diff options
Diffstat (limited to 'net/ipv4/ipip.c')
-rw-r--r-- | net/ipv4/ipip.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index 2d0f99bf61b..715338a1b20 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c | |||
@@ -348,9 +348,6 @@ static int ipip_err(struct sk_buff *skb, u32 info) | |||
348 | case ICMP_PORT_UNREACH: | 348 | case ICMP_PORT_UNREACH: |
349 | /* Impossible event. */ | 349 | /* Impossible event. */ |
350 | return 0; | 350 | return 0; |
351 | case ICMP_FRAG_NEEDED: | ||
352 | /* Soft state for pmtu is maintained by IP core. */ | ||
353 | return 0; | ||
354 | default: | 351 | default: |
355 | /* All others are translated to HOST_UNREACH. | 352 | /* All others are translated to HOST_UNREACH. |
356 | rfc2003 contains "deep thoughts" about NET_UNREACH, | 353 | rfc2003 contains "deep thoughts" about NET_UNREACH, |
@@ -369,7 +366,17 @@ static int ipip_err(struct sk_buff *skb, u32 info) | |||
369 | 366 | ||
370 | rcu_read_lock(); | 367 | rcu_read_lock(); |
371 | t = ipip_tunnel_lookup(dev_net(skb->dev), iph->daddr, iph->saddr); | 368 | t = ipip_tunnel_lookup(dev_net(skb->dev), iph->daddr, iph->saddr); |
372 | if (t == NULL || t->parms.iph.daddr == 0) | 369 | if (t == NULL) |
370 | goto out; | ||
371 | |||
372 | if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) { | ||
373 | ipv4_update_pmtu(skb, dev_net(skb->dev), info, | ||
374 | t->dev->ifindex, 0, IPPROTO_IPIP, 0); | ||
375 | err = 0; | ||
376 | goto out; | ||
377 | } | ||
378 | |||
379 | if (t->parms.iph.daddr == 0) | ||
373 | goto out; | 380 | goto out; |
374 | 381 | ||
375 | err = 0; | 382 | err = 0; |