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