1251881Speter/*- 2251881Speter * Copyright (c) 1985, 1986, 1993 3251881Speter * The Regents of the University of California. All rights reserved. 4251881Speter * 5251881Speter * Redistribution and use in source and binary forms, with or without 6251881Speter * modification, are permitted provided that the following conditions 7251881Speter * are met: 8251881Speter * 1. Redistributions of source code must retain the above copyright 9251881Speter * notice, this list of conditions and the following disclaimer. 10251881Speter * 2. Redistributions in binary form must reproduce the above copyright 11251881Speter * notice, this list of conditions and the following disclaimer in the 12251881Speter * documentation and/or other materials provided with the distribution. 13251881Speter * 4. Neither the name of the University nor the names of its contributors 14251881Speter * may be used to endorse or promote products derived from this software 15251881Speter * without specific prior written permission. 16251881Speter * 17251881Speter * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18251881Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19251881Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20251881Speter * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21251881Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22251881Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23251881Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24251881Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25251881Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26251881Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27251881Speter * SUCH DAMAGE. 28251881Speter * 29251881Speter * @(#)in_var.h 8.2 (Berkeley) 1/9/95 30251881Speter * $FreeBSD: releng/10.2/sys/netinet/in_var.h 250300 2013-05-06 16:42:18Z andre $ 31251881Speter */ 32251881Speter 33251881Speter#ifndef _NETINET_IN_VAR_H_ 34251881Speter#define _NETINET_IN_VAR_H_ 35251881Speter 36251881Speter#include <sys/queue.h> 37251881Speter#include <sys/fnv_hash.h> 38251881Speter#include <sys/tree.h> 39251881Speter 40251881Speterstruct igmp_ifinfo; 41251881Speterstruct in_multi; 42251881Speterstruct lltable; 43251881Speter 44251881Speter/* 45251881Speter * IPv4 per-interface state. 46251881Speter */ 47251881Speterstruct in_ifinfo { 48251881Speter struct lltable *ii_llt; /* ARP state */ 49251881Speter struct igmp_ifinfo *ii_igmp; /* IGMP state */ 50251881Speter struct in_multi *ii_allhosts; /* 224.0.0.1 membership */ 51251881Speter}; 52251881Speter 53251881Speter/* 54251881Speter * Interface address, Internet version. One of these structures 55251881Speter * is allocated for each Internet address on an interface. 56251881Speter * The ifaddr structure contains the protocol-independent part 57251881Speter * of the structure and is assumed to be first. 58251881Speter */ 59251881Speterstruct in_ifaddr { 60251881Speter struct ifaddr ia_ifa; /* protocol-independent info */ 61251881Speter#define ia_ifp ia_ifa.ifa_ifp 62251881Speter#define ia_flags ia_ifa.ifa_flags 63251881Speter /* ia_subnet{,mask} in host order */ 64251881Speter u_long ia_subnet; /* subnet address */ 65251881Speter u_long ia_subnetmask; /* mask of subnet */ 66251881Speter LIST_ENTRY(in_ifaddr) ia_hash; /* entry in bucket of inet addresses */ 67251881Speter TAILQ_ENTRY(in_ifaddr) ia_link; /* list of internet addresses */ 68251881Speter struct sockaddr_in ia_addr; /* reserve space for interface name */ 69251881Speter struct sockaddr_in ia_dstaddr; /* reserve space for broadcast addr */ 70251881Speter#define ia_broadaddr ia_dstaddr 71251881Speter struct sockaddr_in ia_sockmask; /* reserve space for general netmask */ 72251881Speter}; 73251881Speter 74251881Speterstruct in_aliasreq { 75251881Speter char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 76251881Speter struct sockaddr_in ifra_addr; 77251881Speter struct sockaddr_in ifra_broadaddr; 78251881Speter#define ifra_dstaddr ifra_broadaddr 79251881Speter struct sockaddr_in ifra_mask; 80251881Speter int ifra_vhid; 81251881Speter}; 82251881Speter/* 83251881Speter * Given a pointer to an in_ifaddr (ifaddr), 84251881Speter * return a pointer to the addr as a sockaddr_in. 85251881Speter */ 86251881Speter#define IA_SIN(ia) (&(((struct in_ifaddr *)(ia))->ia_addr)) 87251881Speter#define IA_DSTSIN(ia) (&(((struct in_ifaddr *)(ia))->ia_dstaddr)) 88251881Speter#define IA_MASKSIN(ia) (&(((struct in_ifaddr *)(ia))->ia_sockmask)) 89251881Speter 90251881Speter#define IN_LNAOF(in, ifa) \ 91251881Speter ((ntohl((in).s_addr) & ~((struct in_ifaddr *)(ifa)->ia_subnetmask)) 92251881Speter 93251881Speter 94251881Speter#ifdef _KERNEL 95251881Speterextern u_char inetctlerrmap[]; 96251881Speter 97251881Speter#define LLTABLE(ifp) \ 98251881Speter ((struct in_ifinfo *)(ifp)->if_afdata[AF_INET])->ii_llt 99251881Speter/* 100251881Speter * Hash table for IP addresses. 101251881Speter */ 102251881SpeterTAILQ_HEAD(in_ifaddrhead, in_ifaddr); 103251881SpeterLIST_HEAD(in_ifaddrhashhead, in_ifaddr); 104251881Speter 105251881SpeterVNET_DECLARE(struct in_ifaddrhashhead *, in_ifaddrhashtbl); 106251881SpeterVNET_DECLARE(struct in_ifaddrhead, in_ifaddrhead); 107251881SpeterVNET_DECLARE(u_long, in_ifaddrhmask); /* mask for hash table */ 108251881Speter 109251881Speter#define V_in_ifaddrhashtbl VNET(in_ifaddrhashtbl) 110251881Speter#define V_in_ifaddrhead VNET(in_ifaddrhead) 111251881Speter#define V_in_ifaddrhmask VNET(in_ifaddrhmask) 112251881Speter 113251881Speter#define INADDR_NHASH_LOG2 9 114251881Speter#define INADDR_NHASH (1 << INADDR_NHASH_LOG2) 115251881Speter#define INADDR_HASHVAL(x) fnv_32_buf((&(x)), sizeof(x), FNV1_32_INIT) 116251881Speter#define INADDR_HASH(x) \ 117251881Speter (&V_in_ifaddrhashtbl[INADDR_HASHVAL(x) & V_in_ifaddrhmask]) 118251881Speter 119251881Speterextern struct rwlock in_ifaddr_lock; 120251881Speter 121251881Speter#define IN_IFADDR_LOCK_ASSERT() rw_assert(&in_ifaddr_lock, RA_LOCKED) 122251881Speter#define IN_IFADDR_RLOCK() rw_rlock(&in_ifaddr_lock) 123251881Speter#define IN_IFADDR_RLOCK_ASSERT() rw_assert(&in_ifaddr_lock, RA_RLOCKED) 124251881Speter#define IN_IFADDR_RUNLOCK() rw_runlock(&in_ifaddr_lock) 125251881Speter#define IN_IFADDR_WLOCK() rw_wlock(&in_ifaddr_lock) 126251881Speter#define IN_IFADDR_WLOCK_ASSERT() rw_assert(&in_ifaddr_lock, RA_WLOCKED) 127251881Speter#define IN_IFADDR_WUNLOCK() rw_wunlock(&in_ifaddr_lock) 128251881Speter 129251881Speter/* 130251881Speter * Macro for finding the internet address structure (in_ifaddr) 131251881Speter * corresponding to one of our IP addresses (in_addr). 132251881Speter */ 133251881Speter#define INADDR_TO_IFADDR(addr, ia) \ 134251881Speter /* struct in_addr addr; */ \ 135251881Speter /* struct in_ifaddr *ia; */ \ 136251881Speterdo { \ 137251881Speter\ 138251881Speter LIST_FOREACH(ia, INADDR_HASH((addr).s_addr), ia_hash) \ 139251881Speter if (IA_SIN(ia)->sin_addr.s_addr == (addr).s_addr) \ 140251881Speter break; \ 141251881Speter} while (0) 142251881Speter 143251881Speter/* 144251881Speter * Macro for finding the interface (ifnet structure) corresponding to one 145251881Speter * of our IP addresses. 146251881Speter */ 147251881Speter#define INADDR_TO_IFP(addr, ifp) \ 148251881Speter /* struct in_addr addr; */ \ 149251881Speter /* struct ifnet *ifp; */ \ 150251881Speter{ \ 151251881Speter struct in_ifaddr *ia; \ 152251881Speter\ 153251881Speter INADDR_TO_IFADDR(addr, ia); \ 154251881Speter (ifp) = (ia == NULL) ? NULL : ia->ia_ifp; \ 155251881Speter} 156251881Speter 157251881Speter/* 158251881Speter * Macro for finding the internet address structure (in_ifaddr) corresponding 159251881Speter * to a given interface (ifnet structure). 160251881Speter */ 161251881Speter#define IFP_TO_IA(ifp, ia) \ 162251881Speter /* struct ifnet *ifp; */ \ 163251881Speter /* struct in_ifaddr *ia; */ \ 164251881Speterdo { \ 165251881Speter IN_IFADDR_RLOCK(); \ 166251881Speter for ((ia) = TAILQ_FIRST(&V_in_ifaddrhead); \ 167251881Speter (ia) != NULL && (ia)->ia_ifp != (ifp); \ 168251881Speter (ia) = TAILQ_NEXT((ia), ia_link)) \ 169251881Speter continue; \ 170251881Speter if ((ia) != NULL) \ 171251881Speter ifa_ref(&(ia)->ia_ifa); \ 172251881Speter IN_IFADDR_RUNLOCK(); \ 173251881Speter} while (0) 174251881Speter#endif 175251881Speter 176251881Speter/* 177251881Speter * IP datagram reassembly. 178251881Speter */ 179251881Speter#define IPREASS_NHASH_LOG2 6 180251881Speter#define IPREASS_NHASH (1 << IPREASS_NHASH_LOG2) 181251881Speter#define IPREASS_HMASK (IPREASS_NHASH - 1) 182251881Speter#define IPREASS_HASH(x,y) \ 183251881Speter (((((x) & 0xF) | ((((x) >> 8) & 0xF) << 4)) ^ (y)) & IPREASS_HMASK) 184251881Speter 185251881Speter/* 186251881Speter * Legacy IPv4 IGMP per-link structure. 187251881Speter */ 188251881Speterstruct router_info { 189251881Speter struct ifnet *rti_ifp; 190251881Speter int rti_type; /* type of router which is querier on this interface */ 191251881Speter int rti_time; /* # of slow timeouts since last old query */ 192251881Speter SLIST_ENTRY(router_info) rti_list; 193251881Speter}; 194251881Speter 195251881Speter/* 196251881Speter * Per-interface IGMP router version information. 197251881Speter */ 198251881Speterstruct igmp_ifinfo { 199251881Speter LIST_ENTRY(igmp_ifinfo) igi_link; 200251881Speter struct ifnet *igi_ifp; /* interface this instance belongs to */ 201251881Speter uint32_t igi_version; /* IGMPv3 Host Compatibility Mode */ 202251881Speter uint32_t igi_v1_timer; /* IGMPv1 Querier Present timer (s) */ 203251881Speter uint32_t igi_v2_timer; /* IGMPv2 Querier Present timer (s) */ 204251881Speter uint32_t igi_v3_timer; /* IGMPv3 General Query (interface) timer (s)*/ 205251881Speter uint32_t igi_flags; /* IGMP per-interface flags */ 206251881Speter uint32_t igi_rv; /* IGMPv3 Robustness Variable */ 207251881Speter uint32_t igi_qi; /* IGMPv3 Query Interval (s) */ 208251881Speter uint32_t igi_qri; /* IGMPv3 Query Response Interval (s) */ 209251881Speter uint32_t igi_uri; /* IGMPv3 Unsolicited Report Interval (s) */ 210251881Speter SLIST_HEAD(,in_multi) igi_relinmhead; /* released groups */ 211251881Speter struct ifqueue igi_gq; /* queue of general query responses */ 212251881Speter}; 213251881Speter 214251881Speter#define IGIF_SILENT 0x00000001 /* Do not use IGMP on this ifp */ 215251881Speter#define IGIF_LOOPBACK 0x00000002 /* Send IGMP reports to loopback */ 216251881Speter 217251881Speter/* 218251881Speter * IPv4 multicast IGMP-layer source entry. 219251881Speter */ 220251881Speterstruct ip_msource { 221251881Speter RB_ENTRY(ip_msource) ims_link; /* RB tree links */ 222251881Speter in_addr_t ims_haddr; /* host byte order */ 223251881Speter struct ims_st { 224251881Speter uint16_t ex; /* # of exclusive members */ 225251881Speter uint16_t in; /* # of inclusive members */ 226251881Speter } ims_st[2]; /* state at t0, t1 */ 227251881Speter uint8_t ims_stp; /* pending query */ 228251881Speter}; 229251881Speter 230251881Speter/* 231251881Speter * IPv4 multicast PCB-layer source entry. 232251881Speter */ 233251881Speterstruct in_msource { 234251881Speter RB_ENTRY(ip_msource) ims_link; /* RB tree links */ 235251881Speter in_addr_t ims_haddr; /* host byte order */ 236251881Speter uint8_t imsl_st[2]; /* state before/at commit */ 237251881Speter}; 238251881Speter 239251881SpeterRB_HEAD(ip_msource_tree, ip_msource); /* define struct ip_msource_tree */ 240251881Speter 241251881Speterstatic __inline int 242251881Speterip_msource_cmp(const struct ip_msource *a, const struct ip_msource *b) 243251881Speter{ 244251881Speter 245251881Speter if (a->ims_haddr < b->ims_haddr) 246251881Speter return (-1); 247251881Speter if (a->ims_haddr == b->ims_haddr) 248251881Speter return (0); 249251881Speter return (1); 250251881Speter} 251251881SpeterRB_PROTOTYPE(ip_msource_tree, ip_msource, ims_link, ip_msource_cmp); 252251881Speter 253251881Speter/* 254251881Speter * IPv4 multicast PCB-layer group filter descriptor. 255251881Speter */ 256251881Speterstruct in_mfilter { 257251881Speter struct ip_msource_tree imf_sources; /* source list for (S,G) */ 258251881Speter u_long imf_nsrc; /* # of source entries */ 259251881Speter uint8_t imf_st[2]; /* state before/at commit */ 260251881Speter}; 261251881Speter 262251881Speter/* 263251881Speter * IPv4 group descriptor. 264251881Speter * 265251881Speter * For every entry on an ifnet's if_multiaddrs list which represents 266251881Speter * an IP multicast group, there is one of these structures. 267251881Speter * 268251881Speter * If any source filters are present, then a node will exist in the RB-tree 269251881Speter * to permit fast lookup by source whenever an operation takes place. 270251881Speter * This permits pre-order traversal when we issue reports. 271251881Speter * Source filter trees are kept separately from the socket layer to 272251881Speter * greatly simplify locking. 273251881Speter * 274251881Speter * When IGMPv3 is active, inm_timer is the response to group query timer. 275251881Speter * The state-change timer inm_sctimer is separate; whenever state changes 276251881Speter * for the group the state change record is generated and transmitted, 277251881Speter * and kept if retransmissions are necessary. 278251881Speter * 279251881Speter * FUTURE: inm_link is now only used when groups are being purged 280251881Speter * on a detaching ifnet. It could be demoted to a SLIST_ENTRY, but 281251881Speter * because it is at the very start of the struct, we can't do this 282251881Speter * w/o breaking the ABI for ifmcstat. 283251881Speter */ 284251881Speterstruct in_multi { 285251881Speter LIST_ENTRY(in_multi) inm_link; /* to-be-released by in_ifdetach */ 286251881Speter struct in_addr inm_addr; /* IP multicast address, convenience */ 287251881Speter struct ifnet *inm_ifp; /* back pointer to ifnet */ 288251881Speter struct ifmultiaddr *inm_ifma; /* back pointer to ifmultiaddr */ 289251881Speter u_int inm_timer; /* IGMPv1/v2 group / v3 query timer */ 290251881Speter u_int inm_state; /* state of the membership */ 291251881Speter void *inm_rti; /* unused, legacy field */ 292251881Speter u_int inm_refcount; /* reference count */ 293251881Speter 294251881Speter /* New fields for IGMPv3 follow. */ 295251881Speter struct igmp_ifinfo *inm_igi; /* IGMP info */ 296251881Speter SLIST_ENTRY(in_multi) inm_nrele; /* to-be-released by IGMP */ 297251881Speter struct ip_msource_tree inm_srcs; /* tree of sources */ 298251881Speter u_long inm_nsrc; /* # of tree entries */ 299251881Speter 300251881Speter struct ifqueue inm_scq; /* queue of pending 301251881Speter * state-change packets */ 302251881Speter struct timeval inm_lastgsrtv; /* Time of last G-S-R query */ 303251881Speter uint16_t inm_sctimer; /* state-change timer */ 304251881Speter uint16_t inm_scrv; /* state-change rexmit count */ 305251881Speter 306251881Speter /* 307251881Speter * SSM state counters which track state at T0 (the time the last 308251881Speter * state-change report's RV timer went to zero) and T1 309251881Speter * (time of pending report, i.e. now). 310251881Speter * Used for computing IGMPv3 state-change reports. Several refcounts 311251881Speter * are maintained here to optimize for common use-cases. 312251881Speter */ 313251881Speter struct inm_st { 314251881Speter uint16_t iss_fmode; /* IGMP filter mode */ 315251881Speter uint16_t iss_asm; /* # of ASM listeners */ 316251881Speter uint16_t iss_ex; /* # of exclusive members */ 317251881Speter uint16_t iss_in; /* # of inclusive members */ 318251881Speter uint16_t iss_rec; /* # of recorded sources */ 319251881Speter } inm_st[2]; /* state at t0, t1 */ 320251881Speter}; 321251881Speter 322251881Speter/* 323251881Speter * Helper function to derive the filter mode on a source entry 324251881Speter * from its internal counters. Predicates are: 325251881Speter * A source is only excluded if all listeners exclude it. 326251881Speter * A source is only included if no listeners exclude it, 327251881Speter * and at least one listener includes it. 328251881Speter * May be used by ifmcstat(8). 329251881Speter */ 330251881Speterstatic __inline uint8_t 331251881Speterims_get_mode(const struct in_multi *inm, const struct ip_msource *ims, 332251881Speter uint8_t t) 333251881Speter{ 334251881Speter 335251881Speter t = !!t; 336251881Speter if (inm->inm_st[t].iss_ex > 0 && 337251881Speter inm->inm_st[t].iss_ex == ims->ims_st[t].ex) 338251881Speter return (MCAST_EXCLUDE); 339251881Speter else if (ims->ims_st[t].in > 0 && ims->ims_st[t].ex == 0) 340251881Speter return (MCAST_INCLUDE); 341251881Speter return (MCAST_UNDEFINED); 342251881Speter} 343251881Speter 344251881Speter#ifdef _KERNEL 345251881Speter 346251881Speter#ifdef SYSCTL_DECL 347251881SpeterSYSCTL_DECL(_net_inet); 348251881SpeterSYSCTL_DECL(_net_inet_ip); 349251881SpeterSYSCTL_DECL(_net_inet_raw); 350251881Speter#endif 351251881Speter 352251881Speter/* 353251881Speter * Lock macros for IPv4 layer multicast address lists. IPv4 lock goes 354251881Speter * before link layer multicast locks in the lock order. In most cases, 355251881Speter * consumers of IN_*_MULTI() macros should acquire the locks before 356251881Speter * calling them; users of the in_{add,del}multi() functions should not. 357251881Speter */ 358251881Speterextern struct mtx in_multi_mtx; 359251881Speter#define IN_MULTI_LOCK() mtx_lock(&in_multi_mtx) 360251881Speter#define IN_MULTI_UNLOCK() mtx_unlock(&in_multi_mtx) 361251881Speter#define IN_MULTI_LOCK_ASSERT() mtx_assert(&in_multi_mtx, MA_OWNED) 362251881Speter#define IN_MULTI_UNLOCK_ASSERT() mtx_assert(&in_multi_mtx, MA_NOTOWNED) 363251881Speter 364251881Speter/* 365251881Speter * Function for looking up an in_multi record for an IPv4 multicast address 366251881Speter * on a given interface. ifp must be valid. If no record found, return NULL. 367251881Speter * The IN_MULTI_LOCK and IF_ADDR_LOCK on ifp must be held. 368251881Speter */ 369251881Speterstatic __inline struct in_multi * 370251881Speterinm_lookup_locked(struct ifnet *ifp, const struct in_addr ina) 371251881Speter{ 372251881Speter struct ifmultiaddr *ifma; 373251881Speter struct in_multi *inm; 374251881Speter 375251881Speter IN_MULTI_LOCK_ASSERT(); 376251881Speter IF_ADDR_LOCK_ASSERT(ifp); 377251881Speter 378251881Speter inm = NULL; 379251881Speter TAILQ_FOREACH(ifma, &((ifp)->if_multiaddrs), ifma_link) { 380251881Speter if (ifma->ifma_addr->sa_family == AF_INET) { 381251881Speter inm = (struct in_multi *)ifma->ifma_protospec; 382251881Speter if (inm->inm_addr.s_addr == ina.s_addr) 383251881Speter break; 384251881Speter inm = NULL; 385251881Speter } 386251881Speter } 387251881Speter return (inm); 388251881Speter} 389251881Speter 390251881Speter/* 391251881Speter * Wrapper for inm_lookup_locked(). 392251881Speter * The IF_ADDR_LOCK will be taken on ifp and released on return. 393251881Speter */ 394251881Speterstatic __inline struct in_multi * 395251881Speterinm_lookup(struct ifnet *ifp, const struct in_addr ina) 396251881Speter{ 397251881Speter struct in_multi *inm; 398251881Speter 399251881Speter IN_MULTI_LOCK_ASSERT(); 400251881Speter IF_ADDR_RLOCK(ifp); 401251881Speter inm = inm_lookup_locked(ifp, ina); 402251881Speter IF_ADDR_RUNLOCK(ifp); 403251881Speter 404251881Speter return (inm); 405251881Speter} 406251881Speter 407251881Speter/* Acquire an in_multi record. */ 408251881Speterstatic __inline void 409251881Speterinm_acquire_locked(struct in_multi *inm) 410251881Speter{ 411251881Speter 412251881Speter IN_MULTI_LOCK_ASSERT(); 413251881Speter ++inm->inm_refcount; 414251881Speter} 415251881Speter 416251881Speter/* 417251881Speter * Return values for imo_multi_filter(). 418251881Speter */ 419251881Speter#define MCAST_PASS 0 /* Pass */ 420251881Speter#define MCAST_NOTGMEMBER 1 /* This host not a member of group */ 421251881Speter#define MCAST_NOTSMEMBER 2 /* This host excluded source */ 422251881Speter#define MCAST_MUTED 3 /* [deprecated] */ 423251881Speter 424251881Speterstruct rtentry; 425251881Speterstruct route; 426251881Speterstruct ip_moptions; 427251881Speterstruct radix_node_head; 428251881Speter 429251881Speterint imo_multi_filter(const struct ip_moptions *, const struct ifnet *, 430251881Speter const struct sockaddr *, const struct sockaddr *); 431251881Spetervoid inm_commit(struct in_multi *); 432251881Spetervoid inm_clear_recorded(struct in_multi *); 433251881Spetervoid inm_print(const struct in_multi *); 434251881Speterint inm_record_source(struct in_multi *inm, const in_addr_t); 435251881Spetervoid inm_release(struct in_multi *); 436251881Spetervoid inm_release_locked(struct in_multi *); 437251881Speterstruct in_multi * 438251881Speter in_addmulti(struct in_addr *, struct ifnet *); 439251881Spetervoid in_delmulti(struct in_multi *); 440251881Speterint in_joingroup(struct ifnet *, const struct in_addr *, 441251881Speter /*const*/ struct in_mfilter *, struct in_multi **); 442251881Speterint in_joingroup_locked(struct ifnet *, const struct in_addr *, 443251881Speter /*const*/ struct in_mfilter *, struct in_multi **); 444251881Speterint in_leavegroup(struct in_multi *, /*const*/ struct in_mfilter *); 445251881Speterint in_leavegroup_locked(struct in_multi *, 446251881Speter /*const*/ struct in_mfilter *); 447251881Speterint in_control(struct socket *, u_long, caddr_t, struct ifnet *, 448251881Speter struct thread *); 449251881Spetervoid in_rtqdrain(void); 450251881Speterint in_addprefix(struct in_ifaddr *, int); 451251881Speterint in_scrubprefix(struct in_ifaddr *, u_int); 452251881Spetervoid ip_input(struct mbuf *); 453251881Speterint in_ifadown(struct ifaddr *ifa, int); 454251881Spetervoid in_ifscrub(struct ifnet *, struct in_ifaddr *, u_int); 455251881Speterstruct mbuf *ip_fastforward(struct mbuf *); 456251881Spetervoid *in_domifattach(struct ifnet *); 457251881Spetervoid in_domifdetach(struct ifnet *, void *); 458251881Speter 459251881Speter 460251881Speter/* XXX */ 461251881Spetervoid in_rtalloc_ign(struct route *ro, u_long ignflags, u_int fibnum); 462251881Spetervoid in_rtalloc(struct route *ro, u_int fibnum); 463251881Speterstruct rtentry *in_rtalloc1(struct sockaddr *, int, u_long, u_int); 464251881Spetervoid in_rtredirect(struct sockaddr *, struct sockaddr *, 465251881Speter struct sockaddr *, int, struct sockaddr *, u_int); 466251881Speterint in_rtrequest(int, struct sockaddr *, 467251881Speter struct sockaddr *, struct sockaddr *, int, struct rtentry **, u_int); 468251881Spetervoid in_setmatchfunc(struct radix_node_head *, int); 469251881Speter 470251881Speter#if 0 471251881Speterint in_rt_getifa(struct rt_addrinfo *, u_int fibnum); 472251881Speterint in_rtioctl(u_long, caddr_t, u_int); 473251881Speterint in_rtrequest1(int, struct rt_addrinfo *, struct rtentry **, u_int); 474251881Speter#endif 475251881Speter#endif /* _KERNEL */ 476251881Speter 477251881Speter/* INET6 stuff */ 478251881Speter#include <netinet6/in6_var.h> 479251881Speter 480251881Speter#endif /* _NETINET_IN_VAR_H_ */ 481251881Speter