root / lab4 / .minix-src / include / netinet / in_var.h @ 14
History | View | Annotate | Download (10.8 KB)
1 |
/* $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_ */ |