xref: /csrg-svn/sys/netinet/udp_usrreq.c (revision 4887)
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