net: add dev_uc_sync_multiple() and dev_mc_sync_multiple() api
The current implementation of dev_uc_sync/unsync() assumes that there is a strict 1-to-1 relationship between the source and destination of the sync. In other words, once an address has been synced to a destination device, it will not be synced to any other device through the sync API. However, there are some virtual devices that aggreate a number of lower devices and need to sync addresses to all of them. The current API falls short there. This patch introduces a new dev_uc_sync_multiple() api that can be called in the above circumstances and allows sync to work for every invocation. CC: Jiri Pirko <jiri@resnulli.us> Signed-off-by: Vlad Yasevich <vyasevic@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
0022d2dd4d
commit
4cd729b042
@@ -209,6 +209,7 @@ struct netdev_hw_addr {
|
||||
#define NETDEV_HW_ADDR_T_UNICAST 4
|
||||
#define NETDEV_HW_ADDR_T_MULTICAST 5
|
||||
bool global_use;
|
||||
int sync_cnt;
|
||||
int refcount;
|
||||
int synced;
|
||||
struct rcu_head rcu_head;
|
||||
@@ -2627,6 +2628,7 @@ extern int dev_uc_add(struct net_device *dev, const unsigned char *addr);
|
||||
extern int dev_uc_add_excl(struct net_device *dev, const unsigned char *addr);
|
||||
extern int dev_uc_del(struct net_device *dev, const unsigned char *addr);
|
||||
extern int dev_uc_sync(struct net_device *to, struct net_device *from);
|
||||
extern int dev_uc_sync_multiple(struct net_device *to, struct net_device *from);
|
||||
extern void dev_uc_unsync(struct net_device *to, struct net_device *from);
|
||||
extern void dev_uc_flush(struct net_device *dev);
|
||||
extern void dev_uc_init(struct net_device *dev);
|
||||
@@ -2638,6 +2640,7 @@ extern int dev_mc_add_excl(struct net_device *dev, const unsigned char *addr);
|
||||
extern int dev_mc_del(struct net_device *dev, const unsigned char *addr);
|
||||
extern int dev_mc_del_global(struct net_device *dev, const unsigned char *addr);
|
||||
extern int dev_mc_sync(struct net_device *to, struct net_device *from);
|
||||
extern int dev_mc_sync_multiple(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_flush(struct net_device *dev);
|
||||
extern void dev_mc_init(struct net_device *dev);
|
||||
|
Reference in New Issue
Block a user