| #include <stdlib.h> |
| #include <stdio.h> |
| #include <parlib.h> |
| #include <unistd.h> |
| #include <signal.h> |
| #include <nixip.h> |
| |
| static short endian = 1; |
| static uint8_t* aendian = (uint8_t*)&endian; |
| #define LITTLE *aendian |
| |
| uint16_t |
| ptclbsum(uint8_t *addr, int len) |
| { |
| uint32_t losum, hisum, mdsum, x; |
| uint32_t t1, t2; |
| |
| losum = 0; |
| hisum = 0; |
| mdsum = 0; |
| |
| x = 0; |
| if((uintptr_t)addr & 1) { |
| if(len) { |
| hisum += addr[0]; |
| len--; |
| addr++; |
| } |
| x = 1; |
| } |
| while(len >= 16) { |
| t1 = *(uint16_t*)(addr+0); |
| t2 = *(uint16_t*)(addr+2); mdsum += t1; |
| t1 = *(uint16_t*)(addr+4); mdsum += t2; |
| t2 = *(uint16_t*)(addr+6); mdsum += t1; |
| t1 = *(uint16_t*)(addr+8); mdsum += t2; |
| t2 = *(uint16_t*)(addr+10); mdsum += t1; |
| t1 = *(uint16_t*)(addr+12); mdsum += t2; |
| t2 = *(uint16_t*)(addr+14); mdsum += t1; |
| mdsum += t2; |
| len -= 16; |
| addr += 16; |
| } |
| while(len >= 2) { |
| mdsum += *(uint16_t*)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; |
| } |