rdobuilder fb4cff
From a0c83226c3bb8e54a268d62ccce47d0098f534c1 Mon Sep 17 00:00:00 2001
rdobuilder fb4cff
From: Florent Fourcot <florent.fourcot@wifirst.fr>
rdobuilder fb4cff
Date: Fri, 22 Apr 2022 19:01:12 +0200
rdobuilder fb4cff
Subject: [PATCH] iproute/linux: try to improve flags when sending del messages
rdobuilder fb4cff
rdobuilder fb4cff
Flags are not the same between NEW and DELETE request. In file netlink.h
rdobuilder fb4cff
we can see:
rdobuilder fb4cff
rdobuilder fb4cff
 /* Modifiers to NEW request */
rdobuilder fb4cff
 #define NLM_F_REPLACE   0x100   /* Override existing        */
rdobuilder fb4cff
 #define NLM_F_EXCL      0x200   /* Do not touch, if it exists   */
rdobuilder fb4cff
 #define NLM_F_CREATE    0x400   /* Create, if it does not exist */
rdobuilder fb4cff
 #define NLM_F_APPEND    0x800   /* Add to end of list       */
rdobuilder fb4cff
rdobuilder fb4cff
 /* Modifiers to DELETE request */
rdobuilder fb4cff
 #define NLM_F_NONREC    0x100   /* Do not delete recursively    */
rdobuilder fb4cff
 #define NLM_F_BULK      0x200   /* Delete multiple objects  */
rdobuilder fb4cff
rdobuilder fb4cff
So NLM_F_BULK is the same value than NLM_F_EXCL. NLM_F_BULK has been
rdobuilder fb4cff
added in this kernel commit:
rdobuilder fb4cff
rdobuilder fb4cff
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=a6cec0bcd34264be8887791594be793b3f12719f
rdobuilder fb4cff
rdobuilder fb4cff
When this flag is set, pyroute now get a lot of error everywhere when
rdobuilder fb4cff
trying to delete objects.
rdobuilder fb4cff
rdobuilder fb4cff
Note that kernel commit is not yet mainline, and still in developpment
rdobuilder fb4cff
branch. But it can have a huge impact on pyroute2 library
rdobuilder fb4cff
rdobuilder fb4cff
(cherry picked from commit 1eb08312de30a083bcfddfaa9c1d5e124b6368df)
rdobuilder fb4cff
---
rdobuilder fb4cff
 pyroute2.core/pr2modules/iproute/linux.py | 44 +++++++++++------------
rdobuilder fb4cff
 1 file changed, 22 insertions(+), 22 deletions(-)
rdobuilder fb4cff
rdobuilder fb4cff
diff --git a/pyroute2.core/pr2modules/iproute/linux.py b/pyroute2.core/pr2modules/iproute/linux.py
rdobuilder fb4cff
index d3c4a54a..576fb358 100644
rdobuilder fb4cff
--- a/pyroute2.core/pr2modules/iproute/linux.py
rdobuilder fb4cff
+++ b/pyroute2.core/pr2modules/iproute/linux.py
rdobuilder fb4cff
@@ -643,7 +643,7 @@ class RTNL_API(object):
rdobuilder fb4cff
             # flush all addresses with IFA_LABEL='eth0':
rdobuilder fb4cff
             ipr.flush_addr(label='eth0')
rdobuilder fb4cff
         '''
rdobuilder fb4cff
-        flags = NLM_F_CREATE | NLM_F_EXCL | NLM_F_REQUEST
rdobuilder fb4cff
+        flags = NLM_F_CREATE | NLM_F_REQUEST
rdobuilder fb4cff
         ret = []
rdobuilder fb4cff
         for addr in self.get_addr(*argv, **kwarg):
rdobuilder fb4cff
             self.put(addr, msg_type=RTM_DELADDR, msg_flags=flags)
rdobuilder fb4cff
@@ -664,7 +664,7 @@ class RTNL_API(object):
rdobuilder fb4cff
             # flush all IPv6 rules that point to table 250:
rdobuilder fb4cff
             ipr.flush_rules(family=socket.AF_INET6, table=250)
rdobuilder fb4cff
         '''
