ptclbsum.c 1.2 KB

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