This is an old revision of the document!
Overview
Testing the effect of interface manipulation on the values of IFF_UP and IFF_RUNNING.
Links:
Flags
From include/uapi/linux/if.h:
enum net_device_flags {
/* for compatibility with glibc net/if.h */
#if __UAPI_DEF_IF_NET_DEVICE_FLAGS
IFF_UP = 1<<0, /* sysfs */
IFF_BROADCAST = 1<<1, /* volatile */
IFF_DEBUG = 1<<2, /* sysfs */
IFF_LOOPBACK = 1<<3, /* volatile */
IFF_POINTOPOINT = 1<<4, /* volatile */
IFF_NOTRAILERS = 1<<5, /* sysfs */
IFF_RUNNING = 1<<6, /* volatile */
IFF_NOARP = 1<<7, /* sysfs */
IFF_PROMISC = 1<<8, /* sysfs */
IFF_ALLMULTI = 1<<9, /* sysfs */
IFF_MASTER = 1<<10, /* volatile */
IFF_SLAVE = 1<<11, /* volatile */
IFF_MULTICAST = 1<<12, /* sysfs */
IFF_PORTSEL = 1<<13, /* sysfs */
IFF_AUTOMEDIA = 1<<14, /* sysfs */
IFF_DYNAMIC = 1<<15, /* sysfs */
#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */
#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO
IFF_LOWER_UP = 1<<16, /* volatile */
IFF_DORMANT = 1<<17, /* volatile */
IFF_ECHO = 1<<18, /* volatile */
#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
};
operstates.txt
Administrative versus operational state:
Linux distinguishes between administrative and operational state of an interface. Administrative state is the result of "ip link set dev <dev> up or down" and reflects whether the administrator wants to use the device for traffic. However, an interface is not usable just because the admin enabled it - ethernet requires to be plugged into the switch and, depending on a site's networking policy and configuration, an 802.1X authentication to be performed before user data can be transferred. Operational state shows the ability of an interface to transmit this user data. Thanks to 802.1X, userspace must be granted the possibility to influence operational state. To accommodate this, operational state is split into two parts: Two flags that can be set by the driver only, and a RFC2863 compatible state that is derived from these flags, a policy, and changeable from userspace under certain rules.
Flags
Source
ifconfig is getting hex value from SIOCGIFFLAGS which does dev_get_flags(dev).
Up and running
4163:
enp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.15 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fd00:f81d:f81:4062:2e56:dcff:fe25:ad47 prefixlen 64 scopeid 0x0<global>
inet6 fe80::2e56:dcff:fe25:ad47 prefixlen 64 scopeid 0x20<link>
ether 2c:56:dc:25:ad:47 txqueuelen 1000 (Ethernet)
RX packets 81232 bytes 92092778 (87.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 36768 bytes 9024553 (8.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Down
4098:
enp3s0: flags=4098<BROADCAST,MULTICAST> mtu 1500
inet 192.168.0.15 netmask 255.255.255.0 broadcast 192.168.0.255
ether 2c:56:dc:25:ad:47 txqueuelen 1000 (Ethernet)
RX packets 81290 bytes 92110209 (87.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 36836 bytes 9042100 (8.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Up, then disconnected
4099:
enp3s0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.0.15 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fd00:f81d:f81:4062:2e56:dcff:fe25:ad47 prefixlen 64 scopeid 0x0<global>
inet6 fe80::2e56:dcff:fe25:ad47 prefixlen 64 scopeid 0x20<link>
ether 2c:56:dc:25:ad:47 txqueuelen 1000 (Ethernet)
RX packets 81318 bytes 92115343 (87.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 36917 bytes 9052750 (8.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
dev_get_flags()
net/core/dev_ioctl.c
/*
* Perform the SIOCxIFxxx calls, inside rcu_read_lock()
*/
static int dev_ifsioc_locked(struct net *net, struct ifreq *ifr, unsigned int cmd)
{
int err;
struct net_device *dev = dev_get_by_name_rcu(net, ifr->ifr_name);
if (!dev)
return -ENODEV;
switch (cmd) {
case SIOCGIFFLAGS: /* Get interface flags */
ifr->ifr_flags = (short) dev_get_flags(dev);
return 0;