From 2aa7d367ec91518891f6100df562fbe240969105 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 28 Aug 2019 22:42:33 +0900 Subject: [PATCH 1/5] network: do not create default route for ipv4 link local addressing When nspawn container with private network starts, networkd creates the default route for the interface. The route may cause problem on the host side, and it can be created with DefaultRouteOnDevice= now. Hence, this makes networkd not create the route implicitly any more. Closes #13418. --- src/network/networkd-ipv4ll.c | 59 +-------------------- src/network/networkd-link.c | 4 +- src/network/networkd-link.h | 1 - test/test-network/systemd-networkd-tests.py | 1 - 4 files changed, 3 insertions(+), 62 deletions(-) diff --git a/src/network/networkd-ipv4ll.c b/src/network/networkd-ipv4ll.c index e50a3150df..6216a06d20 100644 --- a/src/network/networkd-ipv4ll.c +++ b/src/network/networkd-ipv4ll.c @@ -12,13 +12,11 @@ static int ipv4ll_address_lost(Link *link) { _cleanup_(address_freep) Address *address = NULL; - _cleanup_(route_freep) Route *route = NULL; struct in_addr addr; int r; assert(link); - link->ipv4ll_route = false; link->ipv4ll_address = false; r = sd_ipv4ll_get_address(link->ipv4ll, &addr); @@ -40,60 +38,11 @@ static int ipv4ll_address_lost(Link *link) { if (r < 0) return r; - r = route_new(&route); - if (r < 0) - return log_link_error_errno(link, r, "Could not allocate route: %m"); - - route->family = AF_INET; - route->scope = RT_SCOPE_LINK; - route->priority = IPV4LL_ROUTE_METRIC; - - r = route_remove(route, link, NULL); - if (r < 0) - return r; - link_check_ready(link); return 0; } -static int ipv4ll_route_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { - int r; - - assert(link); - assert(!link->ipv4ll_route); - - r = sd_netlink_message_get_errno(m); - if (r < 0 && r != -EEXIST) { - log_link_error_errno(link, r, "could not set ipv4ll route: %m"); - link_enter_failed(link); - return 1; - } - - link->ipv4ll_route = true; - - link_check_ready(link); - - return 1; -} - -static int ipv4ll_route_configure(Link *link) { - _cleanup_(route_freep) Route *route = NULL; - int r; - - r = route_new(&route); - if (r < 0) - return r; - - route->family = AF_INET; - route->scope = RT_SCOPE_LINK; - route->protocol = RTPROT_STATIC; - route->priority = IPV4LL_ROUTE_METRIC; - route->table = link_get_vrf_table(link); - - return route_configure(route, link, ipv4ll_route_handler); -} - static int ipv4ll_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { int r; @@ -109,12 +58,7 @@ static int ipv4ll_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link (void) manager_rtnl_process_address(rtnl, m, link->manager); link->ipv4ll_address = true; - - r = ipv4ll_route_configure(link); - if (r < 0) { - log_link_error_errno(link, r, "Failed to configure ipv4ll route: %m"); - link_enter_failed(link); - } + link_check_ready(link); return 1; } @@ -128,7 +72,6 @@ static int ipv4ll_address_claimed(sd_ipv4ll *ll, Link *link) { assert(link); link->ipv4ll_address = false; - link->ipv4ll_route = false; r = sd_ipv4ll_get_address(ll, &address); if (r == -ENOENT) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index f5bb78890a..a05971c8d4 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -1020,7 +1020,7 @@ void link_check_ready(Link *link) { if (link_has_carrier(link) || !link->network->configure_without_carrier) { - if (link_ipv4ll_enabled(link, ADDRESS_FAMILY_IPV4) && !(link->ipv4ll_address && link->ipv4ll_route)) + if (link_ipv4ll_enabled(link, ADDRESS_FAMILY_IPV4) && !link->ipv4ll_address) return; if (link_ipv6ll_enabled(link) && @@ -1030,7 +1030,7 @@ void link_check_ready(Link *link) { if ((link_dhcp4_enabled(link) || link_dhcp6_enabled(link)) && !link->dhcp4_configured && !link->dhcp6_configured && - !(link_ipv4ll_enabled(link, ADDRESS_FAMILY_FALLBACK_IPV4) && link->ipv4ll_address && link->ipv4ll_route)) + !(link_ipv4ll_enabled(link, ADDRESS_FAMILY_FALLBACK_IPV4) && link->ipv4ll_address)) /* When DHCP is enabled, at least one protocol must provide an address, or * an IPv4ll fallback address must be configured. */ return; diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index 3eff6fbc62..d364692c86 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -97,7 +97,6 @@ typedef struct Link { sd_ipv4ll *ipv4ll; bool ipv4ll_address:1; - bool ipv4ll_route:1; bool neighbors_configured; diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 374d9cdefd..dd031de383 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -2892,7 +2892,6 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): output = check_output('ip route show vrf vrf99') print(output) self.assertRegex(output, 'default via 192.168.5.1 dev veth99 proto dhcp src 192.168.5.') - self.assertRegex(output, 'default dev veth99 proto static scope link') self.assertRegex(output, '169.254.0.0/16 dev veth99 proto kernel scope link src 169.254') self.assertRegex(output, '192.168.5.0/24 dev veth99 proto kernel scope link src 192.168.5') self.assertRegex(output, '192.168.5.0/24 via 192.168.5.5 dev veth99 proto dhcp') From 70dc23624e6adf207187a20ed96cb1f580e3badc Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 29 Aug 2019 08:13:15 +0900 Subject: [PATCH 2/5] network: do not use implicit cast to boolean --- src/network/networkd-route.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 19055f4e48..9a90879361 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -680,7 +680,7 @@ int route_configure( return log_link_error_errno(link, r, "Could not set route family: %m"); } - if (route->dst_prefixlen) { + if (route->dst_prefixlen > 0) { r = netlink_message_append_in_addr_union(req, RTA_DST, route->family, &route->dst); if (r < 0) return log_link_error_errno(link, r, "Could not append RTA_DST attribute: %m"); @@ -690,7 +690,7 @@ int route_configure( return log_link_error_errno(link, r, "Could not set destination prefix length: %m"); } - if (route->src_prefixlen) { + if (route->src_prefixlen > 0) { r = netlink_message_append_in_addr_union(req, RTA_SRC, route->family, &route->src); if (r < 0) return log_link_error_errno(link, r, "Could not append RTA_SRC attribute: %m"); From 750f9191128674b5325f3218882ad6b6fefdabf5 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 29 Aug 2019 08:11:02 +0900 Subject: [PATCH 3/5] network: drop redundant and invalid destination address When dst_prefixlen is not set, the value is not used. --- src/network/networkd-route.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 9a90879361..d513425276 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -876,10 +876,6 @@ int network_add_default_route_on_device(Network *network) { if (r < 0) return r; - r = in_addr_from_string(AF_INET, "169.254.0.0", &n->dst); - if (r < 0) - return r; - n->family = AF_INET; TAKE_PTR(n); From c697db75de39a63d6c07b706221346dd4a490386 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 29 Aug 2019 20:24:27 +0900 Subject: [PATCH 4/5] network: set scope and protocol for default route --- src/network/networkd-route.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index d513425276..dd1469d0df 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -877,6 +877,9 @@ int network_add_default_route_on_device(Network *network) { return r; n->family = AF_INET; + n->scope = RT_SCOPE_LINK; + n->scope_set = true; + n->protocol = RTPROT_STATIC; TAKE_PTR(n); return 0; From 152015126867294e73b2f0860f30330880d5d657 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 30 Aug 2019 04:18:27 +0900 Subject: [PATCH 5/5] network: add more debug messages --- src/network/networkd-manager.c | 10 ++++++++++ src/network/networkd-routing-policy-rule.c | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index a365bcbde7..a164d6163e 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -914,6 +914,7 @@ static int manager_rtnl_process_link(sd_netlink *rtnl, sd_netlink_message *messa int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, void *userdata) { _cleanup_(routing_policy_rule_freep) RoutingPolicyRule *tmp = NULL; + _cleanup_free_ char *from = NULL, *to = NULL; RoutingPolicyRule *rule = NULL; const char *iif = NULL, *oif = NULL; Manager *m = userdata; @@ -1094,9 +1095,16 @@ int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, voi (void) routing_policy_rule_get(m, tmp, &rule); + if (DEBUG_LOGGING) { + (void) in_addr_to_string(tmp->family, &tmp->from, &from); + (void) in_addr_to_string(tmp->family, &tmp->to, &to); + } + switch (type) { case RTM_NEWRULE: if (!rule) { + log_debug("Remembering foreign routing policy rule: %s/%u -> %s/%u, iif: %s, oif: %s, table: %u", + from, tmp->from_prefixlen, to, tmp->to_prefixlen, strna(tmp->iif), strna(tmp->oif), tmp->table); r = routing_policy_rule_add_foreign(m, tmp, &rule); if (r < 0) { log_warning_errno(r, "Could not remember foreign rule, ignoring: %m"); @@ -1105,6 +1113,8 @@ int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, voi } break; case RTM_DELRULE: + log_debug("Forgetting routing policy rule: %s/%u -> %s/%u, iif: %s, oif: %s, table: %u", + from, tmp->from_prefixlen, to, tmp->to_prefixlen, strna(tmp->iif), strna(tmp->oif), tmp->table); routing_policy_rule_free(rule); break; diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c index f032169aeb..9443db02fd 100644 --- a/src/network/networkd-routing-policy-rule.c +++ b/src/network/networkd-routing-policy-rule.c @@ -453,6 +453,16 @@ int routing_policy_rule_configure(RoutingPolicyRule *rule, Link *link, link_netl assert(link->manager); assert(link->manager->rtnl); + if (DEBUG_LOGGING) { + _cleanup_free_ char *from = NULL, *to = NULL; + + (void) in_addr_to_string(rule->family, &rule->from, &from); + (void) in_addr_to_string(rule->family, &rule->to, &to); + + log_debug("Configuring routing policy rule: %s/%u -> %s/%u, iif: %s, oif: %s, table: %u", + from, rule->from_prefixlen, to, rule->to_prefixlen, strna(rule->iif), strna(rule->oif), rule->table); + } + r = sd_rtnl_message_new_routing_policy_rule(link->manager->rtnl, &m, RTM_NEWRULE, rule->family); if (r < 0) return log_error_errno(r, "Could not allocate RTM_NEWRULE message: %m");