1df6ad731Slogwang /*- 2*d4a07e70Sfengbojiang * SPDX-License-Identifier: BSD-3-Clause 3*d4a07e70Sfengbojiang * 4df6ad731Slogwang * Copyright (c) 1982, 1986, 1989, 1993 5df6ad731Slogwang * The Regents of the University of California. All rights reserved. 6df6ad731Slogwang * 7df6ad731Slogwang * Redistribution and use in source and binary forms, with or without 8df6ad731Slogwang * modification, are permitted provided that the following conditions 9df6ad731Slogwang * are met: 10df6ad731Slogwang * 1. Redistributions of source code must retain the above copyright 11df6ad731Slogwang * notice, this list of conditions and the following disclaimer. 12df6ad731Slogwang * 2. Redistributions in binary form must reproduce the above copyright 13df6ad731Slogwang * notice, this list of conditions and the following disclaimer in the 14df6ad731Slogwang * documentation and/or other materials provided with the distribution. 15*d4a07e70Sfengbojiang * 3. Neither the name of the University nor the names of its contributors 16df6ad731Slogwang * may be used to endorse or promote products derived from this software 17df6ad731Slogwang * without specific prior written permission. 18df6ad731Slogwang * 19df6ad731Slogwang * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20df6ad731Slogwang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21df6ad731Slogwang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22df6ad731Slogwang * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23df6ad731Slogwang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24df6ad731Slogwang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25df6ad731Slogwang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26df6ad731Slogwang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27df6ad731Slogwang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28df6ad731Slogwang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29df6ad731Slogwang * SUCH DAMAGE. 30df6ad731Slogwang * 31df6ad731Slogwang * @(#)if.h 8.1 (Berkeley) 6/10/93 32df6ad731Slogwang * $FreeBSD$ 33df6ad731Slogwang */ 34df6ad731Slogwang 35df6ad731Slogwang #ifndef _NET_IF_H_ 36df6ad731Slogwang #define _NET_IF_H_ 37df6ad731Slogwang 38df6ad731Slogwang #include <sys/time.h> 39df6ad731Slogwang #include "sys/socket.h" 40df6ad731Slogwang 41df6ad731Slogwang /* 42df6ad731Slogwang * Length of interface external name, including terminating '\0'. 43df6ad731Slogwang * Note: this is the same size as a generic device's external name. 44df6ad731Slogwang */ 45df6ad731Slogwang #define IF_NAMESIZE 16 46df6ad731Slogwang #define IFNAMSIZ IF_NAMESIZE 47df6ad731Slogwang #define IF_MAXUNIT 0x7fff /* historical value */ 48df6ad731Slogwang 49df6ad731Slogwang /* 50df6ad731Slogwang * Structure used to query names of interface cloners. 51df6ad731Slogwang */ 52df6ad731Slogwang 53df6ad731Slogwang struct if_clonereq { 54df6ad731Slogwang int ifcr_total; /* total cloners (out) */ 55df6ad731Slogwang int ifcr_count; /* room for this many in user buffer */ 56df6ad731Slogwang char *ifcr_buffer; /* buffer for cloner names */ 57df6ad731Slogwang }; 58df6ad731Slogwang 59df6ad731Slogwang /* 60df6ad731Slogwang * Structure describing information about an interface 61df6ad731Slogwang * which may be of interest to management entities. 62df6ad731Slogwang */ 63df6ad731Slogwang struct if_data { 64df6ad731Slogwang /* generic interface information */ 65df6ad731Slogwang uint8_t ifi_type; /* ethernet, tokenring, etc */ 66df6ad731Slogwang uint8_t ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */ 67df6ad731Slogwang uint8_t ifi_addrlen; /* media address length */ 68df6ad731Slogwang uint8_t ifi_hdrlen; /* media header length */ 69df6ad731Slogwang uint8_t ifi_link_state; /* current link state */ 70df6ad731Slogwang uint8_t ifi_vhid; /* carp vhid */ 71df6ad731Slogwang uint16_t ifi_datalen; /* length of this data struct */ 72df6ad731Slogwang uint32_t ifi_mtu; /* maximum transmission unit */ 73df6ad731Slogwang uint32_t ifi_metric; /* routing metric (external only) */ 74df6ad731Slogwang uint64_t ifi_baudrate; /* linespeed */ 75df6ad731Slogwang /* volatile statistics */ 76df6ad731Slogwang uint64_t ifi_ipackets; /* packets received on interface */ 77df6ad731Slogwang uint64_t ifi_ierrors; /* input errors on interface */ 78df6ad731Slogwang uint64_t ifi_opackets; /* packets sent on interface */ 79df6ad731Slogwang uint64_t ifi_oerrors; /* output errors on interface */ 80df6ad731Slogwang uint64_t ifi_collisions; /* collisions on csma interfaces */ 81df6ad731Slogwang uint64_t ifi_ibytes; /* total number of octets received */ 82df6ad731Slogwang uint64_t ifi_obytes; /* total number of octets sent */ 83df6ad731Slogwang uint64_t ifi_imcasts; /* packets received via multicast */ 84df6ad731Slogwang uint64_t ifi_omcasts; /* packets sent via multicast */ 85df6ad731Slogwang uint64_t ifi_iqdrops; /* dropped on input */ 86df6ad731Slogwang uint64_t ifi_oqdrops; /* dropped on output */ 87df6ad731Slogwang uint64_t ifi_noproto; /* destined for unsupported protocol */ 88df6ad731Slogwang uint64_t ifi_hwassist; /* HW offload capabilities, see IFCAP */ 89df6ad731Slogwang 90df6ad731Slogwang /* Unions are here to make sizes MI. */ 91df6ad731Slogwang union { /* uptime at attach or stat reset */ 92df6ad731Slogwang time_t tt; 93df6ad731Slogwang uint64_t ph; 94df6ad731Slogwang } __ifi_epoch; 95df6ad731Slogwang #define ifi_epoch __ifi_epoch.tt 96df6ad731Slogwang union { /* time of last administrative change */ 97df6ad731Slogwang struct timeval tv; 98df6ad731Slogwang struct { 99df6ad731Slogwang uint64_t ph1; 100df6ad731Slogwang uint64_t ph2; 101df6ad731Slogwang } ph; 102df6ad731Slogwang } __ifi_lastchange; 103df6ad731Slogwang #define ifi_lastchange __ifi_lastchange.tv 104df6ad731Slogwang }; 105df6ad731Slogwang 106df6ad731Slogwang /*- 107df6ad731Slogwang * Interface flags are of two types: network stack owned flags, and driver 108df6ad731Slogwang * owned flags. Historically, these values were stored in the same ifnet 109df6ad731Slogwang * flags field, but with the advent of fine-grained locking, they have been 110df6ad731Slogwang * broken out such that the network stack is responsible for synchronizing 111df6ad731Slogwang * the stack-owned fields, and the device driver the device-owned fields. 112df6ad731Slogwang * Both halves can perform lockless reads of the other half's field, subject 113df6ad731Slogwang * to accepting the involved races. 114df6ad731Slogwang * 115df6ad731Slogwang * Both sets of flags come from the same number space, and should not be 116df6ad731Slogwang * permitted to conflict, as they are exposed to user space via a single 117df6ad731Slogwang * field. 118df6ad731Slogwang * 119df6ad731Slogwang * The following symbols identify read and write requirements for fields: 120df6ad731Slogwang * 121df6ad731Slogwang * (i) if_flags field set by device driver before attach, read-only there 122df6ad731Slogwang * after. 123df6ad731Slogwang * (n) if_flags field written only by the network stack, read by either the 124df6ad731Slogwang * stack or driver. 125df6ad731Slogwang * (d) if_drv_flags field written only by the device driver, read by either 126df6ad731Slogwang * the stack or driver. 127df6ad731Slogwang */ 128df6ad731Slogwang #define IFF_UP 0x1 /* (n) interface is up */ 129df6ad731Slogwang #define IFF_BROADCAST 0x2 /* (i) broadcast address valid */ 130df6ad731Slogwang #define IFF_DEBUG 0x4 /* (n) turn on debugging */ 131df6ad731Slogwang #define IFF_LOOPBACK 0x8 /* (i) is a loopback net */ 132df6ad731Slogwang #define IFF_POINTOPOINT 0x10 /* (i) is a point-to-point link */ 133*d4a07e70Sfengbojiang #define IFF_KNOWSEPOCH 0x20 /* (i) calls if_input in net epoch */ 134df6ad731Slogwang #define IFF_DRV_RUNNING 0x40 /* (d) resources allocated */ 135df6ad731Slogwang #define IFF_NOARP 0x80 /* (n) no address resolution protocol */ 136df6ad731Slogwang #define IFF_PROMISC 0x100 /* (n) receive all packets */ 137df6ad731Slogwang #define IFF_ALLMULTI 0x200 /* (n) receive all multicast packets */ 138df6ad731Slogwang #define IFF_DRV_OACTIVE 0x400 /* (d) tx hardware queue is full */ 139df6ad731Slogwang #define IFF_SIMPLEX 0x800 /* (i) can't hear own transmissions */ 140df6ad731Slogwang #define IFF_LINK0 0x1000 /* per link layer defined bit */ 141df6ad731Slogwang #define IFF_LINK1 0x2000 /* per link layer defined bit */ 142df6ad731Slogwang #define IFF_LINK2 0x4000 /* per link layer defined bit */ 143df6ad731Slogwang #define IFF_ALTPHYS IFF_LINK2 /* use alternate physical connection */ 144df6ad731Slogwang #define IFF_MULTICAST 0x8000 /* (i) supports multicast */ 145df6ad731Slogwang #define IFF_CANTCONFIG 0x10000 /* (i) unconfigurable using ioctl(2) */ 146df6ad731Slogwang #define IFF_PPROMISC 0x20000 /* (n) user-requested promisc mode */ 147df6ad731Slogwang #define IFF_MONITOR 0x40000 /* (n) user-requested monitor mode */ 148df6ad731Slogwang #define IFF_STATICARP 0x80000 /* (n) static ARP */ 149df6ad731Slogwang #define IFF_DYING 0x200000 /* (n) interface is winding down */ 150df6ad731Slogwang #define IFF_RENAMING 0x400000 /* (n) interface is being renamed */ 151*d4a07e70Sfengbojiang #define IFF_NOGROUP 0x800000 /* (n) interface is not part of any groups */ 152*d4a07e70Sfengbojiang 153df6ad731Slogwang /* 154df6ad731Slogwang * Old names for driver flags so that user space tools can continue to use 155df6ad731Slogwang * the old (portable) names. 156df6ad731Slogwang */ 157df6ad731Slogwang #ifndef _KERNEL 158df6ad731Slogwang #define IFF_RUNNING IFF_DRV_RUNNING 159df6ad731Slogwang #define IFF_OACTIVE IFF_DRV_OACTIVE 160df6ad731Slogwang #endif 161df6ad731Slogwang 162df6ad731Slogwang /* flags set internally only: */ 163df6ad731Slogwang #define IFF_CANTCHANGE \ 164df6ad731Slogwang (IFF_BROADCAST|IFF_POINTOPOINT|IFF_DRV_RUNNING|IFF_DRV_OACTIVE|\ 165df6ad731Slogwang IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI|IFF_PROMISC|\ 166*d4a07e70Sfengbojiang IFF_DYING|IFF_CANTCONFIG|IFF_KNOWSEPOCH) 167df6ad731Slogwang 168df6ad731Slogwang /* 169df6ad731Slogwang * Values for if_link_state. 170df6ad731Slogwang */ 171df6ad731Slogwang #define LINK_STATE_UNKNOWN 0 /* link invalid/unknown */ 172df6ad731Slogwang #define LINK_STATE_DOWN 1 /* link is down */ 173df6ad731Slogwang #define LINK_STATE_UP 2 /* link is up */ 174df6ad731Slogwang 175df6ad731Slogwang /* 176df6ad731Slogwang * Some convenience macros used for setting ifi_baudrate. 177df6ad731Slogwang * XXX 1000 vs. 1024? [email protected] 178df6ad731Slogwang */ 179df6ad731Slogwang #define IF_Kbps(x) ((uintmax_t)(x) * 1000) /* kilobits/sec. */ 180df6ad731Slogwang #define IF_Mbps(x) (IF_Kbps((x) * 1000)) /* megabits/sec. */ 181df6ad731Slogwang #define IF_Gbps(x) (IF_Mbps((x) * 1000)) /* gigabits/sec. */ 182df6ad731Slogwang 183df6ad731Slogwang /* 184df6ad731Slogwang * Capabilities that interfaces can advertise. 185df6ad731Slogwang * 186df6ad731Slogwang * struct ifnet.if_capabilities 187df6ad731Slogwang * contains the optional features & capabilities a particular interface 188df6ad731Slogwang * supports (not only the driver but also the detected hw revision). 189df6ad731Slogwang * Capabilities are defined by IFCAP_* below. 190df6ad731Slogwang * struct ifnet.if_capenable 191df6ad731Slogwang * contains the enabled (either by default or through ifconfig) optional 192df6ad731Slogwang * features & capabilities on this interface. 193df6ad731Slogwang * Capabilities are defined by IFCAP_* below. 194df6ad731Slogwang * struct if_data.ifi_hwassist in mbuf CSUM_ flag form, controlled by above 195df6ad731Slogwang * contains the enabled optional feature & capabilites that can be used 196df6ad731Slogwang * individually per packet and are specified in the mbuf pkthdr.csum_flags 197df6ad731Slogwang * field. IFCAP_* and CSUM_* do not match one to one and CSUM_* may be 198*d4a07e70Sfengbojiang * more detailed or differentiated than IFCAP_*. 199df6ad731Slogwang * Hwassist features are defined CSUM_* in sys/mbuf.h 200df6ad731Slogwang * 201df6ad731Slogwang * Capabilities that cannot be arbitrarily changed with ifconfig/ioctl 202df6ad731Slogwang * are listed in IFCAP_CANTCHANGE, similar to IFF_CANTCHANGE. 203df6ad731Slogwang * This is not strictly necessary because the common code never 204df6ad731Slogwang * changes capabilities, and it is left to the individual driver 205df6ad731Slogwang * to do the right thing. However, having the filter here 206df6ad731Slogwang * avoids replication of the same code in all individual drivers. 207df6ad731Slogwang */ 208df6ad731Slogwang #define IFCAP_RXCSUM 0x00001 /* can offload checksum on RX */ 209df6ad731Slogwang #define IFCAP_TXCSUM 0x00002 /* can offload checksum on TX */ 210df6ad731Slogwang #define IFCAP_NETCONS 0x00004 /* can be a network console */ 211df6ad731Slogwang #define IFCAP_VLAN_MTU 0x00008 /* VLAN-compatible MTU */ 212df6ad731Slogwang #define IFCAP_VLAN_HWTAGGING 0x00010 /* hardware VLAN tag support */ 213df6ad731Slogwang #define IFCAP_JUMBO_MTU 0x00020 /* 9000 byte MTU supported */ 214df6ad731Slogwang #define IFCAP_POLLING 0x00040 /* driver supports polling */ 215df6ad731Slogwang #define IFCAP_VLAN_HWCSUM 0x00080 /* can do IFCAP_HWCSUM on VLANs */ 216df6ad731Slogwang #define IFCAP_TSO4 0x00100 /* can do TCP Segmentation Offload */ 217df6ad731Slogwang #define IFCAP_TSO6 0x00200 /* can do TCP6 Segmentation Offload */ 218df6ad731Slogwang #define IFCAP_LRO 0x00400 /* can do Large Receive Offload */ 219df6ad731Slogwang #define IFCAP_WOL_UCAST 0x00800 /* wake on any unicast frame */ 220df6ad731Slogwang #define IFCAP_WOL_MCAST 0x01000 /* wake on any multicast frame */ 221df6ad731Slogwang #define IFCAP_WOL_MAGIC 0x02000 /* wake on any Magic Packet */ 222df6ad731Slogwang #define IFCAP_TOE4 0x04000 /* interface can offload TCP */ 223df6ad731Slogwang #define IFCAP_TOE6 0x08000 /* interface can offload TCP6 */ 224df6ad731Slogwang #define IFCAP_VLAN_HWFILTER 0x10000 /* interface hw can filter vlan tag */ 225*d4a07e70Sfengbojiang /* available 0x20000 */ 226df6ad731Slogwang #define IFCAP_VLAN_HWTSO 0x40000 /* can do IFCAP_TSO on VLANs */ 227df6ad731Slogwang #define IFCAP_LINKSTATE 0x80000 /* the runtime link state is dynamic */ 228df6ad731Slogwang #define IFCAP_NETMAP 0x100000 /* netmap mode supported/enabled */ 229df6ad731Slogwang #define IFCAP_RXCSUM_IPV6 0x200000 /* can offload checksum on IPv6 RX */ 230df6ad731Slogwang #define IFCAP_TXCSUM_IPV6 0x400000 /* can offload checksum on IPv6 TX */ 231df6ad731Slogwang #define IFCAP_HWSTATS 0x800000 /* manages counters internally */ 232*d4a07e70Sfengbojiang #define IFCAP_TXRTLMT 0x1000000 /* hardware supports TX rate limiting */ 233*d4a07e70Sfengbojiang #define IFCAP_HWRXTSTMP 0x2000000 /* hardware rx timestamping */ 234*d4a07e70Sfengbojiang #define IFCAP_NOMAP 0x4000000 /* can TX unmapped mbufs */ 235*d4a07e70Sfengbojiang #define IFCAP_TXTLS4 0x8000000 /* can do TLS encryption and segmentation for TCP */ 236*d4a07e70Sfengbojiang #define IFCAP_TXTLS6 0x10000000 /* can do TLS encryption and segmentation for TCP6 */ 237*d4a07e70Sfengbojiang #define IFCAP_VXLAN_HWCSUM 0x20000000 /* can do IFCAN_HWCSUM on VXLANs */ 238*d4a07e70Sfengbojiang #define IFCAP_VXLAN_HWTSO 0x40000000 /* can do IFCAP_TSO on VXLANs */ 239*d4a07e70Sfengbojiang #define IFCAP_TXTLS_RTLMT 0x80000000 /* can do TLS with rate limiting */ 240df6ad731Slogwang 241df6ad731Slogwang #define IFCAP_HWCSUM_IPV6 (IFCAP_RXCSUM_IPV6 | IFCAP_TXCSUM_IPV6) 242df6ad731Slogwang 243df6ad731Slogwang #define IFCAP_HWCSUM (IFCAP_RXCSUM | IFCAP_TXCSUM) 244df6ad731Slogwang #define IFCAP_TSO (IFCAP_TSO4 | IFCAP_TSO6) 245df6ad731Slogwang #define IFCAP_WOL (IFCAP_WOL_UCAST | IFCAP_WOL_MCAST | IFCAP_WOL_MAGIC) 246df6ad731Slogwang #define IFCAP_TOE (IFCAP_TOE4 | IFCAP_TOE6) 247*d4a07e70Sfengbojiang #define IFCAP_TXTLS (IFCAP_TXTLS4 | IFCAP_TXTLS6) 248df6ad731Slogwang 249df6ad731Slogwang #define IFCAP_CANTCHANGE (IFCAP_NETMAP) 250df6ad731Slogwang 251df6ad731Slogwang #define IFQ_MAXLEN 50 252df6ad731Slogwang #define IFNET_SLOWHZ 1 /* granularity is 1 second */ 253df6ad731Slogwang 254df6ad731Slogwang /* 255df6ad731Slogwang * Message format for use in obtaining information about interfaces 256df6ad731Slogwang * from getkerninfo and the routing socket 257df6ad731Slogwang * For the new, extensible interface see struct if_msghdrl below. 258df6ad731Slogwang */ 259df6ad731Slogwang struct if_msghdr { 260df6ad731Slogwang u_short ifm_msglen; /* to skip over non-understood messages */ 261df6ad731Slogwang u_char ifm_version; /* future binary compatibility */ 262df6ad731Slogwang u_char ifm_type; /* message type */ 263df6ad731Slogwang int ifm_addrs; /* like rtm_addrs */ 264df6ad731Slogwang int ifm_flags; /* value of if_flags */ 265df6ad731Slogwang u_short ifm_index; /* index for associated ifp */ 266*d4a07e70Sfengbojiang u_short _ifm_spare1; 267df6ad731Slogwang struct if_data ifm_data;/* statistics and other data about if */ 268df6ad731Slogwang }; 269df6ad731Slogwang 270df6ad731Slogwang /* 271df6ad731Slogwang * The 'l' version shall be used by new interfaces, like NET_RT_IFLISTL. It is 272df6ad731Slogwang * extensible after ifm_data_off or within ifm_data. Both the if_msghdr and 273df6ad731Slogwang * if_data now have a member field detailing the struct length in addition to 274df6ad731Slogwang * the routing message length. Macros are provided to find the start of 275df6ad731Slogwang * ifm_data and the start of the socket address strucutres immediately following 276df6ad731Slogwang * struct if_msghdrl given a pointer to struct if_msghdrl. 277df6ad731Slogwang */ 278df6ad731Slogwang #define IF_MSGHDRL_IFM_DATA(_l) \ 279df6ad731Slogwang (struct if_data *)((char *)(_l) + (_l)->ifm_data_off) 280df6ad731Slogwang #define IF_MSGHDRL_RTA(_l) \ 281df6ad731Slogwang (void *)((uintptr_t)(_l) + (_l)->ifm_len) 282df6ad731Slogwang struct if_msghdrl { 283df6ad731Slogwang u_short ifm_msglen; /* to skip over non-understood messages */ 284df6ad731Slogwang u_char ifm_version; /* future binary compatibility */ 285df6ad731Slogwang u_char ifm_type; /* message type */ 286df6ad731Slogwang int ifm_addrs; /* like rtm_addrs */ 287df6ad731Slogwang int ifm_flags; /* value of if_flags */ 288df6ad731Slogwang u_short ifm_index; /* index for associated ifp */ 289df6ad731Slogwang u_short _ifm_spare1; /* spare space to grow if_index, see if_var.h */ 290df6ad731Slogwang u_short ifm_len; /* length of if_msghdrl incl. if_data */ 291df6ad731Slogwang u_short ifm_data_off; /* offset of if_data from beginning */ 292*d4a07e70Sfengbojiang int _ifm_spare2; 293df6ad731Slogwang struct if_data ifm_data;/* statistics and other data about if */ 294df6ad731Slogwang }; 295df6ad731Slogwang 296df6ad731Slogwang /* 297df6ad731Slogwang * Message format for use in obtaining information about interface addresses 298df6ad731Slogwang * from getkerninfo and the routing socket 299df6ad731Slogwang * For the new, extensible interface see struct ifa_msghdrl below. 300df6ad731Slogwang */ 301df6ad731Slogwang struct ifa_msghdr { 302df6ad731Slogwang u_short ifam_msglen; /* to skip over non-understood messages */ 303df6ad731Slogwang u_char ifam_version; /* future binary compatibility */ 304df6ad731Slogwang u_char ifam_type; /* message type */ 305df6ad731Slogwang int ifam_addrs; /* like rtm_addrs */ 306df6ad731Slogwang int ifam_flags; /* value of ifa_flags */ 307df6ad731Slogwang u_short ifam_index; /* index for associated ifp */ 308*d4a07e70Sfengbojiang u_short _ifam_spare1; 309df6ad731Slogwang int ifam_metric; /* value of ifa_ifp->if_metric */ 310df6ad731Slogwang }; 311df6ad731Slogwang 312df6ad731Slogwang /* 313df6ad731Slogwang * The 'l' version shall be used by new interfaces, like NET_RT_IFLISTL. It is 314df6ad731Slogwang * extensible after ifam_metric or within ifam_data. Both the ifa_msghdrl and 315df6ad731Slogwang * if_data now have a member field detailing the struct length in addition to 316df6ad731Slogwang * the routing message length. Macros are provided to find the start of 317df6ad731Slogwang * ifm_data and the start of the socket address strucutres immediately following 318df6ad731Slogwang * struct ifa_msghdrl given a pointer to struct ifa_msghdrl. 319df6ad731Slogwang */ 320df6ad731Slogwang #define IFA_MSGHDRL_IFAM_DATA(_l) \ 321df6ad731Slogwang (struct if_data *)((char *)(_l) + (_l)->ifam_data_off) 322df6ad731Slogwang #define IFA_MSGHDRL_RTA(_l) \ 323df6ad731Slogwang (void *)((uintptr_t)(_l) + (_l)->ifam_len) 324df6ad731Slogwang struct ifa_msghdrl { 325df6ad731Slogwang u_short ifam_msglen; /* to skip over non-understood messages */ 326df6ad731Slogwang u_char ifam_version; /* future binary compatibility */ 327df6ad731Slogwang u_char ifam_type; /* message type */ 328df6ad731Slogwang int ifam_addrs; /* like rtm_addrs */ 329df6ad731Slogwang int ifam_flags; /* value of ifa_flags */ 330df6ad731Slogwang u_short ifam_index; /* index for associated ifp */ 331df6ad731Slogwang u_short _ifam_spare1; /* spare space to grow if_index, see if_var.h */ 332df6ad731Slogwang u_short ifam_len; /* length of ifa_msghdrl incl. if_data */ 333df6ad731Slogwang u_short ifam_data_off; /* offset of if_data from beginning */ 334df6ad731Slogwang int ifam_metric; /* value of ifa_ifp->if_metric */ 335df6ad731Slogwang struct if_data ifam_data;/* statistics and other data about if or 336df6ad731Slogwang * address */ 337df6ad731Slogwang }; 338df6ad731Slogwang 339df6ad731Slogwang /* 340df6ad731Slogwang * Message format for use in obtaining information about multicast addresses 341df6ad731Slogwang * from the routing socket 342df6ad731Slogwang */ 343df6ad731Slogwang struct ifma_msghdr { 344df6ad731Slogwang u_short ifmam_msglen; /* to skip over non-understood messages */ 345df6ad731Slogwang u_char ifmam_version; /* future binary compatibility */ 346df6ad731Slogwang u_char ifmam_type; /* message type */ 347df6ad731Slogwang int ifmam_addrs; /* like rtm_addrs */ 348df6ad731Slogwang int ifmam_flags; /* value of ifa_flags */ 349df6ad731Slogwang u_short ifmam_index; /* index for associated ifp */ 350*d4a07e70Sfengbojiang u_short _ifmam_spare1; 351df6ad731Slogwang }; 352df6ad731Slogwang 353df6ad731Slogwang /* 354df6ad731Slogwang * Message format announcing the arrival or departure of a network interface. 355df6ad731Slogwang */ 356df6ad731Slogwang struct if_announcemsghdr { 357df6ad731Slogwang u_short ifan_msglen; /* to skip over non-understood messages */ 358df6ad731Slogwang u_char ifan_version; /* future binary compatibility */ 359df6ad731Slogwang u_char ifan_type; /* message type */ 360df6ad731Slogwang u_short ifan_index; /* index for associated ifp */ 361df6ad731Slogwang char ifan_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 362df6ad731Slogwang u_short ifan_what; /* what type of announcement */ 363df6ad731Slogwang }; 364df6ad731Slogwang 365df6ad731Slogwang #define IFAN_ARRIVAL 0 /* interface arrival */ 366df6ad731Slogwang #define IFAN_DEPARTURE 1 /* interface departure */ 367df6ad731Slogwang 368df6ad731Slogwang /* 369df6ad731Slogwang * Buffer with length to be used in SIOCGIFDESCR/SIOCSIFDESCR requests 370df6ad731Slogwang */ 371df6ad731Slogwang struct ifreq_buffer { 372df6ad731Slogwang size_t length; 373df6ad731Slogwang void *buffer; 374df6ad731Slogwang }; 375df6ad731Slogwang 376df6ad731Slogwang /* 377df6ad731Slogwang * Interface request structure used for socket 378df6ad731Slogwang * ioctl's. All interface ioctl's must have parameter 379df6ad731Slogwang * definitions which begin with ifr_name. The 380df6ad731Slogwang * remainder may be interface specific. 381df6ad731Slogwang */ 382df6ad731Slogwang struct ifreq { 383df6ad731Slogwang char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 384df6ad731Slogwang union { 385df6ad731Slogwang struct sockaddr ifru_addr; 386df6ad731Slogwang struct sockaddr ifru_dstaddr; 387df6ad731Slogwang struct sockaddr ifru_broadaddr; 388df6ad731Slogwang struct ifreq_buffer ifru_buffer; 389df6ad731Slogwang short ifru_flags[2]; 390df6ad731Slogwang short ifru_index; 391df6ad731Slogwang int ifru_jid; 392df6ad731Slogwang int ifru_metric; 393df6ad731Slogwang int ifru_mtu; 394df6ad731Slogwang int ifru_phys; 395df6ad731Slogwang int ifru_media; 396df6ad731Slogwang caddr_t ifru_data; 397df6ad731Slogwang int ifru_cap[2]; 398df6ad731Slogwang u_int ifru_fib; 399df6ad731Slogwang u_char ifru_vlan_pcp; 400df6ad731Slogwang } ifr_ifru; 401df6ad731Slogwang #define ifr_addr ifr_ifru.ifru_addr /* address */ 402df6ad731Slogwang #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ 403df6ad731Slogwang #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ 404*d4a07e70Sfengbojiang #ifndef _KERNEL 405df6ad731Slogwang #define ifr_buffer ifr_ifru.ifru_buffer /* user supplied buffer with its length */ 406*d4a07e70Sfengbojiang #endif 407df6ad731Slogwang #define ifr_flags ifr_ifru.ifru_flags[0] /* flags (low 16 bits) */ 408df6ad731Slogwang #define ifr_flagshigh ifr_ifru.ifru_flags[1] /* flags (high 16 bits) */ 409df6ad731Slogwang #define ifr_jid ifr_ifru.ifru_jid /* jail/vnet */ 410df6ad731Slogwang #define ifr_metric ifr_ifru.ifru_metric /* metric */ 411df6ad731Slogwang #define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ 412df6ad731Slogwang #define ifr_phys ifr_ifru.ifru_phys /* physical wire */ 413df6ad731Slogwang #define ifr_media ifr_ifru.ifru_media /* physical media */ 414*d4a07e70Sfengbojiang #ifndef _KERNEL 415df6ad731Slogwang #define ifr_data ifr_ifru.ifru_data /* for use by interface */ 416*d4a07e70Sfengbojiang #endif 417df6ad731Slogwang #define ifr_reqcap ifr_ifru.ifru_cap[0] /* requested capabilities */ 418df6ad731Slogwang #define ifr_curcap ifr_ifru.ifru_cap[1] /* current capabilities */ 419df6ad731Slogwang #define ifr_index ifr_ifru.ifru_index /* interface index */ 420df6ad731Slogwang #define ifr_fib ifr_ifru.ifru_fib /* interface fib */ 421df6ad731Slogwang #define ifr_vlan_pcp ifr_ifru.ifru_vlan_pcp /* VLAN priority */ 422*d4a07e70Sfengbojiang #define ifr_lan_pcp ifr_ifru.ifru_vlan_pcp /* VLAN priority */ 423df6ad731Slogwang }; 424df6ad731Slogwang 425df6ad731Slogwang #define _SIZEOF_ADDR_IFREQ(ifr) \ 426df6ad731Slogwang ((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \ 427df6ad731Slogwang (sizeof(struct ifreq) - sizeof(struct sockaddr) + \ 428df6ad731Slogwang (ifr).ifr_addr.sa_len) : sizeof(struct ifreq)) 429df6ad731Slogwang 430df6ad731Slogwang struct ifaliasreq { 431df6ad731Slogwang char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 432df6ad731Slogwang struct sockaddr ifra_addr; 433df6ad731Slogwang struct sockaddr ifra_broadaddr; 434df6ad731Slogwang struct sockaddr ifra_mask; 435df6ad731Slogwang int ifra_vhid; 436df6ad731Slogwang }; 437df6ad731Slogwang 438df6ad731Slogwang /* 9.x compat */ 439df6ad731Slogwang struct oifaliasreq { 440df6ad731Slogwang char ifra_name[IFNAMSIZ]; 441df6ad731Slogwang struct sockaddr ifra_addr; 442df6ad731Slogwang struct sockaddr ifra_broadaddr; 443df6ad731Slogwang struct sockaddr ifra_mask; 444df6ad731Slogwang }; 445df6ad731Slogwang 446df6ad731Slogwang struct ifmediareq { 447df6ad731Slogwang char ifm_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 448df6ad731Slogwang int ifm_current; /* current media options */ 449df6ad731Slogwang int ifm_mask; /* don't care mask */ 450df6ad731Slogwang int ifm_status; /* media status */ 451df6ad731Slogwang int ifm_active; /* active options */ 452df6ad731Slogwang int ifm_count; /* # entries in ifm_ulist array */ 453df6ad731Slogwang int *ifm_ulist; /* media words */ 454df6ad731Slogwang }; 455df6ad731Slogwang 456df6ad731Slogwang struct ifdrv { 457df6ad731Slogwang char ifd_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 458df6ad731Slogwang unsigned long ifd_cmd; 459df6ad731Slogwang size_t ifd_len; 460df6ad731Slogwang void *ifd_data; 461df6ad731Slogwang }; 462df6ad731Slogwang 463df6ad731Slogwang /* 464df6ad731Slogwang * Structure used to retrieve aux status data from interfaces. 465df6ad731Slogwang * Kernel suppliers to this interface should respect the formatting 466df6ad731Slogwang * needed by ifconfig(8): each line starts with a TAB and ends with 467df6ad731Slogwang * a newline. The canonical example to copy and paste is in if_tun.c. 468df6ad731Slogwang */ 469df6ad731Slogwang 470df6ad731Slogwang #define IFSTATMAX 800 /* 10 lines of text */ 471df6ad731Slogwang struct ifstat { 472df6ad731Slogwang char ifs_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 473df6ad731Slogwang char ascii[IFSTATMAX + 1]; 474df6ad731Slogwang }; 475df6ad731Slogwang 476df6ad731Slogwang /* 477df6ad731Slogwang * Structure used in SIOCGIFCONF request. 478df6ad731Slogwang * Used to retrieve interface configuration 479df6ad731Slogwang * for machine (useful for programs which 480df6ad731Slogwang * must know all networks accessible). 481df6ad731Slogwang */ 482df6ad731Slogwang struct ifconf { 483df6ad731Slogwang int ifc_len; /* size of associated buffer */ 484df6ad731Slogwang union { 485df6ad731Slogwang caddr_t ifcu_buf; 486df6ad731Slogwang struct ifreq *ifcu_req; 487df6ad731Slogwang } ifc_ifcu; 488df6ad731Slogwang #define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ 489df6ad731Slogwang #define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */ 490df6ad731Slogwang }; 491df6ad731Slogwang 492df6ad731Slogwang /* 493df6ad731Slogwang * interface groups 494df6ad731Slogwang */ 495df6ad731Slogwang 496df6ad731Slogwang #define IFG_ALL "all" /* group contains all interfaces */ 497df6ad731Slogwang /* XXX: will we implement this? */ 498df6ad731Slogwang #define IFG_EGRESS "egress" /* if(s) default route(s) point to */ 499df6ad731Slogwang 500df6ad731Slogwang struct ifg_req { 501df6ad731Slogwang union { 502df6ad731Slogwang char ifgrqu_group[IFNAMSIZ]; 503df6ad731Slogwang char ifgrqu_member[IFNAMSIZ]; 504df6ad731Slogwang } ifgrq_ifgrqu; 505df6ad731Slogwang #define ifgrq_group ifgrq_ifgrqu.ifgrqu_group 506df6ad731Slogwang #define ifgrq_member ifgrq_ifgrqu.ifgrqu_member 507df6ad731Slogwang }; 508df6ad731Slogwang 509df6ad731Slogwang /* 510df6ad731Slogwang * Used to lookup groups for an interface 511df6ad731Slogwang */ 512df6ad731Slogwang struct ifgroupreq { 513df6ad731Slogwang char ifgr_name[IFNAMSIZ]; 514df6ad731Slogwang u_int ifgr_len; 515df6ad731Slogwang union { 516df6ad731Slogwang char ifgru_group[IFNAMSIZ]; 517df6ad731Slogwang struct ifg_req *ifgru_groups; 518df6ad731Slogwang } ifgr_ifgru; 519*d4a07e70Sfengbojiang #ifndef _KERNEL 520df6ad731Slogwang #define ifgr_group ifgr_ifgru.ifgru_group 521df6ad731Slogwang #define ifgr_groups ifgr_ifgru.ifgru_groups 522*d4a07e70Sfengbojiang #endif 523df6ad731Slogwang }; 524df6ad731Slogwang 525df6ad731Slogwang /* 526df6ad731Slogwang * Structure used to request i2c data 527df6ad731Slogwang * from interface transceivers. 528df6ad731Slogwang */ 529df6ad731Slogwang struct ifi2creq { 530df6ad731Slogwang uint8_t dev_addr; /* i2c address (0xA0, 0xA2) */ 531df6ad731Slogwang uint8_t offset; /* read offset */ 532df6ad731Slogwang uint8_t len; /* read length */ 533df6ad731Slogwang uint8_t spare0; 534df6ad731Slogwang uint32_t spare1; 535df6ad731Slogwang uint8_t data[8]; /* read buffer */ 536df6ad731Slogwang }; 537df6ad731Slogwang 538*d4a07e70Sfengbojiang /* 539*d4a07e70Sfengbojiang * RSS hash. 540*d4a07e70Sfengbojiang */ 541*d4a07e70Sfengbojiang 542*d4a07e70Sfengbojiang #define RSS_FUNC_NONE 0 /* RSS disabled */ 543*d4a07e70Sfengbojiang #define RSS_FUNC_PRIVATE 1 /* non-standard */ 544*d4a07e70Sfengbojiang #define RSS_FUNC_TOEPLITZ 2 545*d4a07e70Sfengbojiang 546*d4a07e70Sfengbojiang #define RSS_TYPE_IPV4 0x00000001 547*d4a07e70Sfengbojiang #define RSS_TYPE_TCP_IPV4 0x00000002 548*d4a07e70Sfengbojiang #define RSS_TYPE_IPV6 0x00000004 549*d4a07e70Sfengbojiang #define RSS_TYPE_IPV6_EX 0x00000008 550*d4a07e70Sfengbojiang #define RSS_TYPE_TCP_IPV6 0x00000010 551*d4a07e70Sfengbojiang #define RSS_TYPE_TCP_IPV6_EX 0x00000020 552*d4a07e70Sfengbojiang #define RSS_TYPE_UDP_IPV4 0x00000040 553*d4a07e70Sfengbojiang #define RSS_TYPE_UDP_IPV6 0x00000080 554*d4a07e70Sfengbojiang #define RSS_TYPE_UDP_IPV6_EX 0x00000100 555*d4a07e70Sfengbojiang 556*d4a07e70Sfengbojiang #define RSS_KEYLEN 128 557*d4a07e70Sfengbojiang 558*d4a07e70Sfengbojiang struct ifrsskey { 559*d4a07e70Sfengbojiang char ifrk_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 560*d4a07e70Sfengbojiang uint8_t ifrk_func; /* RSS_FUNC_ */ 561*d4a07e70Sfengbojiang uint8_t ifrk_spare0; 562*d4a07e70Sfengbojiang uint16_t ifrk_keylen; 563*d4a07e70Sfengbojiang uint8_t ifrk_key[RSS_KEYLEN]; 564*d4a07e70Sfengbojiang }; 565*d4a07e70Sfengbojiang 566*d4a07e70Sfengbojiang struct ifrsshash { 567*d4a07e70Sfengbojiang char ifrh_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 568*d4a07e70Sfengbojiang uint8_t ifrh_func; /* RSS_FUNC_ */ 569*d4a07e70Sfengbojiang uint8_t ifrh_spare0; 570*d4a07e70Sfengbojiang uint16_t ifrh_spare1; 571*d4a07e70Sfengbojiang uint32_t ifrh_types; /* RSS_TYPE_ */ 572*d4a07e70Sfengbojiang }; 573*d4a07e70Sfengbojiang 574*d4a07e70Sfengbojiang #define IFNET_PCP_NONE 0xff /* PCP disabled */ 575*d4a07e70Sfengbojiang 576*d4a07e70Sfengbojiang #define IFDR_MSG_SIZE 64 577*d4a07e70Sfengbojiang #define IFDR_REASON_MSG 1 578*d4a07e70Sfengbojiang #define IFDR_REASON_VENDOR 2 579*d4a07e70Sfengbojiang struct ifdownreason { 580*d4a07e70Sfengbojiang char ifdr_name[IFNAMSIZ]; 581*d4a07e70Sfengbojiang uint32_t ifdr_reason; 582*d4a07e70Sfengbojiang uint32_t ifdr_vendor; 583*d4a07e70Sfengbojiang char ifdr_msg[IFDR_MSG_SIZE]; 584*d4a07e70Sfengbojiang }; 585*d4a07e70Sfengbojiang 586*d4a07e70Sfengbojiang #ifdef _KERNEL 587*d4a07e70Sfengbojiang #ifdef MALLOC_DECLARE 588*d4a07e70Sfengbojiang MALLOC_DECLARE(M_IFADDR); 589*d4a07e70Sfengbojiang MALLOC_DECLARE(M_IFMADDR); 590*d4a07e70Sfengbojiang #endif 591*d4a07e70Sfengbojiang 592*d4a07e70Sfengbojiang extern struct sx ifnet_detach_sxlock; 593*d4a07e70Sfengbojiang 594*d4a07e70Sfengbojiang #endif 595*d4a07e70Sfengbojiang 596df6ad731Slogwang struct if_nameindex { 597df6ad731Slogwang unsigned int if_index; /* 1, 2, ... */ 598df6ad731Slogwang char *if_name; /* null terminated name: "le0", ... */ 599df6ad731Slogwang }; 600df6ad731Slogwang 601df6ad731Slogwang void if_freenameindex(struct if_nameindex *); 602df6ad731Slogwang char *if_indextoname(unsigned int, char *); 603df6ad731Slogwang struct if_nameindex *if_nameindex(void); 604df6ad731Slogwang unsigned int if_nametoindex(const char *); 605df6ad731Slogwang 606df6ad731Slogwang #endif /* !_NET_IF_H_ */ 607