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 structifmibdata are as follows:
ifmd_name (char[]) the name of the interface, including the unit number
ifmd_pcount (int) the number of promiscuous listeners
ifmd_flags (int) the interface's flags (defined in <net/if.h>)
ifmd_snd_len (int) the current instantaneous length of the send queue
ifmd_snd_drops (int) the number of packets dropped at this interface because the send queue was full
ifmd_data (structif_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 “structifmib_iso_8802_3” (defined in
<net/if_mib.h>), and implements a superset of the RFC 1650 MIB for Ethernet-like networks.