80 #include <sys/cdefs.h> 81 #include <sys/param.h> 120 #define Asm __asm __volatile 121 #define ADD64 Asm(" ld [%4+ 0],%1; ld [%4+ 4],%2; \ 122 addcc %0,%1,%0; addxcc %0,%2,%0; \ 123 ld [%4+ 8],%1; ld [%4+12],%2; \ 124 addxcc %0,%1,%0; addxcc %0,%2,%0; \ 125 ld [%4+16],%1; ld [%4+20],%2; \ 126 addxcc %0,%1,%0; addxcc %0,%2,%0; \ 127 ld [%4+24],%1; ld [%4+28],%2; \ 128 addxcc %0,%1,%0; addxcc %0,%2,%0; \ 129 ld [%4+32],%1; ld [%4+36],%2; \ 130 addxcc %0,%1,%0; addxcc %0,%2,%0; \ 131 ld [%4+40],%1; ld [%4+44],%2; \ 132 addxcc %0,%1,%0; addxcc %0,%2,%0; \ 133 ld [%4+48],%1; ld [%4+52],%2; \ 134 addxcc %0,%1,%0; addxcc %0,%2,%0; \ 135 ld [%4+56],%1; ld [%4+60],%2; \ 136 addxcc %0,%1,%0; addxcc %0,%2,%0; \ 138 : "=r" (sum), "=&r" (tmp1), "=&r" (tmp2)\ 139 : "0" (sum), "r" (w)) 140 #define ADD32 Asm(" ld [%4+ 0],%1; ld [%4+ 4],%2; \ 141 addcc %0,%1,%0; addxcc %0,%2,%0; \ 142 ld [%4+ 8],%1; ld [%4+12],%2; \ 143 addxcc %0,%1,%0; addxcc %0,%2,%0; \ 144 ld [%4+16],%1; ld [%4+20],%2; \ 145 addxcc %0,%1,%0; addxcc %0,%2,%0; \ 146 ld [%4+24],%1; ld [%4+28],%2; \ 147 addxcc %0,%1,%0; addxcc %0,%2,%0; \ 149 : "=r" (sum), "=&r" (tmp1), "=&r" (tmp2)\ 150 : "0" (sum), "r" (w)) 151 #define ADD16 Asm(" ld [%4+ 0],%1; ld [%4+ 4],%2; \ 152 addcc %0,%1,%0; addxcc %0,%2,%0; \ 153 ld [%4+ 8],%1; ld [%4+12],%2; \ 154 addxcc %0,%1,%0; addxcc %0,%2,%0; \ 156 : "=r" (sum), "=&r" (tmp1), "=&r" (tmp2)\ 157 : "0" (sum), "r" (w)) 158 #define ADD8 Asm(" ld [%4+ 0],%1; ld [%4+ 4],%2; \ 159 addcc %0,%1,%0; addxcc %0,%2,%0; \ 161 : "=r" (sum), "=&r" (tmp1), "=&r" (tmp2)\ 162 : "0" (sum), "r" (w)) 163 #define ADD4 Asm(" ld [%3+ 0],%1; \ 166 : "=r" (sum), "=&r" (tmp1) \ 167 : "0" (sum), "r" (w)) 169 #define REDUCE {sum = (sum & 0xffff) + (sum >> 16);} 170 #define ADDCARRY {if (sum > 0xffff) sum -= 0xffff;} 171 #define ROL {sum = sum << 8;} 172 #define ADDBYTE {ROL; sum += *w; byte_swapped ^= 1;} 173 #define ADDSHORT {sum += *(u_short *)w;} 174 #define ADVANCE(n) {w += n; mlen -= n;} 176 static __inline__
int 177 in_cksum_internal(
struct mbuf *m,
int off,
int len, u_int sum)
181 int byte_swapped = 0;
190 for (; m && len; m = m->m_next) {
193 w = mtod(m, u_char *) + off;
194 mlen = m->m_len - off;
204 if ((3 & (
long)w) != 0) {
206 if ((1 & (
long)w) != 0 && mlen >= 1) {
210 if ((2 & (
long)w) != 0 && mlen >= 2) {
260 return (0xffff ^ sum);
264 in_cksum(
struct mbuf *m,
int len)
267 return (in_cksum_internal(m, 0, len, 0));
271 in4_cksum(
struct mbuf *m, uint8_t nxt,
int off,
int len)
286 memset(&ipov, 0,
sizeof(ipov));
287 ipov.ih_len = htons(len);
289 ipov.ih_src = mtod(m,
struct ip *)->ip_src;
290 ipov.ih_dst = mtod(m,
struct ip *)->ip_dst;
299 while (m && off > 0) {
306 return (in_cksum_internal(m, off, len, sum));