rdobuilder fb4cff
-        flags = NLM_F_CREATE | NLM_F_EXCL | NLM_F_REQUEST
rdobuilder fb4cff
+        flags = NLM_F_CREATE | NLM_F_REQUEST
rdobuilder fb4cff
         ret = []
rdobuilder fb4cff
         for rule in self.get_rules(*argv, **kwarg):
rdobuilder fb4cff
             self.put(rule, msg_type=RTM_DELRULE, msg_flags=flags)
rdobuilder fb4cff
@@ -1049,9 +1049,9 @@ class RTNL_API(object):
rdobuilder fb4cff
             'set': (RTM_NEWNEIGH, flags_replace),
rdobuilder fb4cff
             'replace': (RTM_NEWNEIGH, flags_replace),
rdobuilder fb4cff
             'change': (RTM_NEWNEIGH, flags_change),
rdobuilder fb4cff
-            'del': (RTM_DELNEIGH, flags_make),
rdobuilder fb4cff
-            'remove': (RTM_DELNEIGH, flags_make),
rdobuilder fb4cff
-            'delete': (RTM_DELNEIGH, flags_make),
rdobuilder fb4cff
+            'del': (RTM_DELNEIGH, flags_base),
rdobuilder fb4cff
+            'remove': (RTM_DELNEIGH, flags_base),
rdobuilder fb4cff
+            'delete': (RTM_DELNEIGH, flags_base),
rdobuilder fb4cff
             'dump': (RTM_GETNEIGH, flags_dump),
rdobuilder fb4cff
             'get': (RTM_GETNEIGH, flags_base),
rdobuilder fb4cff
             'append': (RTM_NEWNEIGH, flags_append),
rdobuilder fb4cff
@@ -1428,11 +1428,11 @@ class RTNL_API(object):
rdobuilder fb4cff
             'set': (RTM_NEWLINK, flags_req),
rdobuilder fb4cff
             'update': (RTM_SETLINK, flags_create),
rdobuilder fb4cff
             'add': (RTM_NEWLINK, flags_create),
rdobuilder fb4cff
-            'del': (RTM_DELLINK, flags_create),
rdobuilder fb4cff
+            'del': (RTM_DELLINK, flags_req),
rdobuilder fb4cff
             'property_add': (RTM_NEWLINKPROP, flag_append),
rdobuilder fb4cff
             'property_del': (RTM_DELLINKPROP, flags_req),
rdobuilder fb4cff
-            'remove': (RTM_DELLINK, flags_create),
rdobuilder fb4cff
-            'delete': (RTM_DELLINK, flags_create),
rdobuilder fb4cff
+            'remove': (RTM_DELLINK, flags_req),
rdobuilder fb4cff
+            'delete': (RTM_DELLINK, flags_req),
rdobuilder fb4cff
             'dump': (RTM_GETLINK, flags_dump),
rdobuilder fb4cff
             'get': (RTM_GETLINK, NLM_F_REQUEST),
rdobuilder fb4cff
         }
rdobuilder fb4cff
@@ -1573,9 +1573,9 @@ class RTNL_API(object):
rdobuilder fb4cff
         flags_replace = flags_base | NLM_F_REPLACE | NLM_F_CREATE
rdobuilder fb4cff
         commands = {
rdobuilder fb4cff
             'add': (RTM_NEWADDR, flags_create),
rdobuilder fb4cff
-            'del': (RTM_DELADDR, flags_create),
rdobuilder fb4cff
-            'remove': (RTM_DELADDR, flags_create),
rdobuilder fb4cff
-            'delete': (RTM_DELADDR, flags_create),
rdobuilder fb4cff
+            'del': (RTM_DELADDR, flags_base),
rdobuilder fb4cff
+            'remove': (RTM_DELADDR, flags_base),
rdobuilder fb4cff
+            'delete': (RTM_DELADDR, flags_base),
rdobuilder fb4cff
             'replace': (RTM_NEWADDR, flags_replace),
rdobuilder fb4cff
             'dump': (RTM_GETADDR, flags_dump),
rdobuilder fb4cff
         }
rdobuilder fb4cff
@@ -1727,17 +1727,17 @@ class RTNL_API(object):
rdobuilder fb4cff
 
