xref: /original-bsd/sys/kern/uipc_domain.c (revision be1f24e8)
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.10 (Berkeley) 10/11/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 RMP
43 	ADDDOMAIN(rmp);
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 pfctlinput(cmd, sa)
115 	int cmd;
116 	struct sockaddr *sa;
117 {
118 	register struct domain *dp;
119 	register struct protosw *pr;
120 
121 	for (dp = domains; dp; dp = dp->dom_next)
122 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
123 			if (pr->pr_ctlinput)
124 				(*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0);
125 }
126 
127 pfslowtimo()
128 {
129 	register struct domain *dp;
130 	register struct protosw *pr;
131 
132 	for (dp = domains; dp; dp = dp->dom_next)
133 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
134 			if (pr->pr_slowtimo)
135 				(*pr->pr_slowtimo)();
136 	timeout(pfslowtimo, (caddr_t)0, hz/2);
137 }
138 
139 pffasttimo()
140 {
141 	register struct domain *dp;
142 	register struct protosw *pr;
143 
144 	for (dp = domains; dp; dp = dp->dom_next)
145 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
146 			if (pr->pr_fasttimo)
147 				(*pr->pr_fasttimo)();
148 	timeout(pffasttimo, (caddr_t)0, hz/5);
149 }
150