Message ID | 1381130240-3561-1-git-send-email-vfalico@redhat.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
From: Veaceslav Falico <vfalico@redhat.com> Date: Mon, 7 Oct 2013 09:17:20 +0200 > Currently, in TLB mode we change mac addresses only by memcpy-ing the to > net_device->dev_addr, without actually setting them via > dev_set_mac_address(). This permits us to receive all the traffic always on > one mac address. > > However, in case the interface flips, some drivers might enforce the > mac filtering for its FW/HW based on current ->dev_addr, and thus we won't > be able to receive traffic on that interface, in case it will be selected > as active in TLB mode. > > Fix it by setting the mac address forcefully on every new active slave that > we select in TLB mode. > > CC: Jay Vosburgh <fubar@us.ibm.com> > CC: Andy Gospodarek <andy@greyhouse.net> > CC: Yuval Mintz <yuvalmin@broadcom.com> > Reported-by: Yuval Mintz <yuvalmin@broadcom.com> > Tested-by: Yuval Mintz <yuvalmin@broadcom.com> > Signed-off-by: Veaceslav Falico <vfalico@redhat.com> Since we hole the RTNL during this tricky operation I guess this is fine. Applied, thanks. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c index e960418..576ccea 100644 --- a/drivers/net/bonding/bond_alb.c +++ b/drivers/net/bonding/bond_alb.c @@ -1699,6 +1699,23 @@ void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave ASSERT_RTNL(); + /* in TLB mode, the slave might flip down/up with the old dev_addr, + * and thus filter bond->dev_addr's packets, so force bond's mac + */ + if (bond->params.mode == BOND_MODE_TLB) { + struct sockaddr sa; + u8 tmp_addr[ETH_ALEN]; + + memcpy(tmp_addr, new_slave->dev->dev_addr, ETH_ALEN); + + memcpy(sa.sa_data, bond->dev->dev_addr, bond->dev->addr_len); + sa.sa_family = bond->dev->type; + /* we don't care if it can't change its mac, best effort */ + dev_set_mac_address(new_slave->dev, &sa); + + memcpy(new_slave->dev->dev_addr, tmp_addr, ETH_ALEN); + } + /* curr_active_slave must be set before calling alb_swap_mac_addr */ if (swap_slave) { /* swap mac address */