From: Yu Watanabe Date: Tue, 8 Feb 2022 13:26:23 +0000 (+0900) Subject: network: monitor current IPv6LL address generation mode X-Git-Tag: v251-rc1~315^2~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7d0d832d67e62c4129ea7e65a1aa0597ca3309f4;p=thirdparty%2Fsystemd.git network: monitor current IPv6LL address generation mode --- diff --git a/src/network/networkd-ipv6ll.c b/src/network/networkd-ipv6ll.c index 0ff28761f2a..1db0856bc4a 100644 --- a/src/network/networkd-ipv6ll.c +++ b/src/network/networkd-ipv6ll.c @@ -118,6 +118,65 @@ int ipv6ll_addrgen_mode_fill_message(sd_netlink_message *message, IPv6LinkLocalA return 0; } +int link_update_ipv6ll_addrgen_mode(Link *link, sd_netlink_message *message) { + uint8_t mode; + int family, r; + + assert(link); + assert(message); + + r = sd_rtnl_message_get_family(message, &family); + if (r < 0) + return r; + + if (family != AF_UNSPEC) + return 0; + + r = sd_netlink_message_enter_container(message, IFLA_AF_SPEC); + if (r == -ENODATA) + return 0; + if (r < 0) + return r; + + r = sd_netlink_message_enter_container(message, AF_INET6); + if (r == -ENODATA) + return sd_netlink_message_exit_container(message); + if (r < 0) + return r; + + mode = (uint8_t) link->ipv6ll_address_gen_mode; + r = sd_netlink_message_read_u8(message, IFLA_INET6_ADDR_GEN_MODE, &mode); + if (r < 0 && r != -ENODATA) + return r; + + r = sd_netlink_message_exit_container(message); + if (r < 0) + return r; + + r = sd_netlink_message_exit_container(message); + if (r < 0) + return r; + + if (mode == (uint8_t) link->ipv6ll_address_gen_mode) + return 0; + + if (mode >= _IPV6_LINK_LOCAL_ADDRESS_GEN_MODE_MAX) { + log_link_debug(link, "Received invalid IPv6 link-local address generation mode (%u), ignoring.", mode); + return 0; + } + + if (link->ipv6ll_address_gen_mode < 0) + log_link_debug(link, "Saved IPv6 link-local address generation mode: %s", + ipv6_link_local_address_gen_mode_to_string(mode)); + else + log_link_debug(link, "IPv6 link-local address generation mode is changed: %s -> %s", + ipv6_link_local_address_gen_mode_to_string(link->ipv6ll_address_gen_mode), + ipv6_link_local_address_gen_mode_to_string(mode)); + + link->ipv6ll_address_gen_mode = mode; + return 0; +} + static const char* const ipv6_link_local_address_gen_mode_table[_IPV6_LINK_LOCAL_ADDRESS_GEN_MODE_MAX] = { [IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_EUI64] = "eui64", [IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_NONE] = "none", diff --git a/src/network/networkd-ipv6ll.h b/src/network/networkd-ipv6ll.h index 4f63c71fb5f..9de9a75d898 100644 --- a/src/network/networkd-ipv6ll.h +++ b/src/network/networkd-ipv6ll.h @@ -26,6 +26,7 @@ bool link_may_have_ipv6ll(Link *link); IPv6LinkLocalAddressGenMode link_get_ipv6ll_addrgen_mode(Link *link); int ipv6ll_addrgen_mode_fill_message(sd_netlink_message *message, IPv6LinkLocalAddressGenMode mode); +int link_update_ipv6ll_addrgen_mode(Link *link, sd_netlink_message *message); const char* ipv6_link_local_address_gen_mode_to_string(IPv6LinkLocalAddressGenMode s) _const_; IPv6LinkLocalAddressGenMode ipv6_link_local_address_gen_mode_from_string(const char *s) _pure_; diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 5f5f413fff5..5a4b0b5a559 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -2318,6 +2318,10 @@ static int link_update(Link *link, sd_netlink_message *message) { if (r < 0) return r; + r = link_update_ipv6ll_addrgen_mode(link, message); + if (r < 0) + return r; + return link_update_flags(link, message); } @@ -2391,6 +2395,8 @@ static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) { .ifname = TAKE_PTR(ifname), .kind = TAKE_PTR(kind), + .ipv6ll_address_gen_mode = _IPV6_LINK_LOCAL_ADDRESS_GEN_MODE_INVALID, + .state_file = TAKE_PTR(state_file), .lease_file = TAKE_PTR(lease_file), .lldp_file = TAKE_PTR(lldp_file), diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index 8b3f1096571..47e8538d701 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -68,6 +68,9 @@ typedef struct Link { sd_device *sd_device; char *driver; + /* link local addressing */ + IPv6LinkLocalAddressGenMode ipv6ll_address_gen_mode; + /* wlan */ enum nl80211_iftype wlan_iftype; char *ssid;