diff options
author | wollman <wollman@FreeBSD.org> | 1996-12-17 20:21:01 +0000 |
---|---|---|
committer | wollman <wollman@FreeBSD.org> | 1996-12-17 20:21:01 +0000 |
commit | 25af2478ff4ab13992d997c8de6916fb7de37b41 (patch) | |
tree | 60c3e70959f508f8f220a21c14edc758c34529ec | |
parent | b0e8bc6ae5fbcab68fc6fdcbd39bf81c3dcd129a (diff) | |
download | FreeBSD-src-25af2478ff4ab13992d997c8de6916fb7de37b41.zip FreeBSD-src-25af2478ff4ab13992d997c8de6916fb7de37b41.tar.gz |
Create a new manual page describing how network interfaces and
addresses are glued together with the generic networking code.
-rw-r--r-- | share/man/man9/Makefile | 5 | ||||
-rw-r--r-- | share/man/man9/ifnet.9 | 827 |
2 files changed, 830 insertions, 2 deletions
diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile index fec91d6..9390f9c 100644 --- a/share/man/man9/Makefile +++ b/share/man/man9/Makefile @@ -1,7 +1,7 @@ -# $Id: Makefile,v 1.10 1996/10/08 18:45:03 wollman Exp $ +# $Id: Makefile,v 1.11 1996/10/08 20:25:36 wollman Exp $ MAN9= at_shutdown.9 at_fork.9 at_exit.9 copy.9 devfs_add_devswf.9 \ - devfs_link.9 fetch.9 intro.9 rtalloc.9 rtentry.9 sleep.9 spl.9 \ + devfs_link.9 fetch.9 ifnet.9 intro.9 rtalloc.9 rtentry.9 sleep.9 spl.9 \ store.9 style.9 timeout.9 MLINKS+= copy.9 copyin.9 copy.9 copyout.9 copy.9 copystr.9 copy.9 copyinstr.9 @@ -9,6 +9,7 @@ MLINKS+= fetch.9 fubyte.9 fetch.9 fusword.9 fetch.9 fuswintr.9 fetch.9 fuword.9 MLINKS+= at_shutdown.9 rm_at_shutdown.9 MLINKS+= at_exit.9 rm_at_exit.9 MLINKS+= at_fork.9 rm_at_fork.9 +MLINKS+= ifnet.9 ifaddr.9 ifnet.9 ifqueue.9 ifnet.9 if_data.9 MLINKS+= rtalloc.9 rtalloc_ign.9 rtalloc.9 rtalloc1.9 MLINKS+= sleep.9 tsleep.9 sleep.9 wakeup.9 MLINKS+= spl.9 splbio.9 spl.9 splclock.9 spl.9 splhigh.9 spl.9 splimp.9 diff --git a/share/man/man9/ifnet.9 b/share/man/man9/ifnet.9 new file mode 100644 index 0000000..dbb56ef --- /dev/null +++ b/share/man/man9/ifnet.9 @@ -0,0 +1,827 @@ +.\" +.\" Copyright 1996 Massachusetts Institute of Technology +.\" +.\" Permission to use, copy, modify, and distribute this software and +.\" its documentation for any purpose and without fee is hereby +.\" granted, provided that both the above copyright notice and this +.\" permission notice appear in all copies, that both the above +.\" copyright notice and this permission notice appear in all +.\" supporting documentation, and that the name of M.I.T. not be used +.\" in advertising or publicity pertaining to distribution of the +.\" software without specific, written prior permission. M.I.T. makes +.\" no representations about the suitability of this software for any +.\" purpose. It is provided "as is" without express or implied +.\" warranty. +.\" +.\" THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS +.\" ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE, +.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT +.\" SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $Id: rtalloc.9,v 1.3 1996/12/01 00:25:05 mpp Exp $ +.Dd December 16, 1996 +.Os FreeBSD 2.2 +.Dt IFNET 9 +.Sh NAME +.Nm ifnet , +.Nm ifaddr , +.Nm ifqueue , +.Nm if_data +.Nd kernel interfaces for manipulating network interfaces +.Sh SYNOPSIS +.Fd #include <sys/types.h> +.Fd #include <sys/time.h> +.Fd #include <sys/socket.h> +.Fd #include <net/if.h> +.Fd #include <net/if_types.h> +.\" +.Ss "Interface manipulation functions" +.Ft void +.Fn if_attach "struct ifnet *ifp" +.Ft void +.Fn if_down "struct ifnet *ifp" +.Ft int +.Fn ifioctl "struct socket *so" "int cmd" "caddr_t data" "struct proc *p" +.Ft int +.Fn ifpromisc "struct ifnet *ifp" "int pswitch" +.Ft "struct ifnet *" +.Fn ifunit "char *name" +.Ft void +.Fn if_up "struct ifnet *ifp" +.\" +.Ss "Interface address functions" +.Ft "struct ifaddr *" +.Fn ifa_ifwithaddr "struct sockaddr *addr" +.Ft "struct ifaddr *" +.Fn ifa_ifwithdstaddr "struct sockaddr *addr" +.Ft "struct ifaddr *" +.Fn ifa_ifwithnet "struct sockaddr *addr" +.Ft "struct ifaddr *" +.Fn ifaof_ifpforaddr "struct sockaddr *addr" "struct ifnet *ifp" +.Ft void +.Fn ifafree "struct ifaddr *ifa" +.Ft void \"macro +.Fn IFAFREE "struct ifaddr *ifa" +.\" +.Ss "Output queue macros" +.Ft void \"macro +.Fn IF_ENQ_DROP "struct ifqueue *ifq" "struct mbuf *m" +.Ft void \"macro +.Fn IF_DEQUEUE "struct ifqueue *ifq" "struct mbuf *m" +.\" +.Ss "struct ifnet member functions" +.Ft int +.Fn (*if_output) "struct ifnet *ifp" "struct mbuf *m" "struct sockaddr *dst" "struct rtentry *rt" +.Ft void +.Fn (*if_start) "struct ifnet *ifp" +.Ft int +.Fn (*if_dont) "struct ifnet *ifp" +.Ft int +.Fn (*if_ioctl) "struct ifnet *ifp" "int cmd" "caddr_t data" +.Ft void +.Fn (*if_watchdog) "struct ifnet *ifp" +.Ft int +.Fn (*if_poll_recv) "struct ifnet *ifp" "int *quotap" +.Ft int +.Fn (*if_poll_xmit) "struct ifnet *ifp" "int *quotap" +.Ft void +.Fn (*if_poll_inttrn) "struct ifnet *ifp" +.Ft void +.Fn (*if_poll_slowinput) "struct ifnet *ifp" "struct mbuf *m" +.Ft void +.Fn (*if_init) "void *wtf_is_this" +.Ss "struct ifaddr member function" +.Ft void +.Fn (*ifa_rtrequest) "int cmd" "struct rtentry *rt" "struct sockaddr *dst" +.Ss "Global variables" +.Fd extern struct ifnethead ifnet; +.Fd extern struct ifaddr \&**ifnet_addrs; +.Fd extern int if_index; +.Fd extern int ifqmaxlen; +.Sh DATA STRUCTURES +The kernel mechanisms for handling network interfaces reside primarily +in the +.Li ifnet , +.Li if_data , +and +.Li ifaddr +structures in +.Aq Pa net/if.h , +and the functions named above and defined in +.Pa /sys/net/if.c . +The system keeps a linked list of interfaces using the +.Li TAILQ +macros defined in +.Xr queue 3 ; +this list is headed by a +.Li "struct ifnethead" +called +.Li ifnet . +The elements of this list are of type +.Li "struct ifnet" , +and most kernel routines which manipulate interface as such accept or +return pointers to these structures. Each interface structure +contains an +.Li if_data +structure, which contains statistics and identifying information used +by management programs, and which is exported to user programs by way +of the +.Xr ifmib 4 +branch of the +.Xr sysctl 3 +MIB. +Each interface also has a +.Li TAILQ +of interface addresses, described by +.Li ifaddr +structures; the head of the queue is always an +.Dv AF_LINK +address +(see +.Xr link_addr 3 ) +describing 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.) +.Pp +Interfaces are also associated with an output queue, defined as a +.Li "struct ifqueue" ; +this structure is used to hold packets while the interface is in the +process of sending another. The current implementation implements a +drop-tail queueing discipline, but in the future a Random Early Drop +discipline is expected to be used. For this reason, kernel code +should not depend on the internals of the queue structure; in +particular, only the +.Fn IF_ENQ_DROP +and +.Fn IF_DEQUEUE +macros will be supported in future implementations. +.\" The old structure will probably be retained for compatibility +.\" under a different name. +.Pp +.Ss The ifnet structure +The fields of +.Li "struct ifnet" +are as follows: +.Pp +.Bl -tag -width "if_poll_slowq" -offset indent +.It Li "if_softc" +.Pq Li "void *" +A pointer to the driver's private state block. (Initialized by +driver.) +.It Li if_name +.Pq Li "char *" +The name of the interface, not including the unit number +(e.g., +.Dq Li de +or +.Dq Li lo ) . +(Initialized by driver.) +.It Li if_link +.Pq Li "TAILQ_ENTRY(ifnet)" +.Xr queue 3 +macro glue. +.It Li if_addrhead +.Pq Li "struct ifaddrhead" +The head of the +.Xr queue 3 +.Li TAILQ +containing the list of addresses assigned to this interface. +.It Li if_pcount +.Pq Li "int" +A count of promiscuous listeners on this interface, used to +reference-count the +.Dv IFF_PROMISC +flag. +.It Li "if_bpf" +.Pq Li "struct bpf_if *" +Opaque per-interface data for the packet filter, +.Xr bpf 4 . +(Initialized by +.Fn bpf_attach . ) +.It Li "if_index" +.Pq Li "u_short" +A unique number assigned to each interface in sequence as it is +attached. This number can be used in a +.Li "struct sockaddr_dl" +to refer to a particular interface by index +(see +.Xr link_addr 3 ) . +.It Li "if_unit" +.Pq Li "short" +A unique number assigned to each interface managed by a particular +driver, usually related to the unit number of a physical device in the +kernel configuration file +(see +.Xr config 8 ) . +(Initialized by driver.) +.It Li "if_timer" +.Pq Li "short" +Number of seconds until the watchdog timer +.Fn if_watchdog +is called, or zero if the timer is disabled. (Set by driver, +decremented by generic watchdog code.) +.It Li "if_flags" +.Pq Li "short" +Flags describing operational parameters of this interface (see below). +(Manipulated by both driver and generic code.) +.\" .It Li "if_ipending" +.\" Interrupt-pending bits for polled operation: +.\" .Dv IFI_XMIT +.\" (transmit complete interrupt) +.\" and +.\" .Dv IFI_RECV +.\" (received packet ready interrupt). See the +.\" .Sx Polling +.\" section, below. (Manipulated by driver.) +.It Li "if_linkmib" +.Pq Li "void *" +A pointer to an interface-specific MIB structure exported by +.Xr ifmib 4 . +(Initialized by driver.) +.It Li "if_linkmiblen" +.Pq Li "size_t" +The size of said structure. (Initialized by driver.) +.It Li "if_data" +.Pq Li "struct if_data" +More statistics and information; see +.Dq Sx "The if_data structure" , +below. (Initialized by driver, manipulated by both driver and generic +code.) +.It Li "if_snd" +.Pq Li "struct ifqueue" +The output queue. (Manipulated by driver.) +.\".It Li "if_poll_slowq" +.\".Pq Li "struct ifqueue *" +.\"A pointer to the input queue for devices which do not support polling +.\"well. See the +.\".Sx Polling +.\"section, below. (Initialized by driver.) +.El +.Pp +There are in addition a number of function pointers which the driver +must initialize to complete its interface with the generic interface +layer: +.Bl -ohang -offset indent +.It Fn if_output +Output a packet on interface +.Ar ifp , +or queue it on the output queue if the interface is already active. +.It Fn if_start +Start queued output on an interface. This function is exposed in +order to provide for some interface classes to share a +.Fn if_output +among all drivers. +.Fn if_start +may only be called when the +.Dv IFF_OACTIVE +flag is not set. (Thus, +.Dv IFF_OACTIVE +does not literally mean that output is active, but rather that the +device's internal output queue is full.) +.It Fn if_done +Not used. We're not even sure what it was ever for. +.It Fn if_ioctl +Process interface-related +.Xr ioctl 2 +requests +(defined in +.Aq Pa sys/sockio.h ) . +Preliminary processing is done by the generic routine +.Fn ifioctl +to check for appropriate privileges, locate the interface being +manipulated, and perform certain generic operations like twiddling +flags and flushing queues. See the description of +.Fn ifioctl +below for more information. +.It Fn if_watchdog +Routine called by the generic code when the watchdog timer, +.Li if_timer , +expires. Usually this will reset the interface. +.\" .It Fn if_poll_recv +.\" .It Fn if_poll_xmit +.\" .It Fn if_poll_slowinput +.\" .It Fn if_poll_intren +.\" See the +.\" .Sx Polling +.\" section, below. +.It Fn if_init +XXX fill me in +.El +.Ss "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 +.Aq S +in this table; the latter are marked +.Aq D . +.Pp +.Bl -tag -width "IFF_POINTOPOINT" -compact -offset indent +.It Dv IFF_UP +.Aq D +The interface has been configured up by the user-level code. +.It Dv IFF_BROADCAST +.Aq S* +The interface supports broadcast. +.It Dv IFF_DEBUG +.Aq D +Used to enable/disable driver debugging code. +.It Dv IFF_LOOPBACK +.Aq S +The interface is a loopback device. +.It Dv IFF_POINTOPOINT +.Aq S* +The interface is point-to-point; +.Dq broadcast +addresses are actually the address of the other end. +.It Dv IFF_RUNNING +.Aq D* +The interface has been configured and dynamic resources were +successfully allocated. Probably only useful internal to the +interface. +.It Dv IFF_NOARP +.Aq D +Disable network address resolution on this interface. +.It Dv IFF_PROMISC +.Aq D +This interface is in promiscuous mode. +.It Dv IFF_ALLMULTI +.Aq D* +This interface is in all-multicasts mode (used by multicast routers). +.It Dv IFF_OACTIVE +.Aq D* +The interface's hardware output queue (if any) is full; output packets +are to be queued. +.It Dv IFF_SIMPLEX +.Aq S* +The interface cannot hear its own transmissions. +.It Dv IFF_LINK0 +.It Dv IFF_LINK1 +.It Dv IFF_LINK2 +.Aq D +Control flags for the link layer. (Currently abused to select among +multiple physical layers on some devices.) +.It Dv IFF_MULTICAST +.Aq S* +This interface supports multicast. +.El +.Pp +The macro +.Dv IFF_CANTCHANGE +defines the bits which cannot be set by a user program using the +.Dv SIOCSIFFLAGS +command to +.Xr ioctl 2 ; +these are indicated by an asterisk in the listing above. +.Ss The if_data structure +In +.Bx 4.4 , +a subset of the interface information believed to be of interest to +management stations was segregated from the +.Li ifnet +structure and moved into its own +.Li if_data +structure to facilitate its use by user programs. The following +elements of the +.Li if_data +structure are initialized by the interface and are not expected to change +significantly over the course of normal operation: +.Bl -tag -width "ifi_lastchange" -offset indent +.It Li ifi_type +.Pq Li u_char +The type of the interface, as defined in +.Aq Pa net/if_types.h +and described below in the +.Dq Sx "Interface types" +section. +.It Li ifi_physical +.Pq Li u_char +Intended to represent a selection of physical layers on devices which +support more than one; never implemented. +.It Li ifi_addrlen +.Pq Li 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 +.Li "sockaddr_dl" +structures referring to this interface. +.It Li ifi_hdrlen +.Pq Li 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 +.Li mbuf Ns s +to attempt to ensure that there is always +sufficient space to prepend a link-layer header without allocating an +additional +.Li mbuf . +.\" (See +.\" .Xr mbuf 9 . ) +.\" .It Li ifi_recvquota +.\" .Pq Li u_char +.\" Number of packets the interface is permitted to receive at one time +.\" when in polled mode. +.\" .It Li ifi_xmitquota +.\" .Pq Li u_char +.\" Number of packets the interface is permitted to queue for transmission +.\" at one time when in polled mode. There is some controversy over +.\" whether such a restriction makes any sense at all. +.It Li ifi_mtu +.Pq Li u_long +The maximum transmission unit of the medium, exclusive of any +link-layer overhead. +.It Li ifi_metric +.Pq Li u_long +A dimensionless metric interpreted by a user-mode routing process. +.It Li ifi_baudrate +.Pq Li u_long +The line rate of the interface, in bits per second. +.El +.Pp +The structure additionally contains generic statistics applicable to a +variety of different interface types (except as noted, all members are +of type +.Li u_long ) : +.Bl -tag -width "ifi_lastchange" -offset indent +.It Li ifi_ipackets +Number of packets received. +.It Li 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 +link-specific MIB. +.It Li ifi_opackets +Number of packets transmitted. +.It Li 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 +link-specific MIB. +.It Li 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.) +.It Li ifi_ibytes +Total traffic received, in bytes. +.It Li ifi_obytes +Total traffic transmitted, in bytes. +.It Li ifi_imcasts +Number of packets received which were sent by link-layer multicast. +.It Li ifi_omcasts +Number of packets sent by link-layer multicast. +.It Li ifi_iqdrops +Number of packets dropped on input. Rarely implemented. +.It Li ifi_noproto +Number of packets received for unknown network-layer protocol. +.\" .It Li ifi_recvtiming +.\" Amount of time, in microseconds, spent to receive an average packet on +.\" this interface. See the +.\" .Sx Polling +.\" section, below. +.\" .It Li ifi_xmittiming +.\" Amount of time, in microseconds, spent to service a transmit-complete +.\" interrupt on this interface. See the +.\" .Sx Polling +.\" section, below. +.It Li ifi_lastchange +.Pq Li "struct timeval" +The time of the last administative change to the interface (as required +for +.Tn SNMP ) . +.El +.Ss Interface types +The header file +.Aq Pa net/if_types.h +defines symbolic constants for a number of different types of +interfaces. The most common are: +.Pp +.Bl -tag -compact -offset indent -width IFT_PROPVIRTUAL +.It Dv IFT_OTHER +none of the following +.It Dv IFT_ETHER +Ethernet +.It Dv IFT_ISO88023 +ISO 8802-3 CSMA/CD +.It Dv IFT_ISO88024 +ISO 8802-4 Token Bus +.It Dv IFT_ISO88025 +ISO 8802-5 Token Ring +.It Dv IFT_ISO88026 +ISO 8802-6 DQDB MAN +.It Dv IFT_FDDI +FDDI +.It Dv IFT_PPP +Internet Point-to-Point Protocol +.Pq Xr ppp 8 +.It Dv IFT_LOOP +The loopback +.Pq Xr lo 4 +interface. +.It Dv IFT_SLIP +Serial Line IP +.It Dv IFT_PARA +Parallel-port IP +.Pq Dq Tn PLIP +.It Dv IFT_ATM +Asynchronous Transfer Mode +.El +.Ss The ifaddr structure +Every interface is associated with a list +(or, rather, a +.Dv TAILQ ) +of addresses, rooted at the interface structure's +.Li if_addrlist +member. The first element in this list is always an +.Dv AF_LINK +address representing the interface itself; multi-access network +drivers should complete this structure by filling in their link-layer +addresses after calling +.Fn if_attach . +Other members of the structure represent network-layer addresses which +have been configured by means of the +.Dv SIOCAIFADDR +command to +.Xr ioctl 2 , +called on a socket of the appropriate protocol family. +The elements of this list consist of +.Li ifaddr +structures. Most protocols will declare their own protocol-specific +interface address structures, but all begin with a +.Li "struct ifaddr" +which provides the most-commonly-needed functionality across all +protocols. Interface addresses are reference-counted. +.Pp +The members of +.Li "struct ifaddr" +are as follows: +.Bl -tag -width ifa_rtrequest -offset indent +.It Li ifa_addr +.Pq Li "struct sockaddr *" +The local address of the interface. +.It Li ifa_dstaddr +.Pq Li "struct sockaddr *" +The remote address of point-to-point interfaces, and the broadcast +address of broadcast interfaces. +.Po +.Li ifa_broadaddr +is a macro for +.Li ifa_dstaddr . +.Pc +.It Li ifa_netmask +.Pq Li "struct sockaddr *" +The network mask for multi-access interfaces, and the confusion +generator for point-to-point interfaces. +.It Li ifa_ifp +.Pq Li "struct ifnet *" +A link back to the interface structure. +.It Li ifa_link +.Pq Li TAILQ_ENTRY(ifaddr) +.Xr queue 3 +glue for list of addresses on each interface. +.It Li ifa_rtrequest +See below. +.It Li ifa_flags +.Pq Li u_short +Some of the flags which would be used for a route representing this +address in the route table. +.It Li ifa_refcnt +.Pq Li short +The reference count. +.It Li ifa_metric +.Pq Li int +A metric associated with this interface address, for the use of some +external routing protocol. +.El +.Pp +References to +.Li ifaddr +structures are gained manually, by incrementing the +.Li ifa_refcnt +member. References are released by calling either the +.Fn ifafree +function or the +.Fn IFAFREE +macro. +.Pp +.Fn ifa_rtrequest +is a pointer to a function which receives callouts from the routing +code +.Pq Fn rtrequest +to perform link-layer-specific actions upon requests to add, resolve, +or delete routes. The +.Ar cmd +argument indicates the request in question: +.Dv RTM_ADD , +.Dv RTM_RESOLVE , +or +.Dv RTM_DELETE . +The +.Ar rt +argument is the route in question; the +.Ar sa +argument is the specific destination being manipulated +for +.Dv RTM_RESOLVE , +or a null pointer otherwise. +.Sh 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. +.Ss Interface manipulation functions +.Bl -ohang -offset indent +.It Fn if_attach +Link the specified interface +.Ar ifp +into the list of network interfaces. Also initialize the list of +addresses on that interface, and create a link-layer +.Li ifaddr +structure to be the first element in that list. (A pointer to +this address structure is saved in the global array +.Li ifnet_addrs . ) +.It Fn if_down +Mark the interface +.Ar ifp +as down (i.e., +.Dv IFF_UP +is not set), +flush its output queue, and call the interface's +.Fn if_ioctl +routine to notify the driver of the shutdown request. +.It Fn if_up +Mark the interface +.Ar ifp +as up, and call the interface's +.Fn if_ioctl +routine to (re-)initialize the driver. +.It Fn ifpromisc +Add or remove a promiscuous reference to +.Ar ifp . +If +.Ar 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 +.Dv IFF_PROMISC +flag appropriately and call +.Fn if_ioctl +to set up the interface in the desired mode. +.It Fn ifunit +Return an +.Li ifnet +pointer for the interface named +.Ar name . +.It Fn ifioctl +Process the ioctl request +.Ar cmd , +issued on socket +.Ar so +by process +.Ar p , +with data parameter +.Ar data . +This is the main routine for handling all interface configuration +requests from user mode. +It is ordinarily only called from the socket-layer +.Xr ioctl 2 +handler, and only for commands with class +.Sq Li i . +Any unrecognized commands will be passed down to socket +.Ar so Ns 's +protocol for +further interpretation. The following commands are handled by +.Fn ifioctl : +.Pp +.Bl -tag -width OSIOCGIFNETMASK -compact -offset indent +.It Dv SIOCGIFCONF +.It Dv OSIOCGIFCONF +Get interface configuration. (No call-down to driver.) +.It Dv SIOCGIFFLAGS +.It Dv SIOCGIFMETRIC +.It Dv SIOCGIFMTU +.It Dv SIOCGIFPHYS +Get interface flags, metric, MTU, medium selection. (No call-down to +driver.) +.Pp +.It Dv SIOCSIFFLAGS +Change interface flags. Caller must have appropriate privilege. If +requested a change to the IFF_UP flag is requested, +.Fn if_up +or +.Fn if_down +is called as appropriate. Flags listed in +.Dv IFF_CANTCHANGE +are masked off, and the driver +.Fn if_ioctl +routine is called to perform any setup +requested. +.It Dv SIOCSIFMETRIC +.It Dv SIOCSIFPHYS +Change interface metric or medium. Caller must have appropriate privilege. +.Pp +.It Dv SIOCSIFMTU +Change interface MTU. Caller must have appropriate privilege. MTU +values less than 72 or greater than 65535 are considered invalid. The +driver +.Fn if_ioctl +routine is called to implement the change; it is responsible for any +additional sanity checking and for actually modifying the MTU in the +interface structure. +.It Dv SIOCADDMULTI +.It Dv SIOCDELMULTI +Add or delete permanent multicast group memberships on the interface. +Caller must have appropriate privilege. The driver +.Fn if_ioctl +routine is called to perform the requested action. +.It Dv SIOCSIFDSTADDR +.It Dv SIOCSIFADDR +.It Dv SIOCSIFBRDADDR +.It Dv SIOCSIFNETMASK +The socket's protocol control routine is called to implement the +requested action. +.It Dv OSIOGIFADDR +.It Dv OSIOCGIFDSTADDR +.It Dv OSIOCGIFBRDADDR +.It Dv OSIOCGIFNETMASK +The socket's protocol control routine is called to implement the +requested action. On return, +.Li sockaddr +structures are converted into old-style (no +.Li sa_len +member). +.El +.Pp +.Fn if_down , +.Fn ifioctl , +.Fn ifpromisc , +and +.Fn if_up +must be called at +.Fn splnet +or higher. +.Ss "Interface address functions" +Several functions exist to look up an interface address structure +given an address. +.Fn ifa_ifwithaddr +returns an interface address with either a local address or a +broadcast address precisely matching the parameter +.Ar addr . +.Fn ifa_ifwithdstaddr +returns an interface address for a point-to-point interface whose +remote (``destination'') address is +.Ar addr . +.Pp +.Fn ifa_ifwithnet +returns the most specific interface address which matches the +specified address, +.Ar addr , +subject to its configured netmask, or a point-to-point interface +address whose remote address is +.Ar addr +if one is found. +.Pp +.Fn ifaof_ifpforaddr +returns the most specific address configured on interface +.Ar ifp +which matches address +.Ar addr , +subject to its configured netmask. If the interface is +point-to-point, only an interface address whose remote address is +precisely +.Ar addr +will be returned. +.Pp +All of these functions return a null pointer if no such address can be +found. +.\" .Sh POLLING +.\" XXX write me! +.Sh SEE ALSO +.Xr bpf 4 , +.Xr config 8 , +.Xr ifmib 4 , +.Xr ioctl 2 , +.Xr link_addr 3 , +.Xr lo 4 , +.\" .Xr mbuf 9 , +.Xr netintro 4 , +.Xr ppp 8 , +.Xr queue 3 , +.Xr rtentry 9 , +.Xr sysctl 3 +.Rs +.%A Gary R. Wright and W. Richard Stevens +.%B TCP/IP Illustrated +.%V vol. 2 +.%O Addison-Wesley, ISBN 0-201-63354-X +.Re +.Sh AUTHOR +This manual page was written by Garrett A. Wollman |