Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
IFNET(9)		   Kernel Developer's Manual		      IFNET(9)

NAME
       if_t,  ifnet, ifaddr, ifqueue, if_data -- kernel	interfaces for manipu-
       lating network interfaces

SYNOPSIS
       #include	<sys/param.h>
       #include	<sys/time.h>
       #include	<sys/socket.h>
       #include	<net/if.h>
       #include	<net/if_var.h>
       #include	<net/if_types.h>

   Interface Manipulation Functions
       if_t
       if_alloc(u_char type);

       if_t
       if_alloc_dev(u_char type, device_t dev);

       if_t
       if_alloc_domain(u_char type, int	numa_domain);

       void
       if_attach(if_t ifp);

       void
       if_detach(if_t ifp);

       void
       if_free(if_t ifp);

       void
       if_free_type(if_t ifp, u_char type);

       void
       if_down(if_t ifp);

       int
       ifioctl(struct	 socket	   *so,	   u_long    cmd,    caddr_t	 data,
	   struct thread *td);

       int
       ifpromisc(if_t ifp, int pswitch);

       int
       if_allmulti(if_t	ifp, int amswitch);

       if_t
       ifunit(const char *name);

       if_t
       ifunit_ref(const	char *name);

       void
       if_up(if_t ifp);

   Interface Address Functions
       struct ifaddr *
       ifa_ifwithaddr(struct sockaddr *addr);

       struct ifaddr *
       ifa_ifwithdstaddr(struct	sockaddr *addr,	int fib);

       struct ifaddr *
       ifa_ifwithnet(struct sockaddr *addr, int	ignore_ptp, int	fib);

       struct ifaddr *
       ifaof_ifpforaddr(struct sockaddr	*addr, if_t ifp);

       void
       ifa_ref(struct ifaddr *ifa);

       void
       ifa_free(struct ifaddr *ifa);

   Interface Multicast Address Functions
       int
       if_addmulti(if_t	ifp, struct sockaddr *sa, struct ifmultiaddr **ifmap);

       int
       if_delmulti(if_t	ifp, struct sockaddr *sa);

       struct ifmultiaddr *
       if_findmulti(if_t ifp, struct sockaddr *sa);

   Output queue	accessors
       if_dequeue(if_t ifp, struct mbuf	*m);

   Output queue	macros
       IF_DEQUEUE(struct ifqueue *ifq, struct mbuf *m);

   if_t	accesors
       uint64_t
       if_setbaudrate(if_t ifp,	uint64_t baudrate);

       uint64_t
       if_getbaudrate(const if_t ifp);

       int
       if_setcapabilities(if_t ifp, int	capabilities);

       int
       if_setcapabilitiesbit(if_t ifp, int setbit, int clearbit);

       int
       if_getcapabilities(const	if_t ifp);

       int
       if_togglecapenable(if_t ifp, int	togglecap);

       int
       if_setcapenable(if_t ifp, int capenable);

       int
       if_setcapenablebit(if_t ifp, int	setcap,	int clearcap);

       int
       if_getcapenable(const if_t ifp);

       int
       if_setcapabilities2(if_t	ifp, int capabilities);

       int
       if_setcapabilities2bit(if_t ifp,	int setbit, int	clearbit);

       int
       if_getcapabilities2(const if_t ifp);

       int
       if_togglecapenable2(if_t	ifp, int togglecap);

       int
       if_setcapenable2(if_t ifp, int capenable);

       int
       if_setcapenable2bit(if_t	ifp, int setcap, int clearcap);

       int
       if_getcapenable2(const if_t ifp);

       int
       if_getdunit(const if_t ifp);

       int
       if_getindex(const if_t ifp);

       int
       if_getidxgen(const if_t ifp);

       const char *
       if_getdname(const if_t ifp);

       void
       if_setdname(if_t	ifp, const char	*name);

       const char *
       if_name(if_t ifp);

       int
       if_setname(if_t ifp, const char *name);

       void
       if_setdescr(if_t	ifp, char *descrbuf);

       char *
       if_allocdescr(size_t sz,	int malloc_flag);

       void
       if_freedescr(char *descrbuf);

       int
       if_getalloctype(const if_t ifp);

       int
       if_gettype(const	if_t ifp);

       int
       if_setdev(if_t ifp, void	*dev);

       int
       if_setdrvflagbits(if_t ifp, int if_setflags, int	clear_flags);

       int
       if_getdrvflags(const if_t ifp);

       int
       if_setdrvflags(if_t ifp,	int flags);

       int
       if_getlinkstate(if_t ifp);

       int
       if_clearhwassist(if_t ifp);

       int
       if_sethwassistbits(if_t ifp, int	toset, int toclear);

       int
       if_sethwassist(if_t ifp,	int hwassist_bit);

       int
       if_gethwassist(const if_t ifp);

       int
       if_togglehwassist(if_t ifp, int toggle_bits);

       int
       if_setsoftc(if_t	ifp, void *softc);

       void *
       if_getsoftc(if_t	ifp);

       void
       if_setllsoftc(if_t ifp, void *softc);

       void *
       if_getllsoftc(if_t ifp);

       u_int
       if_getfib(if_t ifp);

       uint8_t
       if_getaddrlen(if_t ifp);

       int
       if_gethwaddr(const if_t ifp, struct ifreq *);

       const uint8_t *
       if_getbroadcastaddr(const if_t ifp);

       void
       if_setbroadcastaddr(if_t	ifp, const uint8_t *);

       int
       if_setmtu(if_t ifp, int mtu);

       int
       if_getmtu(const if_t ifp);

       int
       if_getmtu_family(const if_t ifp,	int family);

       void
       if_notifymtu(if_t ifp);

       int
       if_setflagbits(if_t ifp,	int set, int clear);

       int
       if_setflags(if_t	ifp, int flags);

       int
       if_getflags(const if_t ifp);

       int
       if_getnumadomain(if_t ifp);

       int
       if_sendq_empty(if_t ifp);

       int
       if_setsendqready(if_t ifp);

       int
       if_setsendqlen(if_t ifp,	int tx_desc_count);

       int
       if_sethwtsomax(if_t ifp,	u_int if_hw_tsomax);

       int
       if_sethwtsomaxsegcount(if_t ifp,	u_int if_hw_tsomaxsegcount);

       int
       if_sethwtsomaxsegsize(if_t ifp, u_int if_hw_tsomaxsegsize);

       u_int
       if_gethwtsomax(const if_t ifp);

       u_int
       if_gethwtsomaxsegcount(const if_t ifp);

       u_int
       if_gethwtsomaxsegsize(const if_t	ifp);

       void
       if_setnetmapadapter(if_t	ifp, struct netmap_adapter *na);

       struct netmap_adapter *
       if_getnetmapadapter(if_t	ifp);

       void
       if_input(if_t ifp, struct mbuf* sendmp);

       int
       if_sendq_prepend(if_t ifp, struct mbuf *m);

       struct mbuf *
       if_dequeue(if_t ifp);

       int
       if_setifheaderlen(if_t ifp, int len);

       void
       if_setrcvif(struct mbuf *m, if_t	ifp);

       void
       if_setvtag(struct mbuf *m, u_int16_t tag);

       u_int16_t
       if_getvtag(struct mbuf *m);

       int
       if_vlantrunkinuse(if_t ifp);

       caddr_t
       if_getlladdr(const if_t ifp);

       struct vnet *
       if_getvnet(const	if_t ifp);

       void *
       if_gethandle(u_char);

       void
       if_bpfmtap(if_t ifp, struct mbuf	*m);

       void
       if_etherbpfmtap(if_t ifp, struct	mbuf *m);

       void
       if_vlancap(if_t ifp);

       int
       if_transmit(if_t	ifp, struct mbuf *m);

       void
       if_init(if_t ifp, void *ctx);

       int
       if_resolvemulti(if_t ifp, struct	sockaddr **, struct sockaddr *);

       uint64_t
       if_getcounter(if_t ifp, ift_counter counter);

       struct label *
       if_getmaclabel(if_t ifp);

       void
       if_setmaclabel(if_t ifp,	struct label *label);

       struct bpf_if *
       if_getbpf(if_t ifp);

       uint8_t
       if_getpcp(if_t ifp);

       void *
       if_getl2com(if_t	ifp);

       struct ifvlantrunk *
       if_getvlantrunk(if_t ifp);

       bool
       if_altq_is_enabled(if_t ifp);

   struct ifnet	Member Functions
       void
       (*if_input)(if_t	ifp, struct mbuf *m);

       int
       (*if_output)(if_t ifp,	 struct	mbuf *m,   const struct	sockaddr *dst,
	   struct route	*ro);

       void
       (*if_start)(if_t	ifp);

       int
       (*if_transmit)(if_t ifp,	struct mbuf *m);

       void
       (*if_qflush)(if_t ifp);

       int
       (*if_ioctl)(if_t	ifp, u_long cmd, caddr_t data);

       void
       (*if_init)(void *if_softc);

       int
       (*if_resolvemulti)(if_t ifp,		      struct sockaddr **retsa,
	   struct sockaddr *addr);

   struct ifaddr member	function
       void
       (*ifa_rtrequest)(int cmd,			   struct rtentry *rt,
	   struct rt_addrinfo *info);

   Global Variables
       extern struct ifnethead ifnet;
       extern int if_index;
       extern int ifqmaxlen;

