Skip to content

Commit

Permalink
teamd: lacp: update port state according to partner's sync bit
Browse files Browse the repository at this point in the history
According to 6.4.15 of IEEE 802.1AX-2014, Figure 6-22, the state that the
port is selected moves MUX state from DETACHED to ATTACHED.

But ATTACHED state does not mean that the port can send and receive user
frames. COLLECTING_DISTRIBUTION state is the state that the port can send
and receive user frames. To move MUX state from ATTACHED to
COLLECTING_DISTRIBUTION, the partner state should be sync as well as the
port selected.

In function lacp_port_actor_update(), only INFO_STATE_SYNCHRONIZATION
should be set to the actor.state when the port is selected.
INFO_STATE_COLLECTING and INFO_STATE_DISTRIBUTING should be set to false
with ATTACHED mode and set to true when INFO_STATE_SYNCHRONIZATION of
partner.state is set.

In function lacp_port_should_be_{enabled, disabled}(), we also need to
check the INFO_STATE_SYNCHRONIZATION bit of partner.state.

Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
  • Loading branch information
liuhangbin authored and jpirko committed Mar 8, 2019
1 parent f36c191 commit 54f137c
Showing 1 changed file with 11 additions and 5 deletions.
16 changes: 11 additions & 5 deletions teamd/teamd_runner_lacp.c
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,8 @@ static int lacp_port_should_be_enabled(struct lacp_port *lacp_port)
struct lacp *lacp = lacp_port->lacp;

if (lacp_port_selected(lacp_port) &&
lacp_port->agg_lead == lacp->selected_agg_lead)
lacp_port->agg_lead == lacp->selected_agg_lead &&
lacp_port->partner.state & INFO_STATE_SYNCHRONIZATION)
return true;
return false;
}
Expand All @@ -343,7 +344,8 @@ static int lacp_port_should_be_disabled(struct lacp_port *lacp_port)
struct lacp *lacp = lacp_port->lacp;

if (!lacp_port_selected(lacp_port) ||
lacp_port->agg_lead != lacp->selected_agg_lead)
lacp_port->agg_lead != lacp->selected_agg_lead ||
!(lacp_port->partner.state & INFO_STATE_SYNCHRONIZATION))
return true;
return false;
}
Expand Down Expand Up @@ -914,9 +916,13 @@ static void lacp_port_actor_update(struct lacp_port *lacp_port)
if (lacp_port->lacp->cfg.fast_rate)
state |= INFO_STATE_LACP_TIMEOUT;
if (lacp_port_selected(lacp_port) &&
lacp_port_agg_selected(lacp_port))
state |= INFO_STATE_SYNCHRONIZATION |
INFO_STATE_COLLECTING | INFO_STATE_DISTRIBUTING;
lacp_port_agg_selected(lacp_port)) {
state |= INFO_STATE_SYNCHRONIZATION;
state &= ~(INFO_STATE_COLLECTING | INFO_STATE_DISTRIBUTING);
if (lacp_port->partner.state & INFO_STATE_SYNCHRONIZATION)
state |= INFO_STATE_COLLECTING |
INFO_STATE_DISTRIBUTING;
}
if (lacp_port->state == PORT_STATE_EXPIRED)
state |= INFO_STATE_EXPIRED;
if (lacp_port->state == PORT_STATE_DEFAULTED)
Expand Down

0 comments on commit 54f137c

Please sign in to comment.