File tree Expand file tree Collapse file tree 2 files changed +59
-0
lines changed Expand file tree Collapse file tree 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);
9797extern int vlan_vid_add (struct net_device * dev , unsigned short vid );
9898extern 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
101105static 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)
136140static 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/**
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)
321321 }
322322}
323323EXPORT_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