📄 cksum.c
字号:
#include "syscfg.h"#ifdef __cplusplus#if __cplusplusextern "C"{#endif #endif #include "aos.h" #define NBBY 8 #define GA2S(x) ((U32)(VOID *)(x)) #define ADDCARRY(x) (x > 65535 ? x -= 65535 : x)#define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; ADDCARRY(sum);} struct iovec { S8 *iov_base; S32 iov_len; }; U16 inet_cksumv (struct iovec * v , S32 nv , U32 len) { S32 sum = 0; S32 vlen = 0; struct iovec *vp; S32 byte_swapped = 0; union { S8 c[2]; U16 s; } s_util; union { U16 s[2]; U32 l; } l_util; for (vp = v; nv && len; nv--, vp++) { union { S8 * c; U16 *s; } w; if (vp->iov_len == 0) { continue; } w.c = vp->iov_base; if (vlen == -1) { s_util.c[1] = *w.c; sum += s_util.s; w.c++; vlen = vp->iov_len - 1; len--; } else { vlen = vp->iov_len; } if ((S32)len < vlen) { vlen = (S32)len; } len -= (U32)vlen; if ((1 & GA2S(w.s)) && (vlen > 0)) { REDUCE; sum = (S32)((U32)sum << NBBY); s_util.c[0] = *w.c; w.c++; vlen--; byte_swapped = 1; } while ((vlen -= 32) >= 0) { sum += w.s[0]; sum += w.s[1]; sum += w.s[2]; sum += w.s[3]; sum += w.s[4]; sum += w.s[5]; sum += w.s[6]; sum += w.s[7]; sum += w.s[8]; sum += w.s[9]; sum += w.s[10]; sum += w.s[11]; sum += w.s[12]; sum += w.s[13]; sum += w.s[14]; sum += w.s[15]; w.s += 16; } vlen += 32; while ((vlen -= 8) >= 0) { sum += w.s[0]; sum += w.s[1]; sum += w.s[2]; sum += w.s[3]; w.s += 4; } vlen += 8; if (vlen == 0 && byte_swapped == 0) { continue; } REDUCE; while ((vlen -= 2) >= 0) { sum += *w.s++; } if (byte_swapped) { REDUCE; sum = (S32)((U32)sum << NBBY); byte_swapped = 0; if (vlen == -1) { s_util.c[1] = *w.c; sum += s_util.s; vlen = 0; } else { vlen = -1; } } else if (vlen == -1) { s_util.c[0] = *w.c; } } AOS_ASSERT(!len); if (vlen == -1) { s_util.c[1] = 0; sum += s_util.s; } REDUCE; return (U16)(~(U32)sum & 0xffff);}U16INET_Cksum (VOID * cp , U32 length){ struct iovec iovec; iovec.iov_base = (S8 *) cp; iovec.iov_len = (S32) length; return inet_cksumv(&iovec, 1, length);}#ifdef FLETCHER_CHECKSUM#define INLINE 8 #define INSHIFT 3 #define INLINEMASK (INLINE - 1) #define MAXITER 4096 #define ITERSHIFT 12 #define ITERMASK (MAXITER - 1) #define MAXINLINE (MAXITER/INLINE)#define MODULUS 255 U32ISO_Cksum (VOID * pkt , U32 len , U8 * cksum){ S32 c0, c1; U8 *cp; S32 n; S32 l; c0 = c1 = 0; cp = (U8 *) pkt; l = len; if (cksum) { *cksum = *(cksum + 1) = 0; } n = l & ITERMASK; switch (n & INLINEMASK) { case 7: c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); break; case 6: c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); break; case 5: c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); break; case 4: c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); break; case 3: c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); break; case 2: c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); break; case 1: c1 += (c0 += (S32) (*cp++)); break; case 0: break; } n >>= INSHIFT; while (n-- > 0) { c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); } n = l >> ITERSHIFT; if (n > 0) { do { S32 iter = MAXINLINE; if (cp != (U8 *) pkt) { c0 %= MODULUS; c1 %= MODULUS; } do { c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); c1 += (c0 += (S32) (*cp++)); } while (--iter > 0); } while (--n > 0); } c0 %= MODULUS; if (cksum) { c1 = (c1 - ((S32) (((U8 *) pkt + l) - cksum) * c0)) % MODULUS; if (c1 <= 0) { c1 += MODULUS; } c0 = MODULUS - c1 - c0; if (c0 <= 0) { c0 += MODULUS; } *cksum++ = (U8) c0; *cksum = (U8) c1; return (U32) ((c0 << 8) | c1); } return (U32) (((c1 % MODULUS) << 8) | c0);}#endif #ifdef MD5_CHECKSUM#define MD5_F(x, y, z) (((~(x)) & (z)) | ((x) & (y)))#define MD5_G(x, y, z) (((~(z)) & (y)) | ((z) & (x))) #define MD5_H(x, y, z) ((x) ^ (y) ^ (z))#define MD5_I(x, y, z) ((y) ^ ((x) | (~(z))))#ifndef MD5_ROTL#define MD5_ROTL(x, s) \((x) = ((x) << (s)) | (((x) >> (32 - (s))) & 0xffffffff))#endif #define MD5_OP1(a, b, c, d, xk, s, ti) \ do { \ (a) += MD5_F((b), (c), (d)) + (xk) + (ti); \ MD5_ROTL((a), (s)); \ (a) += (b); \ } while (0)#define MD5_OP2(a, b, c, d, xk, s, ti) \ do { \ (a) += MD5_G((b), (c), (d)) + (xk) + (ti); \ MD5_ROTL((a), (s)); \ (a) += (b); \ } while (0)#define MD5_OP3(a, b, c, d, xk, s, ti) \ do { \ (a) += MD5_H((b), (c), (d)) + (xk) + (ti); \ MD5_ROTL((a), (s)); \ (a) += (b); \ } while (0)#define MD5_OP4(a, b, c, d, xk, s, ti) \ do { \ (a) += MD5_I((b), (c), (d)) + (xk) + (ti); \ MD5_ROTL((a), (s)); \ (a) += (b); \ } while (0)#define MD5_A_INIT 0x67452301#define MD5_B_INIT 0xefcdab89#define MD5_C_INIT 0x98badcfe#define MD5_D_INIT 0x10325476#define MD5_GET(x, cp) \ do { \ U32 Xtmp; \ Xtmp = (U32)(*(cp)++); \ Xtmp |= ((U32)(*(cp)++)) << 8; \ Xtmp |= ((U32)(*(cp)++)) << 16; \ Xtmp |= ((U32)(*(cp)++)) << 24; \ (x) = Xtmp; \ } while (0)#define MD5_PUT(x, cp) \ do { \ U32 Xtmp = (x); \ *(cp)++ = (U8) Xtmp; \ *(cp)++ = (U8) (Xtmp >> 8); \ *(cp)++ = (U8) (Xtmp >> 16); \ *(cp)++ = (U8) (Xtmp >> 24); \ } while (0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -