1
0
mirror of https://github.com/systemd/systemd.git synced 2024-11-01 00:51:24 +03:00

network: address-genereation: introduce generate_addresses()

Preparation for later commits. This does not change functionality.
This commit is contained in:
Yu Watanabe 2021-10-01 21:36:32 +09:00
parent d207581fc5
commit 868bd1aa1c
3 changed files with 18 additions and 6 deletions

View File

@ -150,13 +150,21 @@ static int generate_stable_private_address(
return 0;
}
int ndisc_router_generate_addresses(Link *link, struct in6_addr *prefix, uint8_t prefixlen, Set **ret) {
static int generate_addresses(
Link *link,
Set *tokens,
const sd_id128_t *app_id,
const struct in6_addr *prefix,
uint8_t prefixlen,
Set **ret) {
_cleanup_set_free_ Set *addresses = NULL;
struct in6_addr masked;
IPv6Token *j;
int r;
assert(link);
assert(app_id);
assert(prefix);
assert(prefixlen > 0 && prefixlen <= 64);
assert(ret);
@ -164,7 +172,7 @@ int ndisc_router_generate_addresses(Link *link, struct in6_addr *prefix, uint8_t
masked = *prefix;
in6_addr_mask(&masked, prefixlen);
SET_FOREACH(j, link->network->ndisc_tokens) {
SET_FOREACH(j, tokens) {
struct in6_addr addr, *copy;
switch (j->type) {
@ -177,7 +185,7 @@ int ndisc_router_generate_addresses(Link *link, struct in6_addr *prefix, uint8_t
if (in6_addr_is_set(&j->address) && !in6_addr_equal(&j->address, &masked))
continue;
if (generate_stable_private_address(link, &NDISC_APP_ID, &masked, &addr) < 0)
if (generate_stable_private_address(link, app_id, &masked, &addr) < 0)
continue;
break;
@ -214,6 +222,10 @@ int ndisc_router_generate_addresses(Link *link, struct in6_addr *prefix, uint8_t
return 0;
}
int ndisc_generate_addresses(Link *link, const struct in6_addr *prefix, uint8_t prefixlen, Set **ret) {
return generate_addresses(link, link->network->ndisc_tokens, &NDISC_APP_ID, prefix, prefixlen, ret);
}
static void ipv6_token_hash_func(const IPv6Token *p, struct siphash *state) {
siphash24_compress(&p->type, sizeof(p->type), state);
siphash24_compress(&p->address, sizeof(p->address), state);

View File

@ -9,6 +9,6 @@ typedef struct Link Link;
void generate_eui64_address(const Link *link, const struct in6_addr *prefix, struct in6_addr *ret);
int ndisc_router_generate_addresses(Link *link, struct in6_addr *address, uint8_t prefixlen, Set **ret);
int ndisc_generate_addresses(Link *link, const struct in6_addr *prefix, uint8_t prefixlen, Set **ret);
CONFIG_PARSER_PROTOTYPE(config_parse_address_generation_type);

View File

@ -404,7 +404,7 @@ static int ndisc_router_process_autonomous_prefix(Link *link, sd_ndisc_router *r
if (r < 0)
return log_link_error_errno(link, r, "Failed to get prefix length: %m");
/* ndisc_router_generate_addresses() below requires the prefix length <= 64. */
/* ndisc_generate_addresses() below requires the prefix length <= 64. */
if (prefixlen > 64) {
_cleanup_free_ char *buf = NULL;
@ -430,7 +430,7 @@ static int ndisc_router_process_autonomous_prefix(Link *link, sd_ndisc_router *r
if (lifetime_preferred > lifetime_valid)
return 0;
r = ndisc_router_generate_addresses(link, &prefix, prefixlen, &addresses);
r = ndisc_generate_addresses(link, &prefix, prefixlen, &addresses);
if (r < 0)
return log_link_error_errno(link, r, "Failed to generate SLAAC addresses: %m");