diff options
author | Jiri Pirko <jiri@nvidia.com> | 2022-12-07 13:26:44 +0100 |
---|---|---|
committer | Jiri Pirko <jiri@nvidia.com> | 2022-12-07 13:35:23 +0100 |
commit | 5409fb58b0e9909b44a2ff89cf4c49e35ce53ea6 (patch) | |
tree | 21ed26faca78436149a3791f2e16af945ad35531 | |
parent | 4a43cd854b4b6bbc1ff3dbe99df74eae1efe2b34 (diff) | |
download | libteam-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.c | 13 |
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; |