From: Vladimir Oltean <vladimir.olt...@nxp.com> DSA switches need to keep the list of addresses which are filtered towards the CPU port. One DSA switch can have 1 CPU port and many front-panel (user) ports, each user port having its own MAC address (they can potentially be all the same MAC address). Filtering towards the CPU port means adding a FDB address for each user port MAC address that sends that address to the CPU. There is no net_device associated with the CPU port. So the DSA switches need to keep their own reference counting of MAC addresses for which a FDB entry is installed or removed on the CPU port. Permit that by exporting the raw helpers instead of operating on a struct net_device.
Signed-off-by: Vladimir Oltean <vladimir.olt...@nxp.com> --- include/linux/netdevice.h | 7 +++++++ net/core/dev_addr_lists.c | 17 ++++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 2d11b93f3af4..239efd209c33 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -4307,6 +4307,13 @@ void __hw_addr_unsync_dev(struct netdev_hw_addr_list *list, int (*unsync)(struct net_device *, const unsigned char *)); void __hw_addr_init(struct netdev_hw_addr_list *list); +void __hw_addr_flush(struct netdev_hw_addr_list *list); +int __hw_addr_add(struct netdev_hw_addr_list *list, + const unsigned char *addr, int addr_len, + unsigned char addr_type); +int __hw_addr_del(struct netdev_hw_addr_list *list, + const unsigned char *addr, int addr_len, + unsigned char addr_type); /* Functions used for device addresses handling */ int dev_addr_add(struct net_device *dev, const unsigned char *addr, diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c index 90eaa99b19e5..e307ae7d2a44 100644 --- a/net/core/dev_addr_lists.c +++ b/net/core/dev_addr_lists.c @@ -77,13 +77,14 @@ static int __hw_addr_add_ex(struct netdev_hw_addr_list *list, sync); } -static int __hw_addr_add(struct netdev_hw_addr_list *list, - const unsigned char *addr, int addr_len, - unsigned char addr_type) +int __hw_addr_add(struct netdev_hw_addr_list *list, + const unsigned char *addr, int addr_len, + unsigned char addr_type) { return __hw_addr_add_ex(list, addr, addr_len, addr_type, false, false, 0); } +EXPORT_SYMBOL(__hw_addr_add); static int __hw_addr_del_entry(struct netdev_hw_addr_list *list, struct netdev_hw_addr *ha, bool global, @@ -123,12 +124,13 @@ static int __hw_addr_del_ex(struct netdev_hw_addr_list *list, return -ENOENT; } -static int __hw_addr_del(struct netdev_hw_addr_list *list, - const unsigned char *addr, int addr_len, - unsigned char addr_type) +int __hw_addr_del(struct netdev_hw_addr_list *list, + const unsigned char *addr, int addr_len, + unsigned char addr_type) { return __hw_addr_del_ex(list, addr, addr_len, addr_type, false, false); } +EXPORT_SYMBOL(__hw_addr_del); static int __hw_addr_sync_one(struct netdev_hw_addr_list *to_list, struct netdev_hw_addr *ha, @@ -403,7 +405,7 @@ void __hw_addr_unsync_dev(struct netdev_hw_addr_list *list, } EXPORT_SYMBOL(__hw_addr_unsync_dev); -static void __hw_addr_flush(struct netdev_hw_addr_list *list) +void __hw_addr_flush(struct netdev_hw_addr_list *list) { struct netdev_hw_addr *ha, *tmp; @@ -413,6 +415,7 @@ static void __hw_addr_flush(struct netdev_hw_addr_list *list) } list->count = 0; } +EXPORT_SYMBOL(__hw_addr_flush); void __hw_addr_init(struct netdev_hw_addr_list *list) { -- 2.25.1