]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: Replace existing objects instead of doing nothing if they exist 34224/head
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 1 Aug 2024 12:38:05 +0000 (14:38 +0200)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 2 Sep 2024 05:12:49 +0000 (14:12 +0900)
Currently, if for example a traffic control object already exist, networkd
will silently do nothing, even if the settings in the network file for the
traffic control object have changed. Let's instead replace the object if it
already exists so that new settings from the network file are applied as
expected.

Fixes #31226

src/libsystemd/sd-netlink/netlink-message-rtnl.c
test/test-network/systemd-networkd-tests.py

index fb11c7e02bb2816877c409ed56b7d7c328ff01f2..9184c43feccedb303ab7b3ede9463263d46f1a72 100644 (file)
@@ -892,7 +892,7 @@ int sd_rtnl_message_new_addrlabel(
                 return r;
 
         if (nlmsg_type == RTM_NEWADDRLABEL)
-                (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_EXCL;
+                (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_REPLACE;
 
         addrlabel = NLMSG_DATA((*ret)->hdr);
 
@@ -1143,7 +1143,7 @@ int sd_rtnl_message_new_traffic_control(
                 return r;
 
         if (IN_SET(nlmsg_type, RTM_NEWQDISC, RTM_NEWTCLASS))
-                (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_EXCL;
+                (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_REPLACE;
 
         tcm = NLMSG_DATA((*ret)->hdr);
         tcm->tcm_ifindex = ifindex;
@@ -1212,7 +1212,7 @@ int sd_rtnl_message_new_mdb(
                 return r;
 
         if (nlmsg_type == RTM_NEWMDB)
-                (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_EXCL;
+                (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_REPLACE;
 
         bpm = NLMSG_DATA((*ret)->hdr);
         bpm->family = AF_BRIDGE;
index 8a2c5af3989a7c23eef3e2ccfe3860f30df179b7..1b61038d09e084237b02835a230c6cd2c27ae6b4 100755 (executable)
@@ -4489,6 +4489,17 @@ class NetworkdTCTests(unittest.TestCase, Utilities):
         self.assertIn('rtt 1s', output)
         self.assertIn('ack-filter-aggressive', output)
 
+        # Test for replacing existing qdisc. See #31226.
+        with open(os.path.join(network_unit_dir, '25-qdisc-cake.network'), mode='a', encoding='utf-8') as f:
+            f.write('Bandwidth=250M\n')
+
+        networkctl_reload()
+        self.wait_online('dummy98:routable')
+
+        output = check_output('tc qdisc show dev dummy98')
+        print(output)
+        self.assertIn('bandwidth 250Mbit', output)
+
     @expectedFailureIfModuleIsNotAvailable('sch_codel')
     def test_qdisc_codel(self):
         copy_network_unit('25-qdisc-codel.network', '12-dummy.netdev')