Skip to content

Commit 348a144

Browse files
Jiri Pirkodavem330
Jiri Pirko
authored andcommitted
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 <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 5b9ea6e commit 348a144

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

include/linux/if_vlan.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ extern struct sk_buff *vlan_untag(struct sk_buff *skb);
9797
extern int vlan_vid_add(struct net_device *dev, unsigned short vid);
9898
extern void vlan_vid_del(struct net_device *dev, unsigned short vid);
9999

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);
100104
#else
101105
static inline struct net_device *
102106
__vlan_find_dev_deep(struct net_device *real_dev, u16 vlan_id)
@@ -136,6 +140,17 @@ static inline int vlan_vid_add(struct net_device *dev, unsigned short vid)
136140
static inline void vlan_vid_del(struct net_device *dev, unsigned short vid)
137141
{
138142
}
143+
144+
static inline int vlan_vids_add_by_dev(struct net_device *dev,
145+
const struct net_device *by_dev)
146+
{
147+
return 0;
148+
}
149+
150+
static inline void vlan_vids_del_by_dev(struct net_device *dev,
151+
const struct net_device *by_dev)
152+
{
153+
}
139154
#endif
140155

141156
/**

net/8021q/vlan_core.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,3 +321,47 @@ void vlan_vid_del(struct net_device *dev, unsigned short vid)
321321
}
322322
}
323323
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);

0 commit comments

Comments
 (0)