62 lines
2.1 KiB
Diff
62 lines
2.1 KiB
Diff
From 9ca6bf9bad49d1e3f7fa01c719c075f79c184336 Mon Sep 17 00:00:00 2001
|
|
Message-Id: <9ca6bf9bad49d1e3f7fa01c719c075f79c184336.1588051704.git.lucien.xin@gmail.com>
|
|
In-Reply-To: <f32310b9a5cc0322d8f5c85d94e3866326bc68ce.1588051704.git.lucien.xin@gmail.com>
|
|
References: <f32310b9a5cc0322d8f5c85d94e3866326bc68ce.1588051704.git.lucien.xin@gmail.com>
|
|
From: Hangbin Liu <liuhangbin@gmail.com>
|
|
Date: Wed, 4 Dec 2019 15:17:11 +0800
|
|
Subject: [PATCH 2/4] teamd: update ctx->hwaddr after setting team dev to new
|
|
hwaddr
|
|
|
|
When adding the first slave to team dev, the team dev's hwaddr will
|
|
be updated to this slave's hwaddr in function:
|
|
teamd_event_watch_port_added()
|
|
- teamd_hwaddr_check_change(),
|
|
But we didn't update the ctx->hwaddr, which is still the team's init hwaddr.
|
|
|
|
Later in the following functions:
|
|
lacp_port_set_mac()
|
|
lb_event_watch_port_added()
|
|
ab_hwaddr_policy_same_all_port_added()
|
|
they will set the first slave's hwaddr to team's init hwaddr(ctx->hwaddr).
|
|
|
|
This will cause that the first slave(most likely the active slave)'s hwaddr
|
|
changes to team dev's original hwaddr, and later back to its old hwaddr
|
|
again, which would make the LACPDUs have different Actor System IDs.
|
|
|
|
Fix it by updating ctx->hwaddr when set ctx->ifindex to new hwaddr.
|
|
|
|
Note that teamd_set_hwaddr() doesn't need this fix as it will set
|
|
ctx->hwaddr_explicit = true.
|
|
|
|
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
|
|
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
|
---
|
|
teamd/teamd.c | 4 +++-
|
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/teamd/teamd.c b/teamd/teamd.c
|
|
index 9744021..e035ac5 100644
|
|
--- a/teamd/teamd.c
|
|
+++ b/teamd/teamd.c
|
|
@@ -867,7 +867,7 @@ static int teamd_add_ports(struct teamd_context *ctx)
|
|
static int teamd_hwaddr_check_change(struct teamd_context *ctx,
|
|
struct teamd_port *tdport)
|
|
{
|
|
- const char *hwaddr;
|
|
+ char *hwaddr;
|
|
unsigned char hwaddr_len;
|
|
int err;
|
|
|
|
@@ -885,6 +885,8 @@ static int teamd_hwaddr_check_change(struct teamd_context *ctx,
|
|
teamd_log_err("Failed to set team device hardware address.");
|
|
return err;
|
|
}
|
|
+ ctx->hwaddr = hwaddr;
|
|
+ ctx->hwaddr_len = hwaddr_len;
|
|
return 0;
|
|
}
|
|
|
|
--
|
|
2.1.0
|
|
|