Skip to content

Commit b161dad

Browse files
authored
Merge pull request #3159 from flatcar/jepio/systemd-azure-network-backport
systemd: backport network-nic-unmanaged bugfix to v256
2 parents 9761c0b + 2455aee commit b161dad

File tree

6 files changed

+269
-2
lines changed

6 files changed

+269
-2
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# Temporarily put the SDK version ahead for sd-json support in Dracut.
2-
=sys-apps/systemd-257.5 ~amd64 ~arm64
2+
=sys-apps/systemd-257.7 ~amd64 ~arm64
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
DIST systemd-256.9.tar.gz 15774953 BLAKE2B caeff33d0906583094a44ab89fe9a9c1832a665f8cc768f86c55c5100bdd5c2b1500b2cd65e9519ef21d79bff92d1da3e84240793099a0e0c508afba3669c46e SHA512 aba7a0f7149fe3d28d9f930f244d5b997c28721e93e6f0768b0f0f1c918c87a0e8b7b347cffb2faa4740ca3ee3b04984454e85757365090a2cf32aba09f70681
2-
DIST systemd-257.5.tar.gz 16232112 BLAKE2B 142baef9b09217ea117ac09923604f7520a36d4c63cf04a78d1c4fbf7b057b977f5c77418168c0308a8dc6b48ccc6324438f30c87de8642e8e9cf12b47f90475 SHA512 9e5352c20c9edac53f302a534532035185139998628ed0a85411f440df47f1dd7cce6651aec787484809bb1aa2825008d062714c37936cbfd08451fbe29a998f
2+
DIST systemd-257.7.tar.gz 16327096 BLAKE2B 59a28ce9b355b98f718f26489400640f3d732bbf73c00ea0571302dfc6dfb3585bf07ec56af06d74c5aa033b06a6220c3c839af6dba5ab7f8bde1aef4b58f0f6 SHA512 fdc7c0153432b261ad8018c869dc714ce1d6d2a8428bdec46f7c5f120b196d3a553a375ae433f0c166c57b6e8b3c56549f585349b7b6ff83c2a86a32982d8411
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)