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;
}
}