diff options
Diffstat (limited to 'net/ipv4/esp4.c')
| -rw-r--r-- | net/ipv4/esp4.c | 12 | 
1 files changed, 9 insertions, 3 deletions
diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c index b61e9deb7c7..3b4f0cd2e63 100644 --- a/net/ipv4/esp4.c +++ b/net/ipv4/esp4.c @@ -346,7 +346,10 @@ static int esp_input_done2(struct sk_buff *skb, int err)  	pskb_trim(skb, skb->len - alen - padlen - 2);  	__skb_pull(skb, hlen); -	skb_set_transport_header(skb, -ihl); +	if (x->props.mode == XFRM_MODE_TUNNEL) +		skb_reset_transport_header(skb); +	else +		skb_set_transport_header(skb, -ihl);  	err = nexthdr[1]; @@ -499,9 +502,12 @@ static void esp4_err(struct sk_buff *skb, u32 info)  	if (!x)  		return; -	if (icmp_hdr(skb)->type == ICMP_DEST_UNREACH) +	if (icmp_hdr(skb)->type == ICMP_DEST_UNREACH) { +		atomic_inc(&flow_cache_genid); +		rt_genid_bump(net); +  		ipv4_update_pmtu(skb, net, info, 0, 0, IPPROTO_ESP, 0); -	else +	} else  		ipv4_redirect(skb, net, 0, 0, IPPROTO_ESP, 0);  	xfrm_state_put(x);  }  |