xref: /csrg-svn/sys/kern/uipc_proto.c (revision 4927)
1*4927Swnj /*	uipc_proto.c	4.5	81/11/18	*/
24825Swnj 
34787Swnj #include "../h/param.h"
44825Swnj #include "../h/socket.h"
54825Swnj #include "../h/protosw.h"
64825Swnj #include "../h/mbuf.h"
74825Swnj #include "../net/inet.h"
8*4927Swnj #include "../net/inet_systm.h"
94825Swnj 
104787Swnj /*
114787Swnj  * Protocol configuration table and routines to search it.
124890Swnj  *
134890Swnj  * SHOULD INCLUDE A HEADER FILE GIVING DESIRED PROTOCOLS
144787Swnj  */
154787Swnj 
164787Swnj /*
174890Swnj  * Local protocol handler.
184787Swnj  */
19*4927Swnj int	piusrreq();
204787Swnj 
214787Swnj /*
224787Swnj  * TCP/IP protocol family: IP, ICMP, UDP, TCP.
234787Swnj  */
244916Swnj int	ip_input(),ip_output();
254890Swnj int	ip_init(),ip_slowtimo(),ip_drain();
264890Swnj int	icmp_input();
274890Swnj int	icmp_drain();
284890Swnj int	udp_input(),udp_ctlinput();
294890Swnj int	udp_usrreq(),udp_sense();
304890Swnj int	udp_init();
314890Swnj int	tcp_input(),tcp_ctlinput();
324890Swnj int	tcp_usrreq(),tcp_sense();
334890Swnj int	tcp_init(),tcp_fasttimo(),tcp_slowtimo(),tcp_drain();
344890Swnj int	ri_input(),ri_ctlinput();
354890Swnj int	ri_usrreq(),ri_sense();
364787Swnj 
374787Swnj struct protosw protosw[] = {
384890Swnj { SOCK_STREAM,	PF_LOCAL,	0,		PR_CONNREQUIRED,
394825Swnj   0,		0,		0,		0,
40*4927Swnj   piusrreq,	0,		0,
414825Swnj   0,		0,		0,		0,
424890Swnj },
434890Swnj { SOCK_DGRAM,	PF_LOCAL,	0,		PR_ATOMIC|PR_ADDR,
444825Swnj   0,		0,		0,		0,
45*4927Swnj   piusrreq,	0,		0,
464825Swnj   0,		0,		0,		0,
474890Swnj },
484890Swnj { SOCK_RDM,	PF_LOCAL,	0,		PR_ATOMIC|PR_ADDR,
494890Swnj   0,		0,		0,		0,
50*4927Swnj   piusrreq,	0,		0,
514890Swnj   0,		0,		0,		0,
524890Swnj },
534890Swnj { SOCK_RAW,	PF_LOCAL,	0,		PR_ATOMIC|PR_ADDR,
544890Swnj   0,		0,		0,		0,
55*4927Swnj   piusrreq,	0,		0,
564890Swnj   0,		0,		0,		0,
574890Swnj },
584787Swnj { 0,		0,		0,		0,
594890Swnj   ip_input,	ip_output,	0,		0,
604890Swnj   0,		0,		0,
614890Swnj   ip_init,	0,		ip_slowtimo,	ip_drain,
624890Swnj },
634787Swnj { 0,		0,		IPPROTO_ICMP,	0,
644890Swnj   icmp_input,	0,		0,		0,
654890Swnj   0,		0,		0,
664890Swnj   0,		0,		0,		icmp_drain,
674890Swnj },
684825Swnj { SOCK_DGRAM,	PF_INET,	IPPROTO_UDP,	PR_ATOMIC|PR_ADDR,
694890Swnj   udp_input,	0,		udp_ctlinput,	0,
704890Swnj   udp_usrreq,	udp_sense,	MLEN,
714890Swnj   udp_init,	0,		0,		0,
724890Swnj },
734890Swnj { SOCK_STREAM,	PF_INET,	IPPROTO_TCP,	PR_CONNREQUIRED,
744890Swnj   tcp_input,	0,		tcp_ctlinput,	0,
754890Swnj   tcp_usrreq,	tcp_sense,	MLEN,
764890Swnj   tcp_init,	tcp_fasttimo,	tcp_slowtimo,	tcp_drain,
774890Swnj },
784825Swnj { SOCK_RAW,	PF_INET,	IPPROTO_RAW,	PR_ATOMIC|PR_ADDR,
794890Swnj   ri_input,	0,		ri_ctlinput,	0,
804890Swnj   ri_usrreq,	ri_sense,	MLEN,
814890Swnj   0,		0,		0,		0,
824890Swnj }
834787Swnj };
844787Swnj 
854890Swnj #define	NPROTOSW	(sizeof(protosw) / sizeof(protosw[0]))
864890Swnj 
874890Swnj struct	protosw *protoswLAST = &protosw[NPROTOSW-1];
884890Swnj 
894787Swnj /*
904787Swnj  * Operations on protocol table and protocol families.
914787Swnj  */
924787Swnj 
934787Swnj /*
944890Swnj  * Initialize all protocols.
954890Swnj  */
964890Swnj pfinit()
974890Swnj {
984890Swnj 	register struct protosw *pr;
994890Swnj 
100*4927Swnj COUNT(PFINIT);
1014890Swnj 	for (pr = protoswLAST; pr >= protosw; pr--)
1024890Swnj 		if (pr->pr_init)
1034890Swnj 			(*pr->pr_init)();
1044890Swnj }
1054890Swnj 
1064890Swnj /*
1074787Swnj  * Find a standard protocol in a protocol family
1084787Swnj  * of a specific type.
1094787Swnj  */
1104825Swnj struct protosw *
1114890Swnj pffindtype(family, type)
1124787Swnj 	int family, type;
1134787Swnj {
1144787Swnj 	register struct protosw *pr;
1154787Swnj 
116*4927Swnj COUNT(PFFINDTYPE);
1174787Swnj 	if (family == 0)
1184787Swnj 		return (0);
1194890Swnj 	for (pr = protosw; pr < protoswLAST; pr++)
1204787Swnj 		if (pr->pr_family == family && pr->pr_type == type)
1214787Swnj 			return (pr);
1224787Swnj 	return (0);
1234787Swnj }
1244787Swnj 
1254787Swnj /*
1264787Swnj  * Find a specified protocol in a specified protocol family.
1274787Swnj  */
1284825Swnj struct protosw *
1294890Swnj pffindproto(family, protocol)
1304825Swnj 	int family, protocol;
1314787Swnj {
1324787Swnj 	register struct protosw *pr;
1334787Swnj 
134*4927Swnj COUNT(PFFINDPROTO);
1354787Swnj 	if (family == 0)
1364787Swnj 		return (0);
1374890Swnj 	for (pr = protosw; pr < protoswLAST; pr++)
1384825Swnj 		if (pr->pr_family == family && pr->pr_protocol == protocol)
1394787Swnj 			return (pr);
1404787Swnj 	return (0);
1414787Swnj }
142