1*7dd7cddfSDavid du Colombier #include "u.h" 2*7dd7cddfSDavid du Colombier #include "../port/lib.h" 3*7dd7cddfSDavid du Colombier #include "mem.h" 4*7dd7cddfSDavid du Colombier #include "dat.h" 5*7dd7cddfSDavid du Colombier #include "fns.h" 6*7dd7cddfSDavid du Colombier #include "../port/error.h" 7*7dd7cddfSDavid du Colombier #include "ip.h" 8*7dd7cddfSDavid du Colombier 9*7dd7cddfSDavid du Colombier static short endian = 1; 10*7dd7cddfSDavid du Colombier static uchar* aendian = (uchar*)&endian; 11*7dd7cddfSDavid du Colombier #define LITTLE *aendian 12*7dd7cddfSDavid du Colombier 13*7dd7cddfSDavid du Colombier ushort ptclbsum(uchar * addr,int len)14*7dd7cddfSDavid du Colombierptclbsum(uchar *addr, int len) 15*7dd7cddfSDavid du Colombier { 16*7dd7cddfSDavid du Colombier ulong losum, hisum, mdsum, x; 17*7dd7cddfSDavid du Colombier ulong t1, t2; 18*7dd7cddfSDavid du Colombier 19*7dd7cddfSDavid du Colombier losum = 0; 20*7dd7cddfSDavid du Colombier hisum = 0; 21*7dd7cddfSDavid du Colombier mdsum = 0; 22*7dd7cddfSDavid du Colombier 23*7dd7cddfSDavid du Colombier x = 0; 24*7dd7cddfSDavid du Colombier if((ulong)addr & 1) { 25*7dd7cddfSDavid du Colombier if(len) { 26*7dd7cddfSDavid du Colombier hisum += addr[0]; 27*7dd7cddfSDavid du Colombier len--; 28*7dd7cddfSDavid du Colombier addr++; 29*7dd7cddfSDavid du Colombier } 30*7dd7cddfSDavid du Colombier x = 1; 31*7dd7cddfSDavid du Colombier } 32*7dd7cddfSDavid du Colombier while(len >= 16) { 33*7dd7cddfSDavid du Colombier t1 = *(ushort*)(addr+0); 34*7dd7cddfSDavid du Colombier t2 = *(ushort*)(addr+2); mdsum += t1; 35*7dd7cddfSDavid du Colombier t1 = *(ushort*)(addr+4); mdsum += t2; 36*7dd7cddfSDavid du Colombier t2 = *(ushort*)(addr+6); mdsum += t1; 37*7dd7cddfSDavid du Colombier t1 = *(ushort*)(addr+8); mdsum += t2; 38*7dd7cddfSDavid du Colombier t2 = *(ushort*)(addr+10); mdsum += t1; 39*7dd7cddfSDavid du Colombier t1 = *(ushort*)(addr+12); mdsum += t2; 40*7dd7cddfSDavid du Colombier t2 = *(ushort*)(addr+14); mdsum += t1; 41*7dd7cddfSDavid du Colombier mdsum += t2; 42*7dd7cddfSDavid du Colombier len -= 16; 43*7dd7cddfSDavid du Colombier addr += 16; 44*7dd7cddfSDavid du Colombier } 45*7dd7cddfSDavid du Colombier while(len >= 2) { 46*7dd7cddfSDavid du Colombier mdsum += *(ushort*)addr; 47*7dd7cddfSDavid du Colombier len -= 2; 48*7dd7cddfSDavid du Colombier addr += 2; 49*7dd7cddfSDavid du Colombier } 50*7dd7cddfSDavid du Colombier if(x) { 51*7dd7cddfSDavid du Colombier if(len) 52*7dd7cddfSDavid du Colombier losum += addr[0]; 53*7dd7cddfSDavid du Colombier if(LITTLE) 54*7dd7cddfSDavid du Colombier losum += mdsum; 55*7dd7cddfSDavid du Colombier else 56*7dd7cddfSDavid du Colombier hisum += mdsum; 57*7dd7cddfSDavid du Colombier } else { 58*7dd7cddfSDavid du Colombier if(len) 59*7dd7cddfSDavid du Colombier hisum += addr[0]; 60*7dd7cddfSDavid du Colombier if(LITTLE) 61*7dd7cddfSDavid du Colombier hisum += mdsum; 62*7dd7cddfSDavid du Colombier else 63*7dd7cddfSDavid du Colombier losum += mdsum; 64*7dd7cddfSDavid du Colombier } 65*7dd7cddfSDavid du Colombier 66*7dd7cddfSDavid du Colombier losum += hisum >> 8; 67*7dd7cddfSDavid du Colombier losum += (hisum & 0xff) << 8; 68*7dd7cddfSDavid du Colombier while(hisum = losum>>16) 69*7dd7cddfSDavid du Colombier losum = hisum + (losum & 0xffff); 70*7dd7cddfSDavid du Colombier 71*7dd7cddfSDavid du Colombier return losum & 0xffff; 72*7dd7cddfSDavid du Colombier } 73