1 1.105 ozaki /* $NetBSD: in_var.h,v 1.105 2025/06/11 02:44:13 ozaki-r Exp $ */ 2 1.8 cgd 3 1.32 thorpej /*- 4 1.32 thorpej * Copyright (c) 1998 The NetBSD Foundation, Inc. 5 1.32 thorpej * All rights reserved. 6 1.32 thorpej * 7 1.32 thorpej * This code is derived from software contributed to The NetBSD Foundation 8 1.32 thorpej * by Public Access Networks Corporation ("Panix"). It was developed under 9 1.32 thorpej * contract to Panix by Eric Haszlakiewicz and Thor Lancelot Simon. 10 1.32 thorpej * 11 1.32 thorpej * Redistribution and use in source and binary forms, with or without 12 1.32 thorpej * modification, are permitted provided that the following conditions 13 1.32 thorpej * are met: 14 1.32 thorpej * 1. Redistributions of source code must retain the above copyright 15 1.32 thorpej * notice, this list of conditions and the following disclaimer. 16 1.32 thorpej * 2. Redistributions in binary form must reproduce the above copyright 17 1.32 thorpej * notice, this list of conditions and the following disclaimer in the 18 1.32 thorpej * documentation and/or other materials provided with the distribution. 19 1.32 thorpej * 20 1.32 thorpej * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 1.32 thorpej * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 1.32 thorpej * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 1.32 thorpej * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 1.32 thorpej * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 1.32 thorpej * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 1.32 thorpej * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 1.32 thorpej * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 1.32 thorpej * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 1.32 thorpej * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 1.32 thorpej * POSSIBILITY OF SUCH DAMAGE. 31 1.32 thorpej */ 32 1.32 thorpej 33 1.1 cgd /* 34 1.7 mycroft * Copyright (c) 1985, 1986, 1993 35 1.7 mycroft * The Regents of the University of California. All rights reserved. 36 1.1 cgd * 37 1.1 cgd * Redistribution and use in source and binary forms, with or without 38 1.1 cgd * modification, are permitted provided that the following conditions 39 1.1 cgd * are met: 40 1.1 cgd * 1. Redistributions of source code must retain the above copyright 41 1.1 cgd * notice, this list of conditions and the following disclaimer. 42 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 43 1.1 cgd * notice, this list of conditions and the following disclaimer in the 44 1.1 cgd * documentation and/or other materials provided with the distribution. 45 1.48 agc * 3. Neither the name of the University nor the names of its contributors 46 1.1 cgd * may be used to endorse or promote products derived from this software 47 1.1 cgd * without specific prior written permission. 48 1.1 cgd * 49 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 50 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 51 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 52 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 53 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 54 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 55 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 56 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 57 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 58 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 59 1.1 cgd * SUCH DAMAGE. 60 1.1 cgd * 61 1.19 thorpej * @(#)in_var.h 8.2 (Berkeley) 1/9/95 62 1.1 cgd */ 63 1.1 cgd 64 1.20 perry #ifndef _NETINET_IN_VAR_H_ 65 1.20 perry #define _NETINET_IN_VAR_H_ 66 1.20 perry 67 1.15 mycroft #include <sys/queue.h> 68 1.15 mycroft 69 1.71 roy #define IN_IFF_TENTATIVE 0x01 /* tentative address */ 70 1.71 roy #define IN_IFF_DUPLICATED 0x02 /* DAD detected duplicate */ 71 1.71 roy #define IN_IFF_DETACHED 0x04 /* may be detached from the link */ 72 1.72 roy #define IN_IFF_TRYTENTATIVE 0x08 /* intent to try DAD */ 73 1.71 roy 74 1.81 christos #define IN_IFFBITS \ 75 1.80 christos "\020\1TENTATIVE\2DUPLICATED\3DETACHED\4TRYTENTATIVE" 76 1.80 christos 77 1.71 roy /* do not input/output */ 78 1.72 roy #define IN_IFF_NOTREADY \ 79 1.72 roy (IN_IFF_TRYTENTATIVE | IN_IFF_TENTATIVE | IN_IFF_DUPLICATED) 80 1.71 roy 81 1.1 cgd /* 82 1.1 cgd * Interface address, Internet version. One of these structures 83 1.1 cgd * is allocated for each interface with an Internet address. 84 1.1 cgd * The ifaddr structure contains the protocol-independent part 85 1.1 cgd * of the structure and is assumed to be first. 86 1.1 cgd */ 87 1.1 cgd struct in_ifaddr { 88 1.1 cgd struct ifaddr ia_ifa; /* protocol-independent info */ 89 1.1 cgd #define ia_ifp ia_ifa.ifa_ifp 90 1.7 mycroft #define ia_flags ia_ifa.ifa_flags 91 1.1 cgd /* ia_{,sub}net{,mask} in host order */ 92 1.11 cgd u_int32_t ia_net; /* network number of interface */ 93 1.11 cgd u_int32_t ia_netmask; /* mask of net part */ 94 1.11 cgd u_int32_t ia_subnet; /* subnet number, including net */ 95 1.11 cgd u_int32_t ia_subnetmask; /* mask of subnet part */ 96 1.1 cgd struct in_addr ia_netbroadcast; /* to recognize net broadcasts */ 97 1.21 tls LIST_ENTRY(in_ifaddr) ia_hash; /* entry in bucket of inet addresses */ 98 1.15 mycroft TAILQ_ENTRY(in_ifaddr) ia_list; /* list of internet addresses */ 99 1.1 cgd struct sockaddr_in ia_addr; /* reserve space for interface name */ 100 1.11 cgd struct sockaddr_in ia_dstaddr; /* reserve space for broadcast addr */ 101 1.1 cgd #define ia_broadaddr ia_dstaddr 102 1.1 cgd struct sockaddr_in ia_sockmask; /* reserve space for general netmask */ 103 1.15 mycroft LIST_HEAD(, in_multi) ia_multiaddrs; /* list of multicast addresses */ 104 1.41 enami struct in_multi *ia_allhosts; /* multicast address record for 105 1.41 enami the allhosts multicast group */ 106 1.61 matt uint16_t ia_idsalt; /* ip_id salt for this ia */ 107 1.71 roy int ia4_flags; /* address flags */ 108 1.72 roy void (*ia_dad_start) (struct ifaddr *); /* DAD start function */ 109 1.72 roy void (*ia_dad_stop) (struct ifaddr *); /* DAD stop function */ 110 1.88 roy time_t ia_dad_defended; /* last time of DAD defence */ 111 1.75 ozaki 112 1.75 ozaki #ifdef _KERNEL 113 1.75 ozaki struct pslist_entry ia_hash_pslist_entry; 114 1.76 ozaki struct pslist_entry ia_pslist_entry; 115 1.75 ozaki #endif 116 1.1 cgd }; 117 1.1 cgd 118 1.98 roy struct in_nbrinfo { 119 1.98 roy char ifname[IFNAMSIZ]; /* if name, e.g. "en0" */ 120 1.98 roy struct in_addr addr; /* IPv4 address of the neighbor */ 121 1.98 roy long asked; /* number of queries already sent for this addr */ 122 1.98 roy int state; /* reachability state */ 123 1.98 roy int expire; /* lifetime for NDP state transition */ 124 1.98 roy }; 125 1.98 roy 126 1.79 ozaki #ifdef _KERNEL 127 1.96 christos static __inline void 128 1.79 ozaki ia4_acquire(struct in_ifaddr *ia, struct psref *psref) 129 1.79 ozaki { 130 1.79 ozaki 131 1.79 ozaki KASSERT(ia != NULL); 132 1.79 ozaki ifa_acquire(&ia->ia_ifa, psref); 133 1.79 ozaki } 134 1.79 ozaki 135 1.96 christos static __inline void 136 1.79 ozaki ia4_release(struct in_ifaddr *ia, struct psref *psref) 137 1.79 ozaki { 138 1.79 ozaki 139 1.79 ozaki if (ia == NULL) 140 1.79 ozaki return; 141 1.79 ozaki ifa_release(&ia->ia_ifa, psref); 142 1.79 ozaki } 143 1.79 ozaki #endif 144 1.79 ozaki 145 1.1 cgd struct in_aliasreq { 146 1.1 cgd char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 147 1.1 cgd struct sockaddr_in ifra_addr; 148 1.14 mycroft struct sockaddr_in ifra_dstaddr; 149 1.14 mycroft #define ifra_broadaddr ifra_dstaddr 150 1.1 cgd struct sockaddr_in ifra_mask; 151 1.1 cgd }; 152 1.71 roy 153 1.1 cgd /* 154 1.1 cgd * Given a pointer to an in_ifaddr (ifaddr), 155 1.1 cgd * return a pointer to the addr as a sockaddr_in. 156 1.1 cgd */ 157 1.1 cgd #define IA_SIN(ia) (&(((struct in_ifaddr *)(ia))->ia_addr)) 158 1.1 cgd 159 1.68 rmind #ifdef _KERNEL 160 1.7 mycroft 161 1.68 rmind /* Note: 61, 127, 251, 509, 1021, 2039 are good. */ 162 1.21 tls #ifndef IN_IFADDR_HASH_SIZE 163 1.68 rmind #define IN_IFADDR_HASH_SIZE 509 164 1.45 matt #endif 165 1.21 tls 166 1.28 tls /* 167 1.28 tls * This is a bit unconventional, and wastes a little bit of space, but 168 1.28 tls * because we want a very even hash function we don't use & in_ifaddrhash 169 1.28 tls * here, but rather % the hash size, which should obviously be prime. 170 1.28 tls */ 171 1.28 tls 172 1.28 tls #define IN_IFADDR_HASH(x) in_ifaddrhashtbl[(u_long)(x) % IN_IFADDR_HASH_SIZE] 173 1.21 tls 174 1.21 tls LIST_HEAD(in_ifaddrhashhead, in_ifaddr); /* Type of the hash head */ 175 1.21 tls TAILQ_HEAD(in_ifaddrhead, in_ifaddr); /* Type of the list head */ 176 1.45 matt 177 1.44 matt extern u_long in_ifaddrhash; /* size of hash table - 1 */ 178 1.21 tls extern struct in_ifaddrhashhead *in_ifaddrhashtbl; /* Hash table head */ 179 1.51 jonathan extern struct in_ifaddrhead in_ifaddrhead; /* List head (in ip_input) */ 180 1.21 tls 181 1.89 knakahar extern pserialize_t in_ifaddrhash_psz; 182 1.75 ozaki extern struct pslist_head *in_ifaddrhashtbl_pslist; 183 1.75 ozaki extern u_long in_ifaddrhash_pslist; 184 1.76 ozaki extern struct pslist_head in_ifaddrhead_pslist; 185 1.75 ozaki 186 1.75 ozaki #define IN_IFADDR_HASH_PSLIST(x) \ 187 1.75 ozaki in_ifaddrhashtbl_pslist[(u_long)(x) % IN_IFADDR_HASH_SIZE] 188 1.75 ozaki 189 1.75 ozaki #define IN_ADDRHASH_READER_FOREACH(__ia, __addr) \ 190 1.75 ozaki PSLIST_READER_FOREACH((__ia), &IN_IFADDR_HASH_PSLIST(__addr), \ 191 1.75 ozaki struct in_ifaddr, ia_hash_pslist_entry) 192 1.75 ozaki #define IN_ADDRHASH_WRITER_INSERT_HEAD(__ia) \ 193 1.75 ozaki PSLIST_WRITER_INSERT_HEAD( \ 194 1.75 ozaki &IN_IFADDR_HASH_PSLIST((__ia)->ia_addr.sin_addr.s_addr), \ 195 1.75 ozaki (__ia), ia_hash_pslist_entry) 196 1.75 ozaki #define IN_ADDRHASH_WRITER_REMOVE(__ia) \ 197 1.75 ozaki PSLIST_WRITER_REMOVE((__ia), ia_hash_pslist_entry) 198 1.75 ozaki #define IN_ADDRHASH_ENTRY_INIT(__ia) \ 199 1.75 ozaki PSLIST_ENTRY_INIT((__ia), ia_hash_pslist_entry); 200 1.75 ozaki #define IN_ADDRHASH_ENTRY_DESTROY(__ia) \ 201 1.75 ozaki PSLIST_ENTRY_DESTROY((__ia), ia_hash_pslist_entry); 202 1.77 ozaki #define IN_ADDRHASH_READER_NEXT(__ia) \ 203 1.77 ozaki PSLIST_READER_NEXT((__ia), struct in_ifaddr, ia_hash_pslist_entry) 204 1.75 ozaki 205 1.76 ozaki #define IN_ADDRLIST_ENTRY_INIT(__ia) \ 206 1.76 ozaki PSLIST_ENTRY_INIT((__ia), ia_pslist_entry) 207 1.76 ozaki #define IN_ADDRLIST_ENTRY_DESTROY(__ia) \ 208 1.76 ozaki PSLIST_ENTRY_DESTROY((__ia), ia_pslist_entry); 209 1.76 ozaki #define IN_ADDRLIST_READER_EMPTY() \ 210 1.76 ozaki (PSLIST_READER_FIRST(&in_ifaddrhead_pslist, struct in_ifaddr, \ 211 1.76 ozaki ia_pslist_entry) == NULL) 212 1.76 ozaki #define IN_ADDRLIST_READER_FIRST() \ 213 1.76 ozaki PSLIST_READER_FIRST(&in_ifaddrhead_pslist, struct in_ifaddr, \ 214 1.76 ozaki ia_pslist_entry) 215 1.76 ozaki #define IN_ADDRLIST_READER_NEXT(__ia) \ 216 1.76 ozaki PSLIST_READER_NEXT((__ia), struct in_ifaddr, ia_pslist_entry) 217 1.76 ozaki #define IN_ADDRLIST_READER_FOREACH(__ia) \ 218 1.76 ozaki PSLIST_READER_FOREACH((__ia), &in_ifaddrhead_pslist, \ 219 1.76 ozaki struct in_ifaddr, ia_pslist_entry) 220 1.76 ozaki #define IN_ADDRLIST_WRITER_INSERT_HEAD(__ia) \ 221 1.76 ozaki PSLIST_WRITER_INSERT_HEAD(&in_ifaddrhead_pslist, (__ia), \ 222 1.76 ozaki ia_pslist_entry) 223 1.76 ozaki #define IN_ADDRLIST_WRITER_REMOVE(__ia) \ 224 1.76 ozaki PSLIST_WRITER_REMOVE((__ia), ia_pslist_entry) 225 1.76 ozaki #define IN_ADDRLIST_WRITER_FOREACH(__ia) \ 226 1.76 ozaki PSLIST_WRITER_FOREACH((__ia), &in_ifaddrhead_pslist, \ 227 1.76 ozaki struct in_ifaddr, ia_pslist_entry) 228 1.76 ozaki #define IN_ADDRLIST_WRITER_FIRST() \ 229 1.76 ozaki PSLIST_WRITER_FIRST(&in_ifaddrhead_pslist, struct in_ifaddr, \ 230 1.76 ozaki ia_pslist_entry) 231 1.76 ozaki #define IN_ADDRLIST_WRITER_NEXT(__ia) \ 232 1.76 ozaki PSLIST_WRITER_NEXT((__ia), struct in_ifaddr, ia_pslist_entry) 233 1.76 ozaki #define IN_ADDRLIST_WRITER_INSERT_AFTER(__ia, __new) \ 234 1.76 ozaki PSLIST_WRITER_INSERT_AFTER((__ia), (__new), ia_pslist_entry) 235 1.76 ozaki #define IN_ADDRLIST_WRITER_EMPTY() \ 236 1.76 ozaki (PSLIST_WRITER_FIRST(&in_ifaddrhead_pslist, struct in_ifaddr, \ 237 1.76 ozaki ia_pslist_entry) == NULL) 238 1.76 ozaki #define IN_ADDRLIST_WRITER_INSERT_TAIL(__new) \ 239 1.76 ozaki do { \ 240 1.76 ozaki if (IN_ADDRLIST_WRITER_EMPTY()) { \ 241 1.76 ozaki IN_ADDRLIST_WRITER_INSERT_HEAD((__new)); \ 242 1.76 ozaki } else { \ 243 1.76 ozaki struct in_ifaddr *__ia; \ 244 1.76 ozaki IN_ADDRLIST_WRITER_FOREACH(__ia) { \ 245 1.76 ozaki if (IN_ADDRLIST_WRITER_NEXT(__ia) == NULL) { \ 246 1.76 ozaki IN_ADDRLIST_WRITER_INSERT_AFTER(__ia,\ 247 1.76 ozaki (__new)); \ 248 1.76 ozaki break; \ 249 1.76 ozaki } \ 250 1.76 ozaki } \ 251 1.76 ozaki } \ 252 1.76 ozaki } while (0) 253 1.76 ozaki 254 1.42 matt extern const int inetctlerrmap[]; 255 1.7 mycroft 256 1.4 hpeyerl /* 257 1.78 ozaki * Find whether an internet address (in_addr) belongs to one 258 1.21 tls * of our interfaces (in_ifaddr). NULL if the address isn't ours. 259 1.21 tls */ 260 1.96 christos static __inline struct in_ifaddr * 261 1.78 ozaki in_get_ia(struct in_addr addr) 262 1.78 ozaki { 263 1.78 ozaki struct in_ifaddr *ia; 264 1.78 ozaki 265 1.78 ozaki IN_ADDRHASH_READER_FOREACH(ia, addr.s_addr) { 266 1.78 ozaki if (in_hosteq(ia->ia_addr.sin_addr, addr)) 267 1.78 ozaki break; 268 1.78 ozaki } 269 1.78 ozaki 270 1.78 ozaki return ia; 271 1.27 is } 272 1.27 is 273 1.96 christos static __inline struct in_ifaddr * 274 1.79 ozaki in_get_ia_psref(struct in_addr addr, struct psref *psref) 275 1.79 ozaki { 276 1.79 ozaki struct in_ifaddr *ia; 277 1.79 ozaki int s; 278 1.79 ozaki 279 1.79 ozaki s = pserialize_read_enter(); 280 1.79 ozaki ia = in_get_ia(addr); 281 1.79 ozaki if (ia != NULL) 282 1.79 ozaki ia4_acquire(ia, psref); 283 1.79 ozaki pserialize_read_exit(s); 284 1.79 ozaki 285 1.79 ozaki return ia; 286 1.79 ozaki } 287 1.79 ozaki 288 1.27 is /* 289 1.78 ozaki * Find whether an internet address (in_addr) belongs to a specified 290 1.78 ozaki * interface. NULL if the address isn't ours. 291 1.27 is */ 292 1.96 christos static __inline struct in_ifaddr * 293 1.78 ozaki in_get_ia_on_iface(struct in_addr addr, struct ifnet *ifp) 294 1.78 ozaki { 295 1.78 ozaki struct in_ifaddr *ia; 296 1.27 is 297 1.78 ozaki IN_ADDRHASH_READER_FOREACH(ia, addr.s_addr) { 298 1.78 ozaki if (in_hosteq(ia->ia_addr.sin_addr, addr) && 299 1.78 ozaki ia->ia_ifp == ifp) 300 1.78 ozaki break; 301 1.78 ozaki } 302 1.21 tls 303 1.78 ozaki return ia; 304 1.4 hpeyerl } 305 1.4 hpeyerl 306 1.96 christos static __inline struct in_ifaddr * 307 1.79 ozaki in_get_ia_on_iface_psref(struct in_addr addr, struct ifnet *ifp, struct psref *psref) 308 1.79 ozaki { 309 1.79 ozaki struct in_ifaddr *ia; 310 1.79 ozaki int s; 311 1.79 ozaki 312 1.79 ozaki s = pserialize_read_enter(); 313 1.79 ozaki ia = in_get_ia_on_iface(addr, ifp); 314 1.79 ozaki if (ia != NULL) 315 1.79 ozaki ia4_acquire(ia, psref); 316 1.79 ozaki pserialize_read_exit(s); 317 1.79 ozaki 318 1.79 ozaki return ia; 319 1.79 ozaki } 320 1.79 ozaki 321 1.4 hpeyerl /* 322 1.78 ozaki * Find an internet address structure (in_ifaddr) corresponding 323 1.4 hpeyerl * to a given interface (ifnet structure). 324 1.4 hpeyerl */ 325 1.96 christos static __inline struct in_ifaddr * 326 1.78 ozaki in_get_ia_from_ifp(struct ifnet *ifp) 327 1.78 ozaki { 328 1.78 ozaki struct ifaddr *ifa; 329 1.78 ozaki 330 1.104 ozaki ifa = if_first_addr(ifp, AF_INET); 331 1.78 ozaki return ifatoia(ifa); 332 1.4 hpeyerl } 333 1.73 ozaki 334 1.96 christos static __inline struct in_ifaddr * 335 1.79 ozaki in_get_ia_from_ifp_psref(struct ifnet *ifp, struct psref *psref) 336 1.79 ozaki { 337 1.79 ozaki struct in_ifaddr *ia; 338 1.79 ozaki int s; 339 1.79 ozaki 340 1.79 ozaki s = pserialize_read_enter(); 341 1.79 ozaki ia = in_get_ia_from_ifp(ifp); 342 1.79 ozaki if (ia != NULL) 343 1.79 ozaki ia4_acquire(ia, psref); 344 1.79 ozaki pserialize_read_exit(s); 345 1.79 ozaki 346 1.79 ozaki return ia; 347 1.79 ozaki } 348 1.79 ozaki 349 1.73 ozaki #include <netinet/in_selsrc.h> 350 1.73 ozaki /* 351 1.73 ozaki * IPv4 per-interface state. 352 1.73 ozaki */ 353 1.73 ozaki struct in_ifinfo { 354 1.73 ozaki struct lltable *ii_llt; /* ARP state */ 355 1.73 ozaki struct in_ifsysctl *ii_selsrc; 356 1.103 yamt #ifdef MBUFTRACE 357 1.103 yamt struct mowner ii_mowner; 358 1.103 yamt #endif 359 1.73 ozaki }; 360 1.73 ozaki 361 1.73 ozaki #endif /* _KERNEL */ 362 1.4 hpeyerl 363 1.4 hpeyerl /* 364 1.4 hpeyerl * Internet multicast address structure. There is one of these for each IP 365 1.4 hpeyerl * multicast group to which this host belongs on a given network interface. 366 1.4 hpeyerl * They are kept in a linked list, rooted in the interface's in_ifaddr 367 1.4 hpeyerl * structure. 368 1.4 hpeyerl */ 369 1.68 rmind struct router_info; 370 1.68 rmind 371 1.4 hpeyerl struct in_multi { 372 1.45 matt LIST_ENTRY(in_multi) inm_list; /* list of multicast addresses */ 373 1.45 matt struct router_info *inm_rti; /* router version info */ 374 1.45 matt struct ifnet *inm_ifp; /* back pointer to ifnet */ 375 1.4 hpeyerl struct in_addr inm_addr; /* IP multicast address */ 376 1.4 hpeyerl u_int inm_refcount; /* no. membership claims by sockets */ 377 1.4 hpeyerl u_int inm_timer; /* IGMP membership report timer */ 378 1.12 mycroft u_int inm_state; /* state of membership */ 379 1.4 hpeyerl }; 380 1.4 hpeyerl 381 1.9 jtc #ifdef _KERNEL 382 1.69 rmind 383 1.69 rmind #include <net/pktqueue.h> 384 1.102 christos #include <sys/cprng.h> 385 1.69 rmind 386 1.69 rmind extern pktqueue_t *ip_pktq; 387 1.69 rmind 388 1.71 roy extern int ip_dad_count; /* Duplicate Address Detection probes */ 389 1.97 ozaki 390 1.97 ozaki static inline bool 391 1.97 ozaki ip_dad_enabled(void) 392 1.97 ozaki { 393 1.97 ozaki #if NARP > 0 394 1.97 ozaki return ip_dad_count > 0; 395 1.97 ozaki #else 396 1.97 ozaki return false; 397 1.97 ozaki #endif 398 1.97 ozaki } 399 1.97 ozaki 400 1.85 christos #if defined(INET) && NARP > 0 401 1.82 roy extern int arp_debug; 402 1.95 ryo #define ARPLOGADDR(a) IN_PRINT(_ipbuf, a) 403 1.93 christos #define ARPLOG(level, fmt, args...) \ 404 1.93 christos do { \ 405 1.94 christos char _ipbuf[INET_ADDRSTRLEN]; \ 406 1.94 christos (void)_ipbuf; \ 407 1.93 christos if (arp_debug) \ 408 1.93 christos log(level, "%s: " fmt, __func__, ##args); \ 409 1.93 christos } while (/*CONSTCOND*/0) 410 1.84 christos #else 411 1.93 christos #define ARPLOG(level, fmt, args...) 412 1.84 christos #endif 413 1.71 roy 414 1.4 hpeyerl /* 415 1.68 rmind * Structure used by functions below to remember position when stepping 416 1.68 rmind * through all of the in_multi records. 417 1.4 hpeyerl */ 418 1.4 hpeyerl struct in_multistep { 419 1.47 itojun int i_n; 420 1.4 hpeyerl struct in_multi *i_inm; 421 1.4 hpeyerl }; 422 1.4 hpeyerl 423 1.68 rmind bool in_multi_group(struct in_addr, struct ifnet *, int); 424 1.68 rmind struct in_multi *in_first_multi(struct in_multistep *); 425 1.68 rmind struct in_multi *in_next_multi(struct in_multistep *); 426 1.68 rmind struct in_multi *in_lookup_multi(struct in_addr, struct ifnet *); 427 1.68 rmind struct in_multi *in_addmulti(struct in_addr *, struct ifnet *); 428 1.68 rmind void in_delmulti(struct in_multi *); 429 1.68 rmind 430 1.68 rmind void in_multi_lock(int); 431 1.68 rmind void in_multi_unlock(void); 432 1.68 rmind int in_multi_lock_held(void); 433 1.4 hpeyerl 434 1.36 thorpej struct ifaddr; 435 1.36 thorpej 436 1.86 roy int in_ifinit(struct ifnet *, struct in_ifaddr *, 437 1.86 roy const struct sockaddr_in *, const struct sockaddr_in *, int); 438 1.53 itojun void in_savemkludge(struct in_ifaddr *); 439 1.53 itojun void in_restoremkludge(struct in_ifaddr *, struct ifnet *); 440 1.53 itojun void in_purgemkludge(struct ifnet *); 441 1.53 itojun void in_setmaxmtu(void); 442 1.70 rtr int in_control(struct socket *, u_long, void *, struct ifnet *); 443 1.60 dyoung void in_purgeaddr(struct ifaddr *); 444 1.53 itojun void in_purgeif(struct ifnet *); 445 1.90 knakahar void in_addrhash_insert(struct in_ifaddr *); 446 1.90 knakahar void in_addrhash_remove(struct in_ifaddr *); 447 1.53 itojun int ipflow_fastforward(struct mbuf *); 448 1.61 matt 449 1.65 rmind extern uint16_t ip_id; 450 1.65 rmind extern int ip_do_randomid; 451 1.61 matt 452 1.101 christos static __inline uint16_t 453 1.101 christos ip_randomid(void) 454 1.101 christos { 455 1.101 christos 456 1.101 christos uint16_t id = (uint16_t)cprng_fast32(); 457 1.101 christos return id ? id : 1; 458 1.101 christos } 459 1.101 christos 460 1.61 matt /* 461 1.65 rmind * ip_newid_range: "allocate" num contiguous IP IDs. 462 1.61 matt * 463 1.65 rmind * => Return the first ID. 464 1.61 matt */ 465 1.61 matt static __inline uint16_t 466 1.105 ozaki ip_newid_range(u_int num) 467 1.61 matt { 468 1.61 matt uint16_t id; 469 1.61 matt 470 1.61 matt if (ip_do_randomid) { 471 1.61 matt /* XXX ignore num */ 472 1.101 christos return ip_randomid(); 473 1.61 matt } 474 1.61 matt 475 1.65 rmind /* Never allow an IP ID of 0 (detect wrap). */ 476 1.65 rmind if ((uint16_t)(ip_id + num) < ip_id) { 477 1.61 matt ip_id = 1; 478 1.65 rmind } 479 1.61 matt id = htons(ip_id); 480 1.61 matt ip_id += num; 481 1.61 matt return id; 482 1.61 matt } 483 1.61 matt 484 1.61 matt static __inline uint16_t 485 1.105 ozaki ip_newid(void) 486 1.61 matt { 487 1.65 rmind 488 1.105 ozaki return ip_newid_range(1); 489 1.61 matt } 490 1.35 itojun 491 1.55 atatat #ifdef SYSCTLFN_PROTO 492 1.55 atatat int sysctl_inpcblist(SYSCTLFN_PROTO); 493 1.55 atatat #endif 494 1.55 atatat 495 1.74 ozaki #define LLTABLE(ifp) \ 496 1.74 ozaki ((struct in_ifinfo *)(ifp)->if_afdata[AF_INET])->ii_llt 497 1.74 ozaki 498 1.65 rmind #endif /* !_KERNEL */ 499 1.35 itojun 500 1.35 itojun /* INET6 stuff */ 501 1.35 itojun #include <netinet6/in6_var.h> 502 1.20 perry 503 1.56 elad #endif /* !_NETINET_IN_VAR_H_ */ 504