aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Pirko <jiri@nvidia.com>2022-12-07 13:26:44 +0100
committerJiri Pirko <jiri@nvidia.com>2022-12-07 13:35:23 +0100
commit5409fb58b0e9909b44a2ff89cf4c49e35ce53ea6 (patch)
tree21ed26faca78436149a3791f2e16af945ad35531
parent4a43cd854b4b6bbc1ff3dbe99df74eae1efe2b34 (diff)
downloadlibteam-5409fb58b0e9909b44a2ff89cf4c49e35ce53ea6.tar.gz
teamd: lacp: make sure that lacp_port_agg_update() works with correct unselectable state
In case of checking unselectable port state, lacp_port_agg_update() is checking the new one during port state change. This is wrong as it should check the old one. Move the state setting into lacp_port_agg_update() and rename the function accordingly. Signed-off-by: Jiri Pirko <jiri@nvidia.com>
-rw-r--r--teamd/teamd_runner_lacp.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/teamd/teamd_runner_lacp.c b/teamd/teamd_runner_lacp.c
index 2bb1a80..d414bb4 100644
--- a/teamd/teamd_runner_lacp.c
+++ b/teamd/teamd_runner_lacp.c
@@ -747,7 +747,8 @@ static bool lacp_port_mergeable(struct lacp_port *lacp_port)
lacp_get_agg_lead(lacp_port) != lacp_port;
}
-static int lacp_port_agg_update(struct lacp_port *lacp_port)
+static int lacp_port_set_state_agg_update(struct lacp_port *lacp_port,
+ enum lacp_port_state new_state)
{
if (lacp_port_selected(lacp_port) &&
(lacp_port_unselectable_state(lacp_port) ||
@@ -756,6 +757,8 @@ static int lacp_port_agg_update(struct lacp_port *lacp_port)
lacp_port_mergeable(lacp_port)))
lacp_port_agg_unselect(lacp_port);
+ lacp_port->state = new_state;
+
if (!lacp_port_selected(lacp_port) &&
(lacp_port_selectable_state(lacp_port) &&
lacp_port_loopback_free(lacp_port)))
@@ -764,6 +767,11 @@ static int lacp_port_agg_update(struct lacp_port *lacp_port)
return lacp_selected_agg_update(lacp_port->lacp, NULL);
}
+static int lacp_port_agg_update(struct lacp_port *lacp_port)
+{
+ return lacp_port_set_state_agg_update(lacp_port, lacp_port->state);
+}
+
static const char slow_addr[ETH_ALEN] = { 0x01, 0x80, 0xC2, 0x00, 0x00, 0x02 };
static int __slow_addr_add_del(struct lacp_port *lacp_port, bool add)
@@ -998,9 +1006,8 @@ static int lacp_port_set_state(struct lacp_port *lacp_port,
lacp_port->tdport->ifname,
lacp_port_state_name[lacp_port->state],
lacp_port_state_name[new_state]);
- lacp_port->state = new_state;
- err = lacp_port_agg_update(lacp_port);
+ err = lacp_port_set_state_agg_update(lacp_port, new_state);
if (err)
return err;