diff mbox series

Send LACP PDU right after the Actor state has been changed

Message ID 1589227610-27357-1-git-send-email-pavel.contrib@gmail.com (mailing list archive)
State New
Headers show
Series Send LACP PDU right after the Actor state has been changed | expand

Commit Message

Pavel Shirshov May 11, 2020, 8:06 p.m. UTC
According to the LACP standard "LACP daemon must send LACP PDU
packets with updates when the Actor's state changes or when it is
apparent from the Partner's LACPDUs that the Partner does not know
the Actor's current state."

The current libteam implementation sends periodic updates only, so
in LACP slow rate mode the update will be transmitted within 30 seconds
which doesn't follow the LACP standard.

To fix the issue:
1. Revert the patch:
b2de61b39696 ("Fix sending duplicate LACP frames at the start of establishing a logical channel.")
2. Recalculate LACP actor state before the comparison what the LACP
Partner thinks about the LACP Actor state.

Signed-off-by: Pavel Shirshov <pavel.contrib@gmail.com>
---
 teamd/teamd_runner_lacp.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

Comments

Jiri Pirko May 15, 2020, 10:44 a.m. UTC | #1
Mon, May 11, 2020 at 10:06:50PM CEST, pavel.contrib@gmail.com wrote:
>According to the LACP standard "LACP daemon must send LACP PDU
>packets with updates when the Actor's state changes or when it is
>apparent from the Partner's LACPDUs that the Partner does not know
>the Actor's current state."
>
>The current libteam implementation sends periodic updates only, so
>in LACP slow rate mode the update will be transmitted within 30 seconds
>which doesn't follow the LACP standard.
>
>To fix the issue:
>1. Revert the patch:
>b2de61b39696 ("Fix sending duplicate LACP frames at the start of establishing a logical channel.")
>2. Recalculate LACP actor state before the comparison what the LACP
>Partner thinks about the LACP Actor state.
>
>Signed-off-by: Pavel Shirshov <pavel.contrib@gmail.com>

applied, thanks!
diff mbox series

Patch

diff --git a/teamd/teamd_runner_lacp.c b/teamd/teamd_runner_lacp.c
index ec01237..11d02f1 100644
--- a/teamd/teamd_runner_lacp.c
+++ b/teamd/teamd_runner_lacp.c
@@ -996,8 +996,7 @@  static int lacp_port_set_state(struct lacp_port *lacp_port,
 		return err;
 
 	lacp_port_actor_update(lacp_port);
-	if (lacp_port->periodic_on)
-		return 0;
+
 	return lacpdu_send(lacp_port);
 }
 
@@ -1110,9 +1109,10 @@  static int lacpdu_recv(struct lacp_port *lacp_port)
 	if (err)
 		return err;
 
+	lacp_port_actor_update(lacp_port);
+
 	/* Check if the other side has correct info about us */
-	if (!lacp_port->periodic_on &&
-	    memcmp(&lacpdu.partner, &lacp_port->actor,
+	if (memcmp(&lacpdu.partner, &lacp_port->actor,
 		   sizeof(struct lacpdu_info))) {
 		err = lacpdu_send(lacp_port);
 		if (err)