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