Skip to content

Commit d816176

Browse files
committed
sys-apps/systemd: Backport fix for networkd unmanaged issue to v256
This is upstream issue systemd/systemd#36997 which we are hitting on Auzre, most likely since the networking rules shipped by azure-vm-utils are taking priority over Flatcar's own rule to keep enslaved NICs unmanaged. The azure-vm-utils configs use the ID_NET_MANAGED_BY property in addition to a custom property set on interfaces to keep them unmanaged. It isn't yet clear if only ID_NET_MANAGED_BY is affected or if it's the only thing that was fixed. Meanwhile we need to backport the bugfix. Patch 0011 is the actual fix and 0010 is included because it makes the backport easier. The bugfix will be in v258 and has been backported to v257.7 upstream. Signed-off-by: Jeremi Piotrowski <[email protected]>
1 parent a9221a4 commit d816176

File tree

3 files changed

+267
-0
lines changed

3 files changed

+267
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
From 7136aa7db4423432392a0fe6055c48a922a4aad4 Mon Sep 17 00:00:00 2001
2+
From: Yu Watanabe <[email protected]>
3+
Date: Tue, 10 Sep 2024 00:12:41 +0900
4+
Subject: [PATCH] network/netdev: also check ifindex, iftype, and kind when
5+
assigning NetDev to Link
6+
7+
Even when a NetDev object with the same name found, its iftype or kind
8+
may be different. For safety, let's also check them.
9+
10+
(cherry picked from commit 1788c3462853e8bb955ff656007e20f402dd9af2)
11+
12+
Signed-off-by: Jeremi Piotrowski <[email protected]>
13+
---
14+
src/network/netdev/netdev.c | 37 +++++++++++++++++++++++++++++++++++++
15+
src/network/netdev/netdev.h | 1 +
16+
src/network/networkd-link.c | 10 ++--------
17+
3 files changed, 40 insertions(+), 8 deletions(-)
18+
19+
diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c
20+
index 2b411425ba..9a528137ea 100644
21+
--- a/src/network/netdev/netdev.c
22+
+++ b/src/network/netdev/netdev.c
23+
@@ -265,6 +265,43 @@ int netdev_get(Manager *manager, const char *name, NetDev **ret) {
24+
return 0;
25+
}
26+
27+
+void link_assign_netdev(Link *link) {
28+
+ _unused_ _cleanup_(netdev_unrefp) NetDev *old = NULL;
29+
+ NetDev *netdev;
30+
+
31+
+ assert(link);
32+
+ assert(link->manager);
33+
+ assert(link->ifname);
34+
+
35+
+ old = TAKE_PTR(link->netdev);
36+
+
37+
+ if (netdev_get(link->manager, link->ifname, &netdev) < 0)
38+
+ return;
39+
+
40+
+ if (netdev->ifindex != link->ifindex)
41+
+ return;
42+
+
43+
+ if (NETDEV_VTABLE(netdev)->iftype != link->iftype)
44+
+ return;
45+
+
46+
+ if (!NETDEV_VTABLE(netdev)->skip_netdev_kind_check) {
47+
+ const char *kind;
48+
+
49+
+ if (netdev->kind == NETDEV_KIND_TAP)
50+
+ kind = "tun"; /* the kernel does not distinguish between tun and tap */
51+
+ else
52+
+ kind = netdev_kind_to_string(netdev->kind);
53+
+
54+
+ if (!streq_ptr(kind, link->kind))
55+
+ return;
56+
+ }
57+
+
58+
+ link->netdev = netdev_ref(netdev);
59+
+
60+
+ if (netdev != old)
61+
+ log_link_debug(link, "Found matching .netdev file: %s", netdev->filename);
62+
+}
63+
+
64+
void netdev_enter_failed(NetDev *netdev) {
65+
netdev->state = NETDEV_STATE_FAILED;
66+
}
67+
diff --git a/src/network/netdev/netdev.h b/src/network/netdev/netdev.h
68+
index cb8cc8c6a9..1a03a9b592 100644
69+
--- a/src/network/netdev/netdev.h
70+
+++ b/src/network/netdev/netdev.h
71+
@@ -206,6 +206,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_unref);
72+
73+
bool netdev_is_managed(NetDev *netdev);
74+
int netdev_get(Manager *manager, const char *name, NetDev **ret);
75+
+void link_assign_netdev(Link *link);
76+
int netdev_set_ifindex(NetDev *netdev, sd_netlink_message *newlink);
77+
int netdev_generate_hw_addr(NetDev *netdev, Link *link, const char *name,
78+
const struct hw_addr_data *hw_addr, struct hw_addr_data *ret);
79+
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
80+
index 8f21504d92..c3a5dc1f0d 100644
81+
--- a/src/network/networkd-link.c
82+
+++ b/src/network/networkd-link.c
83+
@@ -1317,7 +1317,6 @@ static int link_get_network(Link *link, Network **ret) {
84+
85+
int link_reconfigure_impl(Link *link, bool force) {
86+
Network *network = NULL;
87+
- NetDev *netdev = NULL;
88+
int r;
89+
90+
assert(link);
91+
@@ -1326,13 +1325,11 @@ int link_reconfigure_impl(Link *link, bool force) {
92+
if (link->manager->state != MANAGER_RUNNING)
93+
return 0;
94+
95+
+ link_assign_netdev(link);
96+
+
97+
if (IN_SET(link->state, LINK_STATE_PENDING, LINK_STATE_LINGER))
98+
return 0;
99+
100+
- r = netdev_get(link->manager, link->ifname, &netdev);
101+
- if (r < 0 && r != -ENOENT)
102+
- return r;
103+
-
104+
r = link_get_network(link, &network);
105+
if (r < 0 && r != -ENOENT)
106+
return r;
107+
@@ -1397,9 +1394,6 @@ int link_reconfigure_impl(Link *link, bool force) {
108+
link_free_engines(link);
109+
link->network = network_unref(link->network);
110+
111+
- netdev_unref(link->netdev);
112+
- link->netdev = netdev_ref(netdev);
113+
-
114+
if (!network) {
115+
link_set_state(link, LINK_STATE_UNMANAGED);
116+
return 0;
117+
--
118+
2.39.5
119+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
From 916523aabc7fcb3b5b9362100a5e3417aae00cb2 Mon Sep 17 00:00:00 2001
2+
From: Yu Watanabe <[email protected]>
3+
Date: Wed, 11 Jun 2025 18:05:46 +0900
4+
Subject: [PATCH] network: also check ID_NET_MANAGED_BY property on
5+
reconfigure
6+
7+
Previously, the property was checked only when an uevent is received,
8+
so even if an interface has ID_NET_MANAGED_BY property, the interface
9+
will be configured by networkd when reconfiguration is triggered e.g.
10+
when interface state is changed.
11+
12+
Follow-up for ba87a61d05d637be9f0b21707f7fe3b0a74c5a05.
13+
Fixes #36997.
14+
15+
(cherry picked from commit 78f8d5ed71ecc16ad36d1c215d2d57433d127679)
16+
17+
Signed-off-by: Jeremi Piotrowski <[email protected]>
18+
---
19+
src/network/networkd-link.c | 44 ++++++++++++++-----
20+
.../test-network/conf/11-dummy-unmanaged.link | 8 ++++
21+
test/test-network/systemd-networkd-tests.py | 11 +++++
22+
3 files changed, 53 insertions(+), 10 deletions(-)
23+
create mode 100644 test/test-network/conf/11-dummy-unmanaged.link
24+
25+
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
26+
index c3a5dc1f0d..3ed1584807 100644
27+
--- a/src/network/networkd-link.c
28+
+++ b/src/network/networkd-link.c
29+
@@ -1315,6 +1315,32 @@ static int link_get_network(Link *link, Network **ret) {
30+
return -ENOENT;
31+
}
32+
33+
+static int link_managed_by_us(Link *link) {
34+
+ int r;
35+
+
36+
+ assert(link);
37+
+
38+
+ if (!link->dev)
39+
+ return true;
40+
+
41+
+ const char *s;
42+
+ r = sd_device_get_property_value(link->dev, "ID_NET_MANAGED_BY", &s);
43+
+ if (r == -ENOENT)
44+
+ return true;
45+
+ if (r < 0)
46+
+ return log_link_warning_errno(link, r, "Failed to get ID_NET_MANAGED_BY udev property: %m");
47+
+
48+
+ if (streq(s, "io.systemd.Network"))
49+
+ return true;
50+
+
51+
+ if (link->state == LINK_STATE_UNMANAGED)
52+
+ return false; /* Already in unmanaged state */
53+
+
54+
+ log_link_debug(link, "Interface is requested to be managed by '%s', unmanaging the interface.", s);
55+
+ link_set_state(link, LINK_STATE_UNMANAGED);
56+
+ return false;
57+
+}
58+
+
59+
int link_reconfigure_impl(Link *link, bool force) {
60+
Network *network = NULL;
61+
int r;
62+
@@ -1330,6 +1356,10 @@ int link_reconfigure_impl(Link *link, bool force) {
63+
if (IN_SET(link->state, LINK_STATE_PENDING, LINK_STATE_LINGER))
64+
return 0;
65+
66+
+ r = link_managed_by_us(link);
67+
+ if (r <= 0)
68+
+ return r;
69+
+
70+
r = link_get_network(link, &network);
71+
if (r < 0 && r != -ENOENT)
72+
return r;
73+
@@ -1584,6 +1614,10 @@ static int link_initialized(Link *link, sd_device *device) {
74+
* or sysattrs) may be outdated. */
75+
device_unref_and_replace(link->dev, device);
76+
77+
+ r = link_managed_by_us(link);
78+
+ if (r <= 0)
79+
+ return r;
80+
+
81+
if (link->dhcp_client) {
82+
r = sd_dhcp_client_attach_device(link->dhcp_client, link->dev);
83+
if (r < 0)
84+
@@ -1651,7 +1685,6 @@ static int link_check_initialized(Link *link) {
85+
86+
int manager_udev_process_link(Manager *m, sd_device *device, sd_device_action_t action) {
87+
int r, ifindex;
88+
- const char *s;
89+
Link *link;
90+
91+
assert(m);
92+
@@ -1686,15 +1719,6 @@ int manager_udev_process_link(Manager *m, sd_device *device, sd_device_action_t
93+
return 0;
94+
}
95+
96+
- r = sd_device_get_property_value(device, "ID_NET_MANAGED_BY", &s);
97+
- if (r < 0 && r != -ENOENT)
98+
- log_device_debug_errno(device, r, "Failed to get ID_NET_MANAGED_BY udev property, ignoring: %m");
99+
- if (r >= 0 && !streq(s, "io.systemd.Network")) {
100+
- log_device_debug(device, "Interface is requested to be managed by '%s', not managing the interface.", s);
101+
- link_set_state(link, LINK_STATE_UNMANAGED);
102+
- return 0;
103+
- }
104+
-
105+
r = link_initialized(link, device);
106+
if (r < 0)
107+
link_enter_failed(link);
108+
diff --git a/test/test-network/conf/11-dummy-unmanaged.link b/test/test-network/conf/11-dummy-unmanaged.link
109+
new file mode 100644
110+
index 0000000000..99c07a72ce
111+
--- /dev/null
112+
+++ b/test/test-network/conf/11-dummy-unmanaged.link
113+
@@ -0,0 +1,8 @@
114+
+# SPDX-License-Identifier: MIT-0
115+
+[Match]
116+
+Kind=dummy
117+
+OriginalName=test1
118+
+
119+
+[Link]
120+
+NamePolicy=keep
121+
+Property=ID_NET_MANAGED_BY=hoge
122+
diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py
123+
index d8acf538f0..391d219de8 100755
124+
--- a/test/test-network/systemd-networkd-tests.py
125+
+++ b/test/test-network/systemd-networkd-tests.py
126+
@@ -2735,6 +2735,17 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
127+
def tearDown(self):
128+
tear_down_common()
129+
130+
+ def test_ID_NET_MANAGED_BY(self):
131+
+ copy_network_unit('11-dummy.netdev', '11-dummy-unmanaged.link', '11-dummy.network')
132+
+ start_networkd()
133+
+ self.wait_online('test1:off', setup_state='unmanaged')
134+
+
135+
+ check_output('ip link set dev test1 up')
136+
+ self.wait_online('test1:degraded', setup_state='unmanaged')
137+
+
138+
+ check_output('ip link set dev test1 down')
139+
+ self.wait_online('test1:off', setup_state='unmanaged')
140+
+
141+
def verify_address_static(
142+
self,
143+
label1: str,
144+
--
145+
2.39.5
146+

sdk_container/src/third_party/coreos-overlay/sys-apps/systemd/systemd-256.9.ebuild renamed to sdk_container/src/third_party/coreos-overlay/sys-apps/systemd/systemd-256.9-r1.ebuild

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,8 @@ src_prepare() {
266266
"${FILESDIR}/0006-Revert-getty-Pass-tty-to-use-by-agetty-via-stdin.patch"
267267
"${FILESDIR}/0007-units-Keep-using-old-journal-file-format.patch"
268268
"${FILESDIR}/0009-initrd-parse-etc.service.patch"
269+
"${FILESDIR}/0010-network-netdev-also-check-ifindex-iftype-and-kind-wh.patch"
270+
"${FILESDIR}/0011-network-also-check-ID_NET_MANAGED_BY-property-on-rec.patch"
269271
)
270272

271273
if ! use vanilla; then

0 commit comments

Comments
 (0)