1*4887Swnj /* udp_usrreq.c 4.3 81/11/14 */ 24784Swnj 34784Swnj #include "../h/param.h" 4*4887Swnj #include "../h/dir.h" 5*4887Swnj #include "../h/user.h" 64784Swnj #include "../h/mbuf.h" 74805Swnj #include "../h/protosw.h" 8*4887Swnj #include "../h/socket.h" 9*4887Swnj #include "../h/socketvar.h" 104805Swnj #include "../net/inet.h" 11*4887Swnj #include "../net/inet_host.h" 12*4887Swnj #include "../net/inet_pcb.h" 134805Swnj #include "../net/inet_systm.h" 14*4887Swnj #include "../net/udp.h" 15*4887Swnj #include "../net/udp_var.h" 164784Swnj 174805Swnj udp_init() 184805Swnj { 194805Swnj 20*4887Swnj udb.inp_next = udb.inp_prev = &udp; 214805Swnj } 224805Swnj 234784Swnj udp_input(m) 244784Swnj struct mbuf *m; 254784Swnj { 26*4887Swnj register struct inpcb *inp; 27*4887Swnj int raddr, rport; 28*4887Swnj int addr, port; 294784Swnj 30*4887Swnj inp = inpcb_lookup(&udb, addr, port); 31*4887Swnj if (inp == 0) 32*4887Swnj goto bad; 33*4887Swnj /* sostuff(inp->inp_socket, m, raddr, rport); */ 34*4887Swnj return; 35*4887Swnj bad: 36*4887Swnj m_freem(m); 37*4887Swnj /* gen icmp? */ 384784Swnj } 394784Swnj 40*4887Swnj udp_ctlinput(m) 41*4887Swnj struct mbuf *m; 42*4887Swnj { 43*4887Swnj 44*4887Swnj m_freem(m); 45*4887Swnj } 46*4887Swnj 474784Swnj udp_advise(m) 484784Swnj struct mbuf *m; 494784Swnj { 504784Swnj 514784Swnj m_freem(m); 524784Swnj } 534784Swnj 54*4887Swnj udp_output(raddr, rport, m) 55*4887Swnj int raddr, rport; 564784Swnj struct mbuf *m; 574784Swnj { 584784Swnj 59*4887Swnj /* setup header */ 60*4887Swnj ip_output(m); 614784Swnj } 624784Swnj 63*4887Swnj udp_usrreq(so, req, m, addr) 64*4887Swnj struct socket *so; 654784Swnj int req; 664784Swnj struct mbuf *m; 674784Swnj struct in_addr *addr; 684784Swnj { 69*4887Swnj struct inpcb *inp = sotoinpcb(so); 70*4887Swnj int error; 714784Swnj 724784Swnj switch (req) { 734784Swnj 744784Swnj case PRU_ATTACH: 75*4887Swnj if (inp != 0) 76*4887Swnj return (EINVAL); 77*4887Swnj inp = in_pcballoc(); 78*4887Swnj if (inp == NULL) 79*4887Swnj return (ENOBUFS); 80*4887Swnj so->so_pcb = (caddr_t)inp; 81*4887Swnj break; 824784Swnj 834784Swnj case PRU_DETACH: 84*4887Swnj if (inp == 0) 85*4887Swnj return (ENOTCONN); 86*4887Swnj sofree(inp->inp_socket); 87*4887Swnj udp_detach(inp); 88*4887Swnj break; 894784Swnj 904784Swnj case PRU_CONNECT: 91*4887Swnj if (inp->inp_fhost) 92*4887Swnj return (EISCONN); 93*4887Swnj inp->inp_fhost = in_hmake((struct in_addr *)addr, &error); 94*4887Swnj if (inp->inp_fhost == 0) 95*4887Swnj return (error); 96*4887Swnj soisconnected(so); 97*4887Swnj break; 984784Swnj 994784Swnj case PRU_DISCONNECT: 100*4887Swnj if (inp->inp_fhost == 0) 101*4887Swnj return (ENOTCONN); 102*4887Swnj h_free(inp->inp_fhost); 103*4887Swnj inp->inp_fhost = 0; 104*4887Swnj soisdisconnected(so); 1054784Swnj break; 1064784Swnj 1074784Swnj case PRU_SEND: 108*4887Swnj #if 0 109*4887Swnj if (addr) { 110*4887Swnj if (inp->inp_fhost) 111*4887Swnj return (EISCONN); 112*4887Swnj udp_output(addr->in_fhost, addr->in_fport, m); 113*4887Swnj } else 114*4887Swnj udp_output(inp->inp_fhost->h_addr, ip->inp_fport, m); 115*4887Swnj #endif 1164784Swnj break; 1174784Swnj 1184784Swnj case PRU_ABORT: 119*4887Swnj in_pcbfree(inp); 120*4887Swnj sofree(so); 121*4887Swnj soisdisconnected(so); 1224784Swnj break; 1234784Swnj 1244784Swnj case PRU_CONTROL: 125*4887Swnj return (EOPNOTSUPP); 1264784Swnj 1274784Swnj default: 1284784Swnj panic("udp_usrreq"); 1294805Swnj } 130*4887Swnj return (0); 1314784Swnj } 1324805Swnj 1334805Swnj udp_sense() 1344805Swnj { 1354805Swnj 1364805Swnj } 137