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

📄 in_cksum.c

📁 早期freebsd实现
💻 C
字号:
/*- * Copyright (c) 1990, 1993 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * from tahoe:	in_cksum.c	1.2	86/01/05 *	@(#)in_cksum.c	8.1 (Berkeley) 6/11/93 */#include <sys/param.h>#include <sys/mbuf.h>#include <netinet/in.h>#include <netinet/in_systm.h>/* * Checksum routine for Internet Protocol family headers. * * This routine is very heavily used in the network * code and should be modified for each CPU to be as fast as possible. *  * This implementation is 386 version. */#undef	ADDCARRY#define ADDCARRY(sum)  {				\			if (sum & 0xffff0000) {		\				sum &= 0xffff;		\				sum++;			\			}				\		}in_cksum(m, len)	register struct mbuf *m;	register int len;{	union word {		char	c[2];		u_short	s;	} u;	register u_short *w;	register int sum = 0;	register int mlen = 0;	for (;m && len; m = m->m_next) {		if (m->m_len == 0)			continue;		w = mtod(m, u_short *);		if (mlen == -1) {			/*			 * The first byte of this mbuf is the continuation			 * of a word spanning between this mbuf and the			 * last mbuf.			 */			/* u.c[0] is already saved when scanning previous 			 * mbuf.			 */			u.c[1] = *(u_char *)w;			sum += u.s;			ADDCARRY(sum);			w = (u_short *)((char *)w + 1);			mlen = m->m_len - 1;			len--;		} else			mlen = m->m_len;		if (len < mlen)			mlen = len;		len -= mlen;		/*		 * add by words.		 */		while ((mlen -= 2) >= 0) {			if ((int)w & 0x1) {				/* word is not aligned */				u.c[0] = *(char *)w;				u.c[1] = *((char *)w+1);				sum += u.s;				w++;			} else				sum += *w++;			ADDCARRY(sum);		}		if (mlen == -1)			/*			 * This mbuf has odd number of bytes. 			 * There could be a word split betwen			 * this mbuf and the next mbuf.			 * Save the last byte (to prepend to next mbuf).			 */			u.c[0] = *(u_char *)w;	}	if (len)		printf("cksum: out of data\n");	if (mlen == -1) {		/* The last mbuf has odd # of bytes. Follow the		   standard (the odd byte is shifted left by 8 bits) */		u.c[1] = 0;		sum += u.s;		ADDCARRY(sum);	}	return (~sum & 0xffff);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -