IFMIB(4) | Device Drivers Manual | IFMIB(4) |
ifmib
— Management
Information Base for network interfaces
#include
<sys/types.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <sys/time.h>
#include <net/if.h>
#include <net/if_mib.h>
The ifmib
facility is an application of
the sysctl(3) interface to provide management information
about network interfaces to client applications such as
netstat(1), slstat(8), and SNMP
management agents. This information is structured as a table, where each row
in the table represents a logical network interface (either a hardware
device or a software pseudo-device like lo(4)). There are
two columns in the table, each containing a single structure: one column
contains generic information relevant to all interfaces, and the other
contains information specific to the particular class of interface.
(Generally the latter will implement the SNMP MIB defined for that
particular interface class, if one exists and can be implemented in the
kernel.)
The ifmib
facility is accessed via the
“net.link.generic
” branch of the
sysctl(3) MIB. The manifest constants for each level in
the sysctl(3) name are defined in
<net/if_mib.h>
. The index of
the last row in the table is given by
“net.link.generic.system.ifcount
” (or,
using the manifest constants, CTL_NET
,
PF_LINK
, NETLINK_GENERIC
,
IFMIB_SYSTEM
,
IFMIB_IFCOUNT
). A management application searching
for a particular interface should start with row 1 and continue through the
table row-by-row until the desired interface is found, or the interface
count is reached. Note that the table may be sparse, i.e., a given row may
not exist, indicated by an errno of
ENOENT
. Such an error should be ignored, and the
next row should be checked.
The generic interface information, common to all interfaces, can be accessed via the following procedure:
int get_ifmib_general(int row, struct ifmibdata *ifmd) { int name[6]; size_t len; name[0] = CTL_NET; name[1] = PF_LINK; name[2] = NETLINK_GENERIC; name[3] = IFMIB_IFDATA; name[4] = row; name[5] = IFDATA_GENERAL; len = sizeof(*ifmd); return sysctl(name, 6, ifmd, &len, (void *)0, 0); }
The fields in struct ifmibdata
are as
follows:
ifmd_name
char []
) the name of the interface, including the
unit numberifmd_pcount
int
) the number of promiscuous listenersifmd_flags
int
) the interface's flags (defined in
<net/if.h>
)ifmd_snd_len
int
) the current instantaneous length of the send
queueifmd_snd_drops
int
) the number of packets dropped at this
interface because the send queue was fullifmd_data
struct if_data
) more information from a structure
defined in <net/if.h>
(see
if_data(9))Class-specific information can be retrieved by examining the
IFDATA_LINKSPECIFIC
column instead. Note that the
form and length of the structure will depend on the class of interface. For
IFT_ETHER
, IFT_ISO88023
, and
IFT_STARLAN
interfaces, the structure is called
“struct ifmib_iso_8802_3
” (defined in
<net/if_mib.h>
), and
implements a superset of the RFC 1650 MIB for Ethernet-like networks.
F. Kastenholz, Definitions of Managed Objects for the Ethernet-like Interface Types Using SMIv2, August 1994, RFC 1650.
The ifmib
interface first appeared in
FreeBSD 2.2.
Many Ethernet-like interfaces do not yet support the Ethernet MIB; the interfaces known to support it include ed(4) and de(4). Regardless, all interfaces automatically support the generic MIB.
October 28, 2009 | Debian |