]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - share/man/man9/domain.9
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / share / man / man9 / domain.9
1 .\"
2 .\" Copyright (C) 2001 Chad David <davidc@acns.ab.ca>. All rights reserved.
3 .\"
4 .\" Redistribution and use in source and binary forms, with or without
5 .\" modification, are permitted provided that the following conditions
6 .\" are met:
7 .\" 1. Redistributions of source code must retain the above copyright
8 .\"    notice(s), this list of conditions and the following disclaimer as
9 .\"    the first lines of this file unmodified other than the possible
10 .\"    addition of one or more copyright notices.
11 .\" 2. Redistributions in binary form must reproduce the above copyright
12 .\"    notice(s), this list of conditions and the following disclaimer in the
13 .\"    documentation and/or other materials provided with the distribution.
14 .\"
15 .\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
16 .\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 .\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 .\" DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
19 .\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 .\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 .\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22 .\" CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
25 .\" DAMAGE.
26 .\"
27 .\" $FreeBSD$
28 .\"
29 .Dd February 23, 2012
30 .Dt DOMAIN 9
31 .Os
32 .Sh NAME
33 .Nm domain_add ,
34 .Nm pfctlinput ,
35 .Nm pfctlinput2 ,
36 .Nm pffindproto ,
37 .Nm pffindtype ,
38 .Nm DOMAIN_SET
39 .Nd "network domain management"
40 .Sh SYNOPSIS
41 .In sys/param.h
42 .In sys/kernel.h
43 .In sys/protosw.h
44 .In sys/domain.h
45 .Ft void
46 .Fn domain_add "void *data"
47 .Ft void
48 .Fn pfctlinput "int cmd" "struct sockaddr *sa"
49 .Ft void
50 .Fn pfctlinput2 "int cmd" "struct sockaddr *sa" "void *ctlparam"
51 .Ft struct protosw *
52 .Fn pffindproto "int family" "int protocol" "int type"
53 .Ft struct protosw *
54 .Fn pffindtype "int family" "int type"
55 .Ft void
56 .Fn DOMAIN_SET "name"
57 .Sh DESCRIPTION
58 Network protocols installed in the system are maintained within what
59 are called domains
60 (for example the
61 .Va inetdomain
62 and
63 .Va localdomain ) .
64 .Bd -literal
65 struct domain {
66         int     dom_family;             /* AF_xxx */
67         char    *dom_name;
68         void    (*dom_init)             /* initialize domain data structures */
69                 (void);
70         int     (*dom_externalize)      /* externalize access rights */
71                 (struct mbuf *, struct mbuf **);
72         void    (*dom_dispose)          /* dispose of internalized rights */
73                 (struct mbuf *);
74         struct  protosw *dom_protosw, *dom_protoswNPROTOSW;
75         struct  domain *dom_next;
76         int     (*dom_rtattach)         /* initialize routing table */
77                 (void **, int);
78         int     dom_rtoffset;           /* an arg to rtattach, in bits */
79         int     dom_maxrtkey;           /* for routing layer */
80 };
81 .Ed
82 .Pp
83 Each domain contains an array of protocol switch structures
84 .Pq Vt "struct protosw *" ,
85 one for each socket type supported.
86 .Bd -literal
87 struct protosw {
88         short   pr_type;                /* socket type used for */
89         struct  domain *pr_domain;      /* domain protocol a member of */
90         short   pr_protocol;            /* protocol number */
91         short   pr_flags;               /* see below */
92 /* protocol-protocol hooks */
93         pr_input_t *pr_input;           /* input to protocol (from below) */
94         pr_output_t *pr_output;         /* output to protocol (from above) */
95         pr_ctlinput_t *pr_ctlinput;     /* control input (from below) */
96         pr_ctloutput_t *pr_ctloutput;   /* control output (from above) */
97 /* utility hooks */
98         pr_init_t *pr_init;
99         pr_fasttimo_t *pr_fasttimo;     /* fast timeout (200ms) */
100         pr_slowtimo_t *pr_slowtimo;     /* slow timeout (500ms) */
101         pr_drain_t *pr_drain;           /* flush any excess space possible */
102
103         struct  pr_usrreqs *pr_usrreqs; /* supersedes pr_usrreq() */
104 };
105 .Ed
106 .Pp
107 The following functions handle the registration of a new domain,
108 lookups of specific protocols and protocol types within those domains,
109 and handle control messages from the system.
110 .Pp
111 .Fn pfctlinput
112 is called by the system whenever an event occurs that could affect every
113 domain.
114 Examples of those types of events are routing table changes, interface
115 shutdowns or certain
116 .Tn ICMP
117 message types.
118 When called,
119 .Fn pfctlinput
120 calls the protocol specific
121 .Fn pr_ctlinput
122 function for each protocol in that has defined one, in every domain.
123 .Pp
124 .Fn pfctlinput2
125 provides that same functionality of
126 .Fn pfctlinput ,
127 but with a few additional checks and a new
128 .Vt "void *"
129 argument that is passed directly to the protocol's
130 .Fn pr_ctlinput
131 function.
132 Unlike
133 .Fn pfctlinput ,
134 .Fn pfctlinput2
135 verifies that
136 .Fa sa
137 is not
138 .Dv NULL ,
139 and that only the protocol families that are the same as
140 .Fa sa
141 have their
142 .Fn pr_ctlinput
143 function called.
144 .Pp
145 .Fn domain_add
146 adds a new protocol domain to the system.
147 The argument
148 .Fa data
149 is cast directly to
150 .Vt "struct domain *"
151 within the function, but is declared
152 .Vt "void *"
153 in order to prevent compiler warnings when new domains are registered with
154 .Fn SYSINIT .
155 In most cases
156 .Fn domain_add
157 is not called directly, instead
158 .Fn DOMAIN_SET
159 is used.
160 .Pp
161 If the new domain has defined an initialization routine, it is called by
162 .Fn domain_add ;
163 as well, each of the protocols within the domain that have defined an
164 initialization routine will have theirs called.
165 .Pp
166 Once a domain is added it cannot be unloaded.
167 This is because there is
168 no reference counting system in place to determine if there are any
169 active references from sockets within that domain.
170 .Pp
171 .Fn pffindtype
172 and
173 .Fn pffindproto
174 look up a protocol by its number or by its type.
175 In most cases, if the protocol or type cannot be found,
176 .Dv NULL
177 is returned, but
178 .Fn pffindproto
179 may return the default if the requested type is
180 .Dv SOCK_RAW ,
181 a protocol switch type of
182 .Dv SOCK_RAW
183 is found, and the domain has a default raw protocol.
184 .Pp
185 Both functions are called by
186 .Fn socreate
187 in order to resolve the protocol for the socket currently being created.
188 .Pp
189 .Fn DOMAIN_SET
190 is a macro that simplifies the registration of a domain via
191 .Fn SYSINIT .
192 The code resulting from the macro expects there to be a domain structure
193 named
194 .Dq Fa name Ns Li domain
195 where
196 .Fa name
197 is the argument to
198 .Fn DOMAIN_SET :
199 .Bd -literal
200 struct domain localdomain =
201 { AF_LOCAL, "local", unp_init, unp_externalize, unp_dispose,
202   localsw, &localsw[sizeof(localsw)/sizeof(localsw[0])] };
203
204 DOMAIN_SET(local);
205 .Ed
206 .Sh RETURN VALUES
207 Both
208 .Fn pffindtype
209 and
210 .Fn pffindproto
211 return a
212 .Vt "struct protosw *"
213 for the protocol requested.
214 If the protocol or socket type is not found,
215 .Dv NULL
216 is returned.
217 In the case of
218 .Fn pffindproto ,
219 the default protocol may be returned for
220 .Dv SOCK_RAW
221 types if the domain has a default raw protocol.
222 .Sh SEE ALSO
223 .Xr socket 2
224 .Sh AUTHORS
225 This manual page was written by
226 .An Chad David Aq davidc@acns.ab.ca .