ifnet(9)
NAME
- ifnet, ifaddr, ifqueue, if_data - kernel interfaces for ma
- nipulating 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 struct ifnet * if_alloc(u_char type); void if_attach(struct ifnet *ifp); void if_detach(struct ifnet *ifp); void if_free(struct ifnet *ifp); void if_free_type(struct ifnet *ifp, u_char type); void if_down(struct ifnet *ifp); int ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td); int ifpromisc(struct ifnet *ifp, int pswitch); int if_allmulti(struct ifnet *ifp, int amswitch); struct ifnet * ifunit(const char *name); void if_up(struct ifnet *ifp); Interface Address Functions struct ifaddr * ifa_ifwithaddr(struct sockaddr *addr); struct ifaddr * ifa_ifwithdstaddr(struct sockaddr *addr); struct ifaddr * ifa_ifwithnet(struct sockaddr *addr); struct ifaddr * ifaof_ifpforaddr(struct sockaddr *addr, struct ifnet *ifp); void ifafree(struct ifaddr *ifa); IFAFREE(struct ifaddr *ifa); Interface Multicast Address Functions int if_addmulti(struct ifnet *ifp, struct sockaddr *sa, struct ifmultiaddr **ifmap); int if_delmulti(struct ifnet *ifp, struct sockaddr *sa); struct ifmultiaddr * ifmaof_ifpforaddr(struct sockaddr *addr, struct ifnet *ifp); Output queue macros IF_DEQUEUE(struct ifqueue *ifq, struct mbuf *m); struct ifnet Member Functions void (*if_input)(struct ifnet *ifp, struct mbuf *m); int (*if_output)(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct rtentry *rt); void (*if_start)(struct ifnet *ifp); int (*if_done)(struct ifnet *ifp); int (*if_ioctl)(struct ifnet *ifp, int cmd, caddr_t data); void (*if_watchdog)(struct ifnet *ifp); int (*if_poll_recv)(struct ifnet *ifp, int *quotap); int (*if_poll_xmit)(struct ifnet *ifp, int *quotap); void (*if_poll_inttrn)(struct ifnet *ifp); void (*if_poll_slowinput)(struct ifnet *ifp, struct mbuf *m); void (*if_init)(void *if_softc); int (*if_resolvemulti)(struct ifnet *ifp, struct sockaddr **retsa, struct sockaddr *addr); struct ifaddr member function void (*ifa_rtrequest)(int cmd, struct rtentry *rt, struct sockaddr *dst); Global Variables extern struct ifnethead ifnet; extern struct ifaddr **ifnet_addrs; 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
- #include
 <net/if.h>
 and #include <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 de
- fined in 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 #include
- <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 #include <net/if_var.h> because it is the prerequisite of some other header file
- like Most references to those two files in particular can be replaced by
- The system keeps a linked list of interfaces using the TAILQ
- macros
 defined 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, which 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. Each interface also
- has a TAILQ of
 interface addresses, described by ifaddr structures; the
- head of the
 queue is always an AF_LINK address (see link_addr(3)) de
- scribing the link
 layer implemented by the interface (if any). (Some trivial
- interfaces do
 not provide any link layer addresses; 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
- interface is in
 the process of sending another.
- The ifnet structure
- The fields of struct ifnet are as follows:
    
 if_softc (void *) A pointer to the driver's privatestate block. (Initialized bydriver.)
- if_l2com (void *) A pointer to the common
- data for the
- interface's layer 2 protocol.
- (Initialized by
 if_alloc().)
- if_link (TAILQ_ENTRY(ifnet)) queue(3)
- macro glue.
- if_xname (char *) The name of the inter
- face, (e.g.,
- ``fxp0'' or ``lo0''). (Initial
- ized by
 driver.)
- if_dname (const char *) The name of the
- driver. (Ini
- tialized by driver.)
- if_dunit (int) A unique number assigned to
- each inter
- face 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.)
- if_addrhead (struct ifaddrhead) The head of
- the queue(3)
- TAILQ containing the list of ad
- dresses
 assigned to this interface.
- if_pcount (int) A count of promiscuous lis
- teners on this
- interface, used to reference
- count the
 IFF_PROMISC flag.
