diff options
author | Jiri Pirko <jpirko@redhat.com> | 2011-12-07 23:11:19 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-12-08 19:52:42 -0500 |
commit | 348a1443cc4303c72cf1ee3b26e476fec8e7b5fa (patch) | |
tree | da134720dcdf4ce0cf8ba0f49cd9ee6b5dd0036b /net/8021q | |
parent | 5b9ea6e022e9ba0fe39cb349ac40361f78d5da5b (diff) |
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 329e0313e01..1414c931bd3 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) | |||
321 | } | 321 | } |
322 | } | 322 | } |
323 | EXPORT_SYMBOL(vlan_vid_del); | 323 | EXPORT_SYMBOL(vlan_vid_del); |
324 | |||
325 | int vlan_vids_add_by_dev(struct net_device *dev, | ||
326 | const struct net_device *by_dev) | ||
327 | { | ||
328 | struct vlan_vid_info *vid_info; | ||
329 | int err; | ||
330 | |||
331 | ASSERT_RTNL(); | ||
332 | |||
333 | if (!by_dev->vlan_info) | ||
334 | return 0; | ||
335 | |||
336 | list_for_each_entry(vid_info, &by_dev->vlan_info->vid_list, list) { | ||
337 | err = vlan_vid_add(dev, vid_info->vid); | ||
338 | if (err) | ||
339 | goto unwind; | ||
340 | } | ||
341 | return 0; | ||
342 | |||
343 | unwind: | ||
344 | list_for_each_entry_continue_reverse(vid_info, | ||
345 | &by_dev->vlan_info->vid_list, | ||
346 | list) { | ||
347 | vlan_vid_del(dev, vid_info->vid); | ||
348 | } | ||
349 | |||
350 | return err; | ||
351 | } | ||
352 | EXPORT_SYMBOL(vlan_vids_add_by_dev); | ||
353 | |||
354 | void vlan_vids_del_by_dev(struct net_device *dev, | ||
355 | const struct net_device *by_dev) | ||
356 | { | ||
357 | struct vlan_vid_info *vid_info; | ||
358 | |||
359 | ASSERT_RTNL(); | ||
360 | |||
361 | if (!by_dev->vlan_info) | ||
362 | return; | ||
363 | |||
364 | list_for_each_entry(vid_info, &by_dev->vlan_info->vid_list, list) | ||
365 | vlan_vid_del(dev, vid_info->vid); | ||
366 | } | ||
367 | EXPORT_SYMBOL(vlan_vids_del_by_dev); | ||