xref: /csrg-svn/sys/kern/uipc_proto.c (revision 5621)
1*5621Swnj /*	uipc_proto.c	4.14	82/01/25	*/
24825Swnj 
34787Swnj #include "../h/param.h"
44825Swnj #include "../h/socket.h"
54825Swnj #include "../h/protosw.h"
64825Swnj #include "../h/mbuf.h"
75091Swnj #include "../net/in.h"
85091Swnj #include "../net/in_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  */
194927Swnj int	piusrreq();
204787Swnj 
214787Swnj /*
224787Swnj  * TCP/IP protocol family: IP, ICMP, UDP, TCP.
234787Swnj  */
245091Swnj int	ip_output();
254890Swnj int	ip_init(),ip_slowtimo(),ip_drain();
265170Swnj int	icmp_input(),icmp_ctlinput();
274890Swnj int	icmp_drain();
284890Swnj int	udp_input(),udp_ctlinput();
295170Swnj int	udp_usrreq();
304890Swnj int	udp_init();
314890Swnj int	tcp_input(),tcp_ctlinput();
325170Swnj int	tcp_usrreq();
334890Swnj int	tcp_init(),tcp_fasttimo(),tcp_slowtimo(),tcp_drain();
345149Swnj int	rip_input(),rip_output(),rip_ctlinput();
355149Swnj int	rip_usrreq(),rip_slowtimo();
364787Swnj 
37*5621Swnj /*
38*5621Swnj  * IMP protocol family: raw interface
39*5621Swnj  */
40*5621Swnj #include "imp.h"
41*5621Swnj #if NIMP > 0
42*5621Swnj int	imp_usrreq(),imp_output(),imp_ctlinput();
43*5621Swnj #endif
44*5621Swnj 
45*5621Swnj /*
46*5621Swnj  * Sundries.
47*5621Swnj */
48*5621Swnj int	raw_init(),raw_usrreq(),raw_input();
49*5621Swnj 
504787Swnj struct protosw protosw[] = {
515149Swnj { SOCK_STREAM,	PF_UNIX,	0,		PR_CONNREQUIRED,
524825Swnj   0,		0,		0,		0,
535149Swnj   piusrreq,
544825Swnj   0,		0,		0,		0,
554890Swnj },
565149Swnj { SOCK_DGRAM,	PF_UNIX,	0,		PR_ATOMIC|PR_ADDR,
574825Swnj   0,		0,		0,		0,
585149Swnj   piusrreq,
594825Swnj   0,		0,		0,		0,
604890Swnj },
615149Swnj { SOCK_RDM,	PF_UNIX,	0,		PR_ATOMIC|PR_ADDR,
624890Swnj   0,		0,		0,		0,
635149Swnj   piusrreq,
644890Swnj   0,		0,		0,		0,
654890Swnj },
665149Swnj { SOCK_RAW,	PF_UNIX,	0,		PR_ATOMIC|PR_ADDR,
674890Swnj   0,		0,		0,		0,
685149Swnj   piusrreq,
694890Swnj   0,		0,		0,		0,
704890Swnj },
714787Swnj { 0,		0,		0,		0,
725091Swnj   0,		ip_output,	0,		0,
735149Swnj   0,
744890Swnj   ip_init,	0,		ip_slowtimo,	ip_drain,
754890Swnj },
764787Swnj { 0,		0,		IPPROTO_ICMP,	0,
775170Swnj   icmp_input,	0,		icmp_ctlinput,	0,
785149Swnj   0,
794890Swnj   0,		0,		0,		icmp_drain,
804890Swnj },
814825Swnj { SOCK_DGRAM,	PF_INET,	IPPROTO_UDP,	PR_ATOMIC|PR_ADDR,
824890Swnj   udp_input,	0,		udp_ctlinput,	0,
835149Swnj   udp_usrreq,
844890Swnj   udp_init,	0,		0,		0,
854890Swnj },
865011Swnj { SOCK_STREAM,	PF_INET,	IPPROTO_TCP,	PR_CONNREQUIRED|PR_WANTRCVD,
874890Swnj   tcp_input,	0,		tcp_ctlinput,	0,
885149Swnj   tcp_usrreq,
894890Swnj   tcp_init,	tcp_fasttimo,	tcp_slowtimo,	tcp_drain,
904890Swnj },
91*5621Swnj { 0,		0,		0,		0,
92*5621Swnj   raw_input,	0,		0,		0,
93*5621Swnj   raw_usrreq,
94*5621Swnj   raw_init,	0,		0,		0,
95*5621Swnj },
96*5621Swnj { SOCK_RAW,	PF_INET,	IPPROTO_RAW,	PR_ATOMIC,
975149Swnj   rip_input,	rip_output,	rip_ctlinput,	0,
985149Swnj   rip_usrreq,
99*5621Swnj   0,		0,		0,		0,
1004890Swnj }
101*5621Swnj #if NIMP > 0
102*5621Swnj ,
103*5621Swnj { SOCK_RAW,	PF_IMPLINK,	0,		PR_ATOMIC|PR_ADDR,
104*5621Swnj   0,		imp_output,	imp_ctlinput,	0,
105*5621Swnj   imp_usrreq,
106*5621Swnj   0,		0,		0,		0,
107*5621Swnj }
108*5621Swnj #endif
1094787Swnj };
1104787Swnj 
1114890Swnj #define	NPROTOSW	(sizeof(protosw) / sizeof(protosw[0]))
1124890Swnj 
1134890Swnj struct	protosw *protoswLAST = &protosw[NPROTOSW-1];
1144890Swnj 
1154787Swnj /*
1164787Swnj  * Operations on protocol table and protocol families.
1174787Swnj  */
1184787Swnj 
1194787Swnj /*
1204890Swnj  * Initialize all protocols.
1214890Swnj  */
1224890Swnj pfinit()
1234890Swnj {
1244890Swnj 	register struct protosw *pr;
1254890Swnj 
1264927Swnj COUNT(PFINIT);
1274890Swnj 	for (pr = protoswLAST; pr >= protosw; pr--)
1284890Swnj 		if (pr->pr_init)
1294890Swnj 			(*pr->pr_init)();
1304890Swnj }
1314890Swnj 
1324890Swnj /*
1334787Swnj  * Find a standard protocol in a protocol family
1344787Swnj  * of a specific type.
1354787Swnj  */
1364825Swnj struct protosw *
1374890Swnj pffindtype(family, type)
1384787Swnj 	int family, type;
1394787Swnj {
1404787Swnj 	register struct protosw *pr;
1414787Swnj 
1424927Swnj COUNT(PFFINDTYPE);
1434787Swnj 	if (family == 0)
1444787Swnj 		return (0);
1455011Swnj 	for (pr = protosw; pr <= protoswLAST; pr++)
1464787Swnj 		if (pr->pr_family == family && pr->pr_type == type)
1474787Swnj 			return (pr);
1484787Swnj 	return (0);
1494787Swnj }
1504787Swnj 
1514787Swnj /*
1524787Swnj  * Find a specified protocol in a specified protocol family.
1534787Swnj  */
1544825Swnj struct protosw *
1554890Swnj pffindproto(family, protocol)
1564825Swnj 	int family, protocol;
1574787Swnj {
1584787Swnj 	register struct protosw *pr;
1594787Swnj 
1604927Swnj COUNT(PFFINDPROTO);
1614787Swnj 	if (family == 0)
1624787Swnj 		return (0);
1635011Swnj 	for (pr = protosw; pr <= protoswLAST; pr++)
1644825Swnj 		if (pr->pr_family == family && pr->pr_protocol == protocol)
1654787Swnj 			return (pr);
1664787Swnj 	return (0);
1674787Swnj }
1685248Sroot 
1695248Sroot /*
1705248Sroot  * Slow timeout on all protocols.
1715248Sroot  */
1725248Sroot pfslowtimo()
1735248Sroot {
1745248Sroot 	register struct protosw *pr;
1755248Sroot 
1765248Sroot COUNT(PFSLOWTIMO);
1775248Sroot 	for (pr = protoswLAST; pr >= protosw; pr--)
1785248Sroot 		if (pr->pr_slowtimo)
1795248Sroot 			(*pr->pr_slowtimo)();
1805248Sroot }
1815248Sroot 
1825248Sroot pffasttimo()
1835248Sroot {
1845248Sroot 	register struct protosw *pr;
1855248Sroot 
1865248Sroot COUNT(PFSLOWTIMO);
1875248Sroot 	for (pr = protoswLAST; pr >= protosw; pr--)
1885272Sroot 		if (pr->pr_fasttimo)
1895272Sroot 			(*pr->pr_fasttimo)();
1905248Sroot }
191