DATA STRUCTURES
       The kernel mechanisms for handling network interfaces reside  primarily
       in the ifnet, if_data, ifaddr, and ifmultiaddr structures in <net/if.h>
       and  <net/if_var.h>  and	 the  functions	 named	above  and  defined in
       /sys/net/if.c.  Those interfaces	which are intended to be used by  user
       programs	 are defined in	<net/if.h>; these include the interface	flags,
       the if_data structure, and the structures defining  the	appearance  of
       interface-related  messages  on	the  route(4)  routing	socket	and in
       sysctl(3).  The header file <net/if_var.h> defines the  kernel-internal
       interfaces, including the ifnet,	ifaddr,	and ifmultiaddr	structures and
       the  functions  which  manipulate them.	(A few user programs will need
       <net/if_var.h> because it is the	prerequisite of	some other header file
       like <netinet/if_ether.h>.  Most	references to those two	files in  par-
       ticular can be replaced by <net/ethernet.h>.)

       The system keeps	a linked list of interfaces using the TAILQ macros de-
       fined  in  queue(3);  this  list	is headed by a struct ifnethead	called
       ifnet.  The elements of this list are of	type struct  ifnet,  and  most
       kernel  routines	 which	manipulate  interface as such accept or	return
       pointers	to these structures.  Each  interface  structure  contains  an
       if_data	structure used for statistics and information.	Each interface
       also has	a TAILQ	of interface addresses,	 described  by	ifaddr	struc-
       tures.  An AF_LINK address (see link_addr(3)) describing	the link layer
       implemented by the interface (if	any) is	accessed by the	if_addr	struc-
       ture.   (Some  trivial  interfaces  do  not  provide any	link layer ad-
       dresses;	this structure,	while still present, serves only  to  identify
       the interface name and index.)

       Finally,	 those	interfaces supporting reception	of multicast datagrams
       have a TAILQ of multicast group memberships, described  by  ifmultiaddr
       structures.  These memberships are reference-counted.

       Interfaces  are	also  associated  with	an  output queue, defined as a
       struct ifqueue; this structure is used to hold packets while the	inter-
       face is in the process of sending another.

   The ifnet accessors
       The accessors for if_t are as follows:

	     if_getbaudrate() if_setbaudrate()
		     (u_long) The line rate of the interface, in bits per sec-
		     ond.

	     if_setcapabilities() if_setcapabilitiesbit() if_getcapabilities()
		     (int) Flags describing  the  capabilities	the  interface
		     supports (see below).

	     if_getcapenable()	    if_setcapenable()	  if_setcapenablebit()
		     if_togglecapenable()
		     (int) Flags describing the	enabled	 capabilities  of  the
		     interface (see below).

	     if_getcapabilities2()			 if_setcapabilities2()
		     if_setcapabilities2bit()

	     if_getcapenable2()	   if_setcapenable2()	 if_setcapenable2bit()
		     if_togglecapenable2()

	     if_getdunit()
		     (int)  A unique number assigned to	each interface managed
		     by	a particular driver.  Drivers may choose to  set  this
		     to	 IF_DUNIT_NONE if a unit number	is not associated with
		     the  device.   (Initialized  by   driver,	 usually   via
		     if_initname().)

	     if_getindex()
		     (u_short) Return the unique number	assigned to the	device
		     when  attached.   This  number  can  be  used in a	struct
		     sockaddr_dl to refer to a particular interface  by	 index
		     (see link_addr(3)).  This is initialized by if_alloc().

	     if_getidxgen()

	     if_getdname() if_setdname()
		     (const  char *) The name of the driver.  This is initial-
		     ized by driver (usually via if_initname()).

	     if_name() if_setname()
		     (char *) The name of  the	interface,  (e.g.,  `fxp0'  or
		     "lo0").   This  is	 initialized  by  driver,  usually via
		     if_initname().

	     if_getalloctype()
		     (u_char) The type of the interface	as it was at the  time
		     of	 its  allocation.  It is used to cache the type	passed
		     to	if_alloc(),  but  unlike  if_type,  it	would  not  be
		     changed by	drivers.

	     if_gettype()

	     if_setdev()

	     if_getdrvflags() if_setdrvflags() if_setdrvflagbits()

	     if_getlinkstate()

	     if_clearhwassist()	if_sethwassistbits()
		     if_gethwassist()	if_sethwassist()   if_togglehwassist()
		     (u_long) A	detailed interpretation	of the capabilities to
		     offload computational tasks for  outgoing	packets.   The
		     interface	driver must keep this field in accord with the
		     current value of if_capenable.

	     if_getsoftc() if_setsoftc()
		     (void *) A	pointer	to the driver's	private	 state	block.
		     This is initialized by driver at attach.

	     if_setllsoftc()

	     if_getllsoftc()

	     if_getfib()

	     if_getaddrlen()

	     if_gethwaddr()

	     if_getbroadcastaddr() if_setbroadcastaddr()
		     Access the	interface broadcast addess.

	     if_setmtu()

	     if_getmtu()
		     Access the	interface MTU.

	     if_setflags() if_getflags() if_setflagbits()
		     (int) Flags describing operational	parameters of this in-
		     terface  (see  below).   These  flags  are	manipulated by
		     generic code.

	     if_getnumadomain()
		     (uint8_t) The NUMA	domain of the hardware device  associ-
		     ated  with	the interface.	This is	filled in with a wild-
		     card value	unless the kernel is NUMA aware, the system is
		     a	NUMA  system,  and  the	 ifnet	is   allocated	 using
		     if_alloc_dev() or if_alloc_domain().

	     if_sendq_empty()

	     if_setsendqready()

	     if_setsendqlen()

	     if_sethwtsomax() if_gethwtsomax()

	     if_sethwtsomaxsegcount() if_gethwtsomaxsegcount()

	     if_sethwtsomaxsegsize() if_gethwtsomaxsegsize()

	     if_setnetmapadapter() if_getnetmapadapter()

	     if_setifheaderlen()

	     if_setrcvif()

	     if_setvtag() if_getvtag()

	     if_vlantrunkinuse()

	     if_getlladdr()

	     if_getvnet()
		     (struct  vnet  *)	A pointer to the virtual network stack
		     instance.	This is	initialized by if_attach().

	     if_gethandle()

	     if_vlancap()

	     if_getcounter()

	     if_getmaclabel() if_setmaclabel()

	     if_getbpf()
		     (struct bpf_if  *)	 Opaque	 per-interface	data  for  the
		     packet   filter,	bpf(4).	   This	  is   initialized  by
		     bpf_attach().

	     if_getpcp()

	     if_getl2com()
		     A pointer to the common data for the interface's layer  2
		     protocol.	   This	   is	initialized   by   if_alloc().
		     if_getvlantrunk(if_t  ifp)	 (struct  ifvlantrunk	*)   A
		     pointer to	802.1Q trunk structure,	vlan(4).  This is ini-
		     tialized by the driver-specific if_ioctl()	routine.

	     if_getdrvflags() if_setdrvflags() if_setdrvflagbits()
		     (int)  Flags describing operational status	of this	inter-
		     face (see below).	These flags are	manipulated by driver.

	     if_addmulti() if_delmulti() if_findmulti()
		     Add, remove, and find  multicast  addresses  assigned  to
		     this interface.

	     if_getifaddr()
		     (struct  ifaddr *)	Get a pointer to the interface's link-
		     level address.

	     if_getbroadcastaddr() if_setbroadcastaddr()
		     (const u_int8_t *)	A link-level broadcast bytestring  for
		     protocols with variable address length.

	     if_getafdata()
		     (void *) An address family	dependent data region.

	     if_addgroup() if_delgroup()
		     Add and delete groups from	the interface.

       References to ifnet structures are gained by calling the	if_ref() func-
       tion  and released by calling the if_rele() function.  They are used to
       allow kernel code walking global	interface lists	to release  the	 ifnet
       lock yet	keep the ifnet structure stable.

       There  are  in  addition	a number of function pointers which the	driver
       must initialize to complete its interface with  the  generic  interface
       layer:

	     if_input()
	     Pass  a  packet  to an appropriate	upper layer as determined from
	     the link-layer header of the  packet.   This  routine  is	to  be
	     called  from an interrupt handler or used to emulate reception of
	     a packet on  this	interface.   A	single	function  implementing
	     if_input()	 can  be  shared  among	multiple drivers utilizing the
	     same link-layer framing, e.g., Ethernet.

	     if_output()
	     Output a packet on	interface ifp, or queue	it on the output queue
	     if	the interface is already active.

	     if_transmit()
	     Transmit a	packet on an interface or queue	it if the interface is
	     in	use.  This function will return	ENOBUFS	if the	devices	 soft-
	     ware  and	hardware  queues are both full.	 This function must be
	     installed after if_attach() to override the  default  implementa-
	     tion.  This function is exposed in	order to allow drivers to man-
	     age  their	 own queues and	to reduce the latency caused by	a fre-
	     quently gratuitous	enqueue	/ dequeue pair to ifq.	The  suggested
	     internal software queuing mechanism is buf_ring.

	     if_qflush()
	     Free  mbufs  in  internally  managed queues when the interface is
	     marked down.  This	function must be installed  after  if_attach()
	     to	override the default implementation.  This function is exposed
	     in	 order	to allow drivers to manage their own queues and	to re-
	     duce the latency caused by	a frequently gratuitous	enqueue	/  de-
	     queue pair	to ifq.	 The suggested internal	software queuing mech-
	     anism is buf_ring.

	     if_start()
	     Start queued output on an interface.  This	function is exposed in
	     order   to	  provide  for	some  interface	 classes  to  share  a
	     if_output() among all drivers.  if_start()	 may  only  be	called
	     when the IFF_DRV_OACTIVE flag is not set.	(Thus, IFF_DRV_OACTIVE
	     does  not	literally  mean	that output is active, but rather that
	     the device's internal output queue	is  full.)  Please  note  that
	     this function will	soon be	deprecated.

	     if_ioctl()
	     Process   interface-related   ioctl(2)   requests	 (defined   in
	     <sys/sockio.h>).  Preliminary processing is done by  the  generic
	     routine ifioctl() to check	for appropriate	privileges, locate the
	     interface	being  manipulated, and	perform	certain	generic	opera-
	     tions like	twiddling flags	and flushing queues.  See the descrip-
	     tion of ifioctl() below for more information.

	     if_init()
	     Initialize	and bring up the hardware, e.g., reset	the  chip  and
	     enable the	receiver unit.	Should mark the	interface running, but
	     not active	(IFF_DRV_RUNNING, ~IIF_DRV_OACTIVE).

	     if_resolvemulti()
	     Check  the	requested multicast group membership, addr, for	valid-
	     ity, and if necessary compute a  link-layer  group	 which	corre-
	     sponds to that address which is returned in *retsa.  Returns zero
	     on	success, or an error code on failure.

   Interface Flags
       Interface  flags	 are  used  for	 a number of different purposes.  Some
       flags simply indicate information about the type	of interface  and  its
       capabilities; others are	dynamically manipulated	to reflect the current
       state  of  the  interface.   Flags of the former	kind are marked	<S> in
       this table;  the	 latter	 are  marked  <D>.   Flags  which  begin  with
       "IFF_DRV_"  are	stored	in if_drv_flags; all other flags are stored in
       if_flags.

       The macro IFF_CANTCHANGE	defines	the bits which cannot be set by	a user
       program using the SIOCSIFFLAGS command to ioctl(2); these are indicated
       by an asterisk (`*') in the following listing.

	     IFF_UP	      <D> The interface	has been configured up by  the
			      user-level code.
	     IFF_BROADCAST    <S*> The interface supports broadcast.
	     IFF_DEBUG	      <D>  Used	 to  enable/disable  driver  debugging
			      code.
	     IFF_LOOPBACK     <S> The interface	is a loopback device.
	     IFF_POINTOPOINT  <S*>   The    interface	 is    point-to-point;
			      "broadcast"  address  is actually	the address of
			      the other	end.
	     IFF_DRV_RUNNING  <D*> The interface has been configured  and  dy-
			      namic  resources	were  successfully  allocated.
			      Probably only useful internal to the interface.
	     IFF_NOARP	      <D> Disable network address resolution  on  this
			      interface.
	     IFF_PROMISC      <D*> This	interface is in	promiscuous mode.
	     IFF_PPROMISC     <D> This interface is in the permanently promis-
			      cuous mode (implies IFF_PROMISC).
	     IFF_ALLMULTI     <D*>  This  interface  is	in all-multicasts mode
			      (used by multicast routers).
	     IFF_PALLMULTI    <D> This interface is in	the  permanently  all-
			      multicasts mode (implies IFF_ALLMULTI).
	     IFF_DRV_OACTIVE  <D*>  The	 interface's hardware output queue (if
			      any) is full; output packets are to be queued.
	     IFF_SIMPLEX      <S*> The interface cannot	hear its own transmis-
			      sions.
	     IFF_LINK0
	     IFF_LINK1
	     IFF_LINK2	      <D> Control flags	for  the  link	layer.	 (Cur-
			      rently  abused to	select among multiple physical
			      layers on	some devices.)
	     IFF_MULTICAST    <S*> This	interface supports multicast.
	     IFF_CANTCONFIG   <S*> The interface  is  not  configurable	 in  a
			      meaningful  way.	 Primarily  useful for IFT_USB
			      interfaces registered at the interface list.
	     IFF_MONITOR      <D> This interface blocks	transmission of	 pack-
			      ets and discards incoming	packets	after BPF pro-
			      cessing.	 Used  to  monitor network traffic but
			      not interact with	the network in question.
	     IFF_STATICARP    <D> Used to enable/disable ARP requests on  this
			      interface.
	     IFF_DYING	      <D*> Set when the	ifnet structure	of this	inter-
			      face is being released and still has if_refcount
			      references.
	     IFF_RENAMING     <D> Set when this	interface is being renamed.

   Interface Capabilities Flags
       Interface capabilities are specialized features an interface may	or may
       not  support.  These capabilities are very hardware-specific and	allow,
       when enabled, to	offload	specific network processing to	the  interface
       or to offer a particular	feature	for use	by other kernel	parts.

       It  should be stressed that a capability	can be completely uncontrolled
       (i.e., stay always enabled with no way to disable it) or	allow  limited
       control over itself (e.g., depend on another capability's state.)  Such
       peculiarities  are  determined  solely  by the hardware and driver of a
       particular interface.  Only  the	 driver	 possesses  the	 knowledge  on
       whether	and  how the interface capabilities can	be controlled.	Conse-
       quently,	capabilities flags in if_capenable should  never  be  modified
       directly	 by  kernel code other than the	interface driver.  The command
       SIOCSIFCAP to ifioctl() is the  dedicated  means	 to  attempt  altering
       if_capenable on an interface.  Userland code shall use ioctl(2).

       The following capabilities are currently	supported by the system:

	     IFCAP_RXCSUM	   This	 interface  can	do checksum validation
				   on receiving	data.  Some interfaces do  not
				   have	 sufficient  buffer  storage  to store
				   frames above	a certain MTU-size completely.
				   The driver for the interface	might  disable
				   hardware  checksum validation if the	MTU is
				   set above the hardcoded limit.

	     IFCAP_TXCSUM	   This	interface can do checksum  calculation
				   on transmitting data.

	     IFCAP_HWCSUM	   A	shorthand    for    (IFCAP_RXCSUM    |
				   IFCAP_TXCSUM).

	     IFCAP_NETCONS	   This	interface can be a network console.

	     IFCAP_VLAN_MTU	   The vlan(4) driver can  operate  over  this
				   interface  in software tagging mode without
				   having to decrease MTU  on  vlan(4)	inter-
				   faces  below	 1500 bytes.  This implies the
				   ability of  this  interface	to  cope  with
				   frames  somewhat  longer  than permitted by
				   the Ethernet	specification.

	     IFCAP_VLAN_HWTAGGING  This	interface can do VLAN tagging on  out-
				   put	and  demultiplex  frames by their VLAN
				   tag on input.

	     IFCAP_JUMBO_MTU	   This	Ethernet interface  can	 transmit  and
				   receive frames up to	9000 bytes long.

	     IFCAP_POLLING	   This	 interface  supports  polling(4).  See
				   below for details.

	     IFCAP_VLAN_HWCSUM	   This	interface can do checksum  calculation
				   on  both transmitting and receiving data on
				   vlan(4) interfaces (implies IFCAP_HWCSUM).

	     IFCAP_TSO4		   This	Ethernet interface supports TCP4  Seg-
				   mentation offloading.

	     IFCAP_TSO6		   This	 Ethernet interface supports TCP6 Seg-
				   mentation offloading.

	     IFCAP_TSO		   A shorthand for (IFCAP_TSO4 | IFCAP_TSO6).

	     IFCAP_TOE4		   This	Ethernet interface supports  TCP4  Of-
				   fload Engine.

	     IFCAP_TOE6		   This	 Ethernet  interface supports TCP6 Of-
				   fload Engine.

	     IFCAP_TOE		   A shorthand for (IFCAP_TOE4 | IFCAP_TOE6).

	     IFCAP_WOL_UCAST	   This	Ethernet interface supports waking  up
				   on any Unicast packet.

	     IFCAP_WOL_MCAST	   This	 Ethernet interface supports waking up
				   on any Multicast packet.

	     IFCAP_WOL_MAGIC	   This	Ethernet interface supports waking  up
				   on  any  Magic packet such as those sent by
				   wake(8).

	     IFCAP_WOL		   A   shorthand   for	 (IFCAP_WOL_UCAST    |
				   IFCAP_WOL_MCAST | IFCAP_WOL_MAGIC).

	     IFCAP_VLAN_HWFILTER   This	 interface supports frame filtering in
				   hardware on vlan(4) interfaces.

	     IFCAP_VLAN_HWTSO	   This	interface  supports  TCP  Segmentation
				   offloading  on  vlan(4) interfaces (implies
				   IFCAP_TSO).

	     IFCAP_LINKSTATE	   This	Ethernet  interface  supports  dynamic
				   link	state changes.

	     IFCAP_NETMAP	   This	Ethernet interface supports netmap(4).

       The  ability of advanced	network	interfaces to offload certain computa-
       tional tasks from the host CPU  to  the	board  is  limited  mostly  to
       TCP/IP.	 Therefore  a separate field associated	with an	interface (see
       ifnet.if_data.ifi_hwassist below) keeps a detailed description  of  its
       enabled	capabilities specific to TCP/IP	processing.  The TCP/IP	module
       consults	the field to see which tasks can be done on an outgoing	packet
       by the interface.  The flags defined for	that field are a  superset  of
       those for mbuf.m_pkthdr.csum_flags, namely:

	     CSUM_IP	    The	interface will compute IP checksums.

	     CSUM_TCP	    The	interface will compute TCP checksums.

	     CSUM_UDP	    The	interface will compute UDP checksums.

       An  interface notifies the TCP/IP module	about the tasks	the former has
       performed on an incoming	packet by setting the corresponding  flags  in
       the  field  mbuf.m_pkthdr.csum_flags  of	 the mbuf chain	containing the
       packet.	See mbuf(9) for	details.

       The capability of a network interface to	operate	in polling(4) mode in-
       volves several flags in different global	 variables  and	 per-interface
       fields.	  The	capability   flag  IFCAP_POLLING  set  in  interface's
       if_capabilities indicates support for polling(4)	on the particular  in-
       terface.	  If  set  in  if_capabilities,	the same flag can be marked or
       cleared in the interface's if_capenable within ifioctl(), thus initiat-
       ing switch of the interface to polling(4) mode or interrupt  mode,  re-
       spectively.   The  actual mode change is	managed	by the driver-specific
       if_ioctl() routine.  The	polling(4) handler returns the number of pack-
       ets processed.

   The if_data Structure
       The if_data structure contains statistics and  identifying  information
       used  by	management programs, and which is exported to user programs by
       way of the ifmib(4) branch of the sysctl(3) MIB.	  The  following  ele-
       ments of	the if_data structure are initialized by the interface and are
       not  expected  to change	significantly over the course of normal	opera-
       tion:

	     ifi_type	     (u_char) The type of the interface, as defined in
			     <net/if_types.h>  and  described  below  in   the
			     "Interface	Types" section.

	     ifi_physical    (u_char)  Intended	 to  represent	a selection of
			     physical layers on	 devices  which	 support  more
			     than one; never implemented.

	     ifi_addrlen     (u_char)  Length  of a link-layer address on this
			     device, or	zero if	there are none.	 Used to  ini-
			     tialized  the address length field	in sockaddr_dl
			     structures	referring to this interface.

	     ifi_hdrlen	     (u_char) Maximum length of	any link-layer	header
			     which  might  be  prepended  by  the  driver to a
			     packet before  transmission.   The	 generic  code
			     computes the maximum over all interfaces and uses
			     that  value to influence the placement of data in
			     mbufs to attempt to ensure	that there  is	always
			     sufficient	 space	to prepend a link-layer	header
			     without allocating	an additional mbuf.

	     ifi_datalen     (u_char) Length of	the if_data structure.	Allows
			     some stabilization	of the routing socket  ABI  in
			     the  face	of  increases  in the length of	struct
			     ifdata.

	     ifi_mtu	     (u_long) The maximum  transmission	 unit  of  the
			     medium, exclusive of any link-layer overhead.

	     ifi_metric	     (u_long)  A dimensionless metric interpreted by a
			     user-mode routing process.

	     ifi_epoch	     (time_t) The system uptime	when interface was at-
			     tached or the statistics below were reset.	  This
			     is	 intended  to be used to set the SNMP variable
			     ifCounterDiscontinuityTime.  It may also be  used
			     to	determine if two successive queries for	an in-
			     terface  of  the same index have returned results
			     for the same interface.

       The structure additionally contains generic statistics applicable to  a
       variety	of different interface types (except as	noted, all members are
       of type u_long):

	     ifi_link_state  (u_char) The current link state of	 Ethernet  in-
			     terfaces.	 See  the "Interface Link States" sec-
			     tion for possible values.

	     ifi_ipackets    Number of packets received.

	     ifi_ierrors     Number of receive errors detected (e.g., FCS  er-
			     rors,  DMA	overruns, etc.).  More detailed	break-
			     downs can often be	had by way of a	 link-specific
			     MIB.

	     ifi_opackets    Number of packets transmitted.

	     ifi_oerrors     Number of output errors detected (e.g., late col-
			     lisions,  DMA  overruns,  etc.).	More  detailed
			     breakdowns	can often be had by way	of a link-spe-
			     cific MIB.

	     ifi_collisions  Total number of collisions	detected on output for
			     CSMA  interfaces.	 (This	member	is   sometimes
			     [ab]used  by  other types of interfaces for other
			     output error counts.)

	     ifi_ibytes	     Total traffic received, in	bytes.

	     ifi_obytes	     Total traffic transmitted,	in bytes.

	     ifi_imcasts     Number of packets received	 which	were  sent  by
			     link-layer	multicast.

	     ifi_omcasts     Number of packets sent by link-layer multicast.

	     ifi_iqdrops     Number  of	 packets dropped on input.  Rarely im-
			     plemented.

	     ifi_oqdrops     Number of packets dropped on output.

	     ifi_noproto     Number of packets received	for  unknown  network-
			     layer protocol.

	     ifi_lastchange  (struct timeval) The time of the last administra-
			     tive  change  to  the  interface (as required for
			     SNMP ) .

   Interface Types
       The header file <net/if_types.h>	defines	symbolic constants for a  num-
       ber of different	types of interfaces.  The most common are:

	     IFT_OTHER	      none of the following
	     IFT_ETHER	      Ethernet
	     IFT_ISO88023     ISO 8802-3 CSMA/CD
	     IFT_ISO88024     ISO 8802-4 Token Bus
	     IFT_ISO88025     ISO 8802-5 Token Ring
	     IFT_ISO88026     ISO 8802-6 DQDB MAN
	     IFT_FDDI	      FDDI
	     IFT_PPP	      Internet Point-to-Point Protocol (ppp(8))
	     IFT_LOOP	      The loopback (lo(4)) interface
	     IFT_SLIP	      Serial Line IP
	     IFT_PARA	      Parallel-port IP ("PLIP")
	     IFT_ATM	      Asynchronous Transfer Mode
	     IFT_USB	      USB Interface

   Interface Link States
       The following link states are currently defined:

	     LINK_STATE_UNKNOWN	 The link is in	an invalid or unknown state.
	     LINK_STATE_DOWN	 The link is down.
	     LINK_STATE_UP	 The link is up.

   The ifaddr Structure
       Every  interface	is associated with a list (or, rather, a TAILQ)	of ad-
       dresses,	rooted at the interface	structure's if_addrhead	 member.   The
       first  element  in  this	list is	always an AF_LINK address representing
       the interface itself; multi-access network drivers should complete this
       structure by  filling  in  their	 link-layer  addresses	after  calling
       if_attach().   Other  members  of the structure represent network-layer
       addresses which have been configured by means of	the  SIOCAIFADDR  com-
       mand  to	 ioctl(2), called on a socket of the appropriate protocol fam-
       ily.  The elements of this list consist	of  ifaddr  structures.	  Most
       protocols  will	declare	 their own protocol-specific interface address
       structures, but all begin with a	struct ifaddr which provides the most-
       commonly-needed functionality  across  all  protocols.	Interface  ad-
       dresses are reference-counted.

       The members of struct ifaddr are	as follows:

	     ifa_addr	    (struct  sockaddr  *) The local address of the in-
			    terface.

	     ifa_dstaddr    (struct sockaddr *)	The remote address  of	point-
			    to-point  interfaces, and the broadcast address of
			    broadcast interfaces.  (ifa_broadaddr is  a	 macro
			    for	ifa_dstaddr.)

	     ifa_netmask    (struct sockaddr *)	The network mask for multi-ac-
			    cess  interfaces,  and the confusion generator for
			    point-to-point interfaces.

	     ifa_ifp	    (if_t) A link back to the interface	structure.

	     ifa_link	    (TAILQ_ENTRY(ifaddr)) queue(3) glue	 for  list  of
			    addresses on each interface.

	     ifa_rtrequest  See	below.

	     ifa_flags	    (u_short)  Some  of	 the flags which would be used
			    for	a route	representing this address in the route
			    table.

	     ifa_refcnt	    (short) The	reference count.

       References to ifaddr structures are gained  by  calling	the  ifa_ref()
       function	and released by	calling	the ifa_free() function.

       ifa_rtrequest() is a pointer to a function which	receives callouts from
       the  routing  code (rtrequest())	to perform link-layer-specific actions
       upon requests to	add, or	delete routes.	The cmd	argument indicates the
       request in question: RTM_ADD, or	RTM_DELETE.  The rt  argument  is  the
       route  in question; the info argument contains the specific destination
       being manipulated.

FUNCTIONS
       The functions provided by the generic interface	code  can  be  divided
       into two	groups:	those which manipulate interfaces, and those which ma-
       nipulate	 interface  addresses.	 In addition to	these functions, there
       may also	be link-layer support routines which are used by a  number  of
       drivers implementing a specific link layer over different hardware; see
       the documentation for that link layer for more details.

   The ifmultiaddr Structure
       Every  multicast-capable	 interface is associated with a	list of	multi-
       cast group memberships, which indicate at a low level which  link-layer
       multicast  addresses  (if any) should be	accepted, and at a high	level,
       in which	network-layer multicast	groups a user  process	has  expressed
       interest.

       The elements of the structure are as follows:

	     ifma_link	    (LIST_ENTRY(ifmultiaddr)) queue(3) macro glue.

	     ifma_addr	    (struct sockaddr *)	A pointer to the address which
			    this record	represents.  The memberships for vari-
			    ous	 address  families are stored in arbitrary or-
			    der.

	     ifma_lladdr    (struct sockaddr *)	A pointer  to  the  link-layer
			    multicast  address,	 if any, to which the network-
			    layer multicast address in	ifma_addr  is  mapped,
			    else  a null pointer.  If this element is non-nil,
			    this membership also holds an invisible  reference
			    to another membership for that link-layer address.

	     ifma_refcount  (u_int)  A	reference  count  of requests for this
			    particular membership.

   Interface Manipulation Functions
	     if_alloc()
	     Allocate and initialize struct  ifnet.   Initialization  includes
	     the  allocation of	an interface index and may include the alloca-
	     tion of a type specific structure in if_l2com.

	     if_alloc_dev()
	     Allocate and initialize struct ifnet as if_alloc()	does, with the
	     addition that the ifnet can be tagged with	the  appropriate  NUMA
	     domain derived from the dev argument passed by the	caller.

	     if_alloc_domain()
	     Allocate and initialize struct ifnet as if_alloc()	does, with the
	     addition  that  the ifnet will be tagged with the NUMA domain via
	     the numa_domain argument passed by	the caller.

	     if_attach()
	     Link the specified	interface ifp into the list of network	inter-
	     faces.   Also initialize the list of addresses on that interface,
	     and create	a link-layer ifaddr structure to be the	first  element
	     in	 that  list.  (A pointer to this address structure is saved in
	     the ifnet structure.)   The  ifp  must  have  been	 allocated  by
	     if_alloc(), if_alloc_dev()	or if_alloc_domain().

	     if_detach()
	     Shut down and unlink the specified	ifp from the interface list.

	     if_free()
	     Free  the	given ifp back to the system.  The interface must have
	     been previously detached if it was	ever attached.

	     if_free_type()
	     Identical to if_free() except that	the given type is used to free
	     if_l2com instead of the type in if_type.  This  is	 intended  for
	     use with drivers that change their	interface type.

	     if_down()
	     Mark  the	interface ifp as down (i.e., IFF_UP is not set), flush
	     its output	queue, notify protocols	of the transition, and	gener-
	     ate a message from	the route(4) routing socket.

	     if_up()
	     Mark the interface	ifp as up, notify protocols of the transition,
	     and generate a message from the route(4) routing socket.

	     ifpromisc()
	     Add  or  remove  a	 promiscuous  reference	to ifp.	 If pswitch is
	     true, add a reference; if it is false, remove  a  reference.   On
	     reference count transitions from zero to one and one to zero, set
	     the  IFF_PROMISC flag appropriately and call if_ioctl() to	set up
	     the interface in the desired mode.

	     if_allmulti()
	     As	ifpromisc(), but for the  all-multicasts  (IFF_ALLMULTI)  flag
	     instead of	the promiscuous	flag.

	     ifunit()
	     Return an ifnet pointer for the interface named name.

	     ifunit_ref()
	     Return  a reference-counted (via ifa_ref()) ifnet pointer for the
	     interface named  name.   This  is	the  preferred	function  over
	     ifunit().	 The caller is responsible for releasing the reference
	     with if_rele() when it is finished	with the ifnet.

	     ifioctl()
	     Process the ioctl request cmd, issued on socket so	by thread  td,
	     with  data	parameter data.	 This is the main routine for handling
	     all interface configuration requests from user mode.  It is ordi-
	     narily only called	from the socket-layer  ioctl(2)	 handler,  and
	     only for commands with class `i'.	Any unrecognized commands will
	     be	 passed	 down  to socket so's protocol for further interpreta-
	     tion.  The	following commands are handled by ifioctl():

		   SIOCGIFCONF	   Get interface configuration.	 (No call-down
				   to driver.)

		   SIOCSIFNAME	   Set the interface name.  RTM_IFANNOUNCE de-
				   parture and arrival messages	 are  sent  so
				   that	routing	code that relies on the	inter-
				   face	 name  will update its interface list.
				   Caller  must	 have  appropriate  privilege.
				   (No call-down to driver.)
		   SIOCGIFCAP
		   SIOCGIFDATA
		   SIOCGIFFIB
		   SIOCGIFFLAGS
		   SIOCGIFMETRIC
		   SIOCGIFMTU
		   SIOCGIFPHYS	   Get	 interface  capabilities,  data,  FIB,
				   flags, metric, MTU, medium selection.   (No
				   call-down to	driver.)

		   SIOCSIFCAP	   Enable  or  disable interface capabilities.
				   Caller  must	 have  appropriate  privilege.
				   Before   a	call  to  the  driver-specific
				   if_ioctl() routine, the requested mask  for
				   enabled capabilities	is checked against the
				   mask	 of  capabilities supported by the in-
				   terface,  if_capabilities.	Requesting  to
				   enable  an  unsupported  capability	is in-
				   valid.  The rest is supposed	to be done  by
				   the	 driver,   which   includes   updating
				   if_capenable	and  if_data.ifi_hwassist  ap-
				   propriately.

		   SIOCGIFCAPNV	   nv(9)  version  of  the  SIOCGIFCAP	ioctl.
				   Caller must provide	a  pointer  to	struct
				   ifreq_cap_nv	 as  data,  where  the	member
				   buffer points  to  some  buffer  containing
				   buf_length  bytes.	The  serialized	nvlist
				   with	description of the device capabilities
				   is written to the buffer.  If buffer	is too
				   short, the structure	is updated with	buffer
				   member set to NULL, length set to the mini-
				   mal required	length,	and error EFBIG	is re-
				   turned.

				   Elements of the returned nvlist for	simple
				   capabilities	 are  boolean,	identified  by
				   names.  Presence  of	 the  boolean  element
				   means that corresponding capability is sup-
				   ported  by  the interface.  Element's value
				   describes  the  current  configured	state:
				   true	 means that the	capability is enabled,
				   and false that it is	disabled.

				   Driver   indicates	support	   for	  both
				   SIOCGIFCAPNV	 and  SIOCSIFCAPNV requests by
				   setting IFCAP_NV non-modifiable  capability
				   bit in if_capabilities.

		   SIOCSIFCAPNV	   nv(9)  version  of  the  SIOCSIFCAP	ioctl.
				   Caller must provide the pointer  to	struct
				   ifreq_cap_nv	 as  data,  where  the	member
				   buffer  points  to  serialized  nvlist   of
				   length  bytes.   Each element of nvlist de-
				   scribes a requested update of one  capabil-
				   ity,	 identified  by	the element name.  For
				   simple capabilities,	the  element  must  be
				   boolean.   Its  true	 value	means that the
				   caller asks to enable the  capability,  and
				   false  value	to disable.  Only capabilities
				   listed in the nvlist	are  affected  by  the
				   call.

		   SIOCSIFFIB	   Sets	 interface  FIB.  Caller must have ap-
				   propriate privilege.	 FIB values start at 0
				   and values greater or equals	than  net.fibs
				   are considered invalid.
		   SIOCSIFFLAGS	   Change  interface  flags.  Caller must have
				   appropriate privilege.  If a	change to  the
				   IFF_UP   flag   is  requested,  if_up()  or
				   if_down() is	called as appropriate.	 Flags
				   listed  in  IFF_CANTCHANGE  are masked off,
				   and the field  if_flags  in	the  interface
				   structure  is updated.  Finally, the	driver
				   if_ioctl() routine is called	to perform any
				   setup requested.

		   SIOCSIFMETRIC
		   SIOCSIFPHYS	   Change interface metric or medium.	Caller
				   must	have appropriate privilege.

		   SIOCSIFMTU	   Change interface MTU.  Caller must have ap-
				   propriate  privilege.  MTU values less than
				   72 or greater than 65535 are	considered in-
				   valid.  The driver  if_ioctl()  routine  is
				   called  to  implement the change; it	is re-
				   sponsible for any additional	sanity	check-
				   ing	and  for actually modifying the	MTU in
				   the interface structure.

		   SIOCADDMULTI
		   SIOCDELMULTI	   Add or  delete  permanent  multicast	 group
				   memberships	on the interface.  Caller must
				   have	   appropriate	   privilege.	   The
				   if_addmulti()  or if_delmulti() function is
				   called to perform the operation; qq.v.

		   SIOCAIFADDR
		   SIOCDIFADDR	   The socket's	protocol  control  routine  is
				   called to implement the requested action.

   Interface Address Functions
       Several functions exist to look up an interface address structure given
       an  address.  ifa_ifwithaddr() returns an interface address with	either
       a local address or a broadcast address precisely	matching the parameter
       addr.  ifa_ifwithdstaddr() returns an interface address for a point-to-
       point interface whose remote ("destination") address is addr and	a  fib
       is fib.	If fib is RT_ALL_FIBS, then the	first interface	address	match-
       ing addr	will be	returned.

       ifa_ifwithnet()	returns	 the  most  specific  interface	 address which
       matches the specified address, addr, subject to its configured netmask,
       or a point-to-point interface address whose remote address is  addr  if
       one is found.  If ignore_ptp is true, skip point-to-point interface ad-
       dresses.	   The	 fib   parameter   is  handled	the  same  way	as  by
       ifa_ifwithdstaddr().

       ifaof_ifpforaddr() returns the most specific address configured on  in-
       terface	ifp which matches address addr,	subject	to its configured net-
       mask.  If the interface is point-to-point, only	an  interface  address
       whose remote address is precisely addr will be returned.

       All  of these functions return a	null pointer if	no such	address	can be
       found.

   Interface Multicast Address Functions
       The if_addmulti(), if_delmulti(), and if_findmulti() functions  provide
       support	for  requesting	and relinquishing multicast group memberships,
       and for querying	an interface's	membership  list,  respectively.   The
       if_addmulti()  function	takes  a  pointer  to an interface, ifp, and a
       generic address,	sa.  It	also takes a pointer to	a struct ifmultiaddr *
       which is	filled in on successful	return with the	address	of  the	 group
       membership control block.  The if_addmulti() function performs the fol-
       lowing four-step	process:

	     1.	  Call the interface's if_resolvemulti() entry point to	deter-
		  mine	the  link-layer	address, if any, corresponding to this
		  membership request, and also to give the link	layer  an  op-
		  portunity  to	 veto this membership request should it	so de-
		  sire.

	     2.	  Check	the interface's	group membership list for a pre-exist-
		  ing membership for this group.  If one is not	 found,	 allo-
		  cate a new one; if one is, increment its reference count.

	     3.	  If  the  if_resolvemulti() routine returned a	link-layer ad-
		  dress	corresponding to the group, repeat the	previous  step
		  for that address as well.

	     4.	  If  the  interface's	multicast  address  filter needs to be
		  changed because a new	membership was added, call the	inter-
		  face's   if_ioctl()	routine	  (with	  a  cmd  argument  of
		  SIOCADDMULTI)	to request that	it do so.

       The if_delmulti() function, given an interface ifp and an address,  sa,
       reverses	 this  process.	  Both	functions return zero on success, or a
       standard	error number on	failure.

       The if_findmulti() function examines the	membership list	 of  interface
       ifp  for	 an  address matching sa, and returns a	pointer	to that	struct
       ifmultiaddr if one is found, else it returns a null pointer.

SEE ALSO
       ioctl(2), link_addr(3), queue(3), sysctl(3), bpf(4),  ifmib(4),	lo(4),
       netintro(4), polling(4),	config(8), ppp(8), mbuf(9), rtentry(9)

       Gary  R.	 Wright	 and  W.  Richard Stevens, TCP/IP Illustrated, Vol. 2,
       Addison-Wesley, ISBN 0-201-63354-X.

AUTHORS
       This manual page	was written by Garrett A. Wollman.

FreeBSD	15.0		       December	10, 2024		      IFNET(9)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=ifnet&manpath=FreeBSD+15.0-RELEASE+and+Ports>

home | help