1 d7094239 2003-11-23 devnull #include <u.h>
2 d7094239 2003-11-23 devnull #include <libc.h>
3 d7094239 2003-11-23 devnull #include <ip.h>
5 d7094239 2003-11-23 devnull static short endian = 1;
6 d7094239 2003-11-23 devnull static uchar* aendian = (uchar*)&endian;
7 d7094239 2003-11-23 devnull #define LITTLE *aendian
10 d7094239 2003-11-23 devnull ptclbsum(uchar *addr, int len)
12 d7094239 2003-11-23 devnull ulong losum, hisum, mdsum, x;
13 d7094239 2003-11-23 devnull ulong t1, t2;
15 d7094239 2003-11-23 devnull losum = 0;
16 d7094239 2003-11-23 devnull hisum = 0;
17 d7094239 2003-11-23 devnull mdsum = 0;
20 d7094239 2003-11-23 devnull if((ulong)addr & 1) {
21 d7094239 2003-11-23 devnull if(len) {
22 d7094239 2003-11-23 devnull hisum += addr[0];
28 d7094239 2003-11-23 devnull while(len >= 16) {
29 d7094239 2003-11-23 devnull t1 = *(ushort*)(addr+0);
30 d7094239 2003-11-23 devnull t2 = *(ushort*)(addr+2); mdsum += t1;
31 d7094239 2003-11-23 devnull t1 = *(ushort*)(addr+4); mdsum += t2;
32 d7094239 2003-11-23 devnull t2 = *(ushort*)(addr+6); mdsum += t1;
33 d7094239 2003-11-23 devnull t1 = *(ushort*)(addr+8); mdsum += t2;
34 d7094239 2003-11-23 devnull t2 = *(ushort*)(addr+10); mdsum += t1;
35 d7094239 2003-11-23 devnull t1 = *(ushort*)(addr+12); mdsum += t2;
36 d7094239 2003-11-23 devnull t2 = *(ushort*)(addr+14); mdsum += t1;
37 d7094239 2003-11-23 devnull mdsum += t2;
38 d7094239 2003-11-23 devnull len -= 16;
39 d7094239 2003-11-23 devnull addr += 16;
41 d7094239 2003-11-23 devnull while(len >= 2) {
42 d7094239 2003-11-23 devnull mdsum += *(ushort*)addr;
43 d7094239 2003-11-23 devnull len -= 2;
44 d7094239 2003-11-23 devnull addr += 2;
48 d7094239 2003-11-23 devnull losum += addr[0];
49 d7094239 2003-11-23 devnull if(LITTLE)
50 d7094239 2003-11-23 devnull losum += mdsum;
52 d7094239 2003-11-23 devnull hisum += mdsum;
55 d7094239 2003-11-23 devnull hisum += addr[0];
56 d7094239 2003-11-23 devnull if(LITTLE)
57 d7094239 2003-11-23 devnull hisum += mdsum;
59 d7094239 2003-11-23 devnull losum += mdsum;
62 d7094239 2003-11-23 devnull losum += hisum >> 8;
63 d7094239 2003-11-23 devnull losum += (hisum & 0xff) << 8;
64 d7094239 2003-11-23 devnull while(hisum = losum>>16)
65 d7094239 2003-11-23 devnull losum = hisum + (losum & 0xffff);
67 d7094239 2003-11-23 devnull return losum & 0xffff;