Skip to content

Commit

Permalink
xfrm4: Invalidate all ipv4 routes on IPsec pmtu events
Browse files Browse the repository at this point in the history
On IPsec pmtu events we can't access the transport headers of
the original packet, so we can't find the socket that sent
the packet. The only chance to notify the socket about the
pmtu change is to force a relookup for all routes. This
patch implenents this for the IPsec protocols.

Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
  • Loading branch information
Steffen Klassert committed Jan 21, 2013
1 parent 5b653b2 commit 05ab86c
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 6 deletions.
7 changes: 5 additions & 2 deletions net/ipv4/ah4.c
Original file line number Diff line number Diff line change
Expand Up @@ -420,9 +420,12 @@ static void ah4_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_AH, 0);
else
} else
ipv4_redirect(skb, net, 0, 0, IPPROTO_AH, 0);
xfrm_state_put(x);
}
Expand Down
7 changes: 5 additions & 2 deletions net/ipv4/esp4.c
Original file line number Diff line number Diff line change
Expand Up @@ -502,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);
}
Expand Down
7 changes: 5 additions & 2 deletions net/ipv4/ipcomp.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,12 @@ static void ipcomp4_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_COMP, 0);
else
} else
ipv4_redirect(skb, net, 0, 0, IPPROTO_COMP, 0);
xfrm_state_put(x);
}
Expand Down

0 comments on commit 05ab86c

Please sign in to comment.