xref: /csrg-svn/sys/kern/uipc_domain.c (revision 21766)
1 /*	uipc_domain.c	6.5	85/06/02	*/
2 
3 #include "param.h"
4 #include "socket.h"
5 #include "protosw.h"
6 #include "domain.h"
7 #include "time.h"
8 #include "kernel.h"
9 
10 #define	ADDDOMAIN(x)	{ \
11 	extern struct domain x/**/domain; \
12 	x/**/domain.dom_next = domains; \
13 	domains = &x/**/domain; \
14 }
15 
16 domaininit()
17 {
18 	register struct domain *dp;
19 	register struct protosw *pr;
20 
21 #ifndef lint
22 	ADDDOMAIN(unix);
23 #ifdef INET
24 	ADDDOMAIN(inet);
25 #endif
26 #ifdef NS
27 	ADDDOMAIN(ns);
28 #endif
29 #ifdef PUP
30 	ADDDOMAIN(pup);
31 #endif
32 #include "imp.h"
33 #if NIMP > 0
34 	ADDDOMAIN(imp);
35 #endif
36 #endif
37 
38 	for (dp = domains; dp; dp = dp->dom_next) {
39 		if (dp->dom_init)
40 			(*dp->dom_init)();
41 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
42 			if (pr->pr_init)
43 				(*pr->pr_init)();
44 	}
45 	pffasttimo();
46 	pfslowtimo();
47 }
48 
49 struct protosw *
50 pffindtype(family, type)
51 	int family, type;
52 {
53 	register struct domain *dp;
54 	register struct protosw *pr;
55 
56 	for (dp = domains; dp; dp = dp->dom_next)
57 		if (dp->dom_family == family)
58 			goto found;
59 	return (0);
60 found:
61 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
62 		if (pr->pr_type && pr->pr_type == type)
63 			return (pr);
64 	return (0);
65 }
66 
67 struct protosw *
68 pffindproto(family, protocol, type)
69 	int family, protocol, type;
70 {
71 	register struct domain *dp;
72 	register struct protosw *pr;
73 	struct protosw *maybe = 0;
74 
75 	if (family == 0)
76 		return (0);
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_protocol == protocol)
84 			return (pr);
85 		if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
86 		    pr->pr_protocol == 0 && maybe == (struct protosw *)0)
87 			maybe = pr;
88 	}
89 	return (maybe);
90 }
91 
92 pfctlinput(cmd, arg)
93 	int cmd;
94 	caddr_t arg;
95 {
96 	register struct domain *dp;
97 	register struct protosw *pr;
98 
99 	for (dp = domains; dp; dp = dp->dom_next)
100 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
101 			if (pr->pr_ctlinput)
102 				(*pr->pr_ctlinput)(cmd, arg);
103 }
104 
105 pfslowtimo()
106 {
107 	register struct domain *dp;
108 	register struct protosw *pr;
109 
110 	for (dp = domains; dp; dp = dp->dom_next)
111 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
112 			if (pr->pr_slowtimo)
113 				(*pr->pr_slowtimo)();
114 	timeout(pfslowtimo, (caddr_t)0, hz/2);
115 }
116 
117 pffasttimo()
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_fasttimo)
125 				(*pr->pr_fasttimo)();
126 	timeout(pffasttimo, (caddr_t)0, hz/5);
127 }
128