- if_bpf (struct bpf_if *) Opaque per-in
- terface data
- for the packet filter, bpf(4).
- (Initialized
 by bpf_attach().)
- if_index (u_short) A unique number as
- signed to each
- interface in sequence as it is
- attached.  This
 number can be used in a struct
- sockaddr_dl to
 refer to a particular interface
- by index (see
 link_addr(3)). (Initialized by
- if_alloc().)
- if_timer (short) Number of seconds until
- the watchdog
- timer if_watchdog() is called, or
- zero if the
 timer is disabled. (Set by driv
- er, decremented by generic watchdog code.)
- if_flags (int) Flags describing opera
- tional parameters
- of this interface (see below).
- (Manipulated
 by both driver and generic code.)
- if_capabilities (int) Flags describing the capa
- bilities the
- interface supports (see below).
- if_capenable (int) Flags describing the en
- abled capabili
- ties of the interface (see be
- low).
- if_linkmib (void *) A pointer to an inter
- face-specific
- MIB structure exported by
- ifmib(4). (Initialized by driver.)
- if_linkmiblen (size_t) The size of said struc
- ture. (Ini
- tialized by driver.)
- if_data (struct if_data) More statistics
- and informa
- tion; see The if_data structure,
- below. (Initialized by driver, manipulated
- by both driver
 and generic code.)
- if_snd (struct ifqueue) The output
- queue. (Manipu
- lated by driver.)
- There are in addition a number of function pointers which
- the driver must
 initialize to complete its interface with the generic inter
- face layer:
 if_input()
 Pass a packet to an appropriate upper layer as deter
- mined 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_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_OACTIVE flag is not set. (Thus, IFF_OACTIVE does
- not literally
 mean that output is active, but rather that the de
- vice's internal
 output queue is full.)
- if_done()
 Not used. We are not even sure what it was ever for.
