xref: /original-bsd/sys/kern/uipc_domain.c (revision 4a884f8b)
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.14 (Berkeley) 03/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, p)
113 	int *name;
114 	u_int namelen;
115 	void *oldp;
116 	size_t *oldlenp;
117 	void *newp;
118 	size_t newlen;
119 	struct proc *p;
120 {
121 	register struct domain *dp;
122 	register struct protosw *pr;
123 	int family, protocol;
124 
125 	/*
126 	 * All sysctl names at this level are nonterminal;
127 	 * next two components are protocol family and protocol number,
128 	 * then at least one addition component.
129 	 */
130 	if (namelen <= 3)
131 		return (EISDIR);		/* overloaded */
132 	family = name[0];
133 	protocol = name[1];
134 
135 	if (family == 0)
136 		return (0);
137 	for (dp = domains; dp; dp = dp->dom_next)
138 		if (dp->dom_family == family)
139 			goto found;
140 	return (ENOPROTOOPT);
141 found:
142 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
143 		if (pr->pr_protocol == protocol && pr->pr_sysctl)
144 			return ((*pr->pr_sysctl)(name + 2, namelen - 2,
145 			    oldp, oldlenp, newp, newlen));
146 	return (ENOPROTOOPT);
147 }
148 
149 pfctlinput(cmd, sa)
150 	int cmd;
151 	struct sockaddr *sa;
152 {
153 	register struct domain *dp;
154 	register struct protosw *pr;
155 
156 	for (dp = domains; dp; dp = dp->dom_next)
157 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
158 			if (pr->pr_ctlinput)
159 				(*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0);
160 }
161 
162 pfslowtimo()
163 {
164 	register struct domain *dp;
165 	register struct protosw *pr;
166 
167 	for (dp = domains; dp; dp = dp->dom_next)
168 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
169 			if (pr->pr_slowtimo)
170 				(*pr->pr_slowtimo)();
171 	timeout(pfslowtimo, (caddr_t)0, hz/2);
172 }
173 
174 pffasttimo()
175 {
176 	register struct domain *dp;
177 	register struct protosw *pr;
178 
179 	for (dp = domains; dp; dp = dp->dom_next)
180 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
181 			if (pr->pr_fasttimo)
182 				(*pr->pr_fasttimo)();
183 	timeout(pffasttimo, (caddr_t)0, hz/5);
184 }
185