Commit 32a806c1 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

bonding: flush unicast and multicast lists when changing type

After the type change, addresses in unicast and multicast lists wouldn't make
sense, not to mention possible different lenghts. So flush both lists here.

Note "dev_addr_discard" will be very soon replaced by "dev_mc_flush" (once
mc_list conversion will be done).
Signed-off-by: default avatarJiri Pirko <jpirko@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 755d0e77
...@@ -1490,6 +1490,10 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) ...@@ -1490,6 +1490,10 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
goto err_undo_flags; goto err_undo_flags;
} }
/* Flush unicast and multicast addresses */
dev_unicast_flush(bond_dev);
dev_addr_discard(bond_dev);
if (slave_dev->type != ARPHRD_ETHER) if (slave_dev->type != ARPHRD_ETHER)
bond_setup_by_slave(bond_dev, slave_dev); bond_setup_by_slave(bond_dev, slave_dev);
else else
......
...@@ -1994,10 +1994,12 @@ extern int dev_unicast_delete(struct net_device *dev, void *addr); ...@@ -1994,10 +1994,12 @@ extern int dev_unicast_delete(struct net_device *dev, void *addr);
extern int dev_unicast_add(struct net_device *dev, void *addr); extern int dev_unicast_add(struct net_device *dev, void *addr);
extern int dev_unicast_sync(struct net_device *to, struct net_device *from); extern int dev_unicast_sync(struct net_device *to, struct net_device *from);
extern void dev_unicast_unsync(struct net_device *to, struct net_device *from); extern void dev_unicast_unsync(struct net_device *to, struct net_device *from);
extern void dev_unicast_flush(struct net_device *dev);
extern int dev_mc_delete(struct net_device *dev, void *addr, int alen, int all); extern int dev_mc_delete(struct net_device *dev, void *addr, int alen, int all);
extern int dev_mc_add(struct net_device *dev, void *addr, int alen, int newonly); extern int dev_mc_add(struct net_device *dev, void *addr, int alen, int newonly);
extern int dev_mc_sync(struct net_device *to, struct net_device *from); extern int dev_mc_sync(struct net_device *to, struct net_device *from);
extern void dev_mc_unsync(struct net_device *to, struct net_device *from); extern void dev_mc_unsync(struct net_device *to, struct net_device *from);
extern void dev_addr_discard(struct net_device *dev);
extern int __dev_addr_delete(struct dev_addr_list **list, int *count, void *addr, int alen, int all); extern int __dev_addr_delete(struct dev_addr_list **list, int *count, void *addr, int alen, int all);
extern int __dev_addr_add(struct dev_addr_list **list, int *count, void *addr, int alen, int newonly); extern int __dev_addr_add(struct dev_addr_list **list, int *count, void *addr, int alen, int newonly);
extern int __dev_addr_sync(struct dev_addr_list **to, int *to_count, struct dev_addr_list **from, int *from_count); extern int __dev_addr_sync(struct dev_addr_list **to, int *to_count, struct dev_addr_list **from, int *from_count);
......
...@@ -4457,12 +4457,13 @@ void dev_unicast_unsync(struct net_device *to, struct net_device *from) ...@@ -4457,12 +4457,13 @@ void dev_unicast_unsync(struct net_device *to, struct net_device *from)
} }
EXPORT_SYMBOL(dev_unicast_unsync); EXPORT_SYMBOL(dev_unicast_unsync);
static void dev_unicast_flush(struct net_device *dev) void dev_unicast_flush(struct net_device *dev)
{ {
netif_addr_lock_bh(dev); netif_addr_lock_bh(dev);
__hw_addr_flush(&dev->uc); __hw_addr_flush(&dev->uc);
netif_addr_unlock_bh(dev); netif_addr_unlock_bh(dev);
} }
EXPORT_SYMBOL(dev_unicast_flush);
static void dev_unicast_init(struct net_device *dev) static void dev_unicast_init(struct net_device *dev)
{ {
...@@ -4484,7 +4485,7 @@ static void __dev_addr_discard(struct dev_addr_list **list) ...@@ -4484,7 +4485,7 @@ static void __dev_addr_discard(struct dev_addr_list **list)
} }
} }
static void dev_addr_discard(struct net_device *dev) void dev_addr_discard(struct net_device *dev)
{ {
netif_addr_lock_bh(dev); netif_addr_lock_bh(dev);
...@@ -4493,6 +4494,7 @@ static void dev_addr_discard(struct net_device *dev) ...@@ -4493,6 +4494,7 @@ static void dev_addr_discard(struct net_device *dev)
netif_addr_unlock_bh(dev); netif_addr_unlock_bh(dev);
} }
EXPORT_SYMBOL(dev_addr_discard);
/** /**
* dev_get_flags - get flags reported to userspace * dev_get_flags - get flags reported to userspace
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment