diff options
Diffstat (limited to 'net/ipv4/ip_gre.c')
-rw-r--r-- | net/ipv4/ip_gre.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index f49047b79609..594cec35ac4d 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
@@ -516,9 +516,6 @@ static void ipgre_err(struct sk_buff *skb, u32 info) | |||
516 | case ICMP_PORT_UNREACH: | 516 | case ICMP_PORT_UNREACH: |
517 | /* Impossible event. */ | 517 | /* Impossible event. */ |
518 | return; | 518 | return; |
519 | case ICMP_FRAG_NEEDED: | ||
520 | /* Soft state for pmtu is maintained by IP core. */ | ||
521 | return; | ||
522 | default: | 519 | default: |
523 | /* All others are translated to HOST_UNREACH. | 520 | /* All others are translated to HOST_UNREACH. |
524 | rfc2003 contains "deep thoughts" about NET_UNREACH, | 521 | rfc2003 contains "deep thoughts" about NET_UNREACH, |
@@ -538,7 +535,16 @@ static void ipgre_err(struct sk_buff *skb, u32 info) | |||
538 | flags & GRE_KEY ? | 535 | flags & GRE_KEY ? |
539 | *(((__be32 *)p) + (grehlen / 4) - 1) : 0, | 536 | *(((__be32 *)p) + (grehlen / 4) - 1) : 0, |
540 | p[1]); | 537 | p[1]); |
541 | if (t == NULL || t->parms.iph.daddr == 0 || | 538 | if (t == NULL) |
539 | goto out; | ||
540 | |||
541 | if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) { | ||
542 | ipv4_update_pmtu(skb, dev_net(skb->dev), info, | ||
543 | t->parms.link, 0, IPPROTO_GRE, 0); | ||
544 | goto out; | ||
545 | } | ||
546 | |||
547 | if (t->parms.iph.daddr == 0 || | ||
542 | ipv4_is_multicast(t->parms.iph.daddr)) | 548 | ipv4_is_multicast(t->parms.iph.daddr)) |
543 | goto out; | 549 | goto out; |
544 | 550 | ||