12c2b37adSJustin Hibbits /*- 22c2b37adSJustin Hibbits * SPDX-License-Identifier: BSD-3-Clause 32c2b37adSJustin Hibbits * 42c2b37adSJustin Hibbits * Copyright (c) 1982, 1986, 1989, 1993 52c2b37adSJustin Hibbits * The Regents of the University of California. All rights reserved. 62c2b37adSJustin Hibbits * 72c2b37adSJustin Hibbits * Redistribution and use in source and binary forms, with or without 82c2b37adSJustin Hibbits * modification, are permitted provided that the following conditions 92c2b37adSJustin Hibbits * are met: 102c2b37adSJustin Hibbits * 1. Redistributions of source code must retain the above copyright 112c2b37adSJustin Hibbits * notice, this list of conditions and the following disclaimer. 122c2b37adSJustin Hibbits * 2. Redistributions in binary form must reproduce the above copyright 132c2b37adSJustin Hibbits * notice, this list of conditions and the following disclaimer in the 142c2b37adSJustin Hibbits * documentation and/or other materials provided with the distribution. 152c2b37adSJustin Hibbits * 3. Neither the name of the University nor the names of its contributors 162c2b37adSJustin Hibbits * may be used to endorse or promote products derived from this software 172c2b37adSJustin Hibbits * without specific prior written permission. 182c2b37adSJustin Hibbits * 192c2b37adSJustin Hibbits * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 202c2b37adSJustin Hibbits * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 212c2b37adSJustin Hibbits * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 222c2b37adSJustin Hibbits * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 232c2b37adSJustin Hibbits * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 242c2b37adSJustin Hibbits * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 252c2b37adSJustin Hibbits * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 262c2b37adSJustin Hibbits * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 272c2b37adSJustin Hibbits * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 282c2b37adSJustin Hibbits * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 292c2b37adSJustin Hibbits * SUCH DAMAGE. 302c2b37adSJustin Hibbits */ 312c2b37adSJustin Hibbits 322c2b37adSJustin Hibbits #ifndef _NET_IF_PRIVATE_H_ 332c2b37adSJustin Hibbits #define _NET_IF_PRIVATE_H_ 342c2b37adSJustin Hibbits 352c2b37adSJustin Hibbits #ifdef _KERNEL 362c2b37adSJustin Hibbits /* 372c2b37adSJustin Hibbits * Structure defining a network interface. 382c2b37adSJustin Hibbits */ 392c2b37adSJustin Hibbits struct ifnet { 402c2b37adSJustin Hibbits /* General book keeping of interface lists. */ 412c2b37adSJustin Hibbits CK_STAILQ_ENTRY(ifnet) if_link; /* all struct ifnets are chained (CK_) */ 422c2b37adSJustin Hibbits LIST_ENTRY(ifnet) if_clones; /* interfaces of a cloner */ 432c2b37adSJustin Hibbits CK_STAILQ_HEAD(, ifg_list) if_groups; /* linked list of groups per if (CK_) */ 442c2b37adSJustin Hibbits /* protected by if_addr_lock */ 452c2b37adSJustin Hibbits u_char if_alloctype; /* if_type at time of allocation */ 462c2b37adSJustin Hibbits uint8_t if_numa_domain; /* NUMA domain of device */ 472c2b37adSJustin Hibbits /* Driver and protocol specific information that remains stable. */ 482c2b37adSJustin Hibbits void *if_softc; /* pointer to driver state */ 492c2b37adSJustin Hibbits void *if_llsoftc; /* link layer softc */ 502c2b37adSJustin Hibbits void *if_l2com; /* pointer to protocol bits */ 512c2b37adSJustin Hibbits const char *if_dname; /* driver name */ 522c2b37adSJustin Hibbits int if_dunit; /* unit or IF_DUNIT_NONE */ 532c2b37adSJustin Hibbits u_short if_index; /* numeric abbreviation for this if */ 542c2b37adSJustin Hibbits u_short if_idxgen; /* ... and its generation count */ 552c2b37adSJustin Hibbits char if_xname[IFNAMSIZ]; /* external name (name + unit) */ 562c2b37adSJustin Hibbits char *if_description; /* interface description */ 572c2b37adSJustin Hibbits 582c2b37adSJustin Hibbits /* Variable fields that are touched by the stack and drivers. */ 592c2b37adSJustin Hibbits int if_flags; /* up/down, broadcast, etc. */ 602c2b37adSJustin Hibbits int if_drv_flags; /* driver-managed status flags */ 612c2b37adSJustin Hibbits int if_capabilities; /* interface features & capabilities */ 622c2b37adSJustin Hibbits int if_capabilities2; /* part 2 */ 632c2b37adSJustin Hibbits int if_capenable; /* enabled features & capabilities */ 642c2b37adSJustin Hibbits int if_capenable2; /* part 2 */ 652c2b37adSJustin Hibbits void *if_linkmib; /* link-type-specific MIB data */ 662c2b37adSJustin Hibbits size_t if_linkmiblen; /* length of above data */ 672c2b37adSJustin Hibbits u_int if_refcount; /* reference count */ 682c2b37adSJustin Hibbits 692c2b37adSJustin Hibbits /* These fields are shared with struct if_data. */ 702c2b37adSJustin Hibbits uint8_t if_type; /* ethernet, tokenring, etc */ 712c2b37adSJustin Hibbits uint8_t if_addrlen; /* media address length */ 722c2b37adSJustin Hibbits uint8_t if_hdrlen; /* media header length */ 732c2b37adSJustin Hibbits uint8_t if_link_state; /* current link state */ 742c2b37adSJustin Hibbits uint32_t if_mtu; /* maximum transmission unit */ 752c2b37adSJustin Hibbits uint32_t if_metric; /* routing metric (external only) */ 762c2b37adSJustin Hibbits uint64_t if_baudrate; /* linespeed */ 772c2b37adSJustin Hibbits uint64_t if_hwassist; /* HW offload capabilities, see IFCAP */ 782c2b37adSJustin Hibbits time_t if_epoch; /* uptime at attach or stat reset */ 792c2b37adSJustin Hibbits struct timeval if_lastchange; /* time of last administrative change */ 802c2b37adSJustin Hibbits 812c2b37adSJustin Hibbits struct ifaltq if_snd; /* output queue (includes altq) */ 822c2b37adSJustin Hibbits struct task if_linktask; /* task for link change events */ 832c2b37adSJustin Hibbits struct task if_addmultitask; /* task for SIOCADDMULTI */ 842c2b37adSJustin Hibbits 852c2b37adSJustin Hibbits /* Addresses of different protocol families assigned to this if. */ 862c2b37adSJustin Hibbits struct mtx if_addr_lock; /* lock to protect address lists */ 872c2b37adSJustin Hibbits /* 882c2b37adSJustin Hibbits * if_addrhead is the list of all addresses associated to 892c2b37adSJustin Hibbits * an interface. 902c2b37adSJustin Hibbits * Some code in the kernel assumes that first element 912c2b37adSJustin Hibbits * of the list has type AF_LINK, and contains sockaddr_dl 922c2b37adSJustin Hibbits * addresses which store the link-level address and the name 932c2b37adSJustin Hibbits * of the interface. 942c2b37adSJustin Hibbits * However, access to the AF_LINK address through this 952c2b37adSJustin Hibbits * field is deprecated. Use if_addr instead. 962c2b37adSJustin Hibbits */ 972c2b37adSJustin Hibbits struct ifaddrhead if_addrhead; /* linked list of addresses per if */ 982c2b37adSJustin Hibbits struct ifmultihead if_multiaddrs; /* multicast addresses configured */ 992c2b37adSJustin Hibbits int if_amcount; /* number of all-multicast requests */ 1002c2b37adSJustin Hibbits struct ifaddr *if_addr; /* pointer to link-level address */ 1012c2b37adSJustin Hibbits void *if_hw_addr; /* hardware link-level address */ 1022c2b37adSJustin Hibbits const u_int8_t *if_broadcastaddr; /* linklevel broadcast bytestring */ 1032c2b37adSJustin Hibbits struct mtx if_afdata_lock; 1042c2b37adSJustin Hibbits void *if_afdata[AF_MAX]; 1052c2b37adSJustin Hibbits int if_afdata_initialized; 1062c2b37adSJustin Hibbits 1072c2b37adSJustin Hibbits /* Additional features hung off the interface. */ 1082c2b37adSJustin Hibbits u_int if_fib; /* interface FIB */ 1092c2b37adSJustin Hibbits struct vnet *if_vnet; /* pointer to network stack instance */ 1102c2b37adSJustin Hibbits struct vnet *if_home_vnet; /* where this ifnet originates from */ 1112c2b37adSJustin Hibbits struct ifvlantrunk *if_vlantrunk; /* pointer to 802.1q data */ 1122c2b37adSJustin Hibbits struct bpf_if *if_bpf; /* packet filter structure */ 1132c2b37adSJustin Hibbits int if_pcount; /* number of promiscuous listeners */ 1142c2b37adSJustin Hibbits void *if_bridge; /* bridge glue */ 1152c2b37adSJustin Hibbits void *if_lagg; /* lagg glue */ 1162c2b37adSJustin Hibbits void *if_pf_kif; /* pf glue */ 1172c2b37adSJustin Hibbits struct carp_if *if_carp; /* carp interface structure */ 1182c2b37adSJustin Hibbits struct label *if_label; /* interface MAC label */ 1192c2b37adSJustin Hibbits struct netmap_adapter *if_netmap; /* netmap(4) softc */ 1202c2b37adSJustin Hibbits 1212c2b37adSJustin Hibbits /* Various procedures of the layer2 encapsulation and drivers. */ 1222c2b37adSJustin Hibbits if_output_fn_t if_output; /* output routine (enqueue) */ 1232c2b37adSJustin Hibbits if_input_fn_t if_input; /* input routine (from h/w driver) */ 1242c2b37adSJustin Hibbits struct mbuf *(*if_bridge_input)(struct ifnet *, struct mbuf *); 1252c2b37adSJustin Hibbits int (*if_bridge_output)(struct ifnet *, struct mbuf *, struct sockaddr *, 1262c2b37adSJustin Hibbits struct rtentry *); 1272c2b37adSJustin Hibbits void (*if_bridge_linkstate)(struct ifnet *ifp); 1282c2b37adSJustin Hibbits if_start_fn_t if_start; /* initiate output routine */ 1292c2b37adSJustin Hibbits if_ioctl_fn_t if_ioctl; /* ioctl routine */ 1302c2b37adSJustin Hibbits if_init_fn_t if_init; /* Init routine */ 1312c2b37adSJustin Hibbits int (*if_resolvemulti) /* validate/resolve multicast */ 1322c2b37adSJustin Hibbits (struct ifnet *, struct sockaddr **, struct sockaddr *); 1332c2b37adSJustin Hibbits if_qflush_fn_t if_qflush; /* flush any queue */ 1342c2b37adSJustin Hibbits if_transmit_fn_t if_transmit; /* initiate output routine */ 1352c2b37adSJustin Hibbits 1360d2684e1SJustin Hibbits if_reassign_fn_t if_reassign; /* reassign to vnet routine */ 1372c2b37adSJustin Hibbits if_get_counter_t if_get_counter; /* get counter values */ 1382c2b37adSJustin Hibbits int (*if_requestencap) /* make link header from request */ 1392c2b37adSJustin Hibbits (struct ifnet *, struct if_encap_req *); 1402c2b37adSJustin Hibbits 141*2131654bSKonstantin Belousov const struct if_ipsec_accel_methods *if_ipsec_accel_m; 142*2131654bSKonstantin Belousov 1432c2b37adSJustin Hibbits /* Statistics. */ 1442c2b37adSJustin Hibbits counter_u64_t if_counters[IFCOUNTERS]; 1452c2b37adSJustin Hibbits 1462c2b37adSJustin Hibbits /* Stuff that's only temporary and doesn't belong here. */ 1472c2b37adSJustin Hibbits 1482c2b37adSJustin Hibbits /* 1492c2b37adSJustin Hibbits * Network adapter TSO limits: 1502c2b37adSJustin Hibbits * =========================== 1512c2b37adSJustin Hibbits * 1522c2b37adSJustin Hibbits * If the "if_hw_tsomax" field is zero the maximum segment 1532c2b37adSJustin Hibbits * length limit does not apply. If the "if_hw_tsomaxsegcount" 1542c2b37adSJustin Hibbits * or the "if_hw_tsomaxsegsize" field is zero the TSO segment 1552c2b37adSJustin Hibbits * count limit does not apply. If all three fields are zero, 1562c2b37adSJustin Hibbits * there is no TSO limit. 1572c2b37adSJustin Hibbits * 1582c2b37adSJustin Hibbits * NOTE: The TSO limits should reflect the values used in the 1592c2b37adSJustin Hibbits * BUSDMA tag a network adapter is using to load a mbuf chain 1602c2b37adSJustin Hibbits * for transmission. The TCP/IP network stack will subtract 1612c2b37adSJustin Hibbits * space for all linklevel and protocol level headers and 1622c2b37adSJustin Hibbits * ensure that the full mbuf chain passed to the network 1632c2b37adSJustin Hibbits * adapter fits within the given limits. 1642c2b37adSJustin Hibbits */ 1652c2b37adSJustin Hibbits u_int if_hw_tsomax; /* TSO maximum size in bytes */ 1662c2b37adSJustin Hibbits u_int if_hw_tsomaxsegcount; /* TSO maximum segment count */ 1672c2b37adSJustin Hibbits u_int if_hw_tsomaxsegsize; /* TSO maximum segment size in bytes */ 1682c2b37adSJustin Hibbits 1692c2b37adSJustin Hibbits /* 1702c2b37adSJustin Hibbits * Network adapter send tag support: 1712c2b37adSJustin Hibbits */ 1722c2b37adSJustin Hibbits if_snd_tag_alloc_t *if_snd_tag_alloc; 1732c2b37adSJustin Hibbits 1742c2b37adSJustin Hibbits /* Ratelimit (packet pacing) */ 1752c2b37adSJustin Hibbits if_ratelimit_query_t *if_ratelimit_query; 1762c2b37adSJustin Hibbits if_ratelimit_setup_t *if_ratelimit_setup; 1772c2b37adSJustin Hibbits 1782c2b37adSJustin Hibbits /* Ethernet PCP */ 1792c2b37adSJustin Hibbits uint8_t if_pcp; 1802c2b37adSJustin Hibbits 1812c2b37adSJustin Hibbits /* 1822c2b37adSJustin Hibbits * Debugnet (Netdump) hooks to be called while in db/panic. 1832c2b37adSJustin Hibbits */ 1842c2b37adSJustin Hibbits struct debugnet_methods *if_debugnet_methods; 1852c2b37adSJustin Hibbits struct epoch_context if_epoch_ctx; 1862c2b37adSJustin Hibbits 1872c2b37adSJustin Hibbits /* 1882c2b37adSJustin Hibbits * Spare fields to be added before branching a stable branch, so 1892c2b37adSJustin Hibbits * that structure can be enhanced without changing the kernel 1902c2b37adSJustin Hibbits * binary interface. 1912c2b37adSJustin Hibbits */ 1922c2b37adSJustin Hibbits int if_ispare[4]; /* general use */ 1932c2b37adSJustin Hibbits }; 1942c2b37adSJustin Hibbits 1957814374bSJustin Hibbits #define IF_AFDATA_LOCK_INIT(ifp) \ 1967814374bSJustin Hibbits mtx_init(&(ifp)->if_afdata_lock, "if_afdata", NULL, MTX_DEF) 1977814374bSJustin Hibbits 1987814374bSJustin Hibbits #define IF_AFDATA_WLOCK(ifp) mtx_lock(&(ifp)->if_afdata_lock) 1997814374bSJustin Hibbits #define IF_AFDATA_WUNLOCK(ifp) mtx_unlock(&(ifp)->if_afdata_lock) 2007814374bSJustin Hibbits #define IF_AFDATA_LOCK(ifp) IF_AFDATA_WLOCK(ifp) 2017814374bSJustin Hibbits #define IF_AFDATA_UNLOCK(ifp) IF_AFDATA_WUNLOCK(ifp) 2027814374bSJustin Hibbits #define IF_AFDATA_TRYLOCK(ifp) mtx_trylock(&(ifp)->if_afdata_lock) 2037814374bSJustin Hibbits #define IF_AFDATA_DESTROY(ifp) mtx_destroy(&(ifp)->if_afdata_lock) 2047814374bSJustin Hibbits 2057814374bSJustin Hibbits #define IF_AFDATA_LOCK_ASSERT(ifp) MPASS(in_epoch(net_epoch_preempt) || mtx_owned(&(ifp)->if_afdata_lock)) 2067814374bSJustin Hibbits #define IF_AFDATA_WLOCK_ASSERT(ifp) mtx_assert(&(ifp)->if_afdata_lock, MA_OWNED) 2077814374bSJustin Hibbits #define IF_AFDATA_UNLOCK_ASSERT(ifp) mtx_assert(&(ifp)->if_afdata_lock, MA_NOTOWNED) 2087814374bSJustin Hibbits 2097814374bSJustin Hibbits #define IF_LLADDR(ifp) \ 2107814374bSJustin Hibbits LLADDR((struct sockaddr_dl *)((ifp)->if_addr->ifa_addr)) 2117814374bSJustin Hibbits 2122c2b37adSJustin Hibbits #endif /* _KERNEL */ 2132c2b37adSJustin Hibbits 2142c2b37adSJustin Hibbits #endif /* _NET_IF_PRIVATE_H_ */ 215