xref: /csrg-svn/sys/kern/uipc_domain.c (revision 41997)
1 /*
2  * Copyright (c) 1982, 1986 Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that the above copyright notice and this paragraph are
7  * duplicated in all such forms and that any documentation,
8  * advertising materials, and other materials related to such
9  * distribution and use acknowledge that the software was developed
10  * by the University of California, Berkeley.  The name of the
11  * University may not be used to endorse or promote products derived
12  * from this software without specific prior written permission.
13  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16  *
17  *	@(#)uipc_domain.c	7.6 (Berkeley) 05/15/90
18  */
19 
20 #include "param.h"
21 #include "socket.h"
22 #include "protosw.h"
23 #include "domain.h"
24 #include "mbuf.h"
25 #include "time.h"
26 #include "kernel.h"
27 
28 #define	ADDDOMAIN(x)	{ \
29 	extern struct domain x/**/domain; \
30 	x/**/domain.dom_next = domains; \
31 	domains = &x/**/domain; \
32 }
33 
34 domaininit()
35 {
36 	register struct domain *dp;
37 	register struct protosw *pr;
38 
39 #ifndef lint
40 	ADDDOMAIN(unix);
41 	ADDDOMAIN(route);
42 #ifdef INET
43 	ADDDOMAIN(inet);
44 #endif
45 #ifdef NS
46 	ADDDOMAIN(ns);
47 #endif
48 #ifdef ISO
49 	ADDDOMAIN(iso);
50 #endif
51 #ifdef RMP
52 	ADDDOMAIN(rmp);
53 #endif
54 #include "imp.h"
55 #if NIMP > 0
56 	ADDDOMAIN(imp);
57 #endif
58 #endif
59 
60 	for (dp = domains; dp; dp = dp->dom_next) {
61 		if (dp->dom_init)
62 			(*dp->dom_init)();
63 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
64 			if (pr->pr_init)
65 				(*pr->pr_init)();
66 	}
67 
68 if (max_linkhdr < 16)		/* XXX */
69 max_linkhdr = 16;
70 	max_hdr = max_linkhdr + max_protohdr;
71 	max_datalen = MHLEN - max_hdr;
72 	pffasttimo();
73 	pfslowtimo();
74 }
75 
76 struct protosw *
77 pffindtype(family, type)
78 	int family, type;
79 {
80 	register struct domain *dp;
81 	register struct protosw *pr;
82 
83 	for (dp = domains; dp; dp = dp->dom_next)
84 		if (dp->dom_family == family)
85 			goto found;
86 	return (0);
87 found:
88 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
89 		if (pr->pr_type && pr->pr_type == type)
90 			return (pr);
91 	return (0);
92 }
93 
94 struct protosw *
95 pffindproto(family, protocol, type)
96 	int family, protocol, type;
97 {
98 	register struct domain *dp;
99 	register struct protosw *pr;
100 	struct protosw *maybe = 0;
101 
102 	if (family == 0)
103 		return (0);
104 	for (dp = domains; dp; dp = dp->dom_next)
105 		if (dp->dom_family == family)
106 			goto found;
107 	return (0);
108 found:
109 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
110 		if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
111 			return (pr);
112 
113 		if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
114 		    pr->pr_protocol == 0 && maybe == (struct protosw *)0)
115 			maybe = pr;
116 	}
117 	return (maybe);
118 }
119 
120 pfctlinput(cmd, sa)
121 	int cmd;
122 	struct sockaddr *sa;
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_ctlinput)
130 				(*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0);
131 }
132 
133 pfslowtimo()
134 {
135 	register struct domain *dp;
136 	register struct protosw *pr;
137 
138 	for (dp = domains; dp; dp = dp->dom_next)
139 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
140 			if (pr->pr_slowtimo)
141 				(*pr->pr_slowtimo)();
142 	timeout(pfslowtimo, (caddr_t)0, hz/2);
143 }
144 
145 pffasttimo()
146 {
147 	register struct domain *dp;
148 	register struct protosw *pr;
149 
150 	for (dp = domains; dp; dp = dp->dom_next)
151 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
152 			if (pr->pr_fasttimo)
153 				(*pr->pr_fasttimo)();
154 	timeout(pffasttimo, (caddr_t)0, hz/5);
155 }
156