xref: /original-bsd/sys/kern/uipc_domain.c (revision e59fb703)
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.9 (Berkeley) 03/04/91
8  */
9 
10 #include <sys/cdefs.h>
11 #include "param.h"
12 #include "socket.h"
13 #include "protosw.h"
14 #include "domain.h"
15 #include "mbuf.h"
16 #include "time.h"
17 #include "kernel.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 RMP
44 	ADDDOMAIN(rmp);
45 #endif
46 #ifdef CCITT
47 	ADDDOMAIN(ccitt);
48 #endif
49 #include "imp.h"
50 #if NIMP > 0
51 	ADDDOMAIN(imp);
52 #endif
53 #endif
54 
55 	for (dp = domains; dp; dp = dp->dom_next) {
56 		if (dp->dom_init)
57 			(*dp->dom_init)();
58 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
59 			if (pr->pr_init)
60 				(*pr->pr_init)();
61 	}
62 
63 if (max_linkhdr < 16)		/* XXX */
64 max_linkhdr = 16;
65 	max_hdr = max_linkhdr + max_protohdr;
66 	max_datalen = MHLEN - max_hdr;
67 	pffasttimo();
68 	pfslowtimo();
69 }
70 
71 struct protosw *
72 pffindtype(family, type)
73 	int family, type;
74 {
75 	register struct domain *dp;
76 	register struct protosw *pr;
77 
78 	for (dp = domains; dp; dp = dp->dom_next)
79 		if (dp->dom_family == family)
80 			goto found;
81 	return (0);
82 found:
83 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
84 		if (pr->pr_type && pr->pr_type == type)
85 			return (pr);
86 	return (0);
87 }
88 
89 struct protosw *
90 pffindproto(family, protocol, type)
91 	int family, protocol, type;
92 {
93 	register struct domain *dp;
94 	register struct protosw *pr;
95 	struct protosw *maybe = 0;
96 
97 	if (family == 0)
98 		return (0);
99 	for (dp = domains; dp; dp = dp->dom_next)
100 		if (dp->dom_family == family)
101 			goto found;
102 	return (0);
103 found:
104 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
105 		if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
106 			return (pr);
107 
108 		if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
109 		    pr->pr_protocol == 0 && maybe == (struct protosw *)0)
110 			maybe = pr;
111 	}
112 	return (maybe);
113 }
114 
115 pfctlinput(cmd, sa)
116 	int cmd;
117 	struct sockaddr *sa;
118 {
119 	register struct domain *dp;
120 	register struct protosw *pr;
121 
122 	for (dp = domains; dp; dp = dp->dom_next)
123 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
124 			if (pr->pr_ctlinput)
125 				(*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0);
126 }
127 
128 pfslowtimo()
129 {
130 	register struct domain *dp;
131 	register struct protosw *pr;
132 
133 	for (dp = domains; dp; dp = dp->dom_next)
134 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
135 			if (pr->pr_slowtimo)
136 				(*pr->pr_slowtimo)();
137 	timeout(pfslowtimo, (caddr_t)0, hz/2);
138 }
139 
140 pffasttimo()
141 {
142 	register struct domain *dp;
143 	register struct protosw *pr;
144 
145 	for (dp = domains; dp; dp = dp->dom_next)
146 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
147 			if (pr->pr_fasttimo)
148 				(*pr->pr_fasttimo)();
149 	timeout(pffasttimo, (caddr_t)0, hz/5);
150 }
151