summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2022-12-07 13:34:39 +0900
committerGitHub <noreply@github.com>2022-12-07 13:34:39 +0900
commitbf9afd7b310b1f4d27685be1b44f683847f4fc65 (patch)
tree32b1b0d9b03509acff112974db985d33c1862afd
parent94799c305acad138ce62e562318fbe7936a50dce (diff)
parent23b6bf274fc1a46d8778bfc979d3c803d61a1f5c (diff)
downloadsystemd-bf9afd7b310b1f4d27685be1b44f683847f4fc65.tar.gz
Merge pull request #25628 from zhangjian3032/dev/fix-set-bond-mac-failed
network: Fix set bond device MAC address failed
-rw-r--r--src/network/networkd-setlink.c23
-rw-r--r--src/network/networkd-setlink.h1
-rw-r--r--test/test-network/conf/23-bond199.network3
-rwxr-xr-xtest/test-network/systemd-networkd-tests.py1
4 files changed, 28 insertions, 0 deletions
diff --git a/src/network/networkd-setlink.c b/src/network/networkd-setlink.c
index b6aaa1e9db..541c4b8a72 100644
--- a/src/network/networkd-setlink.c
+++ b/src/network/networkd-setlink.c
@@ -502,6 +502,14 @@ static int link_is_ready_to_set_link(Link *link, Request *req) {
r = link_down_now(link);
if (r < 0)
return r;
+
+ /* If the kind of the link is "bond", we need
+ * set the slave link down as well. */
+ if (streq_ptr(link->kind, "bond")) {
+ r = link_down_slave_links(link);
+ if (r < 0)
+ return r;
+ }
}
break;
@@ -1226,6 +1234,21 @@ int link_down_now(Link *link) {
return 0;
}
+int link_down_slave_links(Link *link) {
+ Link *slave;
+ int r;
+
+ assert(link);
+
+ SET_FOREACH(slave, link->slaves) {
+ r = link_down_now(slave);
+ if (r < 0)
+ return r;
+ }
+
+ return 0;
+}
+
static int link_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
int r;
diff --git a/src/network/networkd-setlink.h b/src/network/networkd-setlink.h
index 7e5ba32ef1..841e5eeb9c 100644
--- a/src/network/networkd-setlink.h
+++ b/src/network/networkd-setlink.h
@@ -25,4 +25,5 @@ int link_request_to_activate(Link *link);
int link_request_to_bring_up_or_down(Link *link, bool up);
int link_down_now(Link *link);
+int link_down_slave_links(Link *link);
int link_remove(Link *link);
diff --git a/test/test-network/conf/23-bond199.network b/test/test-network/conf/23-bond199.network
index 9f4879ff24..6a1f9a1bc7 100644
--- a/test/test-network/conf/23-bond199.network
+++ b/test/test-network/conf/23-bond199.network
@@ -4,3 +4,6 @@ Name=bond199
[Network]
IPv6AcceptRA=no
+
+[Link]
+MACAddress=00:11:22:33:44:55
diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py
index e4e92d5a37..398ece8297 100755
--- a/test/test-network/systemd-networkd-tests.py
+++ b/test/test-network/systemd-networkd-tests.py
@@ -3881,6 +3881,7 @@ class NetworkdBondTests(unittest.TestCase, Utilities):
output = check_output('ip -d link show bond199')
print(output)
self.assertRegex(output, 'primary dummy98')
+ self.assertIn('link/ether 00:11:22:33:44:55', output)
def test_bond_operstate(self):
copy_network_unit('25-bond.netdev', '11-dummy.netdev', '12-dummy.netdev',