xref: /csrg-svn/sys/kern/uipc_domain.c (revision 28884)
1 /*
2  * Copyright (c) 1982 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  *
6  *	@(#)uipc_domain.c	6.10 (Berkeley) 05/29/86
7  */
8 
9 #include "param.h"
10 #include "socket.h"
11 #include "protosw.h"
12 #include "domain.h"
13 #include "time.h"
14 #include "kernel.h"
15 
16 #define	ADDDOMAIN(x)	{ \
17 	extern struct domain x/**/domain; \
18 	x/**/domain.dom_next = domains; \
19 	domains = &x/**/domain; \
20 }
21 
22 domaininit()
23 {
24 	register struct domain *dp;
25 	register struct protosw *pr;
26 
27 #ifndef lint
28 	ADDDOMAIN(unix);
29 #ifdef INET
30 	ADDDOMAIN(inet);
31 #endif
32 #ifdef NS
33 	ADDDOMAIN(ns);
34 #endif
35 #include "imp.h"
36 #if NIMP > 0
37 	ADDDOMAIN(imp);
38 #endif
39 #endif
40 
41 	for (dp = domains; dp; dp = dp->dom_next) {
42 		if (dp->dom_init)
43 			(*dp->dom_init)();
44 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
45 			if (pr->pr_init)
46 				(*pr->pr_init)();
47 	}
48 	null_init();
49 	pffasttimo();
50 	pfslowtimo();
51 }
52 
53 struct protosw *
54 pffindtype(family, type)
55 	int family, type;
56 {
57 	register struct domain *dp;
58 	register struct protosw *pr;
59 
60 	for (dp = domains; dp; dp = dp->dom_next)
61 		if (dp->dom_family == family)
62 			goto found;
63 	return (0);
64 found:
65 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
66 		if (pr->pr_type && pr->pr_type == type)
67 			return (pr);
68 	return (0);
69 }
70 
71 struct protosw *
72 pffindproto(family, protocol, type)
73 	int family, protocol, type;
74 {
75 	register struct domain *dp;
76 	register struct protosw *pr;
77 	struct protosw *maybe = 0;
78 
79 	if (family == 0)
80 		return (0);
81 	for (dp = domains; dp; dp = dp->dom_next)
82 		if (dp->dom_family == family)
83 			goto found;
84 	return (0);
85 found:
86 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
87 		if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
88 			return (pr);
89 
90 		if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
91 		    pr->pr_protocol == 0 && maybe == (struct protosw *)0)
92 			maybe = pr;
93 	}
94 	return (maybe);
95 }
96 
97 pfctlinput(cmd, sa)
98 	int cmd;
99 	struct sockaddr *sa;
100 {
101 	register struct domain *dp;
102 	register struct protosw *pr;
103 
104 	for (dp = domains; dp; dp = dp->dom_next)
105 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
106 			if (pr->pr_ctlinput)
107 				(*pr->pr_ctlinput)(cmd, sa);
108 }
109 
110 pfslowtimo()
111 {
112 	register struct domain *dp;
113 	register struct protosw *pr;
114 
115 	for (dp = domains; dp; dp = dp->dom_next)
116 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
117 			if (pr->pr_slowtimo)
118 				(*pr->pr_slowtimo)();
119 	timeout(pfslowtimo, (caddr_t)0, hz/2);
120 }
121 
122 pffasttimo()
123 {
124 	register struct domain *dp;
125 	register struct protosw *pr;
126 
127 	for (dp = domains; dp; dp = dp->dom_next)
128 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
129 			if (pr->pr_fasttimo)
130 				(*pr->pr_fasttimo)();
131 	timeout(pffasttimo, (caddr_t)0, hz/5);
132 }
133