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