Print this page
7819 IPv6 Packet and MTU bug

*** 21,31 **** /* * Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1990 Mentat Inc. * Copyright (c) 2012 Joyent, Inc. All rights reserved. ! * Copyright (c) 2014, OmniTI Computer Consulting, Inc. All rights reserved. */ #include <sys/types.h> #include <sys/stream.h> #include <sys/dlpi.h> --- 21,31 ---- /* * Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1990 Mentat Inc. * Copyright (c) 2012 Joyent, Inc. All rights reserved. ! * Copyright (c) 2017 OmniTI Computer Consulting, Inc. All rights reserved. */ #include <sys/types.h> #include <sys/stream.h> #include <sys/dlpi.h>
*** 3856,3869 **** pmtu = IPV6_MIN_MTU; } } /* ! * After receiving an ICMPv6 "packet too big" message with a ! * MTU < 1280, and for multirouted IPv6 packets, the IP layer ! * will insert a 8-byte fragment header in every packet. We compensate ! * for those cases by returning a smaller path MTU to the ULP. * * In the case of CGTP then ip_output will add a fragment header. * Make sure there is room for it by telling a smaller number * to the transport. * --- 3856,3868 ---- pmtu = IPV6_MIN_MTU; } } /* ! * For multirouted IPv6 packets, the IP layer will insert a 8-byte ! * fragment header in every packet. We compensate for those cases by ! * returning a smaller path MTU to the ULP. * * In the case of CGTP then ip_output will add a fragment header. * Make sure there is room for it by telling a smaller number * to the transport. *
*** 3870,3881 **** * When IXAF_IPV6_ADDR_FRAGHDR we subtract the frag hdr here * so the ULPs consistently see a iulp_pmtu and ip_get_pmtu() * which is the size of the packets it can send. */ if (!(ixa->ixa_flags & IXAF_IS_IPV4)) { ! if ((dce->dce_flags & DCEF_TOO_SMALL_PMTU) || ! (ire->ire_flags & RTF_MULTIRT) || (ixa->ixa_flags & IXAF_MULTIRT_MULTICAST)) { pmtu -= sizeof (ip6_frag_t); ixa->ixa_flags |= IXAF_IPV6_ADD_FRAGHDR; } } --- 3869,3879 ---- * When IXAF_IPV6_ADDR_FRAGHDR we subtract the frag hdr here * so the ULPs consistently see a iulp_pmtu and ip_get_pmtu() * which is the size of the packets it can send. */ if (!(ixa->ixa_flags & IXAF_IS_IPV4)) { ! if ((ire->ire_flags & RTF_MULTIRT) || (ixa->ixa_flags & IXAF_MULTIRT_MULTICAST)) { pmtu -= sizeof (ip6_frag_t); ixa->ixa_flags |= IXAF_IPV6_ADD_FRAGHDR; } }