Annotation of sys/kern/uipc_domain.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: uipc_domain.c,v 1.26 2007/06/06 10:04:36 henning Exp $ */
2: /* $NetBSD: uipc_domain.c,v 1.14 1996/02/09 19:00:44 christos Exp $ */
3:
4: /*
5: * Copyright (c) 1982, 1986, 1993
6: * The Regents of the University of California. All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. Neither the name of the University nor the names of its contributors
17: * may be used to endorse or promote products derived from this software
18: * without specific prior written permission.
19: *
20: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30: * SUCH DAMAGE.
31: *
32: * @(#)uipc_domain.c 8.2 (Berkeley) 10/18/93
33: */
34:
35: #include <sys/param.h>
36: #include <sys/socket.h>
37: #include <sys/protosw.h>
38: #include <sys/domain.h>
39: #include <sys/mbuf.h>
40: #include <sys/time.h>
41: #include <sys/kernel.h>
42: #include <sys/systm.h>
43: #include <sys/proc.h>
44: #include <uvm/uvm_extern.h>
45: #include <sys/sysctl.h>
46: #include <sys/timeout.h>
47:
48: #include "bluetooth.h"
49: #include "bpfilter.h"
50:
51: struct domain *domains;
52:
53: void pffasttimo(void *);
54: void pfslowtimo(void *);
55: struct domain * pffinddomain(int);
56:
57: #if defined (KEY) || defined (IPSEC) || defined (TCP_SIGNATURE)
58: int pfkey_init(void);
59: #endif /* KEY || IPSEC || TCP_SIGNATURE */
60:
61: #define ADDDOMAIN(x) { \
62: extern struct domain __CONCAT(x,domain); \
63: __CONCAT(x,domain.dom_next) = domains; \
64: domains = &__CONCAT(x,domain); \
65: }
66:
67: void
68: domaininit(void)
69: {
70: struct domain *dp;
71: struct protosw *pr;
72: static struct timeout pffast_timeout;
73: static struct timeout pfslow_timeout;
74:
75: #undef unix
76: /*
77: * KAME NOTE: ADDDOMAIN(route) is moved to the last part so that
78: * it will be initialized as the *first* element. confusing!
79: */
80: #ifndef lint
81: ADDDOMAIN(unix);
82: #ifdef INET
83: ADDDOMAIN(inet);
84: #endif
85: #ifdef INET6
86: ADDDOMAIN(inet6);
87: #endif /* INET6 */
88: #if defined (KEY) || defined (IPSEC) || defined (TCP_SIGNATURE)
89: pfkey_init();
90: #endif /* KEY || IPSEC */
91: #ifdef NETATALK
92: ADDDOMAIN(atalk);
93: #endif
94: #ifdef NATM
95: ADDDOMAIN(natm);
96: #endif
97: #ifdef IPSEC
98: #ifdef __KAME__
99: ADDDOMAIN(key);
100: #endif
101: #endif
102: #if NBLUETOOTH > 0
103: ADDDOMAIN(bt);
104: #endif
105: ADDDOMAIN(route);
106: #endif
107:
108: for (dp = domains; dp; dp = dp->dom_next) {
109: if (dp->dom_init)
110: (*dp->dom_init)();
111: for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
112: if (pr->pr_init)
113: (*pr->pr_init)();
114: }
115:
116: if (max_linkhdr < 16) /* XXX */
117: max_linkhdr = 16;
118: max_hdr = max_linkhdr + max_protohdr;
119: max_datalen = MHLEN - max_hdr;
120: timeout_set(&pffast_timeout, pffasttimo, &pffast_timeout);
121: timeout_set(&pfslow_timeout, pfslowtimo, &pfslow_timeout);
122: timeout_add(&pffast_timeout, 1);
123: timeout_add(&pfslow_timeout, 1);
124: }
125:
126: struct domain *
127: pffinddomain(int family)
128: {
129: struct domain *dp;
130:
131: for (dp = domains; dp != NULL; dp = dp->dom_next)
132: if (dp->dom_family == family)
133: return (dp);
134: return (NULL);
135: }
136:
137: struct protosw *
138: pffindtype(int family, int type)
139: {
140: struct domain *dp;
141: struct protosw *pr;
142:
143: dp = pffinddomain(family);
144: if (dp == NULL)
145: return (NULL);
146:
147: for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
148: if (pr->pr_type && pr->pr_type == type)
149: return (pr);
150: return (NULL);
151: }
152:
153: struct protosw *
154: pffindproto(int family, int protocol, int type)
155: {
156: struct domain *dp;
157: struct protosw *pr;
158: struct protosw *maybe = NULL;
159:
160: if (family == 0)
161: return (NULL);
162:
163: dp = pffinddomain(family);
164: if (dp == NULL)
165: return (NULL);
166:
167: for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
168: if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
169: return (pr);
170:
171: if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
172: pr->pr_protocol == 0 && maybe == NULL)
173: maybe = pr;
174: }
175: return (maybe);
176: }
177:
178: int
179: net_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
180: size_t newlen, struct proc *p)
181: {
182: struct domain *dp;
183: struct protosw *pr;
184: int family, protocol;
185:
186: /*
187: * All sysctl names at this level are nonterminal.
188: * Usually: next two components are protocol family and protocol
189: * number, then at least one addition component.
190: */
191: if (namelen < 2)
192: return (EISDIR); /* overloaded */
193: family = name[0];
194:
195: if (family == 0)
196: return (0);
197: #if NBPFILTER > 0
198: if (family == PF_BPF)
199: return (bpf_sysctl(name + 1, namelen - 1, oldp, oldlenp,
200: newp, newlen));
201: #endif
202: dp = pffinddomain(family);
203: if (dp == NULL)
204: return (ENOPROTOOPT);
205:
206: if (namelen < 3)
207: return (EISDIR); /* overloaded */
208: protocol = name[1];
209: for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
210: if (pr->pr_protocol == protocol && pr->pr_sysctl)
211: return ((*pr->pr_sysctl)(name + 2, namelen - 2,
212: oldp, oldlenp, newp, newlen));
213: return (ENOPROTOOPT);
214: }
215:
216: void
217: pfctlinput(int cmd, struct sockaddr *sa)
218: {
219: struct domain *dp;
220: struct protosw *pr;
221:
222: for (dp = domains; dp; dp = dp->dom_next)
223: for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
224: if (pr->pr_ctlinput)
225: (*pr->pr_ctlinput)(cmd, sa, NULL);
226: }
227:
228: void
229: pfslowtimo(void *arg)
230: {
231: struct timeout *to = (struct timeout *)arg;
232: struct domain *dp;
233: struct protosw *pr;
234:
235: for (dp = domains; dp; dp = dp->dom_next)
236: for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
237: if (pr->pr_slowtimo)
238: (*pr->pr_slowtimo)();
239: timeout_add(to, hz/2);
240: }
241:
242: void
243: pffasttimo(void *arg)
244: {
245: struct timeout *to = (struct timeout *)arg;
246: struct domain *dp;
247: struct protosw *pr;
248:
249: for (dp = domains; dp; dp = dp->dom_next)
250: for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
251: if (pr->pr_fasttimo)
252: (*pr->pr_fasttimo)();
253: timeout_add(to, hz/5);
254: }
CVSweb