⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cksum.c

📁 abstract rtos
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -