network: monitor current IPv6LL address generation mode

This commit is contained in:
Yu Watanabe
2022-02-08 22:26:23 +09:00
parent 80f2647dfb
commit 7d0d832d67
4 changed files with 69 additions and 0 deletions

View File

@@ -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",

View File

@@ -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_;

View File

@@ -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),

View File

@@ -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;