52 #include <sys/param.h> 69 #define ADD64 __asm __volatile(" \n\ 70 ldmia %0!, {%2, %3, %4, %5} \n\ 71 adds %1,%7,%2; adcs %1,%1,%3 \n\ 72 adcs %1,%1,%4; adcs %1,%1,%5 \n\ 73 ldmia %0!, {%2, %3, %4, %5} \n\ 74 adcs %1,%1,%2; adcs %1,%1,%3 \n\ 75 adcs %1,%1,%4; adcs %1,%1,%5 \n\ 76 ldmia %0!, {%2, %3, %4, %5} \n\ 77 adcs %1,%1,%2; adcs %1,%1,%3 \n\ 78 adcs %1,%1,%4; adcs %1,%1,%5 \n\ 79 ldmia %0!, {%2, %3, %4, %5} \n\ 80 adcs %1,%1,%2; adcs %1,%1,%3 \n\ 81 adcs %1,%1,%4; adcs %1,%1,%5 \n\ 83 : "=r" (w), "=r" (sum), "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4) \ 84 : "0" (w), "r" (sum) \ 87 #define ADD32 __asm __volatile(" \n\ 88 ldmia %0!, {%2, %3, %4, %5} \n\ 89 adds %1,%7,%2; adcs %1,%1,%3 \n\ 90 adcs %1,%1,%4; adcs %1,%1,%5 \n\ 91 ldmia %0!, {%2, %3, %4, %5} \n\ 92 adcs %1,%1,%2; adcs %1,%1,%3 \n\ 93 adcs %1,%1,%4; adcs %1,%1,%5 \n\ 95 : "=r" (w), "=r" (sum), "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4) \ 96 : "0" (w), "r" (sum) \ 99 #define ADD16 __asm __volatile(" \n\ 100 ldmia %0!, {%2, %3, %4, %5} \n\ 101 adds %1,%7,%2; adcs %1,%1,%3 \n\ 102 adcs %1,%1,%4; adcs %1,%1,%5 \n\ 104 : "=r" (w), "=r" (sum), "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4) \ 105 : "0" (w), "r" (sum) \ 108 #define ADD8 __asm __volatile(" \n\ 109 ldmia %0!, {%2, %3} \n\ 110 adds %1,%5,%2; adcs %1,%1,%3 \n\ 112 : "=r" (w), "=r" (sum), "=&r" (tmp1), "=&r" (tmp2) \ 113 : "0" (w), "r" (sum) \ 116 #define ADD4 __asm __volatile(" \n\ 120 : "=r" (w), "=r" (sum), "=&r" (tmp1) \ 121 : "0" (w), "r" (sum) \ 125 #define REDUCE __asm __volatile(" \n\ 127 orr %2, %2, #0xff00 \n\ 129 add %0, %2, %0, lsr #16\n" \ 131 : "0" (sum), "r" (tmp1)) 133 #define ADDCARRY {if (sum > 0xffff) sum -= 0xffff;} 134 #define ROL {sum = sum << 8;} 135 #define ADDBYTE {ROL; sum += (*w << 8); byte_swapped ^= 1;} 136 #define ADDSHORT {sum += *(u_short *)w;} 137 #define ADVANCE(n) {w += n; mlen -= n;} 138 #define ADVANCEML(n) {mlen -= n;} 140 static __inline__
int 141 in_cksum_internal(
struct mbuf *m,
int off,
int len, u_int sum)
145 int byte_swapped = 0;
152 register u_int tmp1=0, tmp2, tmp3, tmp4;
154 for (; m && len; m = m->m_next) {
157 w = mtod(m, u_char *) + off;
158 mlen = m->m_len - off;
168 if ((3 & (
long)w) != 0) {
170 if ((1 & (
long)w) != 0 && mlen >= 1) {
174 if ((2 & (
long)w) != 0 && mlen >= 2) {
225 return (0xffff ^ sum);
234 cksum =in_cksum_internal(m, 0, len, 0);
249 register u_int tmp1, tmp2, tmp3, tmp4;
253 if (off <
sizeof(
struct ipovly))
254 panic(
"in4_cksum: offset too short");
255 if (m->m_len <
sizeof(
struct ip))
256 panic(
"in4_cksum: bad mbuf chain");
258 bzero(&ipov,
sizeof(ipov));
259 ipov.ih_len = htons(len);
261 ipov.ih_src = mtod(m,
struct ip *)->ip_src;
262 ipov.ih_dst = mtod(m,
struct ip *)->ip_dst;
270 while (m && off > 0) {
276 return (in_cksum_internal(m, off, len, sum));