| 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,696 – 1992/0101/sys/src/9/port/devip.c:683,758 (short | long | prev | next) | ||
| 1991/0424 | } | |
| 1991/1013 |
| |
| 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; | |
| 1992/0101 | ulong losum, hisum; | |
| 1991/0424 | ushort csum; int odd, blen, x; | |
| 1991/12171/sys/src/9/port/devip.c:704,729 – 1992/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) { | |
| 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,742 – 1992/0101/sys/src/9/port/devip.c:795,800 | ||
| 1991/0424 | losum += (hisum&0xff)<<8; while((csum = losum>>16) != 0) losum = csum + (losum & 0xffff); | |