network: introduce two helper functions for setting IPv6LL address generation mode

This commit is contained in:
Yu Watanabe
2022-02-08 22:16:38 +09:00
parent de2f372ea2
commit 80f2647dfb
3 changed files with 52 additions and 26 deletions

View File

@@ -74,6 +74,50 @@ bool link_may_have_ipv6ll(Link *link) {
return false;
}
IPv6LinkLocalAddressGenMode link_get_ipv6ll_addrgen_mode(Link *link) {
assert(link);
if (!link_ipv6ll_enabled(link))
return IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_NONE;
if (link->network->ipv6ll_address_gen_mode >= 0)
return link->network->ipv6ll_address_gen_mode;
if (in6_addr_is_set(&link->network->ipv6ll_stable_secret))
return IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_STABLE_PRIVACY;
return IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_EUI64;
}
int ipv6ll_addrgen_mode_fill_message(sd_netlink_message *message, IPv6LinkLocalAddressGenMode mode) {
int r;
assert(message);
assert(mode >= 0 && mode < _IPV6_LINK_LOCAL_ADDRESS_GEN_MODE_MAX);
r = sd_netlink_message_open_container(message, IFLA_AF_SPEC);
if (r < 0)
return r;
r = sd_netlink_message_open_container(message, AF_INET6);
if (r < 0)
return r;
r = sd_netlink_message_append_u8(message, IFLA_INET6_ADDR_GEN_MODE, mode);
if (r < 0)
return r;
r = sd_netlink_message_close_container(message);
if (r < 0)
return r;
r = sd_netlink_message_close_container(message);
if (r < 0)
return r;
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

@@ -5,6 +5,8 @@
#include <linux/if_link.h>
#include <stdbool.h>
#include "sd-netlink.h"
#include "conf-parser.h"
#include "macro.h"
@@ -22,6 +24,9 @@ typedef enum IPv6LinkLocalAddressGenMode {
bool link_ipv6ll_enabled(Link *link);
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);
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

@@ -228,23 +228,7 @@ static int link_configure_fill_message(
switch (op) {
case SET_LINK_ADDRESS_GENERATION_MODE:
r = sd_netlink_message_open_container(req, IFLA_AF_SPEC);
if (r < 0)
return r;
r = sd_netlink_message_open_container(req, AF_INET6);
if (r < 0)
return r;
r = sd_netlink_message_append_u8(req, IFLA_INET6_ADDR_GEN_MODE, PTR_TO_UINT8(userdata));
if (r < 0)
return r;
r = sd_netlink_message_close_container(req);
if (r < 0)
return r;
r = sd_netlink_message_close_container(req);
r = ipv6ll_addrgen_mode_fill_message(req, PTR_TO_UINT8(userdata));
if (r < 0)
return r;
break;
@@ -689,8 +673,8 @@ static int link_request_set_link(
}
int link_request_to_set_addrgen_mode(Link *link) {
IPv6LinkLocalAddressGenMode mode;
Request *req;
uint8_t mode;
int r;
assert(link);
@@ -699,14 +683,7 @@ int link_request_to_set_addrgen_mode(Link *link) {
if (!socket_ipv6_is_supported())
return 0;
if (!link_ipv6ll_enabled(link))
mode = IN6_ADDR_GEN_MODE_NONE;
else if (link->network->ipv6ll_address_gen_mode >= 0)
mode = link->network->ipv6ll_address_gen_mode;
else if (in6_addr_is_set(&link->network->ipv6ll_stable_secret))
mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY;
else
mode = IN6_ADDR_GEN_MODE_EUI64;
mode = link_get_ipv6ll_addrgen_mode(link);
r = link_request_set_link(link, SET_LINK_ADDRESS_GENERATION_MODE, link_set_addrgen_mode_handler, &req);
if (r < 0)