plan 9 kernel history: overview | file list | diff list

1992/0101/port/devip.c (diff list | history)

1991/12171/sys/src/9/port/devip.c:683,6961992/0101/sys/src/9/port/devip.c:683,758 (short | long | prev | next)
1991/0424    
} 
 
 
/*  
1991/1013    
 * ptcl_csum - protcol checksum routine 
1991/0424    
 */ 
1992/0101    
static	short	endian	= 1; 
static	char*	aendian	= (char*)&endian; 
#define	LITTLE	*aendian 
 
1991/0424    
ushort 
1992/0101    
ptcl_bsum(uchar *addr, int len) 
{ 
	ulong losum, hisum, mdsum, x; 
	ulong t1, t2; 
 
	losum = 0; 
	hisum = 0; 
	mdsum = 0; 
 
	x = 0; 
	if((ulong)addr & 1) { 
		if(len) { 
			hisum += addr[0]; 
			len--; 
			addr++; 
		} 
		x = 1; 
	} 
	while(len >= 16) { 
		t1 = *(ushort*)(addr+0); 
		t2 = *(ushort*)(addr+2);	mdsum += t1; 
		t1 = *(ushort*)(addr+4);	mdsum += t2; 
		t2 = *(ushort*)(addr+6);	mdsum += t1; 
		t1 = *(ushort*)(addr+8);	mdsum += t2; 
		t2 = *(ushort*)(addr+10);	mdsum += t1; 
		t1 = *(ushort*)(addr+12);	mdsum += t2; 
		t2 = *(ushort*)(addr+14);	mdsum += t1; 
		mdsum += t2; 
		len -= 16; 
		addr += 16; 
	} 
	while(len >= 2) { 
		mdsum += *(ushort*)addr; 
		len -= 2; 
		addr += 2; 
	} 
	if(x) { 
		if(len) 
			losum += addr[0]; 
		if(LITTLE) 
			losum += mdsum; 
		else 
			hisum += mdsum; 
	} else { 
		if(len) 
			hisum += addr[0]; 
		if(LITTLE) 
			hisum += mdsum; 
		else 
			losum += mdsum; 
	} 
 
	losum += hisum >> 8; 
	losum += (hisum & 0xff) << 8; 
	while(hisum = losum>>16) 
		losum = hisum + (losum & 0xffff); 
 
	return losum & 0xffff; 
} 
 
ushort 
1991/0424    
ptcl_csum(Block *bp, int offset, int len) 
{ 
	uchar *addr; 
	ulong losum = 0, hisum = 0; 
1992/0101    
	ulong losum, hisum; 
1991/0424    
	ushort csum; 
	int odd, blen, x; 
 
1991/12171/sys/src/9/port/devip.c:704,7291992/0101/sys/src/9/port/devip.c:766,789
1991/0424    
 
	addr = bp->rptr + offset; 
	blen = BLEN(bp) - offset; 
1992/0101    
 
	if(bp->next == 0) 
		return ~ptcl_bsum(addr, MIN(len, blen)) & 0xffff; 
 
	losum = 0; 
	hisum = 0; 
 
1991/0424    
	odd = 0; 
	while(len) { 
		if(odd) { 
			losum += *addr++; 
			blen--; 
			len--; 
			odd = 0; 
		} 
		for(x = MIN(len, blen); x > 1; x -= 2) { 
			hisum += addr[0]; 
			losum += addr[1]; 
			len -= 2; 
			blen -= 2; 
			addr += 2; 
		} 
		if(blen && x) { 
			odd = 1; 
			hisum += addr[0]; 
			len--; 
		} 
1992/0101    
		x = MIN(len, blen); 
		csum = ptcl_bsum(addr, x); 
		if(odd) 
			hisum += csum; 
		else 
			losum += csum; 
		odd = (odd+x) & 1; 
		len -= x; 
 
1991/0424    
		bp = bp->next; 
		if(bp == 0) 
			break; 
1991/12171/sys/src/9/port/devip.c:735,7421992/0101/sys/src/9/port/devip.c:795,800
1991/0424    
	losum += (hisum&0xff)<<8; 
	while((csum = losum>>16) != 0) 
		losum = csum + (losum & 0xffff); 
                 
	losum &= 0xffff; 
 
	return ~losum & 0xffff; 
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)