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>
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 @@
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 @@
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 @@
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 @@
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;