xref: /csrg-svn/sys/kern/uipc_proto.c (revision 4890)
1*4890Swnj /*	uipc_proto.c	4.3	81/11/14	*/
24825Swnj 
34787Swnj #include "../h/param.h"
44825Swnj #include "../h/socket.h"
54825Swnj #include "../h/protocol.h"
64825Swnj #include "../h/protosw.h"
74825Swnj #include "../h/mbuf.h"
84825Swnj #include "../net/inet.h"
94825Swnj 
104787Swnj /*
114787Swnj  * Protocol configuration table and routines to search it.
12*4890Swnj  *
13*4890Swnj  * SHOULD INCLUDE A HEADER FILE GIVING DESIRED PROTOCOLS
144787Swnj  */
154787Swnj 
164787Swnj /*
17*4890Swnj  * Local protocol handler.
184787Swnj  */
19*4890Swnj int	pi_usrreq();
204787Swnj 
214787Swnj /*
224787Swnj  * TCP/IP protocol family: IP, ICMP, UDP, TCP.
234787Swnj  */
24*4890Swnj int	ip_input(),ip_output(),ip_ctloutput();
25*4890Swnj int	ip_init(),ip_slowtimo(),ip_drain();
26*4890Swnj int	icmp_input();
27*4890Swnj int	icmp_drain();
28*4890Swnj int	udp_input(),udp_ctlinput();
29*4890Swnj int	udp_usrreq(),udp_sense();
30*4890Swnj int	udp_init();
31*4890Swnj int	tcp_input(),tcp_ctlinput();
32*4890Swnj int	tcp_usrreq(),tcp_sense();
33*4890Swnj int	tcp_init(),tcp_fasttimo(),tcp_slowtimo(),tcp_drain();
34*4890Swnj int	ri_input(),ri_ctlinput();
35*4890Swnj int	ri_usrreq(),ri_sense();
364787Swnj 
374787Swnj struct protosw protosw[] = {
38*4890Swnj { SOCK_STREAM,	PF_LOCAL,	0,		PR_CONNREQUIRED,
394825Swnj   0,		0,		0,		0,
40*4890Swnj   pi_usrreq,	0,		0,
414825Swnj   0,		0,		0,		0,
42*4890Swnj },
43*4890Swnj { SOCK_DGRAM,	PF_LOCAL,	0,		PR_ATOMIC|PR_ADDR,
444825Swnj   0,		0,		0,		0,
45*4890Swnj   pi_usrreq,	0,		0,
464825Swnj   0,		0,		0,		0,
47*4890Swnj },
48*4890Swnj { SOCK_RDM,	PF_LOCAL,	0,		PR_ATOMIC|PR_ADDR,
49*4890Swnj   0,		0,		0,		0,
50*4890Swnj   pi_usrreq,	0,		0,
51*4890Swnj   0,		0,		0,		0,
52*4890Swnj },
53*4890Swnj { SOCK_RAW,	PF_LOCAL,	0,		PR_ATOMIC|PR_ADDR,
54*4890Swnj   0,		0,		0,		0,
55*4890Swnj   pi_usrreq,	0,		0,
56*4890Swnj   0,		0,		0,		0,
57*4890Swnj },
584787Swnj { 0,		0,		0,		0,
59*4890Swnj   ip_input,	ip_output,	0,		0,
60*4890Swnj   0,		0,		0,
61*4890Swnj   ip_init,	0,		ip_slowtimo,	ip_drain,
62*4890Swnj },
634787Swnj { 0,		0,		IPPROTO_ICMP,	0,
64*4890Swnj   icmp_input,	0,		0,		0,
65*4890Swnj   0,		0,		0,
66*4890Swnj   0,		0,		0,		icmp_drain,
67*4890Swnj },
684825Swnj { SOCK_DGRAM,	PF_INET,	IPPROTO_UDP,	PR_ATOMIC|PR_ADDR,
69*4890Swnj   udp_input,	0,		udp_ctlinput,	0,
70*4890Swnj   udp_usrreq,	udp_sense,	MLEN,
71*4890Swnj   udp_init,	0,		0,		0,
72*4890Swnj },
73*4890Swnj { SOCK_STREAM,	PF_INET,	IPPROTO_TCP,	PR_CONNREQUIRED,
74*4890Swnj   tcp_input,	0,		tcp_ctlinput,	0,
75*4890Swnj   tcp_usrreq,	tcp_sense,	MLEN,
76*4890Swnj   tcp_init,	tcp_fasttimo,	tcp_slowtimo,	tcp_drain,
77*4890Swnj },
784825Swnj { SOCK_RAW,	PF_INET,	IPPROTO_RAW,	PR_ATOMIC|PR_ADDR,
79*4890Swnj   ri_input,	0,		ri_ctlinput,	0,
80*4890Swnj   ri_usrreq,	ri_sense,	MLEN,
81*4890Swnj   0,		0,		0,		0,
82*4890Swnj }
834787Swnj };
844787Swnj 
85*4890Swnj #define	NPROTOSW	(sizeof(protosw) / sizeof(protosw[0]))
86*4890Swnj 
87*4890Swnj struct	protosw *protoswLAST = &protosw[NPROTOSW-1];
88*4890Swnj 
894787Swnj /*
904787Swnj  * Operations on protocol table and protocol families.
914787Swnj  */
924787Swnj 
934787Swnj /*
94*4890Swnj  * Initialize all protocols.
95*4890Swnj  */
96*4890Swnj pfinit()
97*4890Swnj {
98*4890Swnj 	register struct protosw *pr;
99*4890Swnj 
100*4890Swnj 	for (pr = protoswLAST; pr >= protosw; pr--)
101*4890Swnj 		if (pr->pr_init)
102*4890Swnj 			(*pr->pr_init)();
103*4890Swnj }
104*4890Swnj 
105*4890Swnj /*
1064787Swnj  * Find a standard protocol in a protocol family
1074787Swnj  * of a specific type.
1084787Swnj  */
1094825Swnj struct protosw *
110*4890Swnj pffindtype(family, type)
1114787Swnj 	int family, type;
1124787Swnj {
1134787Swnj 	register struct protosw *pr;
1144787Swnj 
1154787Swnj 	if (family == 0)
1164787Swnj 		return (0);
117*4890Swnj 	for (pr = protosw; pr < protoswLAST; pr++)
1184787Swnj 		if (pr->pr_family == family && pr->pr_type == type)
1194787Swnj 			return (pr);
1204787Swnj 	return (0);
1214787Swnj }
1224787Swnj 
1234787Swnj /*
1244787Swnj  * Find a specified protocol in a specified protocol family.
1254787Swnj  */
1264825Swnj struct protosw *
127*4890Swnj pffindproto(family, protocol)
1284825Swnj 	int family, protocol;
1294787Swnj {
1304787Swnj 	register struct protosw *pr;
1314787Swnj 
1324787Swnj 	if (family == 0)
1334787Swnj 		return (0);
134*4890Swnj 	for (pr = protosw; pr < protoswLAST; pr++)
1354825Swnj 		if (pr->pr_family == family && pr->pr_protocol == protocol)
1364787Swnj 			return (pr);
1374787Swnj 	return (0);
1384787Swnj }
139