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",
#include <linux/if_link.h>
#include <stdbool.h>
+#include "sd-netlink.h"
+
#include "conf-parser.h"
#include "macro.h"
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_;
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;
}
int link_request_to_set_addrgen_mode(Link *link) {
+ IPv6LinkLocalAddressGenMode mode;
Request *req;
- uint8_t mode;
int r;
assert(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)