File tree 2 files changed +59
-0
lines changed 2 files changed +59
-0
lines changed Original file line number Diff line number Diff line change @@ -97,6 +97,10 @@ extern struct sk_buff *vlan_untag(struct sk_buff *skb);
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 )
@@ -136,6 +140,17 @@ static inline int vlan_vid_add(struct net_device *dev, unsigned short vid)
136
140
static inline void vlan_vid_del (struct net_device * dev , unsigned short vid )
137
141
{
138
142
}
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
+ }
139
154
#endif
140
155
141
156
/**
Original file line number Diff line number Diff line change @@ -321,3 +321,47 @@ void vlan_vid_del(struct net_device *dev, unsigned short vid)
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 );
You can’t perform that action at this time.
0 commit comments