@ -557,37 +557,34 @@ static void ipgre_err(struct sk_buff *skb, u32 info)
break ;
}
rcu_read_lock ( ) ;
t = ipgre_tunnel_lookup ( skb - > dev , iph - > daddr , iph - > saddr ,
flags , key , p [ 1 ] ) ;
if ( t = = NULL )
goto out ;
return ;
if ( type = = ICMP_DEST_UNREACH & & code = = ICMP_FRAG_NEEDED ) {
ipv4_update_pmtu ( skb , dev_net ( skb - > dev ) , info ,
t - > parms . link , 0 , IPPROTO_GRE , 0 ) ;
goto out ;
return ;
}
if ( type = = ICMP_REDIRECT ) {
ipv4_redirect ( skb , dev_net ( skb - > dev ) , t - > parms . link , 0 ,
IPPROTO_GRE , 0 ) ;
goto out ;
return ;
}
if ( t - > parms . iph . daddr = = 0 | |
ipv4_is_multicast ( t - > parms . iph . daddr ) )
goto out ;
return ;
if ( t - > parms . iph . ttl = = 0 & & type = = ICMP_TIME_EXCEEDED )
goto out ;
return ;
if ( time_before ( jiffies , t - > err_time + IPTUNNEL_ERR_TIMEO ) )
t - > err_count + + ;
else
t - > err_count = 1 ;
t - > err_time = jiffies ;
out :
rcu_read_unlock ( ) ;
}
static inline void ipgre_ecn_decapsulate ( const struct iphdr * iph , struct sk_buff * skb )
@ -625,7 +622,7 @@ static int ipgre_rcv(struct sk_buff *skb)
__be16 gre_proto ;
if ( ! pskb_may_pull ( skb , 16 ) )
goto drop_nolock ;
goto drop ;
iph = ip_hdr ( skb ) ;
h = skb - > data ;
@ -636,7 +633,7 @@ static int ipgre_rcv(struct sk_buff *skb)
- We do not support routing headers .
*/
if ( flags & ( GRE_VERSION | GRE_ROUTING ) )
goto drop_nolock ;
goto drop ;
if ( flags & GRE_CSUM ) {
switch ( skb - > ip_summed ) {
@ -664,7 +661,6 @@ static int ipgre_rcv(struct sk_buff *skb)
gre_proto = * ( __be16 * ) ( h + 2 ) ;
rcu_read_lock ( ) ;
tunnel = ipgre_tunnel_lookup ( skb - > dev ,
iph - > saddr , iph - > daddr , flags , key ,
gre_proto ) ;
@ -740,14 +736,11 @@ static int ipgre_rcv(struct sk_buff *skb)
netif_rx ( skb ) ;
rcu_read_unlock ( ) ;
return 0 ;
}
icmp_send ( skb , ICMP_DEST_UNREACH , ICMP_PORT_UNREACH , 0 ) ;
drop :
rcu_read_unlock ( ) ;
drop_nolock :
kfree_skb ( skb ) ;
return 0 ;
}