diff options
Diffstat (limited to 'net/ipv6/sit.c')
-rw-r--r-- | net/ipv6/sit.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 60415711563f..49aea94c9be3 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
@@ -527,9 +527,6 @@ static int ipip6_err(struct sk_buff *skb, u32 info) | |||
527 | case ICMP_PORT_UNREACH: | 527 | case ICMP_PORT_UNREACH: |
528 | /* Impossible event. */ | 528 | /* Impossible event. */ |
529 | return 0; | 529 | return 0; |
530 | case ICMP_FRAG_NEEDED: | ||
531 | /* Soft state for pmtu is maintained by IP core. */ | ||
532 | return 0; | ||
533 | default: | 530 | default: |
534 | /* All others are translated to HOST_UNREACH. | 531 | /* All others are translated to HOST_UNREACH. |
535 | rfc2003 contains "deep thoughts" about NET_UNREACH, | 532 | rfc2003 contains "deep thoughts" about NET_UNREACH, |
@@ -551,7 +548,17 @@ static int ipip6_err(struct sk_buff *skb, u32 info) | |||
551 | skb->dev, | 548 | skb->dev, |
552 | iph->daddr, | 549 | iph->daddr, |
553 | iph->saddr); | 550 | iph->saddr); |
554 | if (t == NULL || t->parms.iph.daddr == 0) | 551 | if (t == NULL) |
552 | goto out; | ||
553 | |||
554 | if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) { | ||
555 | ipv4_update_pmtu(skb, dev_net(skb->dev), info, | ||
556 | t->dev->ifindex, 0, IPPROTO_IPV6, 0); | ||
557 | err = 0; | ||
558 | goto out; | ||
559 | } | ||
560 | |||
561 | if (t->parms.iph.daddr == 0) | ||
555 | goto out; | 562 | goto out; |
556 | 563 | ||
557 | err = 0; | 564 | err = 0; |