~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/ipv6/tunnel6.c

Version: ~ [ linux-5.16-rc3 ] ~ [ linux-5.15.5 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.82 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.162 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.218 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.256 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.291 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.293 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /net/ipv6/tunnel6.c (Version linux-4.13.16) and /net/ipv6/tunnel6.c (Version linux-5.14.11)


** Warning: Cannot open xref database.

  1 /*                                                  1 
  2  * Copyright (C)2003,2004 USAGI/WIDE Project      
  3  *                                                
  4  * This program is free software; you can redi    
  5  * it under the terms of the GNU General Publi    
  6  * the Free Software Foundation; either versio    
  7  * (at your option) any later version.            
  8  *                                                
  9  * This program is distributed in the hope tha    
 10  * but WITHOUT ANY WARRANTY; without even the     
 11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR    
 12  * GNU General Public License for more details    
 13  *                                                
 14  * You should have received a copy of the GNU     
 15  * along with this program; if not, see <http:    
 16  *                                                
 17  * Authors      Mitsuru KANDA  <mk@linux-ipv6.    
 18  *              YOSHIFUJI Hideaki <yoshfuji@li    
 19  */                                               
 20                                                   
 21 #define pr_fmt(fmt) "IPv6: " fmt                  
 22                                                   
 23 #include <linux/icmpv6.h>                         
 24 #include <linux/init.h>                           
 25 #include <linux/module.h>                         
 26 #include <linux/mutex.h>                          
 27 #include <linux/netdevice.h>                      
 28 #include <linux/skbuff.h>                         
 29 #include <linux/slab.h>                           
 30 #include <net/ipv6.h>                             
 31 #include <net/protocol.h>                         
 32 #include <net/xfrm.h>                             
 33                                                   
 34 static struct xfrm6_tunnel __rcu *tunnel6_hand    
 35 static struct xfrm6_tunnel __rcu *tunnel46_han    
 36 static DEFINE_MUTEX(tunnel6_mutex);               
 37                                                   
 38 int xfrm6_tunnel_register(struct xfrm6_tunnel     
 39 {                                                 
 40         struct xfrm6_tunnel __rcu **pprev;        
 41         struct xfrm6_tunnel *t;                   
 42         int ret = -EEXIST;                        
 43         int priority = handler->priority;         
 44                                                   
 45         mutex_lock(&tunnel6_mutex);               
 46                                                   
 47         for (pprev = (family == AF_INET6) ? &t    
 48              (t = rcu_dereference_protected(*p    
 49                         lockdep_is_held(&tunne    
 50              pprev = &t->next) {                  
 51                 if (t->priority > priority)       
 52                         break;                    
 53                 if (t->priority == priority)      
 54                         goto err;                 
 55         }                                         
 56                                                   
 57         handler->next = *pprev;                   
 58         rcu_assign_pointer(*pprev, handler);      
 59                                                   
 60         ret = 0;                                  
 61                                                   
 62 err:                                              
 63         mutex_unlock(&tunnel6_mutex);             
 64                                                   
 65         return ret;                               
 66 }                                                 
 67 EXPORT_SYMBOL(xfrm6_tunnel_register);             
 68                                                   
 69 int xfrm6_tunnel_deregister(struct xfrm6_tunne    
 70 {                                                 
 71         struct xfrm6_tunnel __rcu **pprev;        
 72         struct xfrm6_tunnel *t;                   
 73         int ret = -ENOENT;                        
 74                                                   
 75         mutex_lock(&tunnel6_mutex);               
 76                                                   
 77         for (pprev = (family == AF_INET6) ? &t    
 78              (t = rcu_dereference_protected(*p    
 79                         lockdep_is_held(&tunne    
 80              pprev = &t->next) {                  
 81                 if (t == handler) {               
 82                         *pprev = handler->next    
 83                         ret = 0;                  
 84                         break;                    
 85                 }                                 
 86         }                                         
 87                                                   
 88         mutex_unlock(&tunnel6_mutex);             
 89                                                   
 90         synchronize_net();                        
 91                                                   
 92         return ret;                               
 93 }                                                 
 94 EXPORT_SYMBOL(xfrm6_tunnel_deregister);           
 95                                                   
 96 #define for_each_tunnel_rcu(head, handler)        
 97         for (handler = rcu_dereference(head);     
 98              handler != NULL;                     
 99              handler = rcu_dereference(handler    
100                                                   
101 static int tunnel6_rcv(struct sk_buff *skb)       
102 {                                                 
103         struct xfrm6_tunnel *handler;             
104                                                   
105         if (!pskb_may_pull(skb, sizeof(struct     
106                 goto drop;                        
107                                                   
108         for_each_tunnel_rcu(tunnel6_handlers,     
109                 if (!handler->handler(skb))       
110                         return 0;                 
111                                                   
112         icmpv6_send(skb, ICMPV6_DEST_UNREACH,     
113                                                   
114 drop:                                             
115         kfree_skb(skb);                           
116         return 0;                                 
117 }                                                 
118                                                   
119 static int tunnel46_rcv(struct sk_buff *skb)      
120 {                                                 
121         struct xfrm6_tunnel *handler;             
122                                                   
123         if (!pskb_may_pull(skb, sizeof(struct     
124                 goto drop;                        
125                                                   
126         for_each_tunnel_rcu(tunnel46_handlers,    
127                 if (!handler->handler(skb))       
128                         return 0;                 
129                                                   
130         icmpv6_send(skb, ICMPV6_DEST_UNREACH,     
131                                                   
132 drop:                                             
133         kfree_skb(skb);                           
134         return 0;                                 
135 }                                                 
136                                                   
137 static void tunnel6_err(struct sk_buff *skb, s    
138                         u8 type, u8 code, int     
139 {                                                 
140         struct xfrm6_tunnel *handler;             
141                                                   
142         for_each_tunnel_rcu(tunnel6_handlers,     
143                 if (!handler->err_handler(skb,    
144                         break;                    
145 }                                                 
146                                                   
147 static void tunnel46_err(struct sk_buff *skb,     
148                          u8 type, u8 code, int    
149 {                                                 
150         struct xfrm6_tunnel *handler;             
151                                                   
152         for_each_tunnel_rcu(tunnel46_handlers,    
153                 if (!handler->err_handler(skb,    
154                         break;                    
155 }                                                 
156                                                   
157 static const struct inet6_protocol tunnel6_pro    
158         .handler        = tunnel6_rcv,            
159         .err_handler    = tunnel6_err,            
160         .flags          = INET6_PROTO_NOPOLICY    
161 };                                                
162                                                   
163 static const struct inet6_protocol tunnel46_pr    
164         .handler        = tunnel46_rcv,           
165         .err_handler    = tunnel46_err,           
166         .flags          = INET6_PROTO_NOPOLICY    
167 };                                                
168                                                   
169 static int __init tunnel6_init(void)              
170 {                                                 
171         if (inet6_add_protocol(&tunnel6_protoc    
172                 pr_err("%s: can't add protocol    
173                 return -EAGAIN;                   
174         }                                         
175         if (inet6_add_protocol(&tunnel46_proto    
176                 pr_err("%s: can't add protocol    
177                 inet6_del_protocol(&tunnel6_pr    
178                 return -EAGAIN;                   
179         }                                         
180         return 0;                                 
181 }                                                 
182                                                   
183 static void __exit tunnel6_fini(void)             
184 {                                                 
185         if (inet6_del_protocol(&tunnel46_proto    
186                 pr_err("%s: can't remove proto    
187         if (inet6_del_protocol(&tunnel6_protoc    
188                 pr_err("%s: can't remove proto    
189 }                                                 
190                                                   
191 module_init(tunnel6_init);                        
192 module_exit(tunnel6_fini);                        
193 MODULE_LICENSE("GPL");                            
194                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp