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