]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/netinet/tcp_input.c
xnu-344.34.tar.gz
[apple/xnu.git] / bsd / netinet / tcp_input.c
index 74493fdb740ded65aa26b04a76e5748172ecf82c..b3b12b6f558a7f2a87c48929f3124551a42e3e40 100644 (file)
@@ -466,7 +466,7 @@ tcp_input(m, off0)
                }
        } else
 #endif /* INET6 */
-      {
+       {
        /*
         * Get IP and TCP header together in first mbuf.
         * Note: IP leaves IP header in first mbuf.
@@ -496,10 +496,20 @@ tcp_input(m, off0)
        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)
@@ -511,14 +521,23 @@ tcp_input(m, off0)
                }
                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++;
@@ -528,7 +547,7 @@ tcp_input(m, off0)
        /* Re-initialization for later version check */
        ip->ip_v = IPVERSION;
 #endif
-      }
+       }
 
        /*
         * Check that TCP offset makes sense,