diff --git a/sys/netinet/ip_divert.c b/sys/netinet/ip_divert.c --- a/sys/netinet/ip_divert.c +++ b/sys/netinet/ip_divert.c @@ -212,9 +212,6 @@ /* Delayed checksums are currently not compatible with divert. */ if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA) { - m = mb_unmapped_to_ext(m); - if (m == NULL) - return; in_delayed_cksum(m); m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA; } @@ -226,9 +223,6 @@ #endif #ifdef INET6 if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA_IPV6) { - m = mb_unmapped_to_ext(m); - if (m == NULL) - return; in6_delayed_cksum(m, m->m_pkthdr.len - sizeof(struct ip6_hdr), sizeof(struct ip6_hdr)); m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA_IPV6; diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c --- a/sys/netinet/ip_output.c +++ b/sys/netinet/ip_output.c @@ -733,23 +733,20 @@ } } - m->m_pkthdr.csum_flags |= CSUM_IP; - if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA & ~ifp->if_hwassist) { + /* Ensure the packet data is mapped if the interface requires it. */ + if ((ifp->if_capenable & IFCAP_MEXTPG) == 0) { m = mb_unmapped_to_ext(m); if (m == NULL) { IPSTAT_INC(ips_odropped); error = ENOBUFS; goto bad; } + } + + m->m_pkthdr.csum_flags |= CSUM_IP; + if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA & ~ifp->if_hwassist) { in_delayed_cksum(m); m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA; - } else if ((ifp->if_capenable & IFCAP_MEXTPG) == 0) { - m = mb_unmapped_to_ext(m); - if (m == NULL) { - IPSTAT_INC(ips_odropped); - error = ENOBUFS; - goto bad; - } } #if defined(SCTP) || defined(SCTP_SUPPORT) if (m->m_pkthdr.csum_flags & CSUM_SCTP & ~ifp->if_hwassist) { @@ -894,12 +891,6 @@ * fragmented packets, then do it here. */ if (m0->m_pkthdr.csum_flags & CSUM_DELAY_DATA) { - m0 = mb_unmapped_to_ext(m0); - if (m0 == NULL) { - error = ENOBUFS; - IPSTAT_INC(ips_odropped); - goto done; - } in_delayed_cksum(m0); m0->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA; } diff --git a/sys/netinet6/ip6_output.c b/sys/netinet6/ip6_output.c --- a/sys/netinet6/ip6_output.c +++ b/sys/netinet6/ip6_output.c @@ -212,42 +212,26 @@ *(u_short *)mtodo(m, offset) = csum; } -static int +static void ip6_output_delayed_csum(struct mbuf *m, struct ifnet *ifp, int csum_flags, - int plen, int optlen, bool frag) + int plen, int optlen) { KASSERT((plen >= optlen), ("%s:%d: plen %d < optlen %d, m %p, ifp %p " - "csum_flags %#x frag %d\n", - __func__, __LINE__, plen, optlen, m, ifp, csum_flags, frag)); + "csum_flags %#x", + __func__, __LINE__, plen, optlen, m, ifp, csum_flags)); - if ((csum_flags & CSUM_DELAY_DATA_IPV6) || -#if defined(SCTP) || defined(SCTP_SUPPORT) - (csum_flags & CSUM_SCTP_IPV6) || -#endif - (!frag && (ifp->if_capenable & IFCAP_MEXTPG) == 0)) { - m = mb_unmapped_to_ext(m); - if (m == NULL) { - if (frag) - in6_ifstat_inc(ifp, ifs6_out_fragfail); - else - IP6STAT_INC(ip6s_odropped); - return (ENOBUFS); - } - if (csum_flags & CSUM_DELAY_DATA_IPV6) { - in6_delayed_cksum(m, plen - optlen, - sizeof(struct ip6_hdr) + optlen); - m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA_IPV6; - } + if (csum_flags & CSUM_DELAY_DATA_IPV6) { + in6_delayed_cksum(m, plen - optlen, + sizeof(struct ip6_hdr) + optlen); + m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA_IPV6; + } #if defined(SCTP) || defined(SCTP_SUPPORT) - if (csum_flags & CSUM_SCTP_IPV6) { - sctp_delayed_cksum(m, sizeof(struct ip6_hdr) + optlen); - m->m_pkthdr.csum_flags &= ~CSUM_SCTP_IPV6; - } -#endif + if (csum_flags & CSUM_SCTP_IPV6) { + sctp_delayed_cksum(m, sizeof(struct ip6_hdr) + optlen); + m->m_pkthdr.csum_flags &= ~CSUM_SCTP_IPV6; } - - return (0); +#endif } int @@ -1104,6 +1088,16 @@ passout: if (vlan_pcp > -1) EVL_APPLY_PRI(m, vlan_pcp); + + /* Ensure the packet data is mapped if the interface requires it. */ + if ((ifp->if_capenable & IFCAP_MEXTPG) == 0) { + m = mb_unmapped_to_ext(m); + if (m == NULL) { + IP6STAT_INC(ip6s_odropped); + return (ENOBUFS); + } + } + /* * Send the packet to the outgoing interface. * If necessary, do IPv6 fragmentation before sending. @@ -1136,9 +1130,7 @@ * XXX-BZ Need a framework to know when the NIC can handle it, even * with ext. hdrs. */ - error = ip6_output_delayed_csum(m, ifp, sw_csum, plen, optlen, false); - if (error != 0) - goto bad; + ip6_output_delayed_csum(m, ifp, sw_csum, plen, optlen); /* XXX-BZ m->m_pkthdr.csum_flags &= ~ifp->if_hwassist; */ tlen = m->m_pkthdr.len; @@ -1217,10 +1209,8 @@ * fragmented packets, then do it here. * XXX-BZ handle the hw offloading case. Need flags. */ - error = ip6_output_delayed_csum(m, ifp, m->m_pkthdr.csum_flags, - plen, optlen, true); - if (error != 0) - goto bad; + ip6_output_delayed_csum(m, ifp, m->m_pkthdr.csum_flags, plen, + optlen); /* * Change the next header field of the last header in the diff --git a/sys/netipsec/ipsec_output.c b/sys/netipsec/ipsec_output.c --- a/sys/netipsec/ipsec_output.c +++ b/sys/netipsec/ipsec_output.c @@ -398,12 +398,6 @@ * this is done in the normal processing path. */ if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA) { - m = mb_unmapped_to_ext(m); - if (m == NULL) { - IPSECSTAT_INC(ips_out_nomem); - key_freesp(&sp); - return (ENOBUFS); - } in_delayed_cksum(m); m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA; } @@ -773,12 +767,6 @@ * this is done in the normal processing path. */ if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA_IPV6) { - m = mb_unmapped_to_ext(m); - if (m == NULL) { - IPSEC6STAT_INC(ips_out_nomem); - key_freesp(&sp); - return (ENOBUFS); - } in6_delayed_cksum(m, m->m_pkthdr.len - sizeof(struct ip6_hdr), sizeof(struct ip6_hdr)); m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA_IPV6; diff --git a/sys/netpfil/ipfw/nat64/nat64_translate.c b/sys/netpfil/ipfw/nat64/nat64_translate.c --- a/sys/netpfil/ipfw/nat64/nat64_translate.c +++ b/sys/netpfil/ipfw/nat64/nat64_translate.c @@ -1292,11 +1292,6 @@ /* Handle delayed checksums if needed. */ if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA) { - m = mb_unmapped_to_ext(m); - if (m == NULL) { - NAT64STAT_INC(&cfg->stats, nomem); - return (NAT64RETURN); - } in_delayed_cksum(m); m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA; } @@ -1674,11 +1669,6 @@ /* Handle delayed checksums if needed. */ if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA_IPV6) { - m = mb_unmapped_to_ext(m); - if (m == NULL) { - NAT64STAT_INC(&cfg->stats, nomem); - return (NAT64RETURN); - } in6_delayed_cksum(m, plen, hlen); m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA_IPV6; } diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c --- a/sys/netpfil/pf/pf.c +++ b/sys/netpfil/pf/pf.c @@ -5989,9 +5989,6 @@ /* Copied from FreeBSD 10.0-CURRENT ip_output. */ m0->m_pkthdr.csum_flags |= CSUM_IP; if (m0->m_pkthdr.csum_flags & CSUM_DELAY_DATA & ~ifp->if_hwassist) { - m0 = mb_unmapped_to_ext(m0); - if (m0 == NULL) - goto done; in_delayed_cksum(m0); m0->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA; } @@ -6178,9 +6175,6 @@ if (m0->m_pkthdr.csum_flags & CSUM_DELAY_DATA_IPV6 & ~ifp->if_hwassist) { uint32_t plen = m0->m_pkthdr.len - sizeof(*ip6); - m0 = mb_unmapped_to_ext(m0); - if (m0 == NULL) - goto done; in6_delayed_cksum(m0, plen, sizeof(struct ip6_hdr)); m0->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA_IPV6; }