From 5ff1ef31f208bac62fe41efb0d230d7b77703eb4 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 18 Jul 2020 05:12:33 +0900 Subject: [PATCH 1/4] network: do not enumerate routes if ManageForeignRoutes=no --- src/network/networkd-manager.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 8c51cc12b22..267a391e11b 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -2031,6 +2031,9 @@ int manager_rtnl_enumerate_routes(Manager *m) { assert(m); assert(m->rtnl); + if (!m->manage_foreign_routes) + return 0; + r = sd_rtnl_message_new_route(m->rtnl, &req, RTM_GETROUTE, 0, 0); if (r < 0) return r; From d15818f2278e8ebf9c85dcb693b042181e7e7ee3 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 18 Jul 2020 05:17:31 +0900 Subject: [PATCH 2/4] network: update debug log when foreign routes are received with ManageForeignRoutes=no --- src/network/networkd-manager.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 267a391e11b..4fbb7965be0 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -505,7 +505,8 @@ int manager_rtnl_process_route(sd_netlink *rtnl, sd_netlink_message *message, vo log_link_debug(link, "%s route: dst: %s%s, src: %s, gw: %s, prefsrc: %s, scope: %s, table: %s, proto: %s, type: %s", - (!route && !link->manager->manage_foreign_routes) || type == RTM_DELROUTE ? "Forgetting" : + (!route && !link->manager->manage_foreign_routes) ? "Ignoring received foreign" : + type == RTM_DELROUTE ? "Forgetting" : route ? "Received remembered" : "Remembering", strna(buf_dst), strempty(buf_dst_prefixlen), strna(buf_src), strna(buf_gw), strna(buf_prefsrc), From 5eec0a0810c6e5d84117a34803a17d7b3a6c38df Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 18 Jul 2020 05:42:59 +0900 Subject: [PATCH 3/4] network: introduce address_exists() helper function --- src/network/networkd-address.c | 26 +++++++++++++++++++++++++ src/network/networkd-address.h | 1 + src/network/networkd-ndisc.c | 35 +++++++--------------------------- 3 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 6f1ee3b5349..2c36854588d 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -431,6 +431,32 @@ int address_get(Link *link, return -ENOENT; } +static bool address_exists_internal(Set *addresses, int family, const union in_addr_union *in_addr) { + Address *address; + Iterator i; + + SET_FOREACH(address, addresses, i) { + if (address->family != family) + continue; + if (in_addr_equal(address->family, &address->in_addr, in_addr)) + return true; + } + + return false; +} + +bool address_exists(Link *link, int family, const union in_addr_union *in_addr) { + assert(link); + assert(IN_SET(family, AF_INET, AF_INET6)); + assert(in_addr); + + if (address_exists_internal(link->addresses, family, in_addr)) + return true; + if (address_exists_internal(link->addresses_foreign, family, in_addr)) + return true; + return false; +} + static int address_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { int r; diff --git a/src/network/networkd-address.h b/src/network/networkd-address.h index bd0485e0abe..d55059ee252 100644 --- a/src/network/networkd-address.h +++ b/src/network/networkd-address.h @@ -57,6 +57,7 @@ void address_free(Address *address); int address_add_foreign(Link *link, int family, const union in_addr_union *in_addr, unsigned char prefixlen, Address **ret); int address_add(Link *link, int family, const union in_addr_union *in_addr, unsigned char prefixlen, Address **ret); int address_get(Link *link, int family, const union in_addr_union *in_addr, unsigned char prefixlen, Address **ret); +bool address_exists(Link *link, int family, const union in_addr_union *in_addr); int address_update(Address *address, unsigned char flags, unsigned char scope, const struct ifa_cacheinfo *cinfo); int address_drop(Address *address); int address_configure(Address *address, Link *link, link_netlink_message_handler_t callback, bool update); diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index 52c315ac4e5..848c4ba7adc 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -148,8 +148,6 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) { unsigned preference; uint32_t mtu; usec_t time_now; - Address *address; - Iterator i; int r; assert(link); @@ -166,34 +164,15 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) { if (r < 0) return log_link_error_errno(link, r, "Failed to get gateway address from RA: %m"); - SET_FOREACH(address, link->addresses, i) { - if (address->family != AF_INET6) - continue; - if (in_addr_equal(AF_INET6, &gateway, &address->in_addr)) { - if (DEBUG_LOGGING) { - _cleanup_free_ char *buffer = NULL; + if (address_exists(link, AF_INET6, &gateway)) { + if (DEBUG_LOGGING) { + _cleanup_free_ char *buffer = NULL; - (void) in_addr_to_string(AF_INET6, &address->in_addr, &buffer); - log_link_debug(link, "No NDisc route added, gateway %s matches local address", - strnull(buffer)); - } - return 0; - } - } - - SET_FOREACH(address, link->addresses_foreign, i) { - if (address->family != AF_INET6) - continue; - if (in_addr_equal(AF_INET6, &gateway, &address->in_addr)) { - if (DEBUG_LOGGING) { - _cleanup_free_ char *buffer = NULL; - - (void) in_addr_to_string(AF_INET6, &address->in_addr, &buffer); - log_link_debug(link, "No NDisc route added, gateway %s matches local address", - strnull(buffer)); - } - return 0; + (void) in_addr_to_string(AF_INET6, &gateway, &buffer); + log_link_debug(link, "No NDisc route added, gateway %s matches local address", + strnull(buffer)); } + return 0; } r = sd_ndisc_router_get_preference(rt, &preference); From a8c10331b41155ca26821703369942e5a7b97d7a Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 18 Jul 2020 05:46:53 +0900 Subject: [PATCH 4/4] network: replace NDISC -> NDisc in log messages --- src/network/networkd-link.c | 2 +- src/network/networkd-ndisc.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 2184a326e13..fc15e510e9e 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -4229,7 +4229,7 @@ int link_save(Link *link) { sd_dhcp6_lease_get_dns, NULL); - /* Make sure to flush out old entries before we use the NDISC data */ + /* Make sure to flush out old entries before we use the NDisc data */ ndisc_vacuum(link); if (link->network->ipv6_accept_ra_use_dns && link->ndisc_rdnss) { diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index 848c4ba7adc..409db8c3c5a 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -815,14 +815,14 @@ static void ndisc_handler(sd_ndisc *nd, sd_ndisc_event event, sd_ndisc_router *r break; case SD_NDISC_EVENT_TIMEOUT: - log_link_debug(link, "NDISC handler get timeout event"); + log_link_debug(link, "NDisc handler get timeout event"); link->ndisc_addresses_configured = true; link->ndisc_routes_configured = true; link_check_ready(link); break; default: - assert_not_reached("IPv6 Neighbor Discovery unknown event"); + assert_not_reached("Unknown NDisc event"); } } @@ -948,7 +948,7 @@ int config_parse_ndisc_deny_listed_prefix( return log_oom(); if (r < 0) { log_syntax(unit, LOG_WARNING, filename, line, r, - "Failed to parse NDISC deny-listed prefix, ignoring assignment: %s", + "Failed to parse NDisc deny-listed prefix, ignoring assignment: %s", rvalue); return 0; } @@ -958,7 +958,7 @@ int config_parse_ndisc_deny_listed_prefix( r = in_addr_from_string(AF_INET6, n, &ip); if (r < 0) { log_syntax(unit, LOG_WARNING, filename, line, r, - "NDISC deny-listed prefix is invalid, ignoring assignment: %s", n); + "NDisc deny-listed prefix is invalid, ignoring assignment: %s", n); continue; }