xref: /original-bsd/sys/kern/uipc_domain.c (revision f82e54c4)
1 /*	uipc_domain.c	6.3	84/08/29	*/
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 PUP
27 	ADDDOMAIN(pup);
28 #endif
29 #include "imp.h"
30 #if NIMP > 0
31 	ADDDOMAIN(imp);
32 #endif
33 #endif
34 
35 	for (dp = domains; dp; dp = dp->dom_next) {
36 		if (dp->dom_init)
37 			(*dp->dom_init)();
38 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
39 			if (pr->pr_init)
40 				(*pr->pr_init)();
41 	}
42 	pffasttimo();
43 	pfslowtimo();
44 }
45 
46 struct protosw *
47 pffindtype(family, type)
48 	int family, type;
49 {
50 	register struct domain *dp;
51 	register struct protosw *pr;
52 
53 	for (dp = domains; dp; dp = dp->dom_next)
54 		if (dp->dom_family == family)
55 			goto found;
56 	return (0);
57 found:
58 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
59 		if (pr->pr_type && pr->pr_type == type)
60 			return (pr);
61 	return (0);
62 }
63 
64 struct protosw *
65 pffindproto(family, protocol)
66 	int family, protocol;
67 {
68 	register struct domain *dp;
69 	register struct protosw *pr;
70 
71 	if (family == 0)
72 		return (0);
73 	for (dp = domains; dp; dp = dp->dom_next)
74 		if (dp->dom_family == family)
75 			goto found;
76 	return (0);
77 found:
78 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
79 		if (pr->pr_protocol == protocol)
80 			return (pr);
81 	return (0);
82 }
83 
84 pfctlinput(cmd, arg)
85 	int cmd;
86 	caddr_t arg;
87 {
88 	register struct domain *dp;
89 	register struct protosw *pr;
90 
91 	for (dp = domains; dp; dp = dp->dom_next)
92 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
93 			if (pr->pr_ctlinput)
94 				(*pr->pr_ctlinput)(cmd, arg);
95 }
96 
97 pfslowtimo()
98 {
99 	register struct domain *dp;
100 	register struct protosw *pr;
101 
102 	for (dp = domains; dp; dp = dp->dom_next)
103 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
104 			if (pr->pr_slowtimo)
105 				(*pr->pr_slowtimo)();
106 	timeout(pfslowtimo, (caddr_t)0, hz/2);
107 }
108 
109 pffasttimo()
110 {
111 	register struct domain *dp;
112 	register struct protosw *pr;
113 
114 	for (dp = domains; dp; dp = dp->dom_next)
115 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
116 			if (pr->pr_fasttimo)
117 				(*pr->pr_fasttimo)();
118 	timeout(pffasttimo, (caddr_t)0, hz/5);
119 }
120