From: Yu Watanabe Date: Sun, 14 Nov 2021 09:36:42 +0000 (+0900) Subject: network: introduce link_flags_to_string_alloc() and kernel_operstate_to_string() X-Git-Tag: v250-rc1~143^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7ae55b78e69388c78ad57df6151091cea8654644;p=thirdparty%2Fsystemd.git network: introduce link_flags_to_string_alloc() and kernel_operstate_to_string() --- diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index a63b1704c1a..36ef6a0b5df 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -2670,3 +2670,53 @@ static const char* const link_state_table[_LINK_STATE_MAX] = { }; DEFINE_STRING_TABLE_LOOKUP(link_state, LinkState); + +int link_flags_to_string_alloc(uint32_t flags, char **ret) { + _cleanup_free_ char *str = NULL; + static const struct { + uint32_t flag; + const char *name; + } map[] = { + { IFF_UP, "up" }, /* interface is up. */ + { IFF_BROADCAST, "broadcast" }, /* broadcast address valid.*/ + { IFF_DEBUG, "debug" }, /* turn on debugging. */ + { IFF_LOOPBACK, "loopback" }, /* interface is a loopback net. */ + { IFF_POINTOPOINT, "point-to-point" }, /* interface has p-p link. */ + { IFF_NOTRAILERS, "no-trailers" }, /* avoid use of trailers. */ + { IFF_RUNNING, "running" }, /* interface RFC2863 OPER_UP. */ + { IFF_NOARP, "no-arp" }, /* no ARP protocol. */ + { IFF_PROMISC, "promiscuous" }, /* receive all packets. */ + { IFF_ALLMULTI, "all-multicast" }, /* receive all multicast packets. */ + { IFF_MASTER, "master" }, /* master of a load balancer. */ + { IFF_SLAVE, "slave" }, /* slave of a load balancer. */ + { IFF_MULTICAST, "multicast" }, /* supports multicast.*/ + { IFF_PORTSEL, "portsel" }, /* can set media type. */ + { IFF_AUTOMEDIA, "auto-media" }, /* auto media select active. */ + { IFF_DYNAMIC, "dynamic" }, /* dialup device with changing addresses. */ + { IFF_LOWER_UP, "lower-up" }, /* driver signals L1 up. */ + { IFF_DORMANT, "dormant" }, /* driver signals dormant. */ + { IFF_ECHO, "echo" }, /* echo sent packets. */ + }; + + assert(ret); + + for (size_t i = 0; i < ELEMENTSOF(map); i++) + if (flags & map[i].flag && + !strextend_with_separator(&str, ",", map[i].name)) + return -ENOMEM; + + *ret = TAKE_PTR(str); + return 0; +} + +static const char * const kernel_operstate_table[] = { + [IF_OPER_UNKNOWN] = "unknown", + [IF_OPER_NOTPRESENT] = "not-present", + [IF_OPER_DOWN] = "down", + [IF_OPER_LOWERLAYERDOWN] = "lower-layer-down", + [IF_OPER_TESTING] = "testing", + [IF_OPER_DORMANT] = "dormant", + [IF_OPER_UP] = "up", +}; + +DEFINE_STRING_TABLE_LOOKUP_TO_STRING(kernel_operstate, int); diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index edf93d720ef..cba911f02d9 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -226,3 +226,6 @@ int link_reconfigure_after_sleep(Link *link); int manager_udev_process_link(sd_device_monitor *monitor, sd_device *device, void *userdata); int manager_rtnl_process_link(sd_netlink *rtnl, sd_netlink_message *message, Manager *m); + +int link_flags_to_string_alloc(uint32_t flags, char **ret); +const char *kernel_operstate_to_string(int t) _const_;