summaryrefslogtreecommitdiff
path: root/src/network/networkd-radv.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-09-25 04:12:31 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-10-07 01:24:50 +0900
commite609cd0694ed6fe23f165f6b32312c77432baa4d (patch)
tree4d8a6687cf0ec04de50c848fd52a0a7b7bc1e9ea /src/network/networkd-radv.c
parentf5960e0ab5e4ffa985e8f08308ccadfcb4d4f748 (diff)
downloadsystemd-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.c69
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,