summaryrefslogtreecommitdiffstats
path: root/debian/patches/network-do-not-remove-rule-when-it-is-requested-by-existi.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/network-do-not-remove-rule-when-it-is-requested-by-existi.patch')
-rw-r--r--debian/patches/network-do-not-remove-rule-when-it-is-requested-by-existi.patch56
1 files changed, 56 insertions, 0 deletions
diff --git a/debian/patches/network-do-not-remove-rule-when-it-is-requested-by-existi.patch b/debian/patches/network-do-not-remove-rule-when-it-is-requested-by-existi.patch
new file mode 100644
index 0000000..19cabfe
--- /dev/null
+++ b/debian/patches/network-do-not-remove-rule-when-it-is-requested-by-existi.patch
@@ -0,0 +1,56 @@
+From: Yu Watanabe <watanabe.yu+github@gmail.com>
+Date: Fri, 22 Feb 2019 13:32:47 +0900
+Subject: 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...
+
+(cherry picked from commit 031fb59a984e5b51f3c72aa8125ecc50b08011fe)
+---
+ src/network/networkd-routing-policy-rule.c | 26 ++++++++++++++++++++++++++
+ 1 file changed, 26 insertions(+)
+
+diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c
+index 21a40fa..65a9af2 100644
+--- a/src/network/networkd-routing-policy-rule.c
++++ b/src/network/networkd-routing-policy-rule.c
+@@ -1250,6 +1250,26 @@ int routing_policy_load_rules(const char *state_file, Set **rules) {
+ 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 *m, Link *link) {
+ 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");