NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

kern/41472: IPv6 Path MTU Discovery doesn't work in rare case.



>Number:         41472
>Category:       kern
>Synopsis:       IPv6 Path MTU Discovery doesn't work in rare case.
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Fri May 22 08:25:00 +0000 2009
>Originator:     SUENAGA Hiroki
>Release:        HEAD of netbsd-4-0
>Organization:
Internet Initiative Japan Inc.
>Environment:
hsuenaga@sue-dev:/usr/src/sys/netinet6 > uname -a
NetBSD sue-dev.iij.ad.jp 4.0 NetBSD 4.0 (GENERIC) #0: Sun Dec 16 00:20:10 PST 
2007  
builds@wb34:/home/builds/ab/netbsd-4-0-RELEASE/i386/200712160005Z-obj/home/builds/ab/netbsd-4-0-RELEASE/src/sys/arch/i386/compile/GENERIC
 i386


>Description:
IPv6 Path MTU Discovery doen't work in rare case. For example, 

  - NetBSD received an ICMP6 Packet Too Big message with MTU < 1272
  - And,  NetBSD received an ICMP6 ECHO Request
  - Then NetBSD sends an ICMP6 ECHO Reply with link MTU. This violates RFC 1981.
     NetBSD must send the ECHO Reply with MTU=1280 and must include a fragment 
header.

RFC1981 says following:

 - RFC1981 Path MTU Dicovery for IP version 6
   - Section 4. Protocol Requirements
      ...
      A node MUST NOT reduce its estimate of the Path MTU below the IPv6
      minimum link MTU.

        Note: A node may receive a Packet Too Big message reporting a
        next-hop MTU that is less than the IPv6 minimum link MTU. In that
        case, the node is not required to reduce the size of subsequent
        packets sent on the path to less than the IPv6 minimun link MTU,
        but rather must include a Fragment header in those packets [IPv6-
        SPEC].

The cause of this problem is  src/sys/icmp6.c::icmp6_mtudisc_update(). The code 
discards a Packet Too Big message when the message is reporting MTU < 1272 and 
there is no connected-pcb matched to the message. But there are flows that 
don't have connected-pcb. For example, ICMPv6 ECHO, gif tunnels, IPsec tunnels, 
and so on. We should care such flows.

My proposal is following patch:
===================================================================
RCS file: /cvsroot/src/sys/netinet6/icmp6.c,v
retrieving revision 1.152
diff -u -r1.152 icmp6.c
--- icmp6.c     18 Mar 2009 16:00:22 -0000      1.152
+++ icmp6.c     22 May 2009 07:11:37 -0000
@@ -1092,8 +1092,16 @@
                /* is the mtu even sane? */
                if (mtu < sizeof(struct ip6_hdr) + sizeof(struct ip6_frag) + 8)
                        return;
+#if 0
+               /*
+                * This code may violate RFC 1981 section 4.
+                *
+                * We need to care traffic from non-connected pcb.
+                * For example, ECHO Request/Reply don't have connected pcb.
+                */
                if (!validated)
                        return;
+#endif
                mtu = IPV6_MMTU - sizeof(struct ip6_frag);
        }
===================================================================

Recording Path MTU of all non-connected flow may cause a resource problem. We 
should care this problem too. To ignore non-connected flow(original code) is 
one of the solutions. But the care can be achieved in other way. It seems that 
icmp6_mtudisc_update() has codes to deal the resource problem around line 1113. 
The codes is not enough at this time, but I think that improving the codes is 
good way to solve the resource problem.

This problem found on IPv6 Conformance test tool from TAHI project 
(http://www.tahi.org/). The test tool is used in IPv6 Ready LOGO 
program(http://www.ipv6ready.org/). I try to acquire the IPv6 Ready LOGO on our 
product which is based on NetBSD. And I found the test tool reports NG on Path 
MTU Discovery. After applied above patch, the test tool reports OK.

>How-To-Repeat:
1. Send an ICMPv6 Packet Too Big message with MTU < 1272 to NetBSD.
2. Send an ICMPv6 Echo Request to NetBSD.
3. NetBSD sends invalid ICMPv6 Echo reply.

Or use the test tool from TAHI project. Try following test.
  - Section 4: RFC 1981 - Path MTU Discovery for IPv6
     - No.9 Part A: MTU equal to 56


>Fix:
===================================================================
RCS file: /cvsroot/src/sys/netinet6/icmp6.c,v
retrieving revision 1.152
diff -u -r1.152 icmp6.c
--- icmp6.c     18 Mar 2009 16:00:22 -0000      1.152
+++ icmp6.c     22 May 2009 07:11:37 -0000
@@ -1092,8 +1092,16 @@
                /* is the mtu even sane? */
                if (mtu < sizeof(struct ip6_hdr) + sizeof(struct ip6_frag) + 8)
                        return;
+#if 0
+               /*
+                * This code may violate RFC 1981 section 4.
+                *
+                * We need to care traffic from non-connected pcb.
+                * For example, ECHO Request/Reply don't have connected pcb.
+                */
                if (!validated)
                        return;
+#endif
                mtu = IPV6_MMTU - sizeof(struct ip6_frag);
        }
===================================================================




Home | Main Index | Thread Index | Old Index