1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-26 03:22:00 +03:00

network: use IPV4_ADDRESS_FMT_STR/VAL macros and in6_addr_to_string() or friends

This commit is contained in:
Yu Watanabe 2021-05-06 17:15:01 +09:00
parent 280323984b
commit b8ce3b4490
5 changed files with 121 additions and 128 deletions

View File

@ -1304,7 +1304,6 @@ int manager_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message,
}
static void static_address_on_acd(sd_ipv4acd *acd, int event, void *userdata) {
_cleanup_free_ char *pretty = NULL;
Address *address;
Link *link;
int r;
@ -1315,22 +1314,26 @@ static void static_address_on_acd(sd_ipv4acd *acd, int event, void *userdata) {
address = (Address *) userdata;
link = address->link;
(void) in_addr_to_string(address->family, &address->in_addr, &pretty);
assert(address->family == AF_INET);
switch (event) {
case SD_IPV4ACD_EVENT_STOP:
log_link_debug(link, "Stopping ACD client...");
return;
case SD_IPV4ACD_EVENT_BIND:
log_link_debug(link, "Successfully claimed address %s", strna(pretty));
log_link_debug(link, "Successfully claimed address "IPV4_ADDRESS_FMT_STR,
IPV4_ADDRESS_FMT_VAL(address->in_addr.in));
link_check_ready(link);
break;
case SD_IPV4ACD_EVENT_CONFLICT:
log_link_warning(link, "DAD conflict. Dropping address %s", strna(pretty));
log_link_warning(link, "DAD conflict. Dropping address "IPV4_ADDRESS_FMT_STR,
IPV4_ADDRESS_FMT_VAL(address->in_addr.in));
r = address_remove(address, link, NULL);
if (r < 0)
log_link_error_errno(link, r, "Failed to drop DAD conflicted address %s", strna(pretty));;
log_link_error_errno(link, r, "Failed to drop DAD conflicted address "IPV4_ADDRESS_FMT_STR,
IPV4_ADDRESS_FMT_VAL(address->in_addr.in));
link_check_ready(link);
break;
@ -1353,12 +1356,7 @@ static int ipv4_dad_configure(Address *address) {
if (address->family != AF_INET)
return 0;
if (DEBUG_LOGGING) {
_cleanup_free_ char *pretty = NULL;
(void) in_addr_to_string(address->family, &address->in_addr, &pretty);
log_link_debug(address->link, "Starting IPv4ACD client. Probing address %s", strna(pretty));
}
log_address_debug(address, "Starting IPv4ACD client. Probing", address->link);
if (!address->acd) {
r = sd_ipv4acd_new(&address->acd);

View File

@ -783,8 +783,7 @@ static int dhcp_lease_lost(Link *link) {
}
static void dhcp_address_on_acd(sd_ipv4acd *acd, int event, void *userdata) {
_cleanup_free_ char *pretty = NULL;
union in_addr_union address = {};
struct in_addr address;
Link *link;
int r;
@ -795,23 +794,21 @@ static void dhcp_address_on_acd(sd_ipv4acd *acd, int event, void *userdata) {
switch (event) {
case SD_IPV4ACD_EVENT_STOP:
log_link_debug(link, "Stopping ACD client for DHCP4...");
log_link_debug(link, "Stopping ACD client for DHCPv4 address.");
return;
case SD_IPV4ACD_EVENT_BIND:
if (DEBUG_LOGGING) {
(void) sd_dhcp_lease_get_address(link->dhcp_lease, &address.in);
(void) in_addr_to_string(AF_INET, &address, &pretty);
log_link_debug(link, "Successfully claimed DHCP4 address %s", strna(pretty));
(void) sd_dhcp_lease_get_address(link->dhcp_lease, &address);
log_link_debug(link, "Successfully claimed DHCPv4 address "IPV4_ADDRESS_FMT_STR, IPV4_ADDRESS_FMT_VAL(address));
}
link->dhcp4_address_bind = true;
dhcp4_check_ready(link);
break;
case SD_IPV4ACD_EVENT_CONFLICT:
(void) sd_dhcp_lease_get_address(link->dhcp_lease, &address.in);
(void) in_addr_to_string(AF_INET, &address, &pretty);
log_link_warning(link, "DAD conflict. Dropping DHCP4 address %s", strna(pretty));
(void) sd_dhcp_lease_get_address(link->dhcp_lease, &address);
log_link_warning(link, "DAD conflict. Dropping DHCPv4 address "IPV4_ADDRESS_FMT_STR, IPV4_ADDRESS_FMT_VAL(address));
r = sd_dhcp_client_send_decline(link->dhcp_client);
if (r < 0)
@ -893,8 +890,7 @@ static int dhcp4_dad_update_mac(Link *link) {
}
static int dhcp4_start_acd(Link *link) {
union in_addr_union addr;
struct in_addr old;
struct in_addr addr, old;
int r;
if (!link->network->dhcp_send_decline)
@ -907,7 +903,7 @@ static int dhcp4_start_acd(Link *link) {
link->dhcp4_address_bind = false;
r = sd_dhcp_lease_get_address(link->dhcp_lease, &addr.in);
r = sd_dhcp_lease_get_address(link->dhcp_lease, &addr);
if (r < 0)
return r;
@ -915,7 +911,7 @@ static int dhcp4_start_acd(Link *link) {
if (r < 0)
return r;
r = sd_ipv4acd_set_address(link->dhcp_acd, &addr.in);
r = sd_ipv4acd_set_address(link->dhcp_acd, &addr);
if (r < 0)
return r;
@ -923,18 +919,10 @@ static int dhcp4_start_acd(Link *link) {
if (r < 0)
return r;
if (DEBUG_LOGGING) {
_cleanup_free_ char *pretty = NULL;
log_link_debug(link, "Starting IPv4ACD client. Probing DHCPv4 address "IPV4_ADDRESS_FMT_STR,
IPV4_ADDRESS_FMT_VAL(addr));
(void) in_addr_to_string(AF_INET, &addr, &pretty);
log_link_debug(link, "Starting IPv4ACD client. Probing DHCPv4 address %s", strna(pretty));
}
r = sd_ipv4acd_start(link->dhcp_acd, !in4_addr_equal(&addr.in, &old));
if (r < 0)
return r;
return 1;
return sd_ipv4acd_start(link->dhcp_acd, !in4_addr_equal(&addr, &old));
}
static int dhcp4_address_ready_callback(Address *address) {

View File

@ -43,7 +43,7 @@ bool link_dhcp6_pd_is_enabled(Link *link) {
static bool dhcp6_lease_has_pd_prefix(sd_dhcp6_lease *lease) {
uint32_t lifetime_preferred, lifetime_valid;
union in_addr_union pd_prefix;
struct in6_addr pd_prefix;
uint8_t pd_prefix_len;
if (!lease)
@ -51,7 +51,7 @@ static bool dhcp6_lease_has_pd_prefix(sd_dhcp6_lease *lease) {
sd_dhcp6_lease_reset_pd_prefix_iter(lease);
return sd_dhcp6_lease_get_pd(lease, &pd_prefix.in6, &pd_prefix_len, &lifetime_preferred, &lifetime_valid) >= 0;
return sd_dhcp6_lease_get_pd(lease, &pd_prefix, &pd_prefix_len, &lifetime_preferred, &lifetime_valid) >= 0;
}
DHCP6DelegatedPrefix *dhcp6_pd_free(DHCP6DelegatedPrefix *p) {
@ -86,21 +86,21 @@ static int dhcp6_pd_compare_func(const DHCP6DelegatedPrefix *a, const DHCP6Deleg
DEFINE_HASH_OPS(dhcp6_pd_hash_ops, DHCP6DelegatedPrefix, dhcp6_pd_hash_func, dhcp6_pd_compare_func);
static Link *dhcp6_pd_get_link_by_prefix(Link *link, const union in_addr_union *prefix) {
static Link *dhcp6_pd_get_link_by_prefix(Link *link, const struct in6_addr *prefix) {
DHCP6DelegatedPrefix *pd;
assert(link);
assert(link->manager);
assert(prefix);
pd = hashmap_get(link->manager->dhcp6_prefixes, &prefix->in6);
pd = hashmap_get(link->manager->dhcp6_prefixes, prefix);
if (!pd)
return NULL;
return pd->link;
}
static int dhcp6_pd_get_assigned_prefix(Link *link, const union in_addr_union *pd_prefix, union in_addr_union *ret_prefix) {
static int dhcp6_pd_get_assigned_prefix(Link *link, const struct in6_addr *pd_prefix, struct in6_addr *ret_prefix) {
DHCP6DelegatedPrefix *pd, in;
assert(link);
@ -109,7 +109,7 @@ static int dhcp6_pd_get_assigned_prefix(Link *link, const union in_addr_union *p
assert(ret_prefix);
in = (DHCP6DelegatedPrefix) {
.pd_prefix = pd_prefix->in6,
.pd_prefix = *pd_prefix,
.link = link,
};
@ -117,7 +117,7 @@ static int dhcp6_pd_get_assigned_prefix(Link *link, const union in_addr_union *p
if (!pd)
return -ENOENT;
ret_prefix->in6 = pd->prefix;
*ret_prefix = pd->prefix;
return 0;
}
@ -264,7 +264,7 @@ static int dhcp6_pd_route_handler(sd_netlink *nl, sd_netlink_message *m, Link *l
return 1;
}
static int dhcp6_set_pd_route(Link *link, const union in_addr_union *prefix, const union in_addr_union *pd_prefix) {
static int dhcp6_set_pd_route(Link *link, const struct in6_addr *prefix, const struct in6_addr *pd_prefix) {
_cleanup_(dhcp6_pd_freep) DHCP6DelegatedPrefix *pd = NULL;
_cleanup_(route_freep) Route *route = NULL;
Link *assigned_link;
@ -281,7 +281,7 @@ static int dhcp6_set_pd_route(Link *link, const union in_addr_union *prefix, con
return r;
route->family = AF_INET6;
route->dst = *prefix;
route->dst.in6 = *prefix;
route->dst_prefixlen = 64;
route->protocol = RTPROT_DHCP;
route->priority = link->network->dhcp6_pd_route_metric;
@ -311,8 +311,8 @@ static int dhcp6_set_pd_route(Link *link, const union in_addr_union *prefix, con
return log_oom();
*pd = (DHCP6DelegatedPrefix) {
.prefix = prefix->in6,
.pd_prefix = pd_prefix->in6,
.prefix = *prefix,
.pd_prefix = *pd_prefix,
.link = link_ref(link),
};
@ -370,12 +370,15 @@ static void log_dhcp6_pd_address(Link *link, const Address *address) {
_cleanup_free_ char *buffer = NULL;
int log_level;
assert(address);
assert(address->family == AF_INET6);
log_level = address_get(link, address, NULL) >= 0 ? LOG_DEBUG : LOG_INFO;
if (log_level < log_get_max_level())
return;
(void) in_addr_prefix_to_string(address->family, &address->in_addr, address->prefixlen, &buffer);
(void) in6_addr_prefix_to_string(&address->in_addr.in6, address->prefixlen, &buffer);
if (address->cinfo.ifa_valid != CACHE_INFO_INFINITY_LIFE_TIME)
valid_str = format_timespan(valid_buf, FORMAT_TIMESPAN_MAX,
address->cinfo.ifa_valid * USEC_PER_SEC,
@ -393,7 +396,7 @@ static void log_dhcp6_pd_address(Link *link, const Address *address) {
static int dhcp6_set_pd_address(
Link *link,
const union in_addr_union *prefix,
const struct in6_addr *prefix,
uint32_t lifetime_preferred,
uint32_t lifetime_valid) {
@ -412,10 +415,10 @@ static int dhcp6_set_pd_address(
if (r < 0)
return log_link_error_errno(link, r, "Failed to allocate address for DHCPv6 delegated prefix: %m");
address->in_addr = *prefix;
address->in_addr.in6 = *prefix;
if (in_addr_is_set(AF_INET6, &link->network->dhcp6_pd_token))
memcpy(address->in_addr.in6.s6_addr + 8, link->network->dhcp6_pd_token.in6.s6_addr + 8, 8);
if (in6_addr_is_set(&link->network->dhcp6_pd_token))
memcpy(address->in_addr.in6.s6_addr + 8, link->network->dhcp6_pd_token.s6_addr + 8, 8);
else {
r = generate_ipv6_eui_64_address(link, &address->in_addr.in6);
if (r < 0)
@ -449,8 +452,8 @@ static int dhcp6_set_pd_address(
static int dhcp6_pd_assign_prefix(
Link *link,
const union in_addr_union *prefix,
const union in_addr_union *pd_prefix,
const struct in6_addr *prefix,
const struct in6_addr *pd_prefix,
uint32_t lifetime_preferred,
uint32_t lifetime_valid) {
@ -461,7 +464,7 @@ static int dhcp6_pd_assign_prefix(
assert(prefix);
if (link->network->dhcp6_pd_announce) {
r = radv_add_prefix(link, &prefix->in6, 64, lifetime_preferred, lifetime_valid);
r = radv_add_prefix(link, prefix, 64, lifetime_preferred, lifetime_valid);
if (r < 0)
return r;
}
@ -486,9 +489,9 @@ static bool link_has_preferred_subnet_id(Link *link) {
static int dhcp6_get_preferred_delegated_prefix(
Link *link,
const union in_addr_union *masked_pd_prefix,
const struct in6_addr *masked_pd_prefix,
uint8_t pd_prefix_len,
union in_addr_union *ret) {
struct in6_addr *ret) {
/* We start off with the original PD prefix we have been assigned and iterate from there */
union in_addr_union prefix;
@ -502,7 +505,7 @@ static int dhcp6_get_preferred_delegated_prefix(
assert(pd_prefix_len <= 64);
n_prefixes = UINT64_C(1) << (64 - pd_prefix_len);
prefix = *masked_pd_prefix;
prefix.in6 = *masked_pd_prefix;
if (link_has_preferred_subnet_id(link)) {
uint64_t subnet_id = link->network->dhcp6_pd_subnet_id;
@ -521,28 +524,28 @@ static int dhcp6_get_preferred_delegated_prefix(
/* Verify that the prefix we did calculate fits in the pd prefix.
* This should not fail as we checked the prefix size beforehand */
assert_se(in_addr_prefix_covers(AF_INET6, masked_pd_prefix, pd_prefix_len, &prefix) > 0);
assert_se(in_addr_prefix_covers(AF_INET6, (const union in_addr_union*) masked_pd_prefix, pd_prefix_len, &prefix) > 0);
assigned_link = dhcp6_pd_get_link_by_prefix(link, &prefix);
assigned_link = dhcp6_pd_get_link_by_prefix(link, &prefix.in6);
if (assigned_link && assigned_link != link) {
_cleanup_free_ char *assigned_buf = NULL;
(void) in_addr_to_string(AF_INET6, &prefix, &assigned_buf);
(void) in6_addr_to_string(&prefix.in6, &assigned_buf);
return log_link_warning_errno(link, SYNTHETIC_ERRNO(EAGAIN),
"The requested prefix %s is already assigned to another link.",
strna(assigned_buf));
}
*ret = prefix;
*ret = prefix.in6;
return 0;
}
for (uint64_t n = 0; n < n_prefixes; n++) {
/* If we do not have an allocation preference just iterate
* through the address space and return the first free prefix. */
assigned_link = dhcp6_pd_get_link_by_prefix(link, &prefix);
assigned_link = dhcp6_pd_get_link_by_prefix(link, &prefix.in6);
if (!assigned_link || assigned_link == link) {
*ret = prefix;
*ret = prefix.in6;
return 0;
}
@ -555,7 +558,7 @@ static int dhcp6_get_preferred_delegated_prefix(
}
static void dhcp6_pd_prefix_distribute(Link *dhcp6_link,
const union in_addr_union *masked_pd_prefix,
const struct in6_addr *masked_pd_prefix,
uint8_t pd_prefix_len,
uint32_t lifetime_preferred,
uint32_t lifetime_valid,
@ -571,7 +574,7 @@ static void dhcp6_pd_prefix_distribute(Link *dhcp6_link,
HASHMAP_FOREACH(link, dhcp6_link->manager->links) {
_cleanup_free_ char *assigned_buf = NULL;
union in_addr_union assigned_prefix;
struct in6_addr assigned_prefix;
if (link == dhcp6_link)
continue;
@ -594,7 +597,7 @@ static void dhcp6_pd_prefix_distribute(Link *dhcp6_link,
}
}
(void) in_addr_to_string(AF_INET6, &assigned_prefix, &assigned_buf);
(void) in6_addr_to_string(&assigned_prefix, &assigned_buf);
r = dhcp6_pd_assign_prefix(link, &assigned_prefix, masked_pd_prefix,
lifetime_preferred, lifetime_valid);
if (r < 0) {
@ -815,7 +818,7 @@ static int dhcp6_route_handler(sd_netlink *nl, sd_netlink_message *m, Link *link
return 1;
}
static int dhcp6_set_unreachable_route(Link *link, const union in_addr_union *addr, uint8_t prefixlen) {
static int dhcp6_set_unreachable_route(Link *link, const struct in6_addr *addr, uint8_t prefixlen) {
_cleanup_(route_freep) Route *route = NULL;
_cleanup_free_ char *buf = NULL;
Route *ret;
@ -824,7 +827,7 @@ static int dhcp6_set_unreachable_route(Link *link, const union in_addr_union *ad
assert(link);
assert(addr);
(void) in_addr_prefix_to_string(AF_INET6, addr, prefixlen, &buf);
(void) in6_addr_prefix_to_string(addr, prefixlen, &buf);
if (prefixlen == 64) {
log_link_debug(link, "Not adding a blocking route for DHCPv6 delegated subnet %s since distributed prefix is 64",
@ -837,7 +840,7 @@ static int dhcp6_set_unreachable_route(Link *link, const union in_addr_union *ad
return log_oom();
route->family = AF_INET6;
route->dst = *addr;
route->dst.in6 = *addr;
route->dst_prefixlen = prefixlen;
route->table = link_get_dhcp_route_table(link);
route->type = RTN_UNREACHABLE;
@ -862,7 +865,7 @@ static int dhcp6_set_unreachable_route(Link *link, const union in_addr_union *ad
return 0;
}
static int dhcp6_pd_prefix_add(Link *link, const union in_addr_union *prefix, uint8_t prefixlen) {
static int dhcp6_pd_prefix_add(Link *link, const struct in6_addr *prefix, uint8_t prefixlen) {
_cleanup_free_ struct in_addr_prefix *p = NULL;
_cleanup_free_ char *buf = NULL;
int r;
@ -877,10 +880,10 @@ static int dhcp6_pd_prefix_add(Link *link, const union in_addr_union *prefix, ui
*p = (struct in_addr_prefix) {
.family = AF_INET6,
.prefixlen = prefixlen,
.address = *prefix,
.address.in6 = *prefix,
};
(void) in_addr_prefix_to_string(p->family, &p->address, p->prefixlen, &buf);
(void) in6_addr_prefix_to_string(prefix, prefixlen, &buf);
log_link_full(link,
set_contains(link->dhcp6_pd_prefixes, p) ? LOG_DEBUG :
@ -918,10 +921,11 @@ static int dhcp6_pd_prefix_acquired(Link *dhcp6_link) {
for (sd_dhcp6_lease_reset_pd_prefix_iter(dhcp6_link->dhcp6_lease);;) {
uint32_t lifetime_preferred, lifetime_valid;
union in_addr_union pd_prefix, prefix;
struct in6_addr pd_prefix;
union in_addr_union prefix;
uint8_t pd_prefix_len;
r = sd_dhcp6_lease_get_pd(dhcp6_link->dhcp6_lease, &pd_prefix.in6, &pd_prefix_len,
r = sd_dhcp6_lease_get_pd(dhcp6_link->dhcp6_lease, &pd_prefix, &pd_prefix_len,
&lifetime_preferred, &lifetime_valid);
if (r < 0)
break;
@ -947,7 +951,7 @@ static int dhcp6_pd_prefix_acquired(Link *dhcp6_link) {
assert(pd_prefix_len <= 64);
prefix = pd_prefix;
prefix.in6 = pd_prefix;
r = in_addr_mask(AF_INET6, &prefix, pd_prefix_len);
if (r < 0)
return log_link_error_errno(dhcp6_link, r, "Failed to mask DHCPv6 PD prefix: %m");
@ -956,20 +960,20 @@ static int dhcp6_pd_prefix_acquired(Link *dhcp6_link) {
uint64_t n_prefixes = UINT64_C(1) << (64 - pd_prefix_len);
_cleanup_free_ char *buf = NULL;
(void) in_addr_prefix_to_string(AF_INET6, &prefix, pd_prefix_len, &buf);
(void) in6_addr_prefix_to_string(&prefix.in6, pd_prefix_len, &buf);
log_link_debug(dhcp6_link, "Assigning up to %" PRIu64 " prefixes from %s",
n_prefixes, strna(buf));
}
dhcp6_pd_prefix_distribute(dhcp6_link,
&prefix,
&prefix.in6,
pd_prefix_len,
lifetime_preferred,
lifetime_valid,
true);
dhcp6_pd_prefix_distribute(dhcp6_link,
&prefix,
&prefix.in6,
pd_prefix_len,
lifetime_preferred,
lifetime_valid,
@ -1032,8 +1036,9 @@ static void log_dhcp6_address(Link *link, const Address *address, char **ret) {
assert(link);
assert(address);
assert(address->family == AF_INET6);
(void) in_addr_prefix_to_string(address->family, &address->in_addr, address->prefixlen, &buffer);
(void) in6_addr_prefix_to_string(&address->in_addr.in6, address->prefixlen, &buffer);
if (address->cinfo.ifa_valid != CACHE_INFO_INFINITY_LIFE_TIME)
valid_str = format_timespan(valid_buf, FORMAT_TIMESPAN_MAX,
address->cinfo.ifa_valid * USEC_PER_SEC,
@ -1849,7 +1854,8 @@ int config_parse_dhcp6_pd_token(
void *data,
void *userdata) {
union in_addr_union *addr = data, tmp;
struct in6_addr *addr = data;
union in_addr_union tmp;
int r;
assert(filename);
@ -1858,7 +1864,7 @@ int config_parse_dhcp6_pd_token(
assert(data);
if (isempty(rvalue)) {
*addr = IN_ADDR_NULL;
*addr = (struct in6_addr) {};
return 0;
}
@ -1875,7 +1881,7 @@ int config_parse_dhcp6_pd_token(
return 0;
}
*addr = tmp;
*addr = tmp.in6;
return 0;
}

View File

@ -89,6 +89,7 @@ static int ndisc_address_callback(Address *address) {
assert(address);
assert(address->link);
assert(address->family == AF_INET6);
SET_FOREACH(n, address->link->ndisc_addresses)
if (n->address == address) {
@ -99,7 +100,7 @@ static int ndisc_address_callback(Address *address) {
if (in6_addr_is_null(&router)) {
_cleanup_free_ char *buf = NULL;
(void) in_addr_prefix_to_string(address->family, &address->in_addr, address->prefixlen, &buf);
(void) in6_addr_prefix_to_string(&address->in_addr.in6, address->prefixlen, &buf);
log_link_debug(address->link, "%s is called for %s, but it is already removed, ignoring.",
__func__, strna(buf));
return 0;
@ -107,7 +108,7 @@ static int ndisc_address_callback(Address *address) {
/* Make this called only once */
SET_FOREACH(n, address->link->ndisc_addresses)
if (IN6_ARE_ADDR_EQUAL(&n->router, &router))
if (in6_addr_equal(&n->router, &router))
n->address->callback = NULL;
return ndisc_remove_old_one(address->link, &router, true);
@ -131,7 +132,7 @@ static int ndisc_remove_old_one(Link *link, const struct in6_addr *router, bool
return 0;
SET_FOREACH(na, link->ndisc_addresses)
if (!na->marked && IN6_ARE_ADDR_EQUAL(&na->router, router)) {
if (!na->marked && in6_addr_equal(&na->router, router)) {
set_callback = true;
break;
}
@ -145,13 +146,13 @@ static int ndisc_remove_old_one(Link *link, const struct in6_addr *router, bool
if (set_callback) {
SET_FOREACH(na, link->ndisc_addresses)
if (!na->marked && IN6_ARE_ADDR_EQUAL(&na->router, router))
if (!na->marked && in6_addr_equal(&na->router, router))
na->address->callback = ndisc_address_callback;
if (DEBUG_LOGGING) {
_cleanup_free_ char *buf = NULL;
(void) in_addr_to_string(AF_INET6, (const union in_addr_union*) router, &buf);
(void) in6_addr_to_string(router, &buf);
log_link_debug(link, "No SLAAC address obtained from %s is ready. "
"The old NDisc information will be removed later.",
strna(buf));
@ -163,32 +164,32 @@ static int ndisc_remove_old_one(Link *link, const struct in6_addr *router, bool
if (DEBUG_LOGGING) {
_cleanup_free_ char *buf = NULL;
(void) in_addr_to_string(AF_INET6, (const union in_addr_union*) router, &buf);
(void) in6_addr_to_string(router, &buf);
log_link_debug(link, "Removing old NDisc information obtained from %s.", strna(buf));
}
SET_FOREACH(na, link->ndisc_addresses)
if (na->marked && IN6_ARE_ADDR_EQUAL(&na->router, router)) {
if (na->marked && in6_addr_equal(&na->router, router)) {
k = address_remove(na->address, link, NULL);
if (k < 0)
r = k;
}
SET_FOREACH(nr, link->ndisc_routes)
if (nr->marked && IN6_ARE_ADDR_EQUAL(&nr->router, router)) {
if (nr->marked && in6_addr_equal(&nr->router, router)) {
k = route_remove(nr->route, NULL, link, NULL);
if (k < 0)
r = k;
}
SET_FOREACH(rdnss, link->ndisc_rdnss)
if (rdnss->marked && IN6_ARE_ADDR_EQUAL(&rdnss->router, router)) {
if (rdnss->marked && in6_addr_equal(&rdnss->router, router)) {
free(set_remove(link->ndisc_rdnss, rdnss));
updated = true;
}
SET_FOREACH(dnssl, link->ndisc_dnssl)
if (dnssl->marked && IN6_ARE_ADDR_EQUAL(&dnssl->router, router)) {
if (dnssl->marked && in6_addr_equal(&dnssl->router, router)) {
free(set_remove(link->ndisc_dnssl, dnssl));
updated = true;
}
@ -476,7 +477,7 @@ static int ndisc_address_configure(Address *address, Link *link, sd_ndisc_router
static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
_cleanup_(route_freep) Route *route = NULL;
union in_addr_union gateway;
struct in6_addr gateway;
uint16_t lifetime;
unsigned preference;
uint32_t table, mtu;
@ -493,17 +494,17 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
if (lifetime == 0) /* not a default router */
return 0;
r = sd_ndisc_router_get_address(rt, &gateway.in6);
r = sd_ndisc_router_get_address(rt, &gateway);
if (r < 0)
return log_link_error_errno(link, r, "Failed to get gateway address from RA: %m");
if (link_has_ipv6_address(link, &gateway.in6) > 0) {
if (link_has_ipv6_address(link, &gateway) > 0) {
if (DEBUG_LOGGING) {
_cleanup_free_ char *buffer = NULL;
(void) in_addr_to_string(AF_INET6, &gateway, &buffer);
(void) in6_addr_to_string(&gateway, &buffer);
log_link_debug(link, "No NDisc route added, gateway %s matches local address",
strnull(buffer));
strna(buffer));
}
return 0;
}
@ -534,7 +535,7 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
route->protocol = RTPROT_RA;
route->pref = preference;
route->gw_family = AF_INET6;
route->gw = gateway;
route->gw.in6 = gateway;
route->lifetime = usec_add(time_now, lifetime * USEC_PER_SEC);
route->mtu = mtu;
@ -550,7 +551,7 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
if (route_gw->gw_family != AF_INET6)
continue;
route_gw->gw = gateway;
route_gw->gw.in6 = gateway;
if (!route_gw->table_set)
route_gw->table = table;
if (!route_gw->priority_set)
@ -650,7 +651,7 @@ static int ndisc_router_generate_addresses(Link *link, struct in6_addr *address,
_cleanup_free_ struct in6_addr *new_address = NULL;
if (j->address_generation_type == IPV6_TOKEN_ADDRESS_GENERATION_PREFIXSTABLE
&& (in6_addr_is_null(&j->prefix) || IN6_ARE_ADDR_EQUAL(&j->prefix, address))) {
&& (in6_addr_is_null(&j->prefix) || in6_addr_equal(&j->prefix, address))) {
/* While this loop uses dad_counter and a retry limit as specified in RFC 7217, the loop
* does not actually attempt Duplicate Address Detection; the counter will be incremented
* only when the address generation algorithm produces an invalid address, and the loop
@ -833,7 +834,7 @@ static int ndisc_router_process_onlink_prefix(Link *link, sd_ndisc_router *rt) {
static int ndisc_router_process_route(Link *link, sd_ndisc_router *rt) {
_cleanup_(route_freep) Route *route = NULL;
union in_addr_union gateway, dst;
struct in6_addr gateway, dst;
uint32_t lifetime;
unsigned preference, prefixlen;
usec_t time_now;
@ -848,35 +849,35 @@ static int ndisc_router_process_route(Link *link, sd_ndisc_router *rt) {
if (lifetime == 0)
return 0;
r = sd_ndisc_router_route_get_address(rt, &dst.in6);
r = sd_ndisc_router_route_get_address(rt, &dst);
if (r < 0)
return log_link_error_errno(link, r, "Failed to get route address: %m");
if ((!set_isempty(link->network->ndisc_allow_listed_route_prefix) &&
!set_contains(link->network->ndisc_allow_listed_route_prefix, &dst.in6)) ||
set_contains(link->network->ndisc_deny_listed_route_prefix, &dst.in6)) {
!set_contains(link->network->ndisc_allow_listed_route_prefix, &dst)) ||
set_contains(link->network->ndisc_deny_listed_route_prefix, &dst)) {
if (DEBUG_LOGGING) {
_cleanup_free_ char *buf = NULL;
(void) in_addr_to_string(AF_INET6, &dst, &buf);
(void) in6_addr_to_string(&dst, &buf);
if (!set_isempty(link->network->ndisc_allow_listed_route_prefix))
log_link_debug(link, "Route prefix '%s' is not in allow list, ignoring", strnull(buf));
log_link_debug(link, "Route prefix '%s' is not in allow list, ignoring", strna(buf));
else
log_link_debug(link, "Route prefix '%s' is in deny list, ignoring", strnull(buf));
log_link_debug(link, "Route prefix '%s' is in deny list, ignoring", strna(buf));
}
return 0;
}
r = sd_ndisc_router_get_address(rt, &gateway.in6);
r = sd_ndisc_router_get_address(rt, &gateway);
if (r < 0)
return log_link_error_errno(link, r, "Failed to get gateway address from RA: %m");
if (link_has_ipv6_address(link, &gateway.in6) > 0) {
if (link_has_ipv6_address(link, &gateway) > 0) {
if (DEBUG_LOGGING) {
_cleanup_free_ char *buf = NULL;
(void) in_addr_to_string(AF_INET6, &gateway, &buf);
log_link_debug(link, "Advertised route gateway, %s, is local to the link, ignoring route", strnull(buf));
(void) in6_addr_to_string(&gateway, &buf);
log_link_debug(link, "Advertised route gateway %s is local to the link, ignoring route", strna(buf));
}
return 0;
}
@ -902,9 +903,9 @@ static int ndisc_router_process_route(Link *link, sd_ndisc_router *rt) {
route->priority = link->network->ipv6_accept_ra_route_metric;
route->protocol = RTPROT_RA;
route->pref = preference;
route->gw = gateway;
route->gw.in6 = gateway;
route->gw_family = AF_INET6;
route->dst = dst;
route->dst.in6 = dst;
route->dst_prefixlen = prefixlen;
route->lifetime = usec_add(time_now, lifetime * USEC_PER_SEC);
@ -959,7 +960,7 @@ static int ndisc_router_process_rdnss(Link *link, sd_ndisc_router *rt) {
return log_link_error_errno(link, n, "Failed to get RDNSS addresses: %m");
SET_FOREACH(rdnss, link->ndisc_rdnss)
if (IN6_ARE_ADDR_EQUAL(&rdnss->router, &router))
if (in6_addr_equal(&rdnss->router, &router))
rdnss->marked = true;
if (lifetime == 0)
@ -1053,7 +1054,7 @@ static int ndisc_router_process_dnssl(Link *link, sd_ndisc_router *rt) {
return log_link_error_errno(link, r, "Failed to get DNSSL addresses: %m");
SET_FOREACH(dnssl, link->ndisc_dnssl)
if (IN6_ARE_ADDR_EQUAL(&dnssl->router, &router))
if (in6_addr_equal(&dnssl->router, &router))
dnssl->marked = true;
if (lifetime == 0)
@ -1119,20 +1120,20 @@ static int ndisc_router_process_options(Link *link, sd_ndisc_router *rt) {
switch (type) {
case SD_NDISC_OPTION_PREFIX_INFORMATION: {
union in_addr_union a;
struct in6_addr a;
uint8_t flags;
r = sd_ndisc_router_prefix_get_address(rt, &a.in6);
r = sd_ndisc_router_prefix_get_address(rt, &a);
if (r < 0)
return log_link_error_errno(link, r, "Failed to get prefix address: %m");
if ((!set_isempty(link->network->ndisc_allow_listed_prefix) &&
!set_contains(link->network->ndisc_allow_listed_prefix, &a.in6)) ||
set_contains(link->network->ndisc_deny_listed_prefix, &a.in6)) {
!set_contains(link->network->ndisc_allow_listed_prefix, &a)) ||
set_contains(link->network->ndisc_deny_listed_prefix, &a)) {
if (DEBUG_LOGGING) {
_cleanup_free_ char *b = NULL;
(void) in_addr_to_string(AF_INET6, &a, &b);
(void) in6_addr_to_string(&a, &b);
if (!set_isempty(link->network->ndisc_allow_listed_prefix))
log_link_debug(link, "Prefix '%s' is not in allow list, ignoring", strna(b));
else
@ -1187,7 +1188,7 @@ static int ndisc_router_process_options(Link *link, sd_ndisc_router *rt) {
}
static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) {
union in_addr_union router;
struct in6_addr router;
uint64_t flags;
NDiscAddress *na;
NDiscRoute *nr;
@ -1198,17 +1199,17 @@ static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) {
assert(link->manager);
assert(rt);
r = sd_ndisc_router_get_address(rt, &router.in6);
r = sd_ndisc_router_get_address(rt, &router);
if (r < 0)
return log_link_error_errno(link, r, "Failed to get router address from RA: %m");
if ((!set_isempty(link->network->ndisc_allow_listed_router) &&
!set_contains(link->network->ndisc_allow_listed_router, &router.in6)) ||
set_contains(link->network->ndisc_deny_listed_router, &router.in6)) {
!set_contains(link->network->ndisc_allow_listed_router, &router)) ||
set_contains(link->network->ndisc_deny_listed_router, &router)) {
if (DEBUG_LOGGING) {
_cleanup_free_ char *buf = NULL;
(void) in_addr_to_string(AF_INET6, &router, &buf);
(void) in6_addr_to_string(&router, &buf);
if (!set_isempty(link->network->ndisc_allow_listed_router))
log_link_debug(link, "Router '%s' is not in allow list, ignoring", strna(buf));
else
@ -1218,11 +1219,11 @@ static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) {
}
SET_FOREACH(na, link->ndisc_addresses)
if (IN6_ARE_ADDR_EQUAL(&na->router, &router.in6))
if (in6_addr_equal(&na->router, &router))
na->marked = true;
SET_FOREACH(nr, link->ndisc_routes)
if (IN6_ARE_ADDR_EQUAL(&nr->router, &router.in6))
if (in6_addr_equal(&nr->router, &router))
nr->marked = true;
r = sd_ndisc_router_get_flags(rt, &flags);

View File

@ -228,7 +228,7 @@ struct Network {
bool dhcp6_pd_manage_temporary_address;
int64_t dhcp6_pd_subnet_id;
uint32_t dhcp6_pd_route_metric;
union in_addr_union dhcp6_pd_token;
struct in6_addr dhcp6_pd_token;
/* Bridge Support */
int use_bpdu;