Commit | Line | Data |
---|---|---|
da7c5cc6 | 1 | /* |
0880b18e | 2 | * Copyright (c) 1982, 1986 Regents of the University of California. |
5b519e94 | 3 | * All rights reserved. |
da7c5cc6 | 4 | * |
dbf0c423 | 5 | * %sccs.include.redist.c% |
5b519e94 | 6 | * |
dbf0c423 | 7 | * @(#)uipc_domain.c 7.7 (Berkeley) %G% |
da7c5cc6 | 8 | */ |
2f6bcc97 | 9 | |
94368568 JB |
10 | #include "param.h" |
11 | #include "socket.h" | |
12 | #include "protosw.h" | |
13 | #include "domain.h" | |
fe8b0eef | 14 | #include "mbuf.h" |
94368568 JB |
15 | #include "time.h" |
16 | #include "kernel.h" | |
d0d50a86 BJ |
17 | |
18 | #define ADDDOMAIN(x) { \ | |
19 | extern struct domain x/**/domain; \ | |
20 | x/**/domain.dom_next = domains; \ | |
21 | domains = &x/**/domain; \ | |
22 | } | |
23 | ||
24 | domaininit() | |
25 | { | |
4f083fd7 SL |
26 | register struct domain *dp; |
27 | register struct protosw *pr; | |
d0d50a86 | 28 | |
4f083fd7 | 29 | #ifndef lint |
d0d50a86 | 30 | ADDDOMAIN(unix); |
fe8b0eef | 31 | ADDDOMAIN(route); |
2a04df10 | 32 | #ifdef INET |
d0d50a86 BJ |
33 | ADDDOMAIN(inet); |
34 | #endif | |
6e8408aa KS |
35 | #ifdef NS |
36 | ADDDOMAIN(ns); | |
37 | #endif | |
fe8b0eef MK |
38 | #ifdef ISO |
39 | ADDDOMAIN(iso); | |
40 | #endif | |
2a45cac7 KM |
41 | #ifdef RMP |
42 | ADDDOMAIN(rmp); | |
43 | #endif | |
bd65e3c4 SL |
44 | #include "imp.h" |
45 | #if NIMP > 0 | |
d0d50a86 BJ |
46 | ADDDOMAIN(imp); |
47 | #endif | |
4f083fd7 | 48 | #endif |
d0d50a86 | 49 | |
261a8548 MK |
50 | for (dp = domains; dp; dp = dp->dom_next) { |
51 | if (dp->dom_init) | |
52 | (*dp->dom_init)(); | |
d0d50a86 BJ |
53 | for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) |
54 | if (pr->pr_init) | |
55 | (*pr->pr_init)(); | |
261a8548 | 56 | } |
fe8b0eef MK |
57 | |
58 | if (max_linkhdr < 16) /* XXX */ | |
59 | max_linkhdr = 16; | |
60 | max_hdr = max_linkhdr + max_protohdr; | |
61 | max_datalen = MHLEN - max_hdr; | |
4f083fd7 SL |
62 | pffasttimo(); |
63 | pfslowtimo(); | |
d0d50a86 BJ |
64 | } |
65 | ||
66 | struct protosw * | |
67 | pffindtype(family, type) | |
68 | int family, type; | |
69 | { | |
70 | register struct domain *dp; | |
71 | register struct protosw *pr; | |
72 | ||
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++) | |
6cd6d0de | 79 | if (pr->pr_type && pr->pr_type == type) |
d0d50a86 BJ |
80 | return (pr); |
81 | return (0); | |
82 | } | |
83 | ||
84 | struct protosw * | |
9f773c40 MK |
85 | pffindproto(family, protocol, type) |
86 | int family, protocol, type; | |
d0d50a86 BJ |
87 | { |
88 | register struct domain *dp; | |
89 | register struct protosw *pr; | |
9f773c40 | 90 | struct protosw *maybe = 0; |
d0d50a86 BJ |
91 | |
92 | if (family == 0) | |
93 | return (0); | |
94 | for (dp = domains; dp; dp = dp->dom_next) | |
95 | if (dp->dom_family == family) | |
96 | goto found; | |
97 | return (0); | |
98 | found: | |
9f773c40 | 99 | for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { |
c76325fe | 100 | if ((pr->pr_protocol == protocol) && (pr->pr_type == type)) |
d0d50a86 | 101 | return (pr); |
c76325fe | 102 | |
9f773c40 MK |
103 | if (type == SOCK_RAW && pr->pr_type == SOCK_RAW && |
104 | pr->pr_protocol == 0 && maybe == (struct protosw *)0) | |
105 | maybe = pr; | |
106 | } | |
107 | return (maybe); | |
d0d50a86 BJ |
108 | } |
109 | ||
122d5d84 | 110 | pfctlinput(cmd, sa) |
d0d50a86 | 111 | int cmd; |
122d5d84 | 112 | struct sockaddr *sa; |
d0d50a86 BJ |
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_ctlinput) | |
f3ba532d | 120 | (*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0); |
d0d50a86 BJ |
121 | } |
122 | ||
123 | pfslowtimo() | |
124 | { | |
125 | register struct domain *dp; | |
126 | register struct protosw *pr; | |
127 | ||
128 | for (dp = domains; dp; dp = dp->dom_next) | |
129 | for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) | |
130 | if (pr->pr_slowtimo) | |
131 | (*pr->pr_slowtimo)(); | |
4f083fd7 | 132 | timeout(pfslowtimo, (caddr_t)0, hz/2); |
d0d50a86 BJ |
133 | } |
134 | ||
135 | pffasttimo() | |
4147b3f6 | 136 | { |
d0d50a86 BJ |
137 | register struct domain *dp; |
138 | register struct protosw *pr; | |
4147b3f6 | 139 | |
d0d50a86 BJ |
140 | for (dp = domains; dp; dp = dp->dom_next) |
141 | for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) | |
142 | if (pr->pr_fasttimo) | |
143 | (*pr->pr_fasttimo)(); | |
4f083fd7 | 144 | timeout(pffasttimo, (caddr_t)0, hz/5); |
4147b3f6 | 145 | } |