xref: /csrg-svn/sys/kern/uipc_domain.c (revision 18816)
1 /*	uipc_domain.c	6.4	85/04/27	*/
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)
69 	int family, protocol;
70 {
71 	register struct domain *dp;
72 	register struct protosw *pr;
73 
74 	if (family == 0)
75 		return (0);
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_protocol == protocol)
83 			return (pr);
84 	return (0);
85 }
86 
87 pfctlinput(cmd, arg)
88 	int cmd;
89 	caddr_t arg;
90 {
91 	register struct domain *dp;
92 	register struct protosw *pr;
93 
94 	for (dp = domains; dp; dp = dp->dom_next)
95 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
96 			if (pr->pr_ctlinput)
97 				(*pr->pr_ctlinput)(cmd, arg);
98 }
99 
100 pfslowtimo()
101 {
102 	register struct domain *dp;
103 	register struct protosw *pr;
104 
105 	for (dp = domains; dp; dp = dp->dom_next)
106 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
107 			if (pr->pr_slowtimo)
108 				(*pr->pr_slowtimo)();
109 	timeout(pfslowtimo, (caddr_t)0, hz/2);
110 }
111 
112 pffasttimo()
113 {
114 	register struct domain *dp;
115 	register struct protosw *pr;
116 
117 	for (dp = domains; dp; dp = dp->dom_next)
118 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
119 			if (pr->pr_fasttimo)
120 				(*pr->pr_fasttimo)();
121 	timeout(pffasttimo, (caddr_t)0, hz/5);
122 }
123