2005-01-07 01:45:51 +00:00
|
|
|
/*-
|
2017-11-20 19:43:44 +00:00
|
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
*
|
1994-05-24 10:09:53 +00:00
|
|
|
* Copyright (c) 1982, 1986, 1989, 1993
|
|
|
|
* The Regents of the University of California. All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
2017-02-28 23:42:47 +00:00
|
|
|
* 3. Neither the name of the University nor the names of its contributors
|
1994-05-24 10:09:53 +00:00
|
|
|
* may be used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
* @(#)if.h 8.1 (Berkeley) 6/10/93
|
1999-08-28 01:08:13 +00:00
|
|
|
* $FreeBSD$
|
1994-05-24 10:09:53 +00:00
|
|
|
*/
|
|
|
|
|
1994-08-21 05:11:48 +00:00
|
|
|
#ifndef _NET_IF_H_
|
1994-11-15 14:41:38 +00:00
|
|
|
#define _NET_IF_H_
|
1994-08-21 05:11:48 +00:00
|
|
|
|
2002-10-02 07:44:50 +00:00
|
|
|
#include <sys/cdefs.h>
|
|
|
|
|
|
|
|
#if __BSD_VISIBLE
|
1998-03-21 13:36:20 +00:00
|
|
|
/*
|
|
|
|
* <net/if.h> does not depend on <sys/time.h> on most other systems. This
|
2001-02-06 12:05:58 +00:00
|
|
|
* helps userland compatibility. (struct timeval ifi_lastchange)
|
2011-10-21 12:58:34 +00:00
|
|
|
* The same holds for <sys/socket.h>. (struct sockaddr ifru_addr)
|
1998-03-21 13:36:20 +00:00
|
|
|
*/
|
1999-12-29 04:46:21 +00:00
|
|
|
#ifndef _KERNEL
|
1998-03-21 13:36:20 +00:00
|
|
|
#include <sys/time.h>
|
2011-10-21 12:58:34 +00:00
|
|
|
#include <sys/socket.h>
|
1998-03-21 13:36:20 +00:00
|
|
|
#endif
|
2002-10-02 07:44:50 +00:00
|
|
|
#endif
|
2001-07-02 20:49:25 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Length of interface external name, including terminating '\0'.
|
|
|
|
* Note: this is the same size as a generic device's external name.
|
|
|
|
*/
|
2002-10-02 07:44:50 +00:00
|
|
|
#define IF_NAMESIZE 16
|
|
|
|
#if __BSD_VISIBLE
|
|
|
|
#define IFNAMSIZ IF_NAMESIZE
|
2003-10-31 18:32:15 +00:00
|
|
|
#define IF_MAXUNIT 0x7fff /* historical value */
|
2002-10-02 07:44:50 +00:00
|
|
|
#endif
|
|
|
|
#if __BSD_VISIBLE
|
|
|
|
|
2001-07-02 20:49:25 +00:00
|
|
|
/*
|
|
|
|
* Structure used to query names of interface cloners.
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct if_clonereq {
|
|
|
|
int ifcr_total; /* total cloners (out) */
|
|
|
|
int ifcr_count; /* room for this many in user buffer */
|
|
|
|
char *ifcr_buffer; /* buffer for cloner names */
|
|
|
|
};
|
|
|
|
|
1996-10-21 23:05:57 +00:00
|
|
|
/*
|
|
|
|
* Structure describing information about an interface
|
|
|
|
* which may be of interest to management entities.
|
|
|
|
*/
|
1995-07-09 08:12:27 +00:00
|
|
|
struct if_data {
|
|
|
|
/* generic interface information */
|
2014-03-13 03:42:24 +00:00
|
|
|
uint8_t ifi_type; /* ethernet, tokenring, etc */
|
|
|
|
uint8_t ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */
|
|
|
|
uint8_t ifi_addrlen; /* media address length */
|
|
|
|
uint8_t ifi_hdrlen; /* media header length */
|
|
|
|
uint8_t ifi_link_state; /* current link state */
|
|
|
|
uint8_t ifi_vhid; /* carp vhid */
|
|
|
|
uint16_t ifi_datalen; /* length of this data struct */
|
|
|
|
uint32_t ifi_mtu; /* maximum transmission unit */
|
|
|
|
uint32_t ifi_metric; /* routing metric (external only) */
|
|
|
|
uint64_t ifi_baudrate; /* linespeed */
|
1995-07-09 08:12:27 +00:00
|
|
|
/* volatile statistics */
|
2014-03-13 03:42:24 +00:00
|
|
|
uint64_t ifi_ipackets; /* packets received on interface */
|
|
|
|
uint64_t ifi_ierrors; /* input errors on interface */
|
|
|
|
uint64_t ifi_opackets; /* packets sent on interface */
|
|
|
|
uint64_t ifi_oerrors; /* output errors on interface */
|
|
|
|
uint64_t ifi_collisions; /* collisions on csma interfaces */
|
|
|
|
uint64_t ifi_ibytes; /* total number of octets received */
|
|
|
|
uint64_t ifi_obytes; /* total number of octets sent */
|
|
|
|
uint64_t ifi_imcasts; /* packets received via multicast */
|
|
|
|
uint64_t ifi_omcasts; /* packets sent via multicast */
|
|
|
|
uint64_t ifi_iqdrops; /* dropped on input */
|
|
|
|
uint64_t ifi_oqdrops; /* dropped on output */
|
|
|
|
uint64_t ifi_noproto; /* destined for unsupported protocol */
|
|
|
|
uint64_t ifi_hwassist; /* HW offload capabilities, see IFCAP */
|
|
|
|
|
|
|
|
/* Unions are here to make sizes MI. */
|
|
|
|
union { /* uptime at attach or stat reset */
|
|
|
|
time_t tt;
|
|
|
|
uint64_t ph;
|
|
|
|
} __ifi_epoch;
|
|
|
|
#define ifi_epoch __ifi_epoch.tt
|
|
|
|
union { /* time of last administrative change */
|
|
|
|
struct timeval tv;
|
|
|
|
struct {
|
|
|
|
uint64_t ph1;
|
|
|
|
uint64_t ph2;
|
|
|
|
} ph;
|
|
|
|
} __ifi_lastchange;
|
|
|
|
#define ifi_lastchange __ifi_lastchange.tv
|
1995-07-09 08:12:27 +00:00
|
|
|
};
|
|
|
|
|
2005-08-09 12:56:20 +00:00
|
|
|
/*-
|
Rename IFF_RUNNING to IFF_DRV_RUNNING, IFF_OACTIVE to IFF_DRV_OACTIVE,
and move both flags from ifnet.if_flags to ifnet.if_drv_flags, making
and documenting the locking of these flags the responsibility of the
device driver, not the network stack. The flags for these two fields
will be mutually exclusive so that they can be exposed to user space as
though they were stored in the same variable.
Provide #defines to provide the old names #ifndef _KERNEL, so that user
applications (such as ifconfig) can use the old flag names. Using the
old names in a device driver will result in a compile error in order to
help device driver writers adopt the new model.
When exposing the interface flags to user space, via interface ioctls
or routing sockets, or the two fields together. Since the driver flags
cannot currently be set for user space, no new logic is currently
required to handle this case.
Add some assertions that general purpose network stack routines, such
as if_setflags(), are not improperly used on driver-owned flags.
With this change, a large number of very minor network stack races are
closed, subject to correct device driver locking. Most were likely
never triggered.
Driver sweep to follow; many thanks to pjd and bz for the line-by-line
review they gave this patch.
Reviewed by: pjd, bz
MFC after: 7 days
2005-08-09 10:16:17 +00:00
|
|
|
* Interface flags are of two types: network stack owned flags, and driver
|
|
|
|
* owned flags. Historically, these values were stored in the same ifnet
|
|
|
|
* flags field, but with the advent of fine-grained locking, they have been
|
|
|
|
* broken out such that the network stack is responsible for synchronizing
|
|
|
|
* the stack-owned fields, and the device driver the device-owned fields.
|
|
|
|
* Both halves can perform lockless reads of the other half's field, subject
|
|
|
|
* to accepting the involved races.
|
|
|
|
*
|
|
|
|
* Both sets of flags come from the same number space, and should not be
|
|
|
|
* permitted to conflict, as they are exposed to user space via a single
|
|
|
|
* field.
|
|
|
|
*
|
2005-08-09 12:56:20 +00:00
|
|
|
* The following symbols identify read and write requirements for fields:
|
|
|
|
*
|
|
|
|
* (i) if_flags field set by device driver before attach, read-only there
|
|
|
|
* after.
|
|
|
|
* (n) if_flags field written only by the network stack, read by either the
|
|
|
|
* stack or driver.
|
|
|
|
* (d) if_drv_flags field written only by the device driver, read by either
|
|
|
|
* the stack or driver.
|
Rename IFF_RUNNING to IFF_DRV_RUNNING, IFF_OACTIVE to IFF_DRV_OACTIVE,
and move both flags from ifnet.if_flags to ifnet.if_drv_flags, making
and documenting the locking of these flags the responsibility of the
device driver, not the network stack. The flags for these two fields
will be mutually exclusive so that they can be exposed to user space as
though they were stored in the same variable.
Provide #defines to provide the old names #ifndef _KERNEL, so that user
applications (such as ifconfig) can use the old flag names. Using the
old names in a device driver will result in a compile error in order to
help device driver writers adopt the new model.
When exposing the interface flags to user space, via interface ioctls
or routing sockets, or the two fields together. Since the driver flags
cannot currently be set for user space, no new logic is currently
required to handle this case.
Add some assertions that general purpose network stack routines, such
as if_setflags(), are not improperly used on driver-owned flags.
With this change, a large number of very minor network stack races are
closed, subject to correct device driver locking. Most were likely
never triggered.
Driver sweep to follow; many thanks to pjd and bz for the line-by-line
review they gave this patch.
Reviewed by: pjd, bz
MFC after: 7 days
2005-08-09 10:16:17 +00:00
|
|
|
*/
|
2005-08-09 12:56:20 +00:00
|
|
|
#define IFF_UP 0x1 /* (n) interface is up */
|
|
|
|
#define IFF_BROADCAST 0x2 /* (i) broadcast address valid */
|
|
|
|
#define IFF_DEBUG 0x4 /* (n) turn on debugging */
|
|
|
|
#define IFF_LOOPBACK 0x8 /* (i) is a loopback net */
|
|
|
|
#define IFF_POINTOPOINT 0x10 /* (i) is a point-to-point link */
|
2013-11-05 12:52:56 +00:00
|
|
|
/* 0x20 was IFF_SMART */
|
2005-08-09 12:56:20 +00:00
|
|
|
#define IFF_DRV_RUNNING 0x40 /* (d) resources allocated */
|
|
|
|
#define IFF_NOARP 0x80 /* (n) no address resolution protocol */
|
|
|
|
#define IFF_PROMISC 0x100 /* (n) receive all packets */
|
|
|
|
#define IFF_ALLMULTI 0x200 /* (n) receive all multicast packets */
|
|
|
|
#define IFF_DRV_OACTIVE 0x400 /* (d) tx hardware queue is full */
|
|
|
|
#define IFF_SIMPLEX 0x800 /* (i) can't hear own transmissions */
|
1994-05-24 10:09:53 +00:00
|
|
|
#define IFF_LINK0 0x1000 /* per link layer defined bit */
|
|
|
|
#define IFF_LINK1 0x2000 /* per link layer defined bit */
|
|
|
|
#define IFF_LINK2 0x4000 /* per link layer defined bit */
|
1994-10-01 19:44:38 +00:00
|
|
|
#define IFF_ALTPHYS IFF_LINK2 /* use alternate physical connection */
|
2005-08-09 12:56:20 +00:00
|
|
|
#define IFF_MULTICAST 0x8000 /* (i) supports multicast */
|
2010-12-07 20:23:47 +00:00
|
|
|
#define IFF_CANTCONFIG 0x10000 /* (i) unconfigurable using ioctl(2) */
|
2005-08-09 12:56:20 +00:00
|
|
|
#define IFF_PPROMISC 0x20000 /* (n) user-requested promisc mode */
|
|
|
|
#define IFF_MONITOR 0x40000 /* (n) user-requested monitor mode */
|
|
|
|
#define IFF_STATICARP 0x80000 /* (n) static ARP */
|
2009-04-23 09:32:30 +00:00
|
|
|
#define IFF_DYING 0x200000 /* (n) interface is winding down */
|
2009-12-29 13:35:18 +00:00
|
|
|
#define IFF_RENAMING 0x400000 /* (n) interface is being renamed */
|
2018-05-11 20:08:28 +00:00
|
|
|
#define IFF_NOGROUP 0x800000 /* (n) interface is not part of any groups */
|
|
|
|
|
|
|
|
|
Rename IFF_RUNNING to IFF_DRV_RUNNING, IFF_OACTIVE to IFF_DRV_OACTIVE,
and move both flags from ifnet.if_flags to ifnet.if_drv_flags, making
and documenting the locking of these flags the responsibility of the
device driver, not the network stack. The flags for these two fields
will be mutually exclusive so that they can be exposed to user space as
though they were stored in the same variable.
Provide #defines to provide the old names #ifndef _KERNEL, so that user
applications (such as ifconfig) can use the old flag names. Using the
old names in a device driver will result in a compile error in order to
help device driver writers adopt the new model.
When exposing the interface flags to user space, via interface ioctls
or routing sockets, or the two fields together. Since the driver flags
cannot currently be set for user space, no new logic is currently
required to handle this case.
Add some assertions that general purpose network stack routines, such
as if_setflags(), are not improperly used on driver-owned flags.
With this change, a large number of very minor network stack races are
closed, subject to correct device driver locking. Most were likely
never triggered.
Driver sweep to follow; many thanks to pjd and bz for the line-by-line
review they gave this patch.
Reviewed by: pjd, bz
MFC after: 7 days
2005-08-09 10:16:17 +00:00
|
|
|
/*
|
|
|
|
* Old names for driver flags so that user space tools can continue to use
|
2005-08-09 12:56:20 +00:00
|
|
|
* the old (portable) names.
|
Rename IFF_RUNNING to IFF_DRV_RUNNING, IFF_OACTIVE to IFF_DRV_OACTIVE,
and move both flags from ifnet.if_flags to ifnet.if_drv_flags, making
and documenting the locking of these flags the responsibility of the
device driver, not the network stack. The flags for these two fields
will be mutually exclusive so that they can be exposed to user space as
though they were stored in the same variable.
Provide #defines to provide the old names #ifndef _KERNEL, so that user
applications (such as ifconfig) can use the old flag names. Using the
old names in a device driver will result in a compile error in order to
help device driver writers adopt the new model.
When exposing the interface flags to user space, via interface ioctls
or routing sockets, or the two fields together. Since the driver flags
cannot currently be set for user space, no new logic is currently
required to handle this case.
Add some assertions that general purpose network stack routines, such
as if_setflags(), are not improperly used on driver-owned flags.
With this change, a large number of very minor network stack races are
closed, subject to correct device driver locking. Most were likely
never triggered.
Driver sweep to follow; many thanks to pjd and bz for the line-by-line
review they gave this patch.
Reviewed by: pjd, bz
MFC after: 7 days
2005-08-09 10:16:17 +00:00
|
|
|
*/
|
|
|
|
#ifndef _KERNEL
|
|
|
|
#define IFF_RUNNING IFF_DRV_RUNNING
|
|
|
|
#define IFF_OACTIVE IFF_DRV_OACTIVE
|
|
|
|
#endif
|
|
|
|
|
1994-05-24 10:09:53 +00:00
|
|
|
/* flags set internally only: */
|
|
|
|
#define IFF_CANTCHANGE \
|
Rename IFF_RUNNING to IFF_DRV_RUNNING, IFF_OACTIVE to IFF_DRV_OACTIVE,
and move both flags from ifnet.if_flags to ifnet.if_drv_flags, making
and documenting the locking of these flags the responsibility of the
device driver, not the network stack. The flags for these two fields
will be mutually exclusive so that they can be exposed to user space as
though they were stored in the same variable.
Provide #defines to provide the old names #ifndef _KERNEL, so that user
applications (such as ifconfig) can use the old flag names. Using the
old names in a device driver will result in a compile error in order to
help device driver writers adopt the new model.
When exposing the interface flags to user space, via interface ioctls
or routing sockets, or the two fields together. Since the driver flags
cannot currently be set for user space, no new logic is currently
required to handle this case.
Add some assertions that general purpose network stack routines, such
as if_setflags(), are not improperly used on driver-owned flags.
With this change, a large number of very minor network stack races are
closed, subject to correct device driver locking. Most were likely
never triggered.
Driver sweep to follow; many thanks to pjd and bz for the line-by-line
review they gave this patch.
Reviewed by: pjd, bz
MFC after: 7 days
2005-08-09 10:16:17 +00:00
|
|
|
(IFF_BROADCAST|IFF_POINTOPOINT|IFF_DRV_RUNNING|IFF_DRV_OACTIVE|\
|
2013-11-05 12:52:56 +00:00
|
|
|
IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI|IFF_PROMISC|\
|
2010-12-07 20:31:04 +00:00
|
|
|
IFF_DYING|IFF_CANTCONFIG)
|
1994-05-24 10:09:53 +00:00
|
|
|
|
2004-05-03 13:48:35 +00:00
|
|
|
/*
|
|
|
|
* Values for if_link_state.
|
|
|
|
*/
|
|
|
|
#define LINK_STATE_UNKNOWN 0 /* link invalid/unknown */
|
|
|
|
#define LINK_STATE_DOWN 1 /* link is down */
|
|
|
|
#define LINK_STATE_UP 2 /* link is up */
|
|
|
|
|
2002-11-14 23:16:18 +00:00
|
|
|
/*
|
|
|
|
* Some convenience macros used for setting ifi_baudrate.
|
|
|
|
* XXX 1000 vs. 1024? --thorpej@netbsd.org
|
|
|
|
*/
|
2012-10-17 19:24:13 +00:00
|
|
|
#define IF_Kbps(x) ((uintmax_t)(x) * 1000) /* kilobits/sec. */
|
2002-11-14 23:16:18 +00:00
|
|
|
#define IF_Mbps(x) (IF_Kbps((x) * 1000)) /* megabits/sec. */
|
|
|
|
#define IF_Gbps(x) (IF_Mbps((x) * 1000)) /* gigabits/sec. */
|
|
|
|
|
2006-09-06 18:06:04 +00:00
|
|
|
/*
|
|
|
|
* Capabilities that interfaces can advertise.
|
|
|
|
*
|
|
|
|
* struct ifnet.if_capabilities
|
|
|
|
* contains the optional features & capabilities a particular interface
|
|
|
|
* supports (not only the driver but also the detected hw revision).
|
|
|
|
* Capabilities are defined by IFCAP_* below.
|
2007-05-02 11:13:48 +00:00
|
|
|
* struct ifnet.if_capenable
|
2006-09-06 18:06:04 +00:00
|
|
|
* contains the enabled (either by default or through ifconfig) optional
|
|
|
|
* features & capabilities on this interface.
|
|
|
|
* Capabilities are defined by IFCAP_* below.
|
|
|
|
* struct if_data.ifi_hwassist in mbuf CSUM_ flag form, controlled by above
|
|
|
|
* contains the enabled optional feature & capabilites that can be used
|
|
|
|
* individually per packet and are specified in the mbuf pkthdr.csum_flags
|
|
|
|
* field. IFCAP_* and CSUM_* do not match one to one and CSUM_* may be
|
2007-05-02 11:13:48 +00:00
|
|
|
* more detailed or differenciated than IFCAP_*.
|
2006-09-06 18:06:04 +00:00
|
|
|
* Hwassist features are defined CSUM_* in sys/mbuf.h
|
2011-06-14 12:40:55 +00:00
|
|
|
*
|
|
|
|
* Capabilities that cannot be arbitrarily changed with ifconfig/ioctl
|
|
|
|
* are listed in IFCAP_CANTCHANGE, similar to IFF_CANTCHANGE.
|
|
|
|
* This is not strictly necessary because the common code never
|
|
|
|
* changes capabilities, and it is left to the individual driver
|
|
|
|
* to do the right thing. However, having the filter here
|
|
|
|
* avoids replication of the same code in all individual drivers.
|
2006-09-06 18:06:04 +00:00
|
|
|
*/
|
2008-08-28 22:05:19 +00:00
|
|
|
#define IFCAP_RXCSUM 0x00001 /* can offload checksum on RX */
|
|
|
|
#define IFCAP_TXCSUM 0x00002 /* can offload checksum on TX */
|
|
|
|
#define IFCAP_NETCONS 0x00004 /* can be a network console */
|
|
|
|
#define IFCAP_VLAN_MTU 0x00008 /* VLAN-compatible MTU */
|
|
|
|
#define IFCAP_VLAN_HWTAGGING 0x00010 /* hardware VLAN tag support */
|
|
|
|
#define IFCAP_JUMBO_MTU 0x00020 /* 9000 byte MTU supported */
|
|
|
|
#define IFCAP_POLLING 0x00040 /* driver supports polling */
|
|
|
|
#define IFCAP_VLAN_HWCSUM 0x00080 /* can do IFCAP_HWCSUM on VLANs */
|
|
|
|
#define IFCAP_TSO4 0x00100 /* can do TCP Segmentation Offload */
|
|
|
|
#define IFCAP_TSO6 0x00200 /* can do TCP6 Segmentation Offload */
|
|
|
|
#define IFCAP_LRO 0x00400 /* can do Large Receive Offload */
|
|
|
|
#define IFCAP_WOL_UCAST 0x00800 /* wake on any unicast frame */
|
|
|
|
#define IFCAP_WOL_MCAST 0x01000 /* wake on any multicast frame */
|
|
|
|
#define IFCAP_WOL_MAGIC 0x02000 /* wake on any Magic Packet */
|
|
|
|
#define IFCAP_TOE4 0x04000 /* interface can offload TCP */
|
|
|
|
#define IFCAP_TOE6 0x08000 /* interface can offload TCP6 */
|
|
|
|
#define IFCAP_VLAN_HWFILTER 0x10000 /* interface hw can filter vlan tag */
|
2017-12-06 23:03:34 +00:00
|
|
|
/* available 0x20000 */
|
2010-02-20 22:47:20 +00:00
|
|
|
#define IFCAP_VLAN_HWTSO 0x40000 /* can do IFCAP_TSO on VLANs */
|
2010-03-16 17:59:12 +00:00
|
|
|
#define IFCAP_LINKSTATE 0x80000 /* the runtime link state is dynamic */
|
2011-06-14 12:40:55 +00:00
|
|
|
#define IFCAP_NETMAP 0x100000 /* netmap mode supported/enabled */
|
It turns out that too many drivers are not only parsing the L2/3/4
headers for TSO but also for generic checksum offloading. Ideally we
would only have one common function shared amongst all drivers, and
perhaps when updating them for IPv6 we should introduce that.
Eventually we should provide the meta information along with mbufs to
avoid (re-)parsing entirely.
To not break IPv6 (checksums and offload) and to be able to MFC the
changes without risking to hurt 3rd party drivers, duplicate the v4
framework, as other OSes have done as well.
Introduce interface capability flags for TX/RX checksum offload with
IPv6, to allow independent toggling (where possible). Add CSUM_*_IPV6
flags for UDP/TCP over IPv6, and reserve further for SCTP, and IPv6
fragmentation. Define CSUM_DELAY_DATA_IPV6 as we do for legacy IP and
add an alias for CSUM_DATA_VALID_IPV6.
This pretty much brings IPv6 handling in line with IPv4.
TSO is still handled in a different way and not via if_hwassist.
Update ifconfig to allow (un)setting of the new capability flags.
Update loopback to announce the new capabilities and if_hwassist flags.
Individual driver updates will have to follow, as will SCTP.
Reported by: gallatin, dim, ..
Reviewed by: gallatin (glanced at?)
MFC after: 3 days
X-MFC with: r235961,235959,235958
2012-05-28 09:30:13 +00:00
|
|
|
#define IFCAP_RXCSUM_IPV6 0x200000 /* can offload checksum on IPv6 RX */
|
|
|
|
#define IFCAP_TXCSUM_IPV6 0x400000 /* can offload checksum on IPv6 TX */
|
2013-10-09 19:04:40 +00:00
|
|
|
#define IFCAP_HWSTATS 0x800000 /* manages counters internally */
|
Implement kernel support for hardware rate limited sockets.
- Add RATELIMIT kernel configuration keyword which must be set to
enable the new functionality.
- Add support for hardware driven, Receive Side Scaling, RSS aware, rate
limited sendqueues and expose the functionality through the already
established SO_MAX_PACING_RATE setsockopt(). The API support rates in
the range from 1 to 4Gbytes/s which are suitable for regular TCP and
UDP streams. The setsockopt(2) manual page has been updated.
- Add rate limit function callback API to "struct ifnet" which supports
the following operations: if_snd_tag_alloc(), if_snd_tag_modify(),
if_snd_tag_query() and if_snd_tag_free().
- Add support to ifconfig to view, set and clear the IFCAP_TXRTLMT
flag, which tells if a network driver supports rate limiting or not.
- This patch also adds support for rate limiting through VLAN and LAGG
intermediate network devices.
- How rate limiting works:
1) The userspace application calls setsockopt() after accepting or
making a new connection to set the rate which is then stored in the
socket structure in the kernel. Later on when packets are transmitted
a check is made in the transmit path for rate changes. A rate change
implies a non-blocking ifp->if_snd_tag_alloc() call will be made to the
destination network interface, which then sets up a custom sendqueue
with the given rate limitation parameter. A "struct m_snd_tag" pointer is
returned which serves as a "snd_tag" hint in the m_pkthdr for the
subsequently transmitted mbufs.
2) When the network driver sees the "m->m_pkthdr.snd_tag" different
from NULL, it will move the packets into a designated rate limited sendqueue
given by the snd_tag pointer. It is up to the individual drivers how the rate
limited traffic will be rate limited.
3) Route changes are detected by the NIC drivers in the ifp->if_transmit()
routine when the ifnet pointer in the incoming snd_tag mismatches the
one of the network interface. The network adapter frees the mbuf and
returns EAGAIN which causes the ip_output() to release and clear the send
tag. Upon next ip_output() a new "snd_tag" will be tried allocated.
4) When the PCB is detached the custom sendqueue will be released by a
non-blocking ifp->if_snd_tag_free() call to the currently bound network
interface.
Reviewed by: wblock (manpages), adrian, gallatin, scottl (network)
Differential Revision: https://reviews.freebsd.org/D3687
Sponsored by: Mellanox Technologies
MFC after: 3 months
2017-01-18 13:31:17 +00:00
|
|
|
#define IFCAP_TXRTLMT 0x1000000 /* hardware supports TX rate limiting */
|
2017-11-07 09:29:14 +00:00
|
|
|
#define IFCAP_HWRXTSTMP 0x2000000 /* hardware rx timestamping */
|
It turns out that too many drivers are not only parsing the L2/3/4
headers for TSO but also for generic checksum offloading. Ideally we
would only have one common function shared amongst all drivers, and
perhaps when updating them for IPv6 we should introduce that.
Eventually we should provide the meta information along with mbufs to
avoid (re-)parsing entirely.
To not break IPv6 (checksums and offload) and to be able to MFC the
changes without risking to hurt 3rd party drivers, duplicate the v4
framework, as other OSes have done as well.
Introduce interface capability flags for TX/RX checksum offload with
IPv6, to allow independent toggling (where possible). Add CSUM_*_IPV6
flags for UDP/TCP over IPv6, and reserve further for SCTP, and IPv6
fragmentation. Define CSUM_DELAY_DATA_IPV6 as we do for legacy IP and
add an alias for CSUM_DATA_VALID_IPV6.
This pretty much brings IPv6 handling in line with IPv4.
TSO is still handled in a different way and not via if_hwassist.
Update ifconfig to allow (un)setting of the new capability flags.
Update loopback to announce the new capabilities and if_hwassist flags.
Individual driver updates will have to follow, as will SCTP.
Reported by: gallatin, dim, ..
Reviewed by: gallatin (glanced at?)
MFC after: 3 days
X-MFC with: r235961,235959,235958
2012-05-28 09:30:13 +00:00
|
|
|
|
|
|
|
#define IFCAP_HWCSUM_IPV6 (IFCAP_RXCSUM_IPV6 | IFCAP_TXCSUM_IPV6)
|
2001-09-18 20:13:03 +00:00
|
|
|
|
2007-12-10 02:31:00 +00:00
|
|
|
#define IFCAP_HWCSUM (IFCAP_RXCSUM | IFCAP_TXCSUM)
|
|
|
|
#define IFCAP_TSO (IFCAP_TSO4 | IFCAP_TSO6)
|
|
|
|
#define IFCAP_WOL (IFCAP_WOL_UCAST | IFCAP_WOL_MCAST | IFCAP_WOL_MAGIC)
|
2007-12-15 22:06:23 +00:00
|
|
|
#define IFCAP_TOE (IFCAP_TOE4 | IFCAP_TOE6)
|
2001-09-18 17:41:42 +00:00
|
|
|
|
2011-06-14 12:40:55 +00:00
|
|
|
#define IFCAP_CANTCHANGE (IFCAP_NETMAP)
|
|
|
|
|
1994-05-24 10:09:53 +00:00
|
|
|
#define IFQ_MAXLEN 50
|
|
|
|
#define IFNET_SLOWHZ 1 /* granularity is 1 second */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Message format for use in obtaining information about interfaces
|
|
|
|
* from getkerninfo and the routing socket
|
2012-02-11 06:02:16 +00:00
|
|
|
* For the new, extensible interface see struct if_msghdrl below.
|
1994-05-24 10:09:53 +00:00
|
|
|
*/
|
|
|
|
struct if_msghdr {
|
|
|
|
u_short ifm_msglen; /* to skip over non-understood messages */
|
2001-02-06 12:05:58 +00:00
|
|
|
u_char ifm_version; /* future binary compatibility */
|
1994-05-24 10:09:53 +00:00
|
|
|
u_char ifm_type; /* message type */
|
|
|
|
int ifm_addrs; /* like rtm_addrs */
|
|
|
|
int ifm_flags; /* value of if_flags */
|
|
|
|
u_short ifm_index; /* index for associated ifp */
|
2018-11-26 13:42:18 +00:00
|
|
|
u_short _ifm_spare1;
|
1994-05-24 10:09:53 +00:00
|
|
|
struct if_data ifm_data;/* statistics and other data about if */
|
|
|
|
};
|
|
|
|
|
2012-02-11 06:02:16 +00:00
|
|
|
/*
|
|
|
|
* The 'l' version shall be used by new interfaces, like NET_RT_IFLISTL. It is
|
|
|
|
* extensible after ifm_data_off or within ifm_data. Both the if_msghdr and
|
|
|
|
* if_data now have a member field detailing the struct length in addition to
|
|
|
|
* the routing message length. Macros are provided to find the start of
|
|
|
|
* ifm_data and the start of the socket address strucutres immediately following
|
|
|
|
* struct if_msghdrl given a pointer to struct if_msghdrl.
|
|
|
|
*/
|
|
|
|
#define IF_MSGHDRL_IFM_DATA(_l) \
|
|
|
|
(struct if_data *)((char *)(_l) + (_l)->ifm_data_off)
|
|
|
|
#define IF_MSGHDRL_RTA(_l) \
|
|
|
|
(void *)((uintptr_t)(_l) + (_l)->ifm_len)
|
|
|
|
struct if_msghdrl {
|
|
|
|
u_short ifm_msglen; /* to skip over non-understood messages */
|
|
|
|
u_char ifm_version; /* future binary compatibility */
|
|
|
|
u_char ifm_type; /* message type */
|
|
|
|
int ifm_addrs; /* like rtm_addrs */
|
|
|
|
int ifm_flags; /* value of if_flags */
|
|
|
|
u_short ifm_index; /* index for associated ifp */
|
|
|
|
u_short _ifm_spare1; /* spare space to grow if_index, see if_var.h */
|
|
|
|
u_short ifm_len; /* length of if_msghdrl incl. if_data */
|
|
|
|
u_short ifm_data_off; /* offset of if_data from beginning */
|
2018-11-26 13:42:18 +00:00
|
|
|
int _ifm_spare2;
|
2012-02-11 06:02:16 +00:00
|
|
|
struct if_data ifm_data;/* statistics and other data about if */
|
|
|
|
};
|
|
|
|
|
1994-05-24 10:09:53 +00:00
|
|
|
/*
|
|
|
|
* Message format for use in obtaining information about interface addresses
|
|
|
|
* from getkerninfo and the routing socket
|
2012-02-11 06:02:16 +00:00
|
|
|
* For the new, extensible interface see struct ifa_msghdrl below.
|
1994-05-24 10:09:53 +00:00
|
|
|
*/
|
|
|
|
struct ifa_msghdr {
|
|
|
|
u_short ifam_msglen; /* to skip over non-understood messages */
|
2001-02-06 12:05:58 +00:00
|
|
|
u_char ifam_version; /* future binary compatibility */
|
1994-05-24 10:09:53 +00:00
|
|
|
u_char ifam_type; /* message type */
|
|
|
|
int ifam_addrs; /* like rtm_addrs */
|
|
|
|
int ifam_flags; /* value of ifa_flags */
|
|
|
|
u_short ifam_index; /* index for associated ifp */
|
2018-11-26 13:42:18 +00:00
|
|
|
u_short _ifam_spare1;
|
2014-07-29 15:01:29 +00:00
|
|
|
int ifam_metric; /* value of ifa_ifp->if_metric */
|
1994-05-24 10:09:53 +00:00
|
|
|
};
|
|
|
|
|
2012-02-11 06:02:16 +00:00
|
|
|
/*
|
|
|
|
* The 'l' version shall be used by new interfaces, like NET_RT_IFLISTL. It is
|
|
|
|
* extensible after ifam_metric or within ifam_data. Both the ifa_msghdrl and
|
|
|
|
* if_data now have a member field detailing the struct length in addition to
|
|
|
|
* the routing message length. Macros are provided to find the start of
|
|
|
|
* ifm_data and the start of the socket address strucutres immediately following
|
|
|
|
* struct ifa_msghdrl given a pointer to struct ifa_msghdrl.
|
|
|
|
*/
|
|
|
|
#define IFA_MSGHDRL_IFAM_DATA(_l) \
|
|
|
|
(struct if_data *)((char *)(_l) + (_l)->ifam_data_off)
|
|
|
|
#define IFA_MSGHDRL_RTA(_l) \
|
|
|
|
(void *)((uintptr_t)(_l) + (_l)->ifam_len)
|
|
|
|
struct ifa_msghdrl {
|
|
|
|
u_short ifam_msglen; /* to skip over non-understood messages */
|
|
|
|
u_char ifam_version; /* future binary compatibility */
|
|
|
|
u_char ifam_type; /* message type */
|
|
|
|
int ifam_addrs; /* like rtm_addrs */
|
|
|
|
int ifam_flags; /* value of ifa_flags */
|
|
|
|
u_short ifam_index; /* index for associated ifp */
|
|
|
|
u_short _ifam_spare1; /* spare space to grow if_index, see if_var.h */
|
|
|
|
u_short ifam_len; /* length of ifa_msghdrl incl. if_data */
|
|
|
|
u_short ifam_data_off; /* offset of if_data from beginning */
|
2014-07-29 15:01:29 +00:00
|
|
|
int ifam_metric; /* value of ifa_ifp->if_metric */
|
2012-02-11 06:02:16 +00:00
|
|
|
struct if_data ifam_data;/* statistics and other data about if or
|
|
|
|
* address */
|
|
|
|
};
|
|
|
|
|
1997-01-13 21:26:53 +00:00
|
|
|
/*
|
|
|
|
* Message format for use in obtaining information about multicast addresses
|
|
|
|
* from the routing socket
|
|
|
|
*/
|
|
|
|
struct ifma_msghdr {
|
|
|
|
u_short ifmam_msglen; /* to skip over non-understood messages */
|
2001-02-06 12:05:58 +00:00
|
|
|
u_char ifmam_version; /* future binary compatibility */
|
1997-01-13 21:26:53 +00:00
|
|
|
u_char ifmam_type; /* message type */
|
|
|
|
int ifmam_addrs; /* like rtm_addrs */
|
|
|
|
int ifmam_flags; /* value of ifa_flags */
|
|
|
|
u_short ifmam_index; /* index for associated ifp */
|
2018-11-26 13:42:18 +00:00
|
|
|
u_short _ifmam_spare1;
|
1997-01-13 21:26:53 +00:00
|
|
|
};
|
|
|
|
|
2002-01-18 14:33:04 +00:00
|
|
|
/*
|
|
|
|
* Message format announcing the arrival or departure of a network interface.
|
|
|
|
*/
|
|
|
|
struct if_announcemsghdr {
|
|
|
|
u_short ifan_msglen; /* to skip over non-understood messages */
|
|
|
|
u_char ifan_version; /* future binary compatibility */
|
|
|
|
u_char ifan_type; /* message type */
|
|
|
|
u_short ifan_index; /* index for associated ifp */
|
|
|
|
char ifan_name[IFNAMSIZ]; /* if name, e.g. "en0" */
|
|
|
|
u_short ifan_what; /* what type of announcement */
|
|
|
|
};
|
|
|
|
|
|
|
|
#define IFAN_ARRIVAL 0 /* interface arrival */
|
|
|
|
#define IFAN_DEPARTURE 1 /* interface departure */
|
|
|
|
|
2010-01-27 00:30:07 +00:00
|
|
|
/*
|
|
|
|
* Buffer with length to be used in SIOCGIFDESCR/SIOCSIFDESCR requests
|
|
|
|
*/
|
|
|
|
struct ifreq_buffer {
|
|
|
|
size_t length;
|
|
|
|
void *buffer;
|
|
|
|
};
|
|
|
|
|
1994-05-24 10:09:53 +00:00
|
|
|
/*
|
|
|
|
* Interface request structure used for socket
|
|
|
|
* ioctl's. All interface ioctl's must have parameter
|
|
|
|
* definitions which begin with ifr_name. The
|
|
|
|
* remainder may be interface specific.
|
|
|
|
*/
|
|
|
|
struct ifreq {
|
|
|
|
char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */
|
|
|
|
union {
|
|
|
|
struct sockaddr ifru_addr;
|
|
|
|
struct sockaddr ifru_dstaddr;
|
|
|
|
struct sockaddr ifru_broadaddr;
|
2010-01-27 00:30:07 +00:00
|
|
|
struct ifreq_buffer ifru_buffer;
|
1999-02-19 13:41:35 +00:00
|
|
|
short ifru_flags[2];
|
2001-10-17 19:40:44 +00:00
|
|
|
short ifru_index;
|
2009-06-15 18:59:29 +00:00
|
|
|
int ifru_jid;
|
1994-05-24 10:09:53 +00:00
|
|
|
int ifru_metric;
|
1994-08-08 10:49:26 +00:00
|
|
|
int ifru_mtu;
|
1994-12-21 22:57:05 +00:00
|
|
|
int ifru_phys;
|
1997-05-03 21:07:13 +00:00
|
|
|
int ifru_media;
|
1994-05-24 10:09:53 +00:00
|
|
|
caddr_t ifru_data;
|
2001-09-18 17:41:42 +00:00
|
|
|
int ifru_cap[2];
|
2011-07-03 12:22:02 +00:00
|
|
|
u_int ifru_fib;
|
Add support to priority code point (PCP) that is an 3-bit field
which refers to IEEE 802.1p class of service and maps to the frame
priority level.
Values in order of priority are: 1 (Background (lowest)),
0 (Best effort (default)), 2 (Excellent effort),
3 (Critical applications), 4 (Video, < 100ms latency),
5 (Video, < 10ms latency), 6 (Internetwork control) and
7 (Network control (highest)).
Example of usage:
root# ifconfig em0.1 create
root# ifconfig em0.1 vlanpcp 3
Note:
The review D801 includes the pf(4) part, but as discussed with kristof,
we won't commit the pf(4) bits for now.
The credits of the original code is from rwatson.
Differential Revision: https://reviews.freebsd.org/D801
Reviewed by: gnn, adrian, loos
Discussed with: rwatson, glebius, kristof
Tested by: many including Matthew Grooms <mgrooms__shrew.net>
Obtained from: pfSense
Relnotes: Yes
2016-06-06 09:51:58 +00:00
|
|
|
u_char ifru_vlan_pcp;
|
1994-05-24 10:09:53 +00:00
|
|
|
} ifr_ifru;
|
|
|
|
#define ifr_addr ifr_ifru.ifru_addr /* address */
|
|
|
|
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
|
|
|
|
#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
|
2018-03-27 18:26:50 +00:00
|
|
|
#ifndef _KERNEL
|
2010-01-27 00:30:07 +00:00
|
|
|
#define ifr_buffer ifr_ifru.ifru_buffer /* user supplied buffer with its length */
|
2018-03-27 18:26:50 +00:00
|
|
|
#endif
|
2002-08-18 07:05:00 +00:00
|
|
|
#define ifr_flags ifr_ifru.ifru_flags[0] /* flags (low 16 bits) */
|
|
|
|
#define ifr_flagshigh ifr_ifru.ifru_flags[1] /* flags (high 16 bits) */
|
2009-06-15 18:59:29 +00:00
|
|
|
#define ifr_jid ifr_ifru.ifru_jid /* jail/vnet */
|
1994-05-24 10:09:53 +00:00
|
|
|
#define ifr_metric ifr_ifru.ifru_metric /* metric */
|
1994-08-08 10:49:26 +00:00
|
|
|
#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */
|
1994-12-22 07:20:03 +00:00
|
|
|
#define ifr_phys ifr_ifru.ifru_phys /* physical wire */
|
1997-05-03 21:07:13 +00:00
|
|
|
#define ifr_media ifr_ifru.ifru_media /* physical media */
|
2018-03-30 18:50:13 +00:00
|
|
|
#ifndef _KERNEL
|
1994-05-24 10:09:53 +00:00
|
|
|
#define ifr_data ifr_ifru.ifru_data /* for use by interface */
|
2018-03-30 18:50:13 +00:00
|
|
|
#endif
|
2001-09-18 17:41:42 +00:00
|
|
|
#define ifr_reqcap ifr_ifru.ifru_cap[0] /* requested capabilities */
|
|
|
|
#define ifr_curcap ifr_ifru.ifru_cap[1] /* current capabilities */
|
2001-10-17 19:40:44 +00:00
|
|
|
#define ifr_index ifr_ifru.ifru_index /* interface index */
|
2011-07-03 12:22:02 +00:00
|
|
|
#define ifr_fib ifr_ifru.ifru_fib /* interface fib */
|
Add support to priority code point (PCP) that is an 3-bit field
which refers to IEEE 802.1p class of service and maps to the frame
priority level.
Values in order of priority are: 1 (Background (lowest)),
0 (Best effort (default)), 2 (Excellent effort),
3 (Critical applications), 4 (Video, < 100ms latency),
5 (Video, < 10ms latency), 6 (Internetwork control) and
7 (Network control (highest)).
Example of usage:
root# ifconfig em0.1 create
root# ifconfig em0.1 vlanpcp 3
Note:
The review D801 includes the pf(4) part, but as discussed with kristof,
we won't commit the pf(4) bits for now.
The credits of the original code is from rwatson.
Differential Revision: https://reviews.freebsd.org/D801
Reviewed by: gnn, adrian, loos
Discussed with: rwatson, glebius, kristof
Tested by: many including Matthew Grooms <mgrooms__shrew.net>
Obtained from: pfSense
Relnotes: Yes
2016-06-06 09:51:58 +00:00
|
|
|
#define ifr_vlan_pcp ifr_ifru.ifru_vlan_pcp /* VLAN priority */
|
2018-03-27 15:29:32 +00:00
|
|
|
#define ifr_lan_pcp ifr_ifru.ifru_vlan_pcp /* VLAN priority */
|
1994-05-24 10:09:53 +00:00
|
|
|
};
|
|
|
|
|
1998-01-13 02:56:21 +00:00
|
|
|
#define _SIZEOF_ADDR_IFREQ(ifr) \
|
|
|
|
((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \
|
|
|
|
(sizeof(struct ifreq) - sizeof(struct sockaddr) + \
|
|
|
|
(ifr).ifr_addr.sa_len) : sizeof(struct ifreq))
|
|
|
|
|
1994-05-24 10:09:53 +00:00
|
|
|
struct ifaliasreq {
|
|
|
|
char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */
|
|
|
|
struct sockaddr ifra_addr;
|
|
|
|
struct sockaddr ifra_broadaddr;
|
|
|
|
struct sockaddr ifra_mask;
|
A major overhaul of the CARP implementation. The ip_carp.c was started
from scratch, copying needed functionality from the old implemenation
on demand, with a thorough review of all code. The main change is that
interface layer has been removed from the CARP. Now redundant addresses
are configured exactly on the interfaces, they run on.
The CARP configuration itself is, as before, configured and read via
SIOCSVH/SIOCGVH ioctls. A new prefix created with SIOCAIFADDR or
SIOCAIFADDR_IN6 may now be configured to a particular virtual host id,
which makes the prefix redundant.
ifconfig(8) semantics has been changed too: now one doesn't need
to clone carpXX interface, he/she should directly configure a vhid
on a Ethernet interface.
To supply vhid data from the kernel to an application the getifaddrs(8)
function had been changed to pass ifam_data with each address. [1]
The new implementation definitely closes all PRs related to carp(4)
being an interface, and may close several others. It also allows
to run a single redundant IP per interface.
Big thanks to Bjoern Zeeb for his help with inet6 part of patch, for
idea on using ifam_data and for several rounds of reviewing!
PR: kern/117000, kern/126945, kern/126714, kern/120130, kern/117448
Reviewed by: bz
Submitted by: bz [1]
2011-12-16 12:16:56 +00:00
|
|
|
int ifra_vhid;
|
1994-05-24 10:09:53 +00:00
|
|
|
};
|
|
|
|
|
2013-11-06 19:46:20 +00:00
|
|
|
/* 9.x compat */
|
|
|
|
struct oifaliasreq {
|
|
|
|
char ifra_name[IFNAMSIZ];
|
|
|
|
struct sockaddr ifra_addr;
|
|
|
|
struct sockaddr ifra_broadaddr;
|
|
|
|
struct sockaddr ifra_mask;
|
|
|
|
};
|
|
|
|
|
1997-05-03 21:07:13 +00:00
|
|
|
struct ifmediareq {
|
|
|
|
char ifm_name[IFNAMSIZ]; /* if name, e.g. "en0" */
|
|
|
|
int ifm_current; /* current media options */
|
|
|
|
int ifm_mask; /* don't care mask */
|
|
|
|
int ifm_status; /* media status */
|
|
|
|
int ifm_active; /* active options */
|
|
|
|
int ifm_count; /* # entries in ifm_ulist array */
|
|
|
|
int *ifm_ulist; /* media words */
|
|
|
|
};
|
1999-06-19 18:42:31 +00:00
|
|
|
|
2005-06-05 03:13:13 +00:00
|
|
|
struct ifdrv {
|
|
|
|
char ifd_name[IFNAMSIZ]; /* if name, e.g. "en0" */
|
|
|
|
unsigned long ifd_cmd;
|
|
|
|
size_t ifd_len;
|
|
|
|
void *ifd_data;
|
|
|
|
};
|
|
|
|
|
1999-06-19 18:42:31 +00:00
|
|
|
/*
|
|
|
|
* Structure used to retrieve aux status data from interfaces.
|
1999-07-05 12:00:05 +00:00
|
|
|
* Kernel suppliers to this interface should respect the formatting
|
1999-06-19 18:42:31 +00:00
|
|
|
* needed by ifconfig(8): each line starts with a TAB and ends with
|
1999-07-05 12:00:05 +00:00
|
|
|
* a newline. The canonical example to copy and paste is in if_tun.c.
|
1999-06-19 18:42:31 +00:00
|
|
|
*/
|
|
|
|
|
1999-07-05 12:00:05 +00:00
|
|
|
#define IFSTATMAX 800 /* 10 lines of text */
|
1999-06-19 18:42:31 +00:00
|
|
|
struct ifstat {
|
1999-07-05 12:00:05 +00:00
|
|
|
char ifs_name[IFNAMSIZ]; /* if name, e.g. "en0" */
|
|
|
|
char ascii[IFSTATMAX + 1];
|
1999-06-19 18:42:31 +00:00
|
|
|
};
|
|
|
|
|
1994-05-24 10:09:53 +00:00
|
|
|
/*
|
|
|
|
* Structure used in SIOCGIFCONF request.
|
|
|
|
* Used to retrieve interface configuration
|
|
|
|
* for machine (useful for programs which
|
|
|
|
* must know all networks accessible).
|
|
|
|
*/
|
|
|
|
struct ifconf {
|
|
|
|
int ifc_len; /* size of associated buffer */
|
|
|
|
union {
|
|
|
|
caddr_t ifcu_buf;
|
|
|
|
struct ifreq *ifcu_req;
|
|
|
|
} ifc_ifcu;
|
|
|
|
#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
|
|
|
|
#define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */
|
|
|
|
};
|
|
|
|
|
2006-06-19 22:20:45 +00:00
|
|
|
/*
|
|
|
|
* interface groups
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define IFG_ALL "all" /* group contains all interfaces */
|
|
|
|
/* XXX: will we implement this? */
|
|
|
|
#define IFG_EGRESS "egress" /* if(s) default route(s) point to */
|
|
|
|
|
|
|
|
struct ifg_req {
|
|
|
|
union {
|
|
|
|
char ifgrqu_group[IFNAMSIZ];
|
|
|
|
char ifgrqu_member[IFNAMSIZ];
|
|
|
|
} ifgrq_ifgrqu;
|
|
|
|
#define ifgrq_group ifgrq_ifgrqu.ifgrqu_group
|
|
|
|
#define ifgrq_member ifgrq_ifgrqu.ifgrqu_member
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Used to lookup groups for an interface
|
|
|
|
*/
|
|
|
|
struct ifgroupreq {
|
|
|
|
char ifgr_name[IFNAMSIZ];
|
|
|
|
u_int ifgr_len;
|
|
|
|
union {
|
|
|
|
char ifgru_group[IFNAMSIZ];
|
|
|
|
struct ifg_req *ifgru_groups;
|
|
|
|
} ifgr_ifgru;
|
2018-04-05 22:14:55 +00:00
|
|
|
#ifndef _KERNEL
|
2006-06-19 22:20:45 +00:00
|
|
|
#define ifgr_group ifgr_ifgru.ifgru_group
|
|
|
|
#define ifgr_groups ifgr_ifgru.ifgru_groups
|
2018-04-05 22:14:55 +00:00
|
|
|
#endif
|
2006-06-19 22:20:45 +00:00
|
|
|
};
|
|
|
|
|
2014-08-29 18:02:58 +00:00
|
|
|
/*
|
|
|
|
* Structure used to request i2c data
|
|
|
|
* from interface transceivers.
|
|
|
|
*/
|
|
|
|
struct ifi2creq {
|
|
|
|
uint8_t dev_addr; /* i2c address (0xA0, 0xA2) */
|
|
|
|
uint8_t offset; /* read offset */
|
|
|
|
uint8_t len; /* read length */
|
|
|
|
uint8_t spare0;
|
|
|
|
uint32_t spare1;
|
|
|
|
uint8_t data[8]; /* read buffer */
|
|
|
|
};
|
|
|
|
|
2017-09-05 05:28:52 +00:00
|
|
|
/*
|
|
|
|
* RSS hash.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define RSS_FUNC_NONE 0 /* RSS disabled */
|
|
|
|
#define RSS_FUNC_PRIVATE 1 /* non-standard */
|
|
|
|
#define RSS_FUNC_TOEPLITZ 2
|
|
|
|
|
|
|
|
#define RSS_TYPE_IPV4 0x00000001
|
|
|
|
#define RSS_TYPE_TCP_IPV4 0x00000002
|
|
|
|
#define RSS_TYPE_IPV6 0x00000004
|
|
|
|
#define RSS_TYPE_IPV6_EX 0x00000008
|
|
|
|
#define RSS_TYPE_TCP_IPV6 0x00000010
|
|
|
|
#define RSS_TYPE_TCP_IPV6_EX 0x00000020
|
|
|
|
#define RSS_TYPE_UDP_IPV4 0x00000040
|
|
|
|
#define RSS_TYPE_UDP_IPV6 0x00000080
|
|
|
|
#define RSS_TYPE_UDP_IPV6_EX 0x00000100
|
|
|
|
|
|
|
|
#define RSS_KEYLEN 128
|
|
|
|
|
|
|
|
struct ifrsskey {
|
|
|
|
char ifrk_name[IFNAMSIZ]; /* if name, e.g. "en0" */
|
|
|
|
uint8_t ifrk_func; /* RSS_FUNC_ */
|
|
|
|
uint8_t ifrk_spare0;
|
|
|
|
uint16_t ifrk_keylen;
|
|
|
|
uint8_t ifrk_key[RSS_KEYLEN];
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ifrsshash {
|
|
|
|
char ifrh_name[IFNAMSIZ]; /* if name, e.g. "en0" */
|
|
|
|
uint8_t ifrh_func; /* RSS_FUNC_ */
|
|
|
|
uint8_t ifrh_spare0;
|
|
|
|
uint16_t ifrh_spare1;
|
|
|
|
uint32_t ifrh_types; /* RSS_TYPE_ */
|
|
|
|
};
|
|
|
|
|
2018-03-27 15:29:32 +00:00
|
|
|
#define IFNET_PCP_NONE 0xff /* PCP disabled */
|
|
|
|
|
2002-10-02 07:44:50 +00:00
|
|
|
#endif /* __BSD_VISIBLE */
|
|
|
|
|
1999-12-29 04:46:21 +00:00
|
|
|
#ifdef _KERNEL
|
1997-10-12 20:26:33 +00:00
|
|
|
#ifdef MALLOC_DECLARE
|
|
|
|
MALLOC_DECLARE(M_IFADDR);
|
|
|
|
MALLOC_DECLARE(M_IFMADDR);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
1999-12-29 04:46:21 +00:00
|
|
|
#ifndef _KERNEL
|
1999-11-05 14:41:39 +00:00
|
|
|
struct if_nameindex {
|
2002-10-02 07:44:50 +00:00
|
|
|
unsigned int if_index; /* 1, 2, ... */
|
2002-10-02 07:55:33 +00:00
|
|
|
char *if_name; /* null terminated name: "le0", ... */
|
1999-11-05 14:41:39 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
__BEGIN_DECLS
|
2002-10-02 07:55:33 +00:00
|
|
|
void if_freenameindex(struct if_nameindex *);
|
|
|
|
char *if_indextoname(unsigned int, char *);
|
|
|
|
struct if_nameindex *if_nameindex(void);
|
|
|
|
unsigned int if_nametoindex(const char *);
|
1999-11-05 14:41:39 +00:00
|
|
|
__END_DECLS
|
|
|
|
#endif
|
1994-11-15 14:41:38 +00:00
|
|
|
#endif /* !_NET_IF_H_ */
|