Blame


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>
4 d7094239 2003-11-23 devnull
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
8 d7094239 2003-11-23 devnull
9 d7094239 2003-11-23 devnull ushort
10 d7094239 2003-11-23 devnull ptclbsum(uchar *addr, int len)
11 d7094239 2003-11-23 devnull {
12 d7094239 2003-11-23 devnull ulong losum, hisum, mdsum, x;
13 d7094239 2003-11-23 devnull ulong t1, t2;
14 d7094239 2003-11-23 devnull
15 d7094239 2003-11-23 devnull losum = 0;
16 d7094239 2003-11-23 devnull hisum = 0;
17 d7094239 2003-11-23 devnull mdsum = 0;
18 d7094239 2003-11-23 devnull
19 d7094239 2003-11-23 devnull x = 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];
23 d7094239 2003-11-23 devnull len--;
24 d7094239 2003-11-23 devnull addr++;
25 d7094239 2003-11-23 devnull }
26 d7094239 2003-11-23 devnull x = 1;
27 d7094239 2003-11-23 devnull }
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;
40 d7094239 2003-11-23 devnull }
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;
45 d7094239 2003-11-23 devnull }
46 d7094239 2003-11-23 devnull if(x) {
47 d7094239 2003-11-23 devnull if(len)
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;
51 d7094239 2003-11-23 devnull else
52 d7094239 2003-11-23 devnull hisum += mdsum;
53 d7094239 2003-11-23 devnull } else {
54 d7094239 2003-11-23 devnull if(len)
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;
58 d7094239 2003-11-23 devnull else
59 d7094239 2003-11-23 devnull losum += mdsum;
60 d7094239 2003-11-23 devnull }
61 d7094239 2003-11-23 devnull
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);
66 d7094239 2003-11-23 devnull
67 d7094239 2003-11-23 devnull return losum & 0xffff;
68 d7094239 2003-11-23 devnull }