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:
parent
0d9c3423f5
commit
44775b163b
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user