xref: /original-bsd/sys/kern/uipc_domain.c (revision a6d8c59f)
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.11 (Berkeley) 11/18/92
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 
18 #define	ADDDOMAIN(x)	{ \
19 	extern struct domain __CONCAT(x,domain); \
20 	__CONCAT(x,domain.dom_next) = domains; \
21 	domains = &__CONCAT(x,domain); \
22 }
23 
24 domaininit()
25 {
26 	register struct domain *dp;
27 	register struct protosw *pr;
28 
29 #undef unix
30 #ifndef lint
31 	ADDDOMAIN(unix);
32 	ADDDOMAIN(route);
33 #ifdef INET
34 	ADDDOMAIN(inet);
35 #endif
36 #ifdef NS
37 	ADDDOMAIN(ns);
38 #endif
39 #ifdef ISO
40 	ADDDOMAIN(iso);
41 #endif
42 #ifdef CCITT
43 	ADDDOMAIN(ccitt);
44 #endif
45 #include "imp.h"
46 #if NIMP > 0
47 	ADDDOMAIN(imp);
48 #endif
49 #endif
50 
51 	for (dp = domains; dp; dp = dp->dom_next) {
52 		if (dp->dom_init)
53 			(*dp->dom_init)();
54 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
55 			if (pr->pr_init)
56 				(*pr->pr_init)();
57 	}
58 
59 if (max_linkhdr < 16)		/* XXX */
60 max_linkhdr = 16;
61 	max_hdr = max_linkhdr + max_protohdr;
62 	max_datalen = MHLEN - max_hdr;
63 	pffasttimo();
64 	pfslowtimo();
65 }
66 
67 struct protosw *
68 pffindtype(family, type)
69 	int family, type;
70 {
71 	register struct domain *dp;
72 	register struct protosw *pr;
73 
74 	for (dp = domains; dp; dp = dp->dom_next)
75 		if (dp->dom_family == family)
76 			goto found;
77 	return (0);
78 found:
79 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
80 		if (pr->pr_type && pr->pr_type == type)
81 			return (pr);
82 	return (0);
83 }
84 
85 struct protosw *
86 pffindproto(family, protocol, type)
87 	int family, protocol, type;
88 {
89 	register struct domain *dp;
90 	register struct protosw *pr;
91 	struct protosw *maybe = 0;
92 
93 	if (family == 0)
94 		return (0);
95 	for (dp = domains; dp; dp = dp->dom_next)
96 		if (dp->dom_family == family)
97 			goto found;
98 	return (0);
99 found:
100 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
101 		if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
102 			return (pr);
103 
104 		if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
105 		    pr->pr_protocol == 0 && maybe == (struct protosw *)0)
106 			maybe = pr;
107 	}
108 	return (maybe);
109 }
110 
111 pfctlinput(cmd, sa)
112 	int cmd;
113 	struct sockaddr *sa;
114 {
115 	register struct domain *dp;
116 	register struct protosw *pr;
117 
118 	for (dp = domains; dp; dp = dp->dom_next)
119 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
120 			if (pr->pr_ctlinput)
121 				(*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0);
122 }
123 
124 pfslowtimo()
125 {
126 	register struct domain *dp;
127 	register struct protosw *pr;
128 
129 	for (dp = domains; dp; dp = dp->dom_next)
130 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
131 			if (pr->pr_slowtimo)
132 				(*pr->pr_slowtimo)();
133 	timeout(pfslowtimo, (caddr_t)0, hz/2);
134 }
135 
136 pffasttimo()
137 {
138 	register struct domain *dp;
139 	register struct protosw *pr;
140 
141 	for (dp = domains; dp; dp = dp->dom_next)
142 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
143 			if (pr->pr_fasttimo)
144 				(*pr->pr_fasttimo)();
145 	timeout(pffasttimo, (caddr_t)0, hz/5);
146 }
147