root / lab4 / .minix-src / include / netinet / in_var.h @ 13
History | View | Annotate | Download (10.8 KB)
1 | 13 | up20180614 | /* $NetBSD: in_var.h,v 1.74 2015/08/31 08:05:20 ozaki-r Exp $ */
|
---|---|---|---|
2 | |||
3 | /*-
|
||
4 | * Copyright (c) 1998 The NetBSD Foundation, Inc.
|
||
5 | * All rights reserved.
|
||
6 | *
|
||
7 | * This code is derived from software contributed to The NetBSD Foundation
|
||
8 | * by Public Access Networks Corporation ("Panix"). It was developed under
|
||
9 | * contract to Panix by Eric Haszlakiewicz and Thor Lancelot Simon.
|
||
10 | *
|
||
11 | * Redistribution and use in source and binary forms, with or without
|
||
12 | * modification, are permitted provided that the following conditions
|
||
13 | * are met:
|
||
14 | * 1. Redistributions of source code must retain the above copyright
|
||
15 | * notice, this list of conditions and the following disclaimer.
|
||
16 | * 2. Redistributions in binary form must reproduce the above copyright
|
||
17 | * notice, this list of conditions and the following disclaimer in the
|
||
18 | * documentation and/or other materials provided with the distribution.
|
||
19 | *
|
||
20 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
||
21 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||
22 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||
23 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
||
24 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||
25 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||
26 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||
27 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||
28 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||
29 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||
30 | * POSSIBILITY OF SUCH DAMAGE.
|
||
31 | */
|
||
32 | |||
33 | /*
|
||
34 | * Copyright (c) 1985, 1986, 1993
|
||
35 | * The Regents of the University of California. All rights reserved.
|
||
36 | *
|
||
37 | * Redistribution and use in source and binary forms, with or without
|
||
38 | * modification, are permitted provided that the following conditions
|
||
39 | * are met:
|
||
40 | * 1. Redistributions of source code must retain the above copyright
|
||
41 | * notice, this list of conditions and the following disclaimer.
|
||
42 | * 2. Redistributions in binary form must reproduce the above copyright
|
||
43 | * notice, this list of conditions and the following disclaimer in the
|
||
44 | * documentation and/or other materials provided with the distribution.
|
||
45 | * 3. Neither the name of the University nor the names of its contributors
|
||
46 | * may be used to endorse or promote products derived from this software
|
||
47 | * without specific prior written permission.
|
||
48 | *
|
||
49 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||
50 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
51 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
52 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||
53 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
54 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
55 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
56 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
57 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
58 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
59 | * SUCH DAMAGE.
|
||
60 | *
|
||
61 | * @(#)in_var.h 8.2 (Berkeley) 1/9/95
|
||
62 | */
|
||
63 | |||
64 | #ifndef _NETINET_IN_VAR_H_
|
||
65 | #define _NETINET_IN_VAR_H_
|
||
66 | |||
67 | #include <sys/queue.h> |
||
68 | |||
69 | #define IN_IFF_TENTATIVE 0x01 /* tentative address */ |
||
70 | #define IN_IFF_DUPLICATED 0x02 /* DAD detected duplicate */ |
||
71 | #define IN_IFF_DETACHED 0x04 /* may be detached from the link */ |
||
72 | #define IN_IFF_TRYTENTATIVE 0x08 /* intent to try DAD */ |
||
73 | |||
74 | /* do not input/output */
|
||
75 | #define IN_IFF_NOTREADY \
|
||
76 | (IN_IFF_TRYTENTATIVE | IN_IFF_TENTATIVE | IN_IFF_DUPLICATED) |
||
77 | |||
78 | /*
|
||
79 | * Interface address, Internet version. One of these structures
|
||
80 | * is allocated for each interface with an Internet address.
|
||
81 | * The ifaddr structure contains the protocol-independent part
|
||
82 | * of the structure and is assumed to be first.
|
||
83 | */
|
||
84 | struct in_ifaddr {
|
||
85 | struct ifaddr ia_ifa; /* protocol-independent info */ |
||
86 | #define ia_ifp ia_ifa.ifa_ifp
|
||
87 | #define ia_flags ia_ifa.ifa_flags
|
||
88 | /* ia_{,sub}net{,mask} in host order */
|
||
89 | u_int32_t ia_net; /* network number of interface */
|
||
90 | u_int32_t ia_netmask; /* mask of net part */
|
||
91 | u_int32_t ia_subnet; /* subnet number, including net */
|
||
92 | u_int32_t ia_subnetmask; /* mask of subnet part */
|
||
93 | struct in_addr ia_netbroadcast; /* to recognize net broadcasts */ |
||
94 | LIST_ENTRY(in_ifaddr) ia_hash; /* entry in bucket of inet addresses */
|
||
95 | TAILQ_ENTRY(in_ifaddr) ia_list; /* list of internet addresses */
|
||
96 | struct sockaddr_in ia_addr; /* reserve space for interface name */ |
||
97 | struct sockaddr_in ia_dstaddr; /* reserve space for broadcast addr */ |
||
98 | #define ia_broadaddr ia_dstaddr
|
||
99 | struct sockaddr_in ia_sockmask; /* reserve space for general netmask */ |
||
100 | LIST_HEAD(, in_multi) ia_multiaddrs; /* list of multicast addresses */
|
||
101 | struct in_multi *ia_allhosts; /* multicast address record for |
||
102 | the allhosts multicast group */
|
||
103 | uint16_t ia_idsalt; /* ip_id salt for this ia */
|
||
104 | int ia4_flags; /* address flags */ |
||
105 | void (*ia_dad_start) (struct ifaddr *); /* DAD start function */ |
||
106 | void (*ia_dad_stop) (struct ifaddr *); /* DAD stop function */ |
||
107 | }; |
||
108 | |||
109 | struct in_aliasreq {
|
||
110 | char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ |
||
111 | struct sockaddr_in ifra_addr;
|
||
112 | struct sockaddr_in ifra_dstaddr;
|
||
113 | #define ifra_broadaddr ifra_dstaddr
|
||
114 | struct sockaddr_in ifra_mask;
|
||
115 | }; |
||
116 | |||
117 | /*
|
||
118 | * Given a pointer to an in_ifaddr (ifaddr),
|
||
119 | * return a pointer to the addr as a sockaddr_in.
|
||
120 | */
|
||
121 | #define IA_SIN(ia) (&(((struct in_ifaddr *)(ia))->ia_addr)) |
||
122 | |||
123 | #ifdef _KERNEL
|
||
124 | |||
125 | /* Note: 61, 127, 251, 509, 1021, 2039 are good. */
|
||
126 | #ifndef IN_IFADDR_HASH_SIZE
|
||
127 | #define IN_IFADDR_HASH_SIZE 509 |
||
128 | #endif
|
||
129 | |||
130 | /*
|
||
131 | * This is a bit unconventional, and wastes a little bit of space, but
|
||
132 | * because we want a very even hash function we don't use & in_ifaddrhash
|
||
133 | * here, but rather % the hash size, which should obviously be prime.
|
||
134 | */
|
||
135 | |||
136 | #define IN_IFADDR_HASH(x) in_ifaddrhashtbl[(u_long)(x) % IN_IFADDR_HASH_SIZE]
|
||
137 | |||
138 | LIST_HEAD(in_ifaddrhashhead, in_ifaddr); /* Type of the hash head */
|
||
139 | TAILQ_HEAD(in_ifaddrhead, in_ifaddr); /* Type of the list head */
|
||
140 | |||
141 | extern u_long in_ifaddrhash; /* size of hash table - 1 */ |
||
142 | extern struct in_ifaddrhashhead *in_ifaddrhashtbl; /* Hash table head */ |
||
143 | extern struct in_ifaddrhead in_ifaddrhead; /* List head (in ip_input) */ |
||
144 | |||
145 | extern const int inetctlerrmap[]; |
||
146 | |||
147 | /*
|
||
148 | * Macro for finding whether an internet address (in_addr) belongs to one
|
||
149 | * of our interfaces (in_ifaddr). NULL if the address isn't ours.
|
||
150 | */
|
||
151 | #define INADDR_TO_IA(addr, ia) \
|
||
152 | /* struct in_addr addr; */ \
|
||
153 | /* struct in_ifaddr *ia; */ \
|
||
154 | { \ |
||
155 | LIST_FOREACH(ia, &IN_IFADDR_HASH((addr).s_addr), ia_hash) { \ |
||
156 | if (in_hosteq(ia->ia_addr.sin_addr, (addr))) \
|
||
157 | break; \
|
||
158 | } \ |
||
159 | } |
||
160 | |||
161 | /*
|
||
162 | * Macro for finding the next in_ifaddr structure with the same internet
|
||
163 | * address as ia. Call only with a valid ia pointer.
|
||
164 | * Will set ia to NULL if none found.
|
||
165 | */
|
||
166 | |||
167 | #define NEXT_IA_WITH_SAME_ADDR(ia) \
|
||
168 | /* struct in_ifaddr *ia; */ \
|
||
169 | { \ |
||
170 | struct in_addr addr; \
|
||
171 | addr = ia->ia_addr.sin_addr; \ |
||
172 | do { \
|
||
173 | ia = LIST_NEXT(ia, ia_hash); \ |
||
174 | } while ((ia != NULL) && !in_hosteq(ia->ia_addr.sin_addr, addr)); \ |
||
175 | } |
||
176 | |||
177 | /*
|
||
178 | * Macro for finding the interface (ifnet structure) corresponding to one
|
||
179 | * of our IP addresses.
|
||
180 | */
|
||
181 | #define INADDR_TO_IFP(addr, ifp) \
|
||
182 | /* struct in_addr addr; */ \
|
||
183 | /* struct ifnet *ifp; */ \
|
||
184 | { \ |
||
185 | struct in_ifaddr *ia; \
|
||
186 | \ |
||
187 | INADDR_TO_IA(addr, ia); \ |
||
188 | (ifp) = (ia == NULL) ? NULL : ia->ia_ifp; \ |
||
189 | } |
||
190 | |||
191 | /*
|
||
192 | * Macro for finding an internet address structure (in_ifaddr) corresponding
|
||
193 | * to a given interface (ifnet structure).
|
||
194 | */
|
||
195 | #define IFP_TO_IA(ifp, ia) \
|
||
196 | /* struct ifnet *ifp; */ \
|
||
197 | /* struct in_ifaddr *ia; */ \
|
||
198 | { \ |
||
199 | struct ifaddr *ifa; \
|
||
200 | \ |
||
201 | IFADDR_FOREACH(ifa, ifp) { \ |
||
202 | if (ifa->ifa_addr->sa_family == AF_INET) \
|
||
203 | break; \
|
||
204 | } \ |
||
205 | (ia) = ifatoia(ifa); \ |
||
206 | } |
||
207 | |||
208 | #include <netinet/in_selsrc.h> |
||
209 | /*
|
||
210 | * IPv4 per-interface state.
|
||
211 | */
|
||
212 | struct in_ifinfo {
|
||
213 | struct lltable *ii_llt; /* ARP state */ |
||
214 | struct in_ifsysctl *ii_selsrc;
|
||
215 | }; |
||
216 | |||
217 | #endif /* _KERNEL */ |
||
218 | |||
219 | /*
|
||
220 | * Internet multicast address structure. There is one of these for each IP
|
||
221 | * multicast group to which this host belongs on a given network interface.
|
||
222 | * They are kept in a linked list, rooted in the interface's in_ifaddr
|
||
223 | * structure.
|
||
224 | */
|
||
225 | struct router_info;
|
||
226 | |||
227 | struct in_multi {
|
||
228 | LIST_ENTRY(in_multi) inm_list; /* list of multicast addresses */
|
||
229 | struct router_info *inm_rti; /* router version info */ |
||
230 | struct ifnet *inm_ifp; /* back pointer to ifnet */ |
||
231 | struct in_addr inm_addr; /* IP multicast address */ |
||
232 | u_int inm_refcount; /* no. membership claims by sockets */
|
||
233 | u_int inm_timer; /* IGMP membership report timer */
|
||
234 | u_int inm_state; /* state of membership */
|
||
235 | }; |
||
236 | |||
237 | #ifdef _KERNEL
|
||
238 | |||
239 | #include <net/pktqueue.h> |
||
240 | |||
241 | extern pktqueue_t *ip_pktq;
|
||
242 | |||
243 | extern int ip_dad_count; /* Duplicate Address Detection probes */ |
||
244 | |||
245 | /*
|
||
246 | * Structure used by functions below to remember position when stepping
|
||
247 | * through all of the in_multi records.
|
||
248 | */
|
||
249 | struct in_multistep {
|
||
250 | int i_n;
|
||
251 | struct in_multi *i_inm;
|
||
252 | }; |
||
253 | |||
254 | bool in_multi_group(struct in_addr, struct ifnet *, int); |
||
255 | struct in_multi *in_first_multi(struct in_multistep *); |
||
256 | struct in_multi *in_next_multi(struct in_multistep *); |
||
257 | struct in_multi *in_lookup_multi(struct in_addr, struct ifnet *); |
||
258 | struct in_multi *in_addmulti(struct in_addr *, struct ifnet *); |
||
259 | void in_delmulti(struct in_multi *); |
||
260 | |||
261 | void in_multi_lock(int); |
||
262 | void in_multi_unlock(void); |
||
263 | int in_multi_lock_held(void); |
||
264 | |||
265 | struct ifaddr;
|
||
266 | |||
267 | int in_ifinit(struct ifnet *, |
||
268 | struct in_ifaddr *, const struct sockaddr_in *, int, int); |
||
269 | void in_savemkludge(struct in_ifaddr *); |
||
270 | void in_restoremkludge(struct in_ifaddr *, struct ifnet *); |
||
271 | void in_purgemkludge(struct ifnet *); |
||
272 | void in_ifscrub(struct ifnet *, struct in_ifaddr *); |
||
273 | void in_setmaxmtu(void); |
||
274 | const char *in_fmtaddr(struct in_addr); |
||
275 | int in_control(struct socket *, u_long, void *, struct ifnet *); |
||
276 | void in_purgeaddr(struct ifaddr *); |
||
277 | void in_purgeif(struct ifnet *); |
||
278 | int ipflow_fastforward(struct mbuf *); |
||
279 | |||
280 | struct ipid_state;
|
||
281 | typedef struct ipid_state ipid_state_t; |
||
282 | |||
283 | ipid_state_t * ip_id_init(void);
|
||
284 | void ip_id_fini(ipid_state_t *);
|
||
285 | uint16_t ip_randomid(ipid_state_t *, uint16_t); |
||
286 | |||
287 | extern ipid_state_t * ip_ids;
|
||
288 | extern uint16_t ip_id;
|
||
289 | extern int ip_do_randomid; |
||
290 | |||
291 | /*
|
||
292 | * ip_newid_range: "allocate" num contiguous IP IDs.
|
||
293 | *
|
||
294 | * => Return the first ID.
|
||
295 | */
|
||
296 | static __inline uint16_t
|
||
297 | ip_newid_range(const struct in_ifaddr *ia, u_int num) |
||
298 | { |
||
299 | uint16_t id; |
||
300 | |||
301 | if (ip_do_randomid) {
|
||
302 | /* XXX ignore num */
|
||
303 | return ip_randomid(ip_ids, ia ? ia->ia_idsalt : 0); |
||
304 | } |
||
305 | |||
306 | /* Never allow an IP ID of 0 (detect wrap). */
|
||
307 | if ((uint16_t)(ip_id + num) < ip_id) {
|
||
308 | ip_id = 1;
|
||
309 | } |
||
310 | id = htons(ip_id); |
||
311 | ip_id += num; |
||
312 | return id;
|
||
313 | } |
||
314 | |||
315 | static __inline uint16_t
|
||
316 | ip_newid(const struct in_ifaddr *ia) |
||
317 | { |
||
318 | |||
319 | return ip_newid_range(ia, 1); |
||
320 | } |
||
321 | |||
322 | #ifdef SYSCTLFN_PROTO
|
||
323 | int sysctl_inpcblist(SYSCTLFN_PROTO);
|
||
324 | #endif
|
||
325 | |||
326 | #define LLTABLE(ifp) \
|
||
327 | ((struct in_ifinfo *)(ifp)->if_afdata[AF_INET])->ii_llt
|
||
328 | |||
329 | #endif /* !_KERNEL */ |
||
330 | |||
331 | /* INET6 stuff */
|
||
332 | #include <netinet6/in6_var.h> |
||
333 | |||
334 | #endif /* !_NETINET_IN_VAR_H_ */ |