diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-09-25 04:12:31 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-10-07 01:24:50 +0900 |
commit | e609cd0694ed6fe23f165f6b32312c77432baa4d (patch) | |
tree | 4d8a6687cf0ec04de50c848fd52a0a7b7bc1e9ea /src/network/networkd-radv.c | |
parent | f5960e0ab5e4ffa985e8f08308ccadfcb4d4f748 (diff) | |
download | systemd-e609cd0694ed6fe23f165f6b32312c77432baa4d.tar.gz |
network: introduce Token= setting in [IPv6Prefix]
Closes #20149.
Diffstat (limited to 'src/network/networkd-radv.c')
-rw-r--r-- | src/network/networkd-radv.c | 69 |
1 files changed, 56 insertions, 13 deletions
diff --git a/src/network/networkd-radv.c b/src/network/networkd-radv.c index b9ba0ff9ba..34e6a41c34 100644 --- a/src/network/networkd-radv.c +++ b/src/network/networkd-radv.c @@ -69,6 +69,7 @@ Prefix *prefix_free(Prefix *prefix) { network_config_section_free(prefix->section); sd_radv_prefix_unref(prefix->radv_prefix); + set_free(prefix->tokens); return mfree(prefix); } @@ -204,8 +205,8 @@ int link_request_radv_addresses(Link *link) { return 0; HASHMAP_FOREACH(p, link->network->prefixes_by_section) { - _cleanup_(address_freep) Address *address = NULL; - struct in6_addr prefix; + _cleanup_set_free_ Set *addresses = NULL; + struct in6_addr prefix, *a; uint8_t prefixlen; if (!p->assign) @@ -215,7 +216,7 @@ int link_request_radv_addresses(Link *link) { if (r < 0) return r; - /* generate_eui64_address() below requires the prefix length <= 64. */ + /* radv_generate_addresses() below requires the prefix length <= 64. */ if (prefixlen > 64) { _cleanup_free_ char *str = NULL; @@ -226,20 +227,27 @@ int link_request_radv_addresses(Link *link) { continue; } - r = address_new(&address); + r = radv_generate_addresses(link, p->tokens, &prefix, prefixlen, &addresses); if (r < 0) - return log_oom(); + return r; - generate_eui64_address(link, &prefix, &address->in_addr.in6); + SET_FOREACH(a, addresses) { + _cleanup_(address_freep) Address *address = NULL; - address->source = NETWORK_CONFIG_SOURCE_STATIC; - address->family = AF_INET6; - address->prefixlen = prefixlen; - address->route_metric = p->route_metric; + r = address_new(&address); + if (r < 0) + return -ENOMEM; - r = link_request_static_address(link, TAKE_PTR(address), true); - if (r < 0) - return r; + address->source = NETWORK_CONFIG_SOURCE_STATIC; + address->family = AF_INET6; + address->in_addr.in6 = *a; + address->prefixlen = prefixlen; + address->route_metric = p->route_metric; + + r = link_request_static_address(link, TAKE_PTR(address), true); + if (r < 0) + return r; + } } return 0; @@ -875,6 +883,41 @@ int config_parse_prefix_metric( return 0; } +int config_parse_prefix_token( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + _cleanup_(prefix_free_or_set_invalidp) Prefix *p = NULL; + Network *network = userdata; + int r; + + assert(filename); + assert(section); + assert(lvalue); + assert(rvalue); + assert(userdata); + + r = prefix_new_static(network, filename, section_line, &p); + if (r < 0) + return log_oom(); + + r = config_parse_address_generation_type(unit, filename, line, section, section_line, + lvalue, ltype, rvalue, &p->tokens, userdata); + if (r < 0) + return r; + + TAKE_PTR(p); + return 0; +} + int config_parse_route_prefix( const char *unit, const char *filename, |