ptclbsum.c 1.1 KB

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