Print this page
Don't create DCE for bad MTU.

*** 681,691 **** --- 681,703 ---- /* Caller has already pulled up everything. */ ip6h = (ip6_t *)&icmp6[1]; final_dst = ip_get_dst_v6(ip6h, NULL, NULL); + mtu = ntohl(icmp6->icmp6_mtu); + if (mtu < IPV6_MIN_MTU) { /* + * RFC 8021 suggests to ignore messages where mtu is + * less than the IPv6 minimum. + */ + ip1dbg(("Received mtu less than IPv6 " + "min mtu %d: %d\n", IPV6_MIN_MTU, mtu)); + DTRACE_PROBE1(icmp6__too__small__mtu, uint32_t, mtu); + return; + } + + /* * For link local destinations matching simply on address is not * sufficient. Same link local addresses for different ILL's is * possible. */ if (IN6_IS_ADDR_LINKSCOPE(&final_dst)) {
*** 703,740 **** &final_dst); } return; } - mtu = ntohl(icmp6->icmp6_mtu); - mutex_enter(&dce->dce_lock); if (dce->dce_flags & DCEF_PMTU) old_max_frag = dce->dce_pmtu; else if (IN6_IS_ADDR_MULTICAST(&final_dst)) old_max_frag = ill->ill_mc_mtu; else old_max_frag = ill->ill_mtu; - if (mtu >= IPV6_MIN_MTU) { ip1dbg(("Received mtu from router: %d\n", mtu)); DTRACE_PROBE1(icmp6__received__mtu, uint32_t, mtu); dce->dce_pmtu = MIN(old_max_frag, mtu); icmp6->icmp6_mtu = htonl(dce->dce_pmtu); /* We now have a PMTU for sure */ dce->dce_flags |= DCEF_PMTU; dce->dce_last_change_time = TICK_TO_SEC(ddi_get_lbolt64()); - } else { - /* - * RFC 8021 suggests to ignore messages where mtu is - * less than the IPv6 minimum. - */ - ip1dbg(("Received mtu less than IPv6 " - "min mtu %d: %d\n", IPV6_MIN_MTU, mtu)); - DTRACE_PROBE1(icmp6__too__small__mtu, uint32_t, mtu); - } mutex_exit(&dce->dce_lock); /* * After dropping the lock the new value is visible to everyone. * Then we bump the generation number so any cached values reinspect --- 715,740 ----