networkd: remove route if carrier is lost

Patch cherry-picked from upstream master.

Gbp-Dch: Short
This commit is contained in:
Martin Pitt 2016-09-11 09:11:10 +02:00
parent f3c4eafa52
commit 79e10aaee1
3 changed files with 98 additions and 0 deletions

View File

@ -0,0 +1,32 @@
From: =?utf-8?q?Mantas_Mikul=C4=97nas?= <grawity@gmail.com>
Date: Wed, 24 Aug 2016 18:26:48 +0300
Subject: networkd: do not drop config for unmanaged interfaces
Flushing foreign configuration for unmanaged interfaces is outright
evil, especially when it's a regular occurence with Wi-Fi.
Fixes: 3104883ddc24 "networkd: remove route if carrier is lost"
Ref: #3831
---
src/network/networkd-link.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 0eaa25e..2a8bdd0 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -2897,9 +2897,11 @@ static int link_carrier_lost(Link *link) {
if (r < 0)
return r;
- r = link_drop_foreign_config(link);
- if (r < 0)
- return r;
+ if (link->state != LINK_STATE_UNMANAGED) {
+ r = link_drop_foreign_config(link);
+ if (r < 0)
+ return r;
+ }
r = link_handle_bound_by_list(link);
if (r < 0)

View File

@ -0,0 +1,64 @@
From: Susant Sahani <ssahani@users.noreply.github.com>
Date: Thu, 4 Aug 2016 19:26:39 +0530
Subject: networkd: remove route if carrier is lost (#3831)
Fixes #3669.
---
src/network/networkd-link.c | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 82f5615..0eaa25e 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -2318,6 +2318,35 @@ static int link_drop_foreign_config(Link *link) {
return 0;
}
+static int link_drop_config(Link *link) {
+ Address *address;
+ Route *route;
+ Iterator i;
+ int r;
+
+ SET_FOREACH(address, link->addresses, i) {
+ /* we consider IPv6LL addresses to be managed by the kernel */
+ if (address->family == AF_INET6 && in_addr_is_link_local(AF_INET6, &address->in_addr) == 1)
+ continue;
+
+ r = address_remove(address, link, link_address_remove_handler);
+ if (r < 0)
+ return r;
+ }
+
+ SET_FOREACH(route, link->routes, i) {
+ /* do not touch routes managed by the kernel */
+ if (route->protocol == RTPROT_KERNEL)
+ continue;
+
+ r = route_remove(route, link, link_route_remove_handler);
+ if (r < 0)
+ return r;
+ }
+
+ return 0;
+}
+
static int link_update_lldp(Link *link) {
int r;
@@ -2864,6 +2893,14 @@ static int link_carrier_lost(Link *link) {
return r;
}
+ r = link_drop_config(link);
+ if (r < 0)
+ return r;
+
+ r = link_drop_foreign_config(link);
+ if (r < 0)
+ return r;
+
r = link_handle_bound_by_list(link);
if (r < 0)
return r;

View File

@ -13,6 +13,8 @@ nspawn-detect-SECCOMP-availability-skip-audit-filter-if-u.patch
shared-recognize-DNS-names-with-more-than-one-trailing-do.patch
networkd-limit-the-number-of-routes-to-the-kernel-limit-4.patch
systemctl-consider-service-running-only-when-it-is-in-act.patch
networkd-remove-route-if-carrier-is-lost-3831.patch
networkd-do-not-drop-config-for-unmanaged-interfaces.patch
debian/Use-Debian-specific-config-files.patch
debian/don-t-try-to-start-autovt-units-when-not-running-wit.patch
debian/Make-logind-hostnamed-localed-timedated-D-Bus-activa.patch