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