mirror of
https://github.com/systemd/systemd.git
synced 2026-08-02 22:20:20 +00:00
network: monitor current IPv6LL address generation mode
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user