}
} else
#endif /* INET6 */
- {
+ {
/*
* Get IP and TCP header together in first mbuf.
* Note: IP leaves IP header in first mbuf.
if (m->m_pkthdr.csum_flags & CSUM_DATA_VALID) {
if (apple_hwcksum_rx && (m->m_pkthdr.csum_flags & CSUM_TCP_SUM16)) {
u_short pseudo;
+ char b[9];
+ *(uint32_t*)&b[0] = *(uint32_t*)&ipov->ih_x1[0];
+ *(uint32_t*)&b[4] = *(uint32_t*)&ipov->ih_x1[4];
+ *(uint8_t*)&b[8] = *(uint8_t*)&ipov->ih_x1[8];
+
bzero(ipov->ih_x1, sizeof(ipov->ih_x1));
ipov->ih_len = (u_short)tlen;
HTONS(ipov->ih_len);
pseudo = in_cksum(m, sizeof (struct ip));
+
+ *(uint32_t*)&ipov->ih_x1[0] = *(uint32_t*)&b[0];
+ *(uint32_t*)&ipov->ih_x1[4] = *(uint32_t*)&b[4];
+ *(uint8_t*)&ipov->ih_x1[8] = *(uint8_t*)&b[8];
+
th->th_sum = in_addword(pseudo, (m->m_pkthdr.csum_data & 0xFFFF));
} else {
if (m->m_pkthdr.csum_flags & CSUM_PSEUDO_HDR)
}
th->th_sum ^= 0xffff;
} else {
+ char b[9];
/*
* Checksum extended TCP header and data.
*/
+ *(uint32_t*)&b[0] = *(uint32_t*)&ipov->ih_x1[0];
+ *(uint32_t*)&b[4] = *(uint32_t*)&ipov->ih_x1[4];
+ *(uint8_t*)&b[8] = *(uint8_t*)&ipov->ih_x1[8];
+
len = sizeof (struct ip) + tlen;
bzero(ipov->ih_x1, sizeof(ipov->ih_x1));
ipov->ih_len = (u_short)tlen;
HTONS(ipov->ih_len);
th->th_sum = in_cksum(m, len);
+
+ *(uint32_t*)&ipov->ih_x1[0] = *(uint32_t*)&b[0];
+ *(uint32_t*)&ipov->ih_x1[4] = *(uint32_t*)&b[4];
+ *(uint8_t*)&ipov->ih_x1[8] = *(uint8_t*)&b[8];
}
if (th->th_sum) {
tcpstat.tcps_rcvbadsum++;
/* Re-initialization for later version check */
ip->ip_v = IPVERSION;
#endif
- }
+ }
/*
* Check that TCP offset makes sense,