version 1.211, 2018/06/01 08:56:00 |
version 1.212, 2018/08/10 06:46:09 |
|
|
|
|
if (needipsec && |
if (needipsec && |
(m->m_pkthdr.csum_flags & (M_CSUM_UDPv6|M_CSUM_TCPv6)) != 0) { |
(m->m_pkthdr.csum_flags & (M_CSUM_UDPv6|M_CSUM_TCPv6)) != 0) { |
in6_delayed_cksum(m); |
in6_undefer_cksum_tcpudp(m); |
m->m_pkthdr.csum_flags &= ~(M_CSUM_UDPv6|M_CSUM_TCPv6); |
m->m_pkthdr.csum_flags &= ~(M_CSUM_UDPv6|M_CSUM_TCPv6); |
} |
} |
|
|
|
|
if ((sw_csum & (M_CSUM_UDPv6|M_CSUM_TCPv6)) != 0) { |
if ((sw_csum & (M_CSUM_UDPv6|M_CSUM_TCPv6)) != 0) { |
if (IN6_NEED_CHECKSUM(ifp, |
if (IN6_NEED_CHECKSUM(ifp, |
sw_csum & (M_CSUM_UDPv6|M_CSUM_TCPv6))) { |
sw_csum & (M_CSUM_UDPv6|M_CSUM_TCPv6))) { |
in6_delayed_cksum(m); |
in6_undefer_cksum_tcpudp(m); |
} |
} |
m->m_pkthdr.csum_flags &= ~(M_CSUM_UDPv6|M_CSUM_TCPv6); |
m->m_pkthdr.csum_flags &= ~(M_CSUM_UDPv6|M_CSUM_TCPv6); |
} |
} |
|
|
if (IN6_NEED_CHECKSUM(ifp, |
if (IN6_NEED_CHECKSUM(ifp, |
m->m_pkthdr.csum_flags & |
m->m_pkthdr.csum_flags & |
(M_CSUM_UDPv6|M_CSUM_TCPv6))) { |
(M_CSUM_UDPv6|M_CSUM_TCPv6))) { |
in6_delayed_cksum(m); |
in6_undefer_cksum_tcpudp(m); |
} |
} |
m->m_pkthdr.csum_flags &= ~(M_CSUM_UDPv6|M_CSUM_TCPv6); |
m->m_pkthdr.csum_flags &= ~(M_CSUM_UDPv6|M_CSUM_TCPv6); |
} |
} |
Line 1072 ip6_copyexthdr(struct mbuf **mp, void *h |
|
Line 1072 ip6_copyexthdr(struct mbuf **mp, void *h |
|
} |
} |
|
|
/* |
/* |
* Process a delayed payload checksum calculation. |
|
*/ |
|
void |
|
in6_delayed_cksum(struct mbuf *m) |
|
{ |
|
uint16_t csum, offset; |
|
|
|
KASSERT((m->m_pkthdr.csum_flags & (M_CSUM_UDPv6|M_CSUM_TCPv6)) != 0); |
|
KASSERT((~m->m_pkthdr.csum_flags & (M_CSUM_UDPv6|M_CSUM_TCPv6)) != 0); |
|
KASSERT((m->m_pkthdr.csum_flags |
|
& (M_CSUM_UDPv4|M_CSUM_TCPv4|M_CSUM_TSOv4)) == 0); |
|
|
|
offset = M_CSUM_DATA_IPv6_IPHL(m->m_pkthdr.csum_data); |
|
csum = in6_cksum(m, 0, offset, m->m_pkthdr.len - offset); |
|
if (csum == 0 && (m->m_pkthdr.csum_flags & M_CSUM_UDPv6) != 0) { |
|
csum = 0xffff; |
|
} |
|
|
|
offset += M_CSUM_DATA_IPv6_OFFSET(m->m_pkthdr.csum_data); |
|
if ((offset + sizeof(csum)) > m->m_len) { |
|
m_copyback(m, offset, sizeof(csum), &csum); |
|
} else { |
|
*(uint16_t *)(mtod(m, char *) + offset) = csum; |
|
} |
|
} |
|
|
|
/* |
|
* Insert jumbo payload option. |
* Insert jumbo payload option. |
*/ |
*/ |
static int |
static int |