diff options
author | Jiri Pirko <jpirko@redhat.com> | 2011-12-08 05:11:19 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-12-09 01:52:42 +0100 |
commit | 348a1443cc4303c72cf1ee3b26e476fec8e7b5fa (patch) | |
tree | da134720dcdf4ce0cf8ba0f49cd9ee6b5dd0036b /net/8021q | |
parent | vlan: introduce vid list with reference counting (diff) | |
download | linux-348a1443cc4303c72cf1ee3b26e476fec8e7b5fa.tar.xz linux-348a1443cc4303c72cf1ee3b26e476fec8e7b5fa.zip |
vlan: introduce functions to do mass addition/deletion of vids by another device
Introduce functions handy to copy vlan ids from one driver's list to
another.
Signed-off-by: Jiri Pirko <jpirko@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/8021q')
-rw-r--r-- | net/8021q/vlan_core.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c index 329e0313e01f..1414c931bd3f 100644 --- a/net/8021q/vlan_core.c +++ b/net/8021q/vlan_core.c @@ -321,3 +321,47 @@ void vlan_vid_del(struct net_device *dev, unsigned short vid) } } 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; + int err; + + ASSERT_RTNL(); + + if (!by_dev->vlan_info) + return 0; + + list_for_each_entry(vid_info, &by_dev->vlan_info->vid_list, list) { + err = vlan_vid_add(dev, vid_info->vid); + if (err) + goto unwind; + } + return 0; + +unwind: + list_for_each_entry_continue_reverse(vid_info, + &by_dev->vlan_info->vid_list, + list) { + vlan_vid_del(dev, vid_info->vid); + } + + return err; +} +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); +} +EXPORT_SYMBOL(vlan_vids_del_by_dev); |