From: Jiri Pirko Date: Thu, 8 Dec 2011 04:11:19 +0000 Subject: [10/23] vlan: introduce functions to do mass addition/deletion of vids by another device commit 348a1443cc4303c72cf1ee3b26e476fec8e7b5fa upstream. Introduce functions handy to copy vlan ids from one driver's list to another. Signed-off-by: Jiri Pirko Signed-off-by: David S. Miller [bwh: Assume ndo_vlan_rx_add_id still returns void] --- --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h @@ -112,6 +112,10 @@ extern int vlan_vid_add(struct net_device *dev, unsigned short vid); extern void vlan_vid_del(struct net_device *dev, unsigned short vid); +extern int vlan_vids_add_by_dev(struct net_device *dev, + const struct net_device *by_dev); +extern void vlan_vids_del_by_dev(struct net_device *dev, + const struct net_device *by_dev); #else static inline struct net_device * __vlan_find_dev_deep(struct net_device *real_dev, u16 vlan_id) @@ -151,6 +155,16 @@ static inline void vlan_vid_del(struct net_device *dev, unsigned short vid) { } + +static inline int vlan_vids_add_by_dev(struct net_device *dev, + const struct net_device *by_dev) +{ +} + +static inline void vlan_vids_del_by_dev(struct net_device *dev, + const struct net_device *by_dev) +{ +} #endif /** --- a/net/8021q/vlan_core.c +++ b/net/8021q/vlan_core.c @@ -202,3 +202,34 @@ } } EXPORT_SYMBOL(vlan_vid_del); + +int vlan_vids_add_by_dev(struct net_device *dev, + const struct net_device *by_dev) +{ + struct vlan_vid_info *vid_info; + + ASSERT_RTNL(); + + if (!by_dev->vlan_info) + return; + + list_for_each_entry(vid_info, &by_dev->vlan_info->vid_list, list) { + vlan_vid_add(dev, vid_info->vid); + } + return 0; +} +EXPORT_SYMBOL(vlan_vids_add_by_dev); + +void vlan_vids_del_by_dev(struct net_device *dev, + const struct net_device *by_dev) +{ + struct vlan_vid_info *vid_info; + + ASSERT_RTNL(); + + if (!by_dev->vlan_info) + return; + + list_for_each_entry(vid_info, &by_dev->vlan_info->vid_list, list) + vlan_vid_del(dev, vid_info->vid); +}