xref: /csrg-svn/sys/kern/uipc_proto.c (revision 4787)
1*4787Swnj #include "../h/param.h"
2*4787Swnj #include "../inet/protocol.h"
3*4787Swnj #include "../inet/protocolsw.h"
4*4787Swnj /* should include a header file giving desired protocols */
5*4787Swnj #define	NTCP	1
6*4787Swnj 
7*4787Swnj /*
8*4787Swnj  * Protocol configuration table and routines to search it.
9*4787Swnj  */
10*4787Swnj 
11*4787Swnj /*
12*4787Swnj  * Generic (local or not yet specified) protocol.
13*4787Swnj  */
14*4787Swnj int	gen_usrreq();
15*4787Swnj 
16*4787Swnj #if NTCP > 0
17*4787Swnj /*
18*4787Swnj  * TCP/IP protocol family: IP, ICMP, UDP, TCP.
19*4787Swnj  */
20*4787Swnj int	ip_input(),ip_output(),ip_advise(),ip_slowtimo(),ip_drain();
21*4787Swnj int	icmp_input(),icmp_output();
22*4787Swnj int	udp_input(),udp_advise(),udp_usrreq(),udp_sense();
23*4787Swnj int	tcp_input(),tcp_advise(),tcp_fasttimo(),tcp_slowtimo(),
24*4787Swnj 	    tcp_drain(),tcp_sense();
25*4787Swnj int	rawip_input(),rawip_advise(),rawip_advise(),rawip_usrreq(),
26*4787Swnj 	    rawip_sense();
27*4787Swnj #endif
28*4787Swnj 
29*4787Swnj #if NPUP > 0
30*4787Swnj /*
31*4787Swnj  * Pup protocols: PUP, BSP.
32*4787Swnj  */
33*4787Swnj int	pup1_input(),pup1_output(),pup1_advise(),pup1_slowtimo(),
34*4787Swnj 	    pup1_drain(),pup1_usrreq(),pup1_sense();
35*4787Swnj int	bsp_input(),bsp_advise(),bsp_fasttimo(),bsp_slowtimo(),
36*4787Swnj 	    bsp_drain(),bsp_usrreq(),bsp_sense();
37*4787Swnj int	rawpup_input(),rawpup_usrreq(),rawpup_sense();
38*4787Swnj #endif
39*4787Swnj 
40*4787Swnj #if NCHAOS > 0
41*4787Swnj /*
42*4787Swnj  * Chaosnet protocols.
43*4787Swnj  */
44*4787Swnj /* ... */
45*4787Swnj #endif
46*4787Swnj 
47*4787Swnj #if NOISCP > 0
48*4787Swnj /*
49*4787Swnj  * Office information system communcation protocols.
50*4787Swnj  */
51*4787Swnj /* ... */
52*4787Swnj #endif
53*4787Swnj 
54*4787Swnj #if NNBS > 0
55*4787Swnj /*
56*4787Swnj  * NBS protocols.
57*4787Swnj  */
58*4787Swnj /* ... */
59*4787Swnj #endif
60*4787Swnj 
61*4787Swnj #if NECMA > 0
62*4787Swnj /*
63*4787Swnj  * ECMA protocols.
64*4787Swnj  */
65*4787Swnj /* ... */
66*4787Swnj #endif
67*4787Swnj 
68*4787Swnj #if NDATAKIT > 0
69*4787Swnj /*
70*4787Swnj  * Datakit protocols.
71*4787Swnj  */
72*4787Swnj /* ... */
73*4787Swnj #endif
74*4787Swnj 
75*4787Swnj struct protosw protosw[] = {
76*4787Swnj { SOCK_STREAM,	PF_GENERIC,	0,		0,
77*4787Swnj   0,		0,		0,
78*4787Swnj   0,		0,		0,		gen_usrreq,	0,
79*4787Swnj   0 },
80*4787Swnj { SOCK_DGRAM,	PF_GENERIC,	0,		PR_ATOMIC|PR_PROVIDEADDR,
81*4787Swnj   0,		0,		0,
82*4787Swnj   0,		0,		0,		gen_usrreq,	0,
83*4787Swnj   0 },
84*4787Swnj { SOCK_RDM,	PF_GENERIC,	0,		PR_ATOMIC|PR_PROVIDEADDR,
85*4787Swnj   0,		0,		0,
86*4787Swnj   0,		0,		0,		gen_usrreq,	0,
87*4787Swnj   0 },
88*4787Swnj { SOCK_RAW,	PF_GENERIC,	0,		PR_ATOMIC|PR_PROVIDEADDR,
89*4787Swnj   0,		0,		0,
90*4787Swnj   0,		0,		0,		gen_usrreq,	0,
91*4787Swnj #if NTCP > 0
92*4787Swnj { 0,		0,		0,		0,
93*4787Swnj   ip_input,	ip_output,	0,
94*4787Swnj   0,		ip_slowtimo,	ip_drain,	0,		0,
95*4787Swnj   0 },
96*4787Swnj { 0,		0,		IPPROTO_ICMP,	0,
97*4787Swnj   icmp_input,	icmp_output,	0,
98*4787Swnj   0,		0,		icmp_drain,	0,		0,
99*4787Swnj   0 },
100*4787Swnj { SOCK_DGRAM,	PF_INET,	IPPROTO_UDP,	PR_ATOMIC|PR_PROVIDEADDR,
101*4787Swnj   udp_input,	0,		udp_advise,
102*4787Swnj   0,		0,		0,		udp_usrreq,	udp_sense,
103*4787Swnj   MLEN },
104*4787Swnj { SOCK_STREAM,	PF_INET,	IPPROTO_TCP,	0,
105*4787Swnj   tcp_input,	0,		tcp_advise,
106*4787Swnj   tcp_fasttimo,	tcp_slowtimo,	tcp_drain,	tcp_usrreq,	tcp_sense,
107*4787Swnj   MLEN },
108*4787Swnj { SOCK_RAW,	PF_INET,	IPPROTO_RAW,	PR_ATOMIC|PR_PROVIDEADDR,
109*4787Swnj   ri_input,	0,		ri_advise,
110*4787Swnj   ri_fasttimo,	ri_slowtimo,	ri_drain,	ri_usrreq,	ri_sense,
111*4787Swnj   MLEN },
112*4787Swnj #endif
113*4787Swnj #if NPUP > 0
114*4787Swnj { SOCK_DGRAM,	PF_PUP,		0,		PR_ATOMIC|PR_PROVIDEADDR,
115*4787Swnj   pup_input,	pup_output,	pup_advise,
116*4787Swnj   0,		pup_slowtimo,	pup_drain,	pup_usrreq,	pup_sense,
117*4787Swnj   MLEN },
118*4787Swnj { SOCK_STREAM,	PF_PUP1,	PUPPROTO_BSP,	0,
119*4787Swnj   bsp_input,	0,		bsp_advise,
120*4787Swnj   bsp_fasttimo,	bsp_slowtimo,	bsp_drain,	bsp_usrreq,	bsp_sense,
121*4787Swnj   MLEN },
122*4787Swnj { SOCK_RAW,	PF_PUP1,	PUPPROTO_RAW,	PR_ATOMIC|PR_PROVIDEADDR,
123*4787Swnj   rp_input,	0,		rp_advise,
124*4787Swnj   rp_fasttimo,	rp_slowtimo,	rp_drain,	rp_usrreq,	rp_sense,
125*4787Swnj   MLEN	},
126*4787Swnj #endif
127*4787Swnj #if NCHAOS > 0
128*4787Swnj /* ... */
129*4787Swnj #endif
130*4787Swnj #if NOISCP > 0
131*4787Swnj /* ... */
132*4787Swnj #endif
133*4787Swnj #if NNBS > 0
134*4787Swnj /* ... */
135*4787Swnj #endif
136*4787Swnj #if NECMA > 0
137*4787Swnj /* ... */
138*4787Swnj #endif
139*4787Swnj #if NDATAKIT > 0
140*4787Swnj /* ... */
141*4787Swnj #endif
142*4787Swnj };
143*4787Swnj #define	protoswEND	&protosw[sizeof (protosw)/sizeof (protosw[0])]
144*4787Swnj 
145*4787Swnj /*
146*4787Swnj  * Operations on protocol table and protocol families.
147*4787Swnj  */
148*4787Swnj 
149*4787Swnj /*
150*4787Swnj  * Find a standard protocol in a protocol family
151*4787Swnj  * of a specific type.
152*4787Swnj  */
153*4787Swnj pf_stdproto(family, type)
154*4787Swnj 	int family, type;
155*4787Swnj {
156*4787Swnj 	register struct protosw *pr;
157*4787Swnj 
158*4787Swnj 	if (family == 0)
159*4787Swnj 		return (0);
160*4787Swnj 	for (pr = protosw; pr < protoswEND; pr++)
161*4787Swnj 		if (pr->pr_family == family && pr->pr_type == type)
162*4787Swnj 			return (pr);
163*4787Swnj 	return (0);
164*4787Swnj }
165*4787Swnj 
166*4787Swnj /*
167*4787Swnj  * Find a specified protocol in a specified protocol family.
168*4787Swnj  */
169*4787Swnj pf_findproto(family, proto)
170*4787Swnj 	int family, proto;
171*4787Swnj {
172*4787Swnj 	register struct protosw *pr;
173*4787Swnj 
174*4787Swnj 	if (family == 0)
175*4787Swnj 		return (0);
176*4787Swnj 	for (pr = protosw; pr < protoswEND; pr++)
177*4787Swnj 		if (pr->pr_family == family && pr->pr_proto == proto)
178*4787Swnj 			return (pr);
179*4787Swnj 	return (0);
180*4787Swnj }
181