This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
ipp_up_and_iff_running [2018/08/25 16:15] rpjday [Up but disconnected] |
ipp_up_and_iff_running [2018/08/27 11:03] rpjday [net/core/dev_ioctl.c] |
||
---|---|---|---|
Line 8: | Line 8: | ||
===== Flags ===== | ===== Flags ===== | ||
+ | |||
+ | Issues: | ||
+ | |||
+ | * Is ''IFF_LOWER_UP'' significant? | ||
+ | * Can we use ''IFF_DEBUG''? | ||
+ | * Understand actual meaning of "volatile". | ||
From ''include/uapi/linux/if.h'': | From ''include/uapi/linux/if.h'': | ||
<code> | <code> | ||
+ | /** | ||
+ | * enum net_device_flags - &struct net_device flags | ||
+ | * | ||
+ | * These are the &struct net_device flags, they can be set by drivers, the | ||
+ | * kernel and some can be triggered by userspace. Userspace can query and | ||
+ | * set these flags using userspace utilities but there is also a sysfs | ||
+ | * entry available for all dev flags which can be queried and set. These flags | ||
+ | * are shared for all types of net_devices. The sysfs entries are available | ||
+ | * via /sys/class/net/<dev>/flags. Flags which can be toggled through sysfs | ||
+ | * are annotated below, note that only a few flags can be toggled and some | ||
+ | * other flags are always preserved from the original net_device flags | ||
+ | * even if you try to set them via sysfs. Flags which are always preserved | ||
+ | * are kept under the flag grouping @IFF_VOLATILE. Flags which are volatile | ||
+ | * are annotated below as such. | ||
+ | * | ||
+ | * You should have a pretty good reason to be extending these flags. | ||
+ | * | ||
+ | * @IFF_UP: interface is up. Can be toggled through sysfs. | ||
+ | * @IFF_BROADCAST: broadcast address valid. Volatile. | ||
+ | * @IFF_DEBUG: turn on debugging. Can be toggled through sysfs. | ||
+ | * @IFF_LOOPBACK: is a loopback net. Volatile. | ||
+ | * @IFF_POINTOPOINT: interface is has p-p link. Volatile. | ||
+ | * @IFF_NOTRAILERS: avoid use of trailers. Can be toggled through sysfs. | ||
+ | * Volatile. | ||
+ | * @IFF_RUNNING: interface RFC2863 OPER_UP. Volatile. | ||
+ | * @IFF_NOARP: no ARP protocol. Can be toggled through sysfs. Volatile. | ||
+ | * @IFF_PROMISC: receive all packets. Can be toggled through sysfs. | ||
+ | * @IFF_ALLMULTI: receive all multicast packets. Can be toggled through | ||
+ | * sysfs. | ||
+ | * @IFF_MASTER: master of a load balancer. Volatile. | ||
+ | * @IFF_SLAVE: slave of a load balancer. Volatile. | ||
+ | * @IFF_MULTICAST: Supports multicast. Can be toggled through sysfs. | ||
+ | * @IFF_PORTSEL: can set media type. Can be toggled through sysfs. | ||
+ | * @IFF_AUTOMEDIA: auto media select active. Can be toggled through sysfs. | ||
+ | * @IFF_DYNAMIC: dialup device with changing addresses. Can be toggled | ||
+ | * through sysfs. | ||
+ | * @IFF_LOWER_UP: driver signals L1 up. Volatile. | ||
+ | * @IFF_DORMANT: driver signals dormant. Volatile. | ||
+ | * @IFF_ECHO: echo sent packets. Volatile. | ||
+ | */ | ||
+ | |||
enum net_device_flags { | enum net_device_flags { | ||
/* for compatibility with glibc net/if.h */ | /* for compatibility with glibc net/if.h */ | ||
Line 65: | Line 112: | ||
===== Flags ===== | ===== Flags ===== | ||
+ | |||
+ | ==== Source ==== | ||
+ | |||
+ | ''ifconfig'' is getting hex value from ''SIOCGIFFLAGS'' which does ''dev_get_flags(dev)''. | ||
==== Up and running ==== | ==== Up and running ==== | ||
Line 93: | Line 144: | ||
RX errors 0 dropped 0 overruns 0 frame 0 | RX errors 0 dropped 0 overruns 0 frame 0 | ||
TX packets 36836 bytes 9042100 (8.6 MiB) | TX packets 36836 bytes 9042100 (8.6 MiB) | ||
+ | TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 | ||
+ | </code> | ||
+ | |||
+ | ==== Up again ==== | ||
+ | |||
+ | UP, shortly followed by RUNNING: | ||
+ | |||
+ | <code> | ||
+ | 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 1268514 bytes 1611028865 (1.5 GiB) | ||
+ | RX errors 0 dropped 0 overruns 0 frame 0 | ||
+ | TX packets 396222 bytes 65965632 (62.9 MiB) | ||
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 | TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 | ||
</code> | </code> | ||
Line 110: | Line 177: | ||
TX packets 36917 bytes 9052750 (8.6 MiB) | TX packets 36917 bytes 9052750 (8.6 MiB) | ||
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 | TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 | ||
+ | </code> | ||
+ | |||
+ | ===== dev_get_flags() ===== | ||
+ | |||
+ | ==== net/core/dev_ioctl.c ==== | ||
+ | |||
+ | This is how ''ifconfig'' gets its info -- via ''dev_get_flags()'' and ioctl command ''SIOCGIFFLAGS'': | ||
+ | |||
+ | <code> | ||
+ | /* | ||
+ | * 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; | ||
+ | </code> | ||
+ | |||
+ | ==== net/core/dev.c ==== | ||
+ | |||
+ | Volatile flags are supported via RFC2863 operstates. | ||
+ | |||
+ | <code> | ||
+ | /** | ||
+ | * dev_get_flags - get flags reported to userspace | ||
+ | * @dev: device | ||
+ | * | ||
+ | * Get the combination of flag bits exported through APIs to userspace. | ||
+ | */ | ||
+ | unsigned int dev_get_flags(const struct net_device *dev) | ||
+ | { | ||
+ | unsigned int flags; | ||
+ | |||
+ | flags = (dev->flags & ~(IFF_PROMISC | | ||
+ | IFF_ALLMULTI | | ||
+ | IFF_RUNNING | | ||
+ | IFF_LOWER_UP | | ||
+ | IFF_DORMANT)) | | ||
+ | (dev->gflags & (IFF_PROMISC | | ||
+ | IFF_ALLMULTI)); | ||
+ | |||
+ | if (netif_running(dev)) { | ||
+ | if (netif_oper_up(dev)) | ||
+ | flags |= IFF_RUNNING; | ||
+ | if (netif_carrier_ok(dev)) | ||
+ | flags |= IFF_LOWER_UP; | ||
+ | if (netif_dormant(dev)) | ||
+ | flags |= IFF_DORMANT; | ||
+ | } | ||
+ | |||
+ | return flags; | ||
+ | } | ||
+ | EXPORT_SYMBOL(dev_get_flags); | ||
</code> | </code> |