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