rdobuilder fb4cff
         commands = {
rdobuilder fb4cff
             'add': (RTM_NEWQDISC, flags_make),
rdobuilder fb4cff
-            'del': (RTM_DELQDISC, flags_make),
rdobuilder fb4cff
-            'remove': (RTM_DELQDISC, flags_make),
rdobuilder fb4cff
-            'delete': (RTM_DELQDISC, flags_make),
rdobuilder fb4cff
+            'del': (RTM_DELQDISC, flags_base),
rdobuilder fb4cff
+            'remove': (RTM_DELQDISC, flags_base),
rdobuilder fb4cff
+            'delete': (RTM_DELQDISC, flags_base),
rdobuilder fb4cff
             'change': (RTM_NEWQDISC, flags_change),
rdobuilder fb4cff
             'replace': (RTM_NEWQDISC, flags_replace),
rdobuilder fb4cff
             'add-class': (RTM_NEWTCLASS, flags_make),
rdobuilder fb4cff
-            'del-class': (RTM_DELTCLASS, flags_make),
rdobuilder fb4cff
+            'del-class': (RTM_DELTCLASS, flags_base),
rdobuilder fb4cff
             'change-class': (RTM_NEWTCLASS, flags_change),
rdobuilder fb4cff
             'replace-class': (RTM_NEWTCLASS, flags_replace),
rdobuilder fb4cff
             'add-filter': (RTM_NEWTFILTER, flags_make),
rdobuilder fb4cff
-            'del-filter': (RTM_DELTFILTER, flags_make),
rdobuilder fb4cff
+            'del-filter': (RTM_DELTFILTER, flags_base),
rdobuilder fb4cff
             'change-filter': (RTM_NEWTFILTER, flags_change),
rdobuilder fb4cff
             'replace-filter': (RTM_NEWTFILTER, flags_replace),
rdobuilder fb4cff
         }
rdobuilder fb4cff
@@ -2040,9 +2040,9 @@ class RTNL_API(object):
rdobuilder fb4cff
             'replace': (RTM_NEWROUTE, flags_replace),
rdobuilder fb4cff
             'change': (RTM_NEWROUTE, flags_change),
rdobuilder fb4cff
             'append': (RTM_NEWROUTE, flags_append),
rdobuilder fb4cff
-            'del': (RTM_DELROUTE, flags_make),
rdobuilder fb4cff
-            'remove': (RTM_DELROUTE, flags_make),
rdobuilder fb4cff
-            'delete': (RTM_DELROUTE, flags_make),
rdobuilder fb4cff
+            'del': (RTM_DELROUTE, flags_base),
rdobuilder fb4cff
+            'remove': (RTM_DELROUTE, flags_base),
rdobuilder fb4cff
+            'delete': (RTM_DELROUTE, flags_base),
rdobuilder fb4cff
             'get': (RTM_GETROUTE, NLM_F_REQUEST),
rdobuilder fb4cff
             'show': (RTM_GETROUTE, flags_dump),
rdobuilder fb4cff
             'dump': (RTM_GETROUTE, flags_dump),
rdobuilder fb4cff
@@ -2192,9 +2192,9 @@ class RTNL_API(object):
rdobuilder fb4cff
 
rdobuilder fb4cff
         commands = {
rdobuilder fb4cff
             'add': (RTM_NEWRULE, flags_make),
rdobuilder fb4cff
-            'del': (RTM_DELRULE, flags_make),
rdobuilder fb4cff
-            'remove': (RTM_DELRULE, flags_make),
rdobuilder fb4cff
-            'delete': (RTM_DELRULE, flags_make),
rdobuilder fb4cff
+            'del': (RTM_DELRULE, flags_base),
rdobuilder fb4cff
+            'remove': (RTM_DELRULE, flags_base),
rdobuilder fb4cff
+            'delete': (RTM_DELRULE, flags_base),
rdobuilder fb4cff
             'dump': (RTM_GETRULE, flags_dump),
rdobuilder fb4cff
         }
rdobuilder fb4cff
         if isinstance(command, int):
rdobuilder fb4cff
-- 
rdobuilder fb4cff
2.40.0
rdobuilder fb4cff