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
This commit is contained in:
Mark Johnston 2021-11-24 13:20:09 -05:00
parent 0d9c3423f5
commit 44775b163b
6 changed files with 37 additions and 90 deletions

View File

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

View File

@ -733,23 +733,20 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, int flags,
}
}
/* 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) {
m = mb_unmapped_to_ext(m);
if (m == NULL) {
IPSTAT_INC(ips_odropped);
error = ENOBUFS;
goto bad;
}
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;
}

View File

@ -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 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_DELAY_DATA_IPV6) {
in6_delayed_cksum(m, plen - optlen,
sizeof(struct ip6_hdr) + optlen);
m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA_IPV6;
}
return (0);
#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
}
int
@ -1104,6 +1088,16 @@ ip6_output(struct mbuf *m0, struct ip6_pktopts *opt,
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 @@ ip6_output(struct mbuf *m0, struct ip6_pktopts *opt,
* 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 @@ ip6_output(struct mbuf *m0, struct ip6_pktopts *opt,
* 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

View File

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

View File

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

View File

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