- The prototype is faked.
- if_ioctl()
 Process interface-related ioctl(2) requests (defined
- in Preliminary
 processing is done by the generic routine ifioctl() to
- check for
 appropriate privileges, locate the interface being ma
- nipulated, and
 perform certain generic operations like twiddling
- flags and flushing queues. See the description of ifioctl() below
- for more information.
- if_watchdog()
 Routine called by the generic code when the watchdog
- timer,
 if_timer, expires. Usually this will reset the inter
- face.
- if_init()
 Initialize and bring up the hardware, e.g., reset the
- chip and the
 watchdog timer and enable the receiver unit. Should
- mark the
 interface running, but not active (IFF_RUNNING,
- ~IIF_OACTIVE).
- if_resolvemulti()
 Check the requested multicast group membership, addr,
- for validity,
 and if necessary compute a link-layer group which cor
- responds to
 that address which is returned in *retsa. Returns ze
- ro 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 cur
- rent state of
 the interface. Flags of the former kind are marked <S> in
- this table;
 the latter are marked <D>.
- 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 bythe user-level code.IFF_BROADCAST <S*> The interface supportsbroadcast.
 IFF_DEBUG <D> Used to enable/disable driverdebuggingcode.IFF_LOOPBACK <S> The interface is a loopbackdevice.
 IFF_POINTOPOINT <S*> The interface is point-topoint;``broadcast'' address is actuallythe address
 of the other end.IFF_RUNNING <D*> The interface has been configured anddynamic resources were successfully allocated.
 Probably only useful internal tothe interface.IFF_NOARP <D> Disable network address resolution on thisinterface.IFF_PROMISC <D*> This interface is in promiscuous mode.
 IFF_PPROMISC <D> This interface is in the permanentlypromiscuous mode (impliesIFF_PROMISC).IFF_ALLMULTI <D*> This interface is in allmulticasts mode(used by multicast routers).IFF_OACTIVE <D*> The interface's hardwareoutput queue (ifany) is full; output packets areto be queued.IFF_SIMPLEX <S*> The interface cannot hearits own transmissions.IFF_LINK0
 IFF_LINK1
 IFF_LINK2 <D> Control flags for the linklayer. (Currently abused to select amongmultiple physical layers on some devices.)IFF_MULTICAST <S*> This interface supports multicast.
 IFF_POLLING <D*> The interface is inpolling(4) mode. SeeInterface Capabilities Flags fordetails.
- 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 al
- low 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. Con
- sequently,
 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_NETCONS This interface can be a network console.IFCAP_POLLING This interface supportspolling(4). Seebelow for details.
- IFCAP_RXCSUM This interface can do check
- sum validation
- on receiving data. Some in
- terfaces 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 check
- sum calcula
- tion on transmitting data.
- IFCAP_HWCSUM A shorthand for (IFCAP_RXC
- SUM
- IFCAP_TXCSUM).
- IFCAP_VLAN_HWTAGGING This interface can do VLAN
- tagging on
- output and demultiplex
- frames by their
 VLAN tag on input.
- IFCAP_VLAN_MTU The vlan(4) driver can oper
- ate over this
- interface in software tag
- ging mode without having to decrease MTU
- on vlan(4)
 interfaces below 1500 bytes.
- This
 implies the ability of this
- interface to
 cope with frames somewhat
- longer than
 permitted by the Ethernet
- specification.
- IFCAP_JUMBO_MTU This Ethernet interface can
- transmit and
- receive frames up to 9000
- bytes long.
- The ability of advanced network interfaces to offload cer
- tain computational tasks from the host CPU to the board is limited most
- ly to TCP/IP.
 Therefore a separate field associated with an interface (see
 ifnet.if_data.ifi_hwassist below) keeps a detailed descrip
- tion 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.
- CSUM_IP_FRAGS The interface can compute a TCP or
- UDP checksum
    for a packet fragmented by the hostCPU. Makes
 sense only along with CSUM_TCP orCSUM_UDP.
- CSUM_FRAGMENT The interface will do the fragmen
- tation of IP
- packets if necessary. The host CPU
- does not
 need to care about MTU on this in
- terface as long
 as a packet to transmit through it
- is an IP one
 and it does not exceed the size of
- the hardware
 buffer.
- 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
 involves several flags in different global variables and
- per-interface
 fields. First, there is a system-wide sysctl(8) master
- switch named
 kern.polling.enable, which can toggle polling(4) globally.
- If that variable is set to non-zero, polling(4) will be used on those
- devices where
 it is enabled individually. Otherwise, polling(4) will not
- be used in
 the system. Second, the capability flag IFCAP_POLLING set
- in interface's
 if_capabilities indicates support for polling(4) on the par
- ticular interface. If set in if_capabilities, the same flag can be
- marked or cleared
 in the interface's if_capenable, thus initiating switch of
- the interface
 to polling(4) mode or interrupt mode, respectively. The ac
- tual mode
 change will occur at an implementation-specific moment in
- the future,
 e.g., during the next interrupt or polling(4) cycle. And
- finally, if the
 mode transition has been successful, the flag IFF_POLLING is
- marked or
 cleared in the interface's if_flags to indicate the current
- mode of the
 interface.
- The if_data Structure
- In 4.4BSD, a subset of the interface information believed to
- be of interest to management stations was segregated from the ifnet
- structure and
 moved into its own if_data structure to facilitate its use
- by user programs. The following elements of the if_data structure are
- initialized
 by the interface and are not expected to change significant
- ly over the
 course of normal operation:
 ifi_type (u_char) The type of the interface, as definedin #include <net/if_types.h> and described below in theInterface 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
 initialized 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 en
- sure that
 there is always sufficient space
- to prepend a
 link-layer header without allocat
- ing 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-lay
- er overhead.
- ifi_metric (u_long) A dimensionless metric
- interpreted by
- a user-mode routing process.
- ifi_baudrate (u_long) The line rate of the in
- terface, in
- bits per second.
- ifi_hwassist (u_long) A detailed interpretation
- of the capa
- bilities to offload computational
- tasks for
 outgoing packets. The interface
- driver must
 keep this field in accord with the
- current
 value of if_capenable.
- ifi_epoch (time_t) The system uptime when
- interface was
- attached 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 interface of the
- same index have
 returned results for the same in
- terface.
- The structure additionally contains generic statistics ap
- plicable 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
    interfaces. See the InterfaceLink States section for possible values.
- ifi_ipackets Number of packets received.
- ifi_ierrors Number of receive errors detected
- (e.g., FCS
- errors, DMA overruns, etc.). More
- detailed
 breakdowns can often be had by way
- of a linkspecific MIB.
- ifi_opackets Number of packets transmitted.
- ifi_oerrors Number of output errors detected
- (e.g., late
- collisions, DMA overruns, etc.).
- More detailed
 breakdowns can often be had by way
- of a linkspecific MIB.
- ifi_collisions Total number of collisions detect
- ed on output
- for CSMA interfaces. (This member
- is sometimes
 [ab]used by other types of inter
- faces 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 in
- put. Rarely
- implemented.
- ifi_noproto Number of packets received for un
- known network
- layer protocol.
- ifi_lastchange (struct timeval) The time of the
- last adminis
- trative change to the interface
- (as required
 for SNMP).
- Interface Types
- The header file #include <net/if_types.h> defines symbolic constants for a number 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
- Interface Link States
- The following link states are currently defined:
    
 LINK_STATE_UNKNOWN The link is in an invalid orunknown 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
 addresses, rooted at the interface structure's if_addrlist
- member.  The
 first element in this list is always an AF_LINK address rep
- resenting the
 interface itself; multi-access network drivers should com
- plete this
 structure by filling in their link-layer addresses after
- calling
 if_attach(). Other members of the structure represent net
- work-layer
 addresses which have been configured by means of the SIO
- CAIFADDR command
 to ioctl(2), called on a socket of the appropriate protocol
- family.  The
 elements of this list consist of ifaddr structures. Most
- protocols will
 declare their own protocol-specific interface address struc
- tures, but all
 begin with a struct ifaddr which provides the most-commonly
- needed functionality across all protocols. Interface addresses are
- referencecounted.
- The members of struct ifaddr are as follows:
    
 ifa_addr (struct sockaddr *) The local address of theinterface.
- ifa_dstaddr (struct sockaddr *) The remote ad
- dress of point
- to-point interfaces, and the broad
- cast address
 of broadcast interfaces.
- (ifa_broadaddr is a
 macro for ifa_dstaddr.)
- ifa_netmask (struct sockaddr *) The network
- mask for multi
- access interfaces, and the confu
- sion generator
 for point-to-point interfaces.
- ifa_ifp (struct ifnet *) 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 ad
- dress in the
 route table.
- ifa_refcnt (short) The reference count.
- ifa_metric (int) A metric associated with this
- interface
- address, for the use of some exter
- nal routing
 protocol.
- References to ifaddr structures are gained manually, by in
- crementing the
 ifa_refcnt member. References are released by calling ei
- ther the
 ifafree() function or the IFAFREE() macro.
- ifa_rtrequest() is a pointer to a function which receives
- callouts from
 the routing code (rtrequest()) to perform link-layer-specif
- ic actions
 upon requests to add, resolve, or delete routes. The cmd
- argument indicates the request in question: RTM_ADD, RTM_RESOLVE, or
- RTM_DELETE.  The
 rt argument is the route in question; the dst argument is
- the specific
 destination being manipulated for RTM_RESOLVE, or a null
- pointer otherwise.
FUNCTIONS
- The  functions provided by the generic interface code can be
- divided into
 two groups: those which manipulate interfaces, and those
- which manipulate
 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 multicast
 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:
    
   macro glue.ifma_addr (struct sockaddr *) A pointer tothe addresswhich this record represents. Thememberships
 for various address families arestored in arbitrary order.
- ifma_lladdr (struct sockaddr *) A pointer to
- the link-layer
- multicast address, if any, to which
- the networklayer multicast address in
- ifma_addr is mapped,
 else a null pointer. If this ele
- ment is nonnil, this membership also holds an
- invisible
 reference to another membership for
- that linklayer address.
- ifma_refcount (u_int) A reference count of re
- quests 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
- allocation of
 a type specific structure in if_l2com.
- if_attach()
 Link the specified interface ifp into the list of net
- work interfaces. 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
 global array ifnet_addrs.) The ifp must have been al
- locted by
 if_alloc().
- if_detach()
 Shut down and unlink the specified ifp from the inter
- face 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 in
- tended 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
- generate 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 sock
- et.
- 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_ALL
- MULTI) flag
 instead of the promiscuous flag.
- ifunit()
 Return an ifnet pointer for the interface named name.
- 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 ordinarily only called from the socket-layer ioctl(2) han
- dler, and only
 for commands with class `i'. Any unrecognized com
- mands will be
 passed down to socket so's protocol for further inter
- pretation.
 The following commands are handled by ifioctl():
 SIOCGIFCONF
 OSIOCGIFCONF Get interface configuration. (No calldown to driver.)
- SIOCSIFNAME Set the interface name.
- RTM_IFANNOUNCE
- departure and arrival mes
- sages are sent
 so that routing code that
- relies on the
 interface name will update
- its interface
 list. Caller must have ap
- propriate
 privilege. (No call-down
- to driver.)
- SIOCGIFCAP
 SIOCGIFFLAGS
 SIOCGIFMETRIC
 SIOCGIFMTU
 SIOCGIFPHYS Get interface capabilities,
- flags, met
- ric, MTU, medium selection.
- (No calldown to driver.)
- SIOCSIFCAP Enable or disable interface
- capabili
- ties. Caller must have ap
- propriate
 privilege. Before a call
- to the driverspecific if_ioctl() rou
- tine, the
 requested mask for enabled
- capabilities
 is checked against the mask
- of capabilities supported by the in
- terface,
 if_capabilities. Request
- ing to enable
 an unsupported capability
- is invalid.
 The rest is supposed to be
- done by the
 driver, which includes up
- dating
 if_capenable and
- if_data.ifi_hwassist
 appropriately.
- SIOCSIFFLAGS Change interface flags.
- Caller must
- have appropriate privilege.
- If a change
 to the IFF_UP flag is re
- quested, 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 appropri
- ate privilege.
- SIOCSIFMTU Change interface MTU.
- Caller must have
- appropriate privilege. MTU
- values less
 than 72 or greater than
- 65535 are considered invalid. The driv
- er if_ioctl()
 routine is called to imple
- ment the
 change; it is responsible
- for any additional sanity checking and
- for actually
 modifying the MTU in the
- interface
 structure.
- SIOCADDMULTI
 SIOCDELMULTI Add or delete permanent
- multicast group
- memberships on the inter
- face.  Caller
 must have appropriate priv
- ilege.  The
 if_addmulti() or
- if_delmulti() function
 is called to perform the
- operation;
 qq.v.
- SIOCSIFDSTADDR
 SIOCSIFADDR
 SIOCSIFBRDADDR
 SIOCSIFNETMASK The socket's protocol con
- trol routine is
- called to implement the re
- quested
 action.
- OSIOGIFADDR
 OSIOCGIFDSTADDR
 OSIOCGIFBRDADDR
 OSIOCGIFNETMASK The socket's protocol con
- trol routine is
- called to implement the re
- quested
 action. On return,
- sockaddr structures
 are converted into old
- style (no sa_len
 member).
- if_down(), ifioctl(), ifpromisc(), and if_up() must be
- called at splnet()
 or higher.
- 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-topoint interface whose remote (``destination'') address is
- addr.
- ifa_ifwithnet() returns the most specific interface address
- which matches
 the specified address, addr, subject to its configured net
- mask, or a
 point-to-point interface address whose remote address is
- addr if one is
 found.
- ifaof_ifpforaddr() returns the most specific address config
- ured on interface ifp which matches address addr, subject to its config
- ured netmask.
 If the interface is point-to-point, only an interface ad
- dress whose
 remote address is precisely addr will be returned.
- All of these functions return a null pointer if no such ad
- dress can be
 found.
- Interface Multicast Address Functions
- The if_addmulti(), if_delmulti(), and ifmaof_ifpforaddr()
- functions provide support for requesting and relinquishing multicast
- group memberships, and for querying an interface's membership list, re
- spectively.
 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 per
- forms the following four-step process:
    
 1. Call the interface's if_resolvemulti() entry
- point to deter
 mine the link-layer address, if any, correspond
- ing to this
 membership request, and also to give the link
- layer an opportunity to veto this membership request should it
- so desire.
- 2. Check the interface's group membership list for a
- pre-existing
 membership for this group. If one is not found,
- allocate a
 new one; if one is, increment its reference
- count.
- 3. If the if_resolvemulti() routine returned a link
- layer address
 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 interface'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 suc
- cess, or a standard error number on failure.
- The ifmaof_ifpforaddr() function examines the membership
- list of interface ifp for an address matching addr, 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), rten
- try(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.
- BSD June 10, 2005