xref: /csrg-svn/sys/kern/uipc_domain.c (revision 57842)
1 /*
2  * Copyright (c) 1982, 1986 Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  *
7  *	@(#)uipc_domain.c	7.12 (Berkeley) 02/04/93
8  */
9 
10 #include <sys/param.h>
11 #include <sys/socket.h>
12 #include <sys/protosw.h>
13 #include <sys/domain.h>
14 #include <sys/mbuf.h>
15 #include <sys/time.h>
16 #include <sys/kernel.h>
17 #include <sys/sysctl.h>
18 
19 #define	ADDDOMAIN(x)	{ \
20 	extern struct domain __CONCAT(x,domain); \
21 	__CONCAT(x,domain.dom_next) = domains; \
22 	domains = &__CONCAT(x,domain); \
23 }
24 
25 domaininit()
26 {
27 	register struct domain *dp;
28 	register struct protosw *pr;
29 
30 #undef unix
31 #ifndef lint
32 	ADDDOMAIN(unix);
33 	ADDDOMAIN(route);
34 #ifdef INET
35 	ADDDOMAIN(inet);
36 #endif
37 #ifdef NS
38 	ADDDOMAIN(ns);
39 #endif
40 #ifdef ISO
41 	ADDDOMAIN(iso);
42 #endif
43 #ifdef CCITT
44 	ADDDOMAIN(ccitt);
45 #endif
46 #include "imp.h"
47 #if NIMP > 0
48 	ADDDOMAIN(imp);
49 #endif
50 #endif
51 
52 	for (dp = domains; dp; dp = dp->dom_next) {
53 		if (dp->dom_init)
54 			(*dp->dom_init)();
55 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
56 			if (pr->pr_init)
57 				(*pr->pr_init)();
58 	}
59 
60 if (max_linkhdr < 16)		/* XXX */
61 max_linkhdr = 16;
62 	max_hdr = max_linkhdr + max_protohdr;
63 	max_datalen = MHLEN - max_hdr;
64 	pffasttimo();
65 	pfslowtimo();
66 }
67 
68 struct protosw *
69 pffindtype(family, type)
70 	int family, type;
71 {
72 	register struct domain *dp;
73 	register struct protosw *pr;
74 
75 	for (dp = domains; dp; dp = dp->dom_next)
76 		if (dp->dom_family == family)
77 			goto found;
78 	return (0);
79 found:
80 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
81 		if (pr->pr_type && pr->pr_type == type)
82 			return (pr);
83 	return (0);
84 }
85 
86 struct protosw *
87 pffindproto(family, protocol, type)
88 	int family, protocol, type;
89 {
90 	register struct domain *dp;
91 	register struct protosw *pr;
92 	struct protosw *maybe = 0;
93 
94 	if (family == 0)
95 		return (0);
96 	for (dp = domains; dp; dp = dp->dom_next)
97 		if (dp->dom_family == family)
98 			goto found;
99 	return (0);
100 found:
101 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
102 		if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
103 			return (pr);
104 
105 		if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
106 		    pr->pr_protocol == 0 && maybe == (struct protosw *)0)
107 			maybe = pr;
108 	}
109 	return (maybe);
110 }
111 
112 net_sysctl(name, namelen, oldp, oldlenp, newp, newlen)
113 	int *name;
114 	u_int namelen;
115 	void *oldp;
116 	u_int *oldlenp;
117 	void *newp;
118 	u_int newlen;
119 {
120 	register struct domain *dp;
121 	register struct protosw *pr;
122 	int family, protocol;
123 
124 	/*
125 	 * All sysctl names at this level are nonterminal;
126 	 * next two components are protocol family and protocol number,
127 	 * then at least one addition component.
128 	 */
129 	if (namelen <= 3)
130 		return (EISDIR);		/* overloaded */
131 	family = name[0];
132 	protocol = name[1];
133 
134 	if (family == 0)
135 		return (0);
136 	for (dp = domains; dp; dp = dp->dom_next)
137 		if (dp->dom_family == family)
138 			goto found;
139 	return (ENOPROTOOPT);
140 found:
141 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
142 		if (pr->pr_protocol == protocol && pr->pr_sysctl)
143 			return ((*pr->pr_sysctl)(name + 2, namelen - 2,
144 			    oldp, oldlenp, newp, newlen));
145 	return (ENOPROTOOPT);
146 }
147 
148 pfctlinput(cmd, sa)
149 	int cmd;
150 	struct sockaddr *sa;
151 {
152 	register struct domain *dp;
153 	register struct protosw *pr;
154 
155 	for (dp = domains; dp; dp = dp->dom_next)
156 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
157 			if (pr->pr_ctlinput)
158 				(*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0);
159 }
160 
161 pfslowtimo()
162 {
163 	register struct domain *dp;
164 	register struct protosw *pr;
165 
166 	for (dp = domains; dp; dp = dp->dom_next)
167 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
168 			if (pr->pr_slowtimo)
169 				(*pr->pr_slowtimo)();
170 	timeout(pfslowtimo, (caddr_t)0, hz/2);
171 }
172 
173 pffasttimo()
174 {
175 	register struct domain *dp;
176 	register struct protosw *pr;
177 
178 	for (dp = domains; dp; dp = dp->dom_next)
179 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
180 			if (pr->pr_fasttimo)
181 				(*pr->pr_fasttimo)();
182 	timeout(pffasttimo, (caddr_t)0, hz/5);
183 }
184