The branch main has been updated by markj:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=44775b163bfa902ea96658343e852062e2e67a8e

commit 44775b163bfa902ea96658343e852062e2e67a8e
Author:     Mark Johnston <ma...@freebsd.org>
AuthorDate: 2021-11-24 18:20:09 +0000
Commit:     Mark Johnston <ma...@freebsd.org>
CommitDate: 2021-11-24 18:31:16 +0000

    netinet: Remove unneeded mb_unmapped_to_ext() calls
    
    in_cksum_skip() now handles unmapped mbufs on platforms where they're
    permitted.
    
    Reviewed by:    glebius, jhb
    MFC after:      1 week
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D33097
---
 sys/netinet/ip_divert.c                  |  6 ----
 sys/netinet/ip_output.c                  | 21 ++++-------
 sys/netinet6/ip6_output.c                | 62 ++++++++++++++------------------
 sys/netipsec/ipsec_output.c              | 12 -------
 sys/netpfil/ipfw/nat64/nat64_translate.c | 10 ------
 sys/netpfil/pf/pf.c                      |  6 ----
 6 files changed, 32 insertions(+), 85 deletions(-)

diff --git a/sys/netinet/ip_divert.c b/sys/netinet/ip_divert.c
index fb4eba220703..265fc1918d82 100644
--- a/sys/netinet/ip_divert.c
+++ b/sys/netinet/ip_divert.c
@@ -212,9 +212,6 @@ divert_packet(struct mbuf *m, bool incoming)
 
        /* 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 @@ divert_packet(struct mbuf *m, bool incoming)
 #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
index cfa6b1919a06..e30339f8c4aa 100644
--- a/sys/netinet/ip_output.c
+++ b/sys/netinet/ip_output.c
@@ -733,23 +733,20 @@ sendit:
                }
        }
 
-       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 @@ ip_fragment(struct ip *ip, struct mbuf **m_frag, int mtu,
         * 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
index fedb6c6b6c78..6091951e2ba2 100644
--- a/sys/netinet6/ip6_output.c
+++ b/sys/netinet6/ip6_output.c
@@ -212,42 +212,26 @@ in6_delayed_cksum(struct mbuf *m, uint32_t plen, u_short 
offset)
                *(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 @@ nonh6lookup:
 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 @@ passout:
         * 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 @@ passout:
                 * 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
index 0b171e9c4970..b0298f8145d4 100644
--- a/sys/netipsec/ipsec_output.c
+++ b/sys/netipsec/ipsec_output.c
@@ -398,12 +398,6 @@ ipsec4_common_output(struct mbuf *m, struct inpcb *inp, 
int forwarding)
                 * 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 @@ ipsec6_common_output(struct mbuf *m, struct inpcb *inp, 
int forwarding)
                 * 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
index aa6f47656d9d..fecc8ff334d2 100644
--- a/sys/netpfil/ipfw/nat64/nat64_translate.c
+++ b/sys/netpfil/ipfw/nat64/nat64_translate.c
@@ -1292,11 +1292,6 @@ nat64_do_handle_ip4(struct mbuf *m, struct in6_addr 
*saddr,
 
        /* 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 @@ nat64_do_handle_ip6(struct mbuf *m, uint32_t aaddr, 
uint16_t aport,
 
        /* 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
index 837417d6a43d..d01ee906740f 100644
--- a/sys/netpfil/pf/pf.c
+++ b/sys/netpfil/pf/pf.c
@@ -5989,9 +5989,6 @@ pf_route(struct mbuf **m, struct pf_krule *r, int dir, 
struct ifnet *oifp,
        /* 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 @@ pf_route6(struct mbuf **m, struct pf_krule *r, int dir, 
struct ifnet *oifp,
        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;
        }

Reply via email to