Bug#924406: systemd-netword: RoutingPolicyRule does not apply correctly

Ioanna Alifieraki ioanna-maria.alifieraki at canonical.com
Tue Mar 12 16:38:30 GMT 2019


Package: systemd
Version: 240-6
Severity: normal
Tags: patch
User: ubuntu-devel at lists.ubuntu.com
Usertags: origin-ubuntu disco ubuntu-patch

Dear Maintainer,

When attaching multiple IPs on secondary interface the routing policy rules do not
apply for all IPs.
The rules that are applied after restarting networkd are random.
The issue has been reported and addressed upstream.
Bug : https://github.com/systemd/systemd/issues/11280
Fix : https://github.com/systemd/systemd/pull/11795/

In Ubuntu, the attached patch was applied to achieve the following:

lp-bug : https://launchpad.net/bugs/1818282

  * d/p/network-remove-routing-policy-rule-from-foreign-rule.patch:
    - Fix RoutingPolicyRule does not apply correctly (LP: #1818282)
  * d/p/network-do-not-remove-rule-when-it-is-requested-by-e.patch:
    - Fix RoutingPolicyRule does not apply correctly (LP: #1818282) 


Thanks for considering the patch.


-- System Information:
Debian Release: buster/sid
  APT prefers disco
  APT policy: (500, 'disco')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 4.19.0-13-generic (SMP w/8 CPU cores)
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8), LANGUAGE=en_GB:en (charmap=UTF-8)
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages systemd is related to:
pn  dracut           <none>
ii  initramfs-tools  0.131ubuntu17
ii  udev             240-6ubuntu2
-------------- next part --------------
diff -Nru systemd-240/debian/control systemd-240/debian/control
--- systemd-240/debian/control	2019-02-20 20:21:33.000000000 +0000
+++ systemd-240/debian/control	2019-03-04 10:32:19.000000000 +0000
@@ -1,8 +1,7 @@
 Source: systemd
 Section: admin
 Priority: optional
-Maintainer: Ubuntu Developers <ubuntu-devel-discuss at lists.ubuntu.com>
-XSBC-Original-Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers at lists.alioth.debian.org>
+Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers at lists.alioth.debian.org>
 Uploaders: Michael Biebl <biebl at debian.org>,
            Marco d'Itri <md at linux.it>,
            Sjoerd Simons <sjoerd at debian.org>,
diff -Nru systemd-240/debian/patches/network-do-not-remove-rule-when-it-is-requested-by-e.patch systemd-240/debian/patches/network-do-not-remove-rule-when-it-is-requested-by-e.patch
--- systemd-240/debian/patches/network-do-not-remove-rule-when-it-is-requested-by-e.patch	1970-01-01 01:00:00.000000000 +0100
+++ systemd-240/debian/patches/network-do-not-remove-rule-when-it-is-requested-by-e.patch	2019-03-04 10:30:34.000000000 +0000
@@ -0,0 +1,58 @@
+Description: Network-Do not remove rule when it is requested by existing links
+Otherwise, the first link once removes all saved rules in the foreign
+rule database, and the second or later links create again...
+
+Author: Yu Watanabe <watanabe.yu+github at gmail.com>
+Subject: [PATCH] network: do not remove rule when it is requested by existing
+ links
+Origin: Upstream, https://github.com/systemd/systemd/pull/11795/commits/031fb59a984e5b51f3c72aa8125ecc50b08011fe
+Bug: https://github.com/systemd/systemd/issues/11280
+Bug-Ubuntu: https://launchpad.net/bugs/1818282
+---
+ src/network/networkd-routing-policy-rule.c | 26 ++++++++++++++++++++++
+ 1 file changed, 26 insertions(+)
+
+Index: systemd-240/src/network/networkd-routing-policy-rule.c
+===================================================================
+--- systemd-240.orig/src/network/networkd-routing-policy-rule.c
++++ systemd-240/src/network/networkd-routing-policy-rule.c
+@@ -1250,6 +1250,26 @@ int routing_policy_load_rules(const char
+         return 0;
+ }
+ 
++static bool manager_links_have_routing_policy_rule(Manager *m, RoutingPolicyRule *rule) {
++        RoutingPolicyRule *link_rule;
++        Iterator i;
++        Link *link;
++
++        assert(m);
++        assert(rule);
++
++        HASHMAP_FOREACH(link, m->links, i) {
++                if (!link->network)
++                        continue;
++
++                LIST_FOREACH(rules, link_rule, link->network->rules)
++                        if (routing_policy_rule_compare_func(link_rule, rule) == 0)
++                                return true;
++        }
++
++        return false;
++}
++
+ void routing_policy_rule_purge(Manager *m, Link *link) {
+         RoutingPolicyRule *rule, *existing;
+         Iterator i;
+@@ -1263,6 +1283,12 @@ void routing_policy_rule_purge(Manager *
+                 if (!existing)
+                         continue; /* Saved rule does not exist anymore. */
+ 
++                if (manager_links_have_routing_policy_rule(m, existing))
++                        continue; /* Existing links have the saved rule. */
++
++                /* Existing links do not have the saved rule. Let's drop the rule now, and re-configure it
++                 * later when it is requested. */
++
+                 r = routing_policy_rule_remove(existing, link, NULL);
+                 if (r < 0) {
+                         log_warning_errno(r, "Could not remove routing policy rules: %m");
diff -Nru systemd-240/debian/patches/network-remove-routing-policy-rule-from-foreign-rule.patch systemd-240/debian/patches/network-remove-routing-policy-rule-from-foreign-rule.patch
--- systemd-240/debian/patches/network-remove-routing-policy-rule-from-foreign-rule.patch	1970-01-01 01:00:00.000000000 +0100
+++ systemd-240/debian/patches/network-remove-routing-policy-rule-from-foreign-rule.patch	2019-03-04 10:23:57.000000000 +0000
@@ -0,0 +1,51 @@
+Description: Network - remove routing policy from foreign rule database
+Previously, When the first link configures rules, it removes all saved
+rules, which were configured by networkd previously, in the foreign rule
+database, but the rules themselves are still in the database.
+Thus, when the second or later link configures rules, it errnously
+treats the rules already exist.
+This is the root of issue #11280.
+This removes rules from the foreign database when they are removed.
+Fixes #11280.
+
+Author: Yu Watanabe <watanabe.yu+github at gmail.com>
+Subject: [PATCH] network: remove routing policy rule from foreign rule
+ database when it is removed
+Origin: Upstream, https://github.com/systemd/systemd/pull/11795/commits/92cd00b9749141907a1110044cc7d1f01caff545
+Bug: https://github.com/systemd/systemd/issues/11280
+Bug-Ubuntu: https://launchpad.net/bugs/1818282
+---
+ src/network/networkd-routing-policy-rule.c | 19 +++++++++++--------
+ 1 file changed, 11 insertions(+), 8 deletions(-)
+
+Index: systemd-240/src/network/networkd-routing-policy-rule.c
+===================================================================
+--- systemd-240.orig/src/network/networkd-routing-policy-rule.c
++++ systemd-240/src/network/networkd-routing-policy-rule.c
+@@ -1260,15 +1260,18 @@ void routing_policy_rule_purge(Manager *
+ 
+         SET_FOREACH(rule, m->rules_saved, i) {
+                 existing = set_get(m->rules_foreign, rule);
+-                if (existing) {
++                if (!existing)
++                        continue; /* Saved rule does not exist anymore. */
+ 
+-                        r = routing_policy_rule_remove(rule, link, NULL);
+-                        if (r < 0) {
+-                                log_warning_errno(r, "Could not remove routing policy rules: %m");
+-                                continue;
+-                        }
+-
+-                        link->routing_policy_rule_remove_messages++;
++                r = routing_policy_rule_remove(existing, link, NULL);
++                if (r < 0) {
++                        log_warning_errno(r, "Could not remove routing policy rules: %m");
++                        continue;
+                 }
++
++                link->routing_policy_rule_remove_messages++;
++
++                assert_se(set_remove(m->rules_foreign, existing) == existing);
++                routing_policy_rule_free(existing);
+         }
+ }
diff -Nru systemd-240/debian/patches/series systemd-240/debian/patches/series
--- systemd-240/debian/patches/series	2019-02-20 20:37:16.000000000 +0000
+++ systemd-240/debian/patches/series	2019-03-04 10:24:49.000000000 +0000
@@ -95,3 +95,5 @@
 resolved-only-call-complete-with-zero-argument-in-LLMNR-c.patch
 resolved-add-comment-to-dns_stream_complete-about-its-err.patch
 resolved-keep-stub-stream-connections-up-for-as-long-as-c.patch
+network-remove-routing-policy-rule-from-foreign-rule.patch
+network-do-not-remove-rule-when-it-is-requested-by-e.patch


More information about the Pkg-systemd-maintainers mailing list