Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Jiri Pirko and committed by
David S. Miller
348a1443 5b9ea6e0

+59
+15
include/linux/if_vlan.h
··· 97 97 extern int vlan_vid_add(struct net_device *dev, unsigned short vid); 98 98 extern void vlan_vid_del(struct net_device *dev, unsigned short vid); 99 99 100 + extern int vlan_vids_add_by_dev(struct net_device *dev, 101 + const struct net_device *by_dev); 102 + extern void vlan_vids_del_by_dev(struct net_device *dev, 103 + const struct net_device *by_dev); 100 104 #else 101 105 static inline struct net_device * 102 106 __vlan_find_dev_deep(struct net_device *real_dev, u16 vlan_id) ··· 138 134 } 139 135 140 136 static inline void vlan_vid_del(struct net_device *dev, unsigned short vid) 137 + { 138 + } 139 + 140 + static inline int vlan_vids_add_by_dev(struct net_device *dev, 141 + const struct net_device *by_dev) 142 + { 143 + return 0; 144 + } 145 + 146 + static inline void vlan_vids_del_by_dev(struct net_device *dev, 147 + const struct net_device *by_dev) 141 148 { 142 149 } 143 150 #endif
+44
net/8021q/vlan_core.c
··· 321 321 } 322 322 } 323 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);