diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-09-03 00:24:15 +0200 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-09-03 17:20:36 +0200 |
commit | 571bf1aa319d8fbf15e58907a779ae5ccc6a43d5 (patch) | |
tree | d26afddaa26d6d7d574b206c17857d8d68d64d00 | |
parent | man: drop unnecessary white space (diff) | |
download | systemd-571bf1aa319d8fbf15e58907a779ae5ccc6a43d5.tar.xz systemd-571bf1aa319d8fbf15e58907a779ae5ccc6a43d5.zip |
network: use master ifindex to check if the interface is enslaved
-rw-r--r-- | src/network/networkd-bridge-mdb.c | 36 | ||||
-rw-r--r-- | src/network/networkd-link.c | 3 | ||||
-rw-r--r-- | src/network/networkd-setlink.c | 2 |
3 files changed, 13 insertions, 28 deletions
diff --git a/src/network/networkd-bridge-mdb.c b/src/network/networkd-bridge-mdb.c index 6eca470826..6cd10c78e0 100644 --- a/src/network/networkd-bridge-mdb.c +++ b/src/network/networkd-bridge-mdb.c @@ -92,7 +92,7 @@ static int bridge_mdb_configure_handler(sd_netlink *rtnl, sd_netlink_message *m, return 1; r = sd_netlink_message_get_errno(m); - if (r == -EINVAL && streq_ptr(link->kind, "bridge") && (!link->network || !link->network->bridge)) { + if (r == -EINVAL && streq_ptr(link->kind, "bridge") && link->master_ifindex <= 0) { /* To configure bridge MDB entries on bridge master, 1bc844ee0faa1b92e3ede00bdd948021c78d7088 (v5.4) is required. */ if (!link->manager->bridge_mdb_on_master_not_supported) { log_link_warning_errno(link, r, "Kernel seems not to support bridge MDB entries on bridge master, ignoring: %m"); @@ -112,23 +112,11 @@ static int bridge_mdb_configure_handler(sd_netlink *rtnl, sd_netlink_message *m, return 1; } -static int link_get_bridge_master_ifindex(Link *link) { - assert(link); - - if (link->network && link->network->bridge) - return link->network->bridge->ifindex; - - if (streq_ptr(link->kind, "bridge")) - return link->ifindex; - - return 0; -} - /* send a request to the kernel to add an MDB entry */ static int bridge_mdb_configure(BridgeMDB *mdb, Link *link, link_netlink_message_handler_t callback) { _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL; struct br_mdb_entry entry; - int master, r; + int r; assert(mdb); assert(link); @@ -144,14 +132,10 @@ static int bridge_mdb_configure(BridgeMDB *mdb, Link *link, link_netlink_message strna(a), mdb->vlan_id); } - master = link_get_bridge_master_ifindex(link); - if (master <= 0) - return log_link_error_errno(link, SYNTHETIC_ERRNO(EINVAL), "Invalid bridge master ifindex %i", master); - entry = (struct br_mdb_entry) { /* If MDB entry is added on bridge master, then the state must be MDB_TEMPORARY. * See br_mdb_add_group() in net/bridge/br_mdb.c of kernel. */ - .state = master == link->ifindex ? MDB_TEMPORARY : MDB_PERMANENT, + .state = link->master_ifindex <= 0 ? MDB_TEMPORARY : MDB_PERMANENT, .ifindex = link->ifindex, .vid = mdb->vlan_id, }; @@ -172,7 +156,8 @@ static int bridge_mdb_configure(BridgeMDB *mdb, Link *link, link_netlink_message } /* create new RTM message */ - r = sd_rtnl_message_new_mdb(link->manager->rtnl, &req, RTM_NEWMDB, master); + r = sd_rtnl_message_new_mdb(link->manager->rtnl, &req, RTM_NEWMDB, + link->master_ifindex > 0 ? link->master_ifindex : link->ifindex); if (r < 0) return log_link_error_errno(link, r, "Could not create RTM_NEWMDB message: %m"); @@ -240,16 +225,13 @@ static bool bridge_mdb_is_ready_to_configure(Link *link) { if (!link_is_ready_to_configure(link, false)) return false; - if (!link->network->bridge) - return true; /* The interface is bridge master. */ - - if (link->master_ifindex <= 0) + if (!link->master_set) return false; - if (link->master_ifindex != link->network->bridge->ifindex) - return false; + if (link->master_ifindex <= 0 && streq_ptr(link->kind, "bridge")) + return true; /* The interface is bridge master. */ - if (link_get_by_index(link->manager, link->master_ifindex, &master) < 0) + if (link_get_master(link, &master) < 0) return false; if (!streq_ptr(master->kind, "bridge")) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 59313bcdfd..b3aa5bd807 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -2015,6 +2015,9 @@ static int link_update_master(Link *link, sd_netlink_message *message) { if (r < 0) return log_link_debug_errno(link, r, "rtnl: failed to read master ifindex: %m"); + if (master_ifindex == link->ifindex) + master_ifindex = 0; + if (master_ifindex == link->master_ifindex) return 0; diff --git a/src/network/networkd-setlink.c b/src/network/networkd-setlink.c index f09c318517..06aa2067f7 100644 --- a/src/network/networkd-setlink.c +++ b/src/network/networkd-setlink.c @@ -405,7 +405,7 @@ static int link_configure( if (r < 0) return log_link_debug_errno(link, r, "Could not open IFLA_AF_SPEC container: %m"); - if (!link->network->bridge) { + if (link->master_ifindex <= 0) { /* master needs BRIDGE_FLAGS_SELF flag */ r = sd_netlink_message_append_u16(req, IFLA_BRIDGE_FLAGS, BRIDGE_FLAGS_SELF); if (r < 0) |