ipaux.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <ip.h>
  4. #include <auth.h>
  5. #include "ppp.h"
  6. static ushort endian = 1;
  7. static uchar* aendian = (uchar*)&endian;
  8. #define LITTLE *aendian
  9. ushort
  10. ptclbsum(uchar *addr, int len)
  11. {
  12. ulong losum, hisum, mdsum, x;
  13. ulong t1, t2;
  14. losum = 0;
  15. hisum = 0;
  16. mdsum = 0;
  17. x = 0;
  18. if((ulong)addr & 1) {
  19. if(len) {
  20. hisum += addr[0];
  21. len--;
  22. addr++;
  23. }
  24. x = 1;
  25. }
  26. while(len >= 16) {
  27. t1 = *(ushort*)(addr+0);
  28. t2 = *(ushort*)(addr+2); mdsum += t1;
  29. t1 = *(ushort*)(addr+4); mdsum += t2;
  30. t2 = *(ushort*)(addr+6); mdsum += t1;
  31. t1 = *(ushort*)(addr+8); mdsum += t2;
  32. t2 = *(ushort*)(addr+10); mdsum += t1;
  33. t1 = *(ushort*)(addr+12); mdsum += t2;
  34. t2 = *(ushort*)(addr+14); mdsum += t1;
  35. mdsum += t2;
  36. len -= 16;
  37. addr += 16;
  38. }
  39. while(len >= 2) {
  40. mdsum += *(ushort*)addr;
  41. len -= 2;
  42. addr += 2;
  43. }
  44. if(x) {
  45. if(len)
  46. losum += addr[0];
  47. if(LITTLE)
  48. losum += mdsum;
  49. else
  50. hisum += mdsum;
  51. } else {
  52. if(len)
  53. hisum += addr[0];
  54. if(LITTLE)
  55. hisum += mdsum;
  56. else
  57. losum += mdsum;
  58. }
  59. losum += hisum >> 8;
  60. losum += (hisum & 0xff) << 8;
  61. while(hisum = losum>>16)
  62. losum = hisum + (losum & 0xffff);
  63. return losum & 0xffff;
  64. }
  65. ushort
  66. ptclcsum(Block *bp, int offset, int len)
  67. {
  68. uchar *addr;
  69. ulong losum, hisum;
  70. ushort csum;
  71. int odd, blen, x;
  72. /* Correct to front of data area */
  73. while(bp != nil && offset && offset >= BLEN(bp)) {
  74. offset -= BLEN(bp);
  75. bp = bp->next;
  76. }
  77. if(bp == nil)
  78. return 0;
  79. addr = bp->rptr + offset;
  80. blen = BLEN(bp) - offset;
  81. if(bp->next == nil) {
  82. if(blen < len)
  83. len = blen;
  84. return ~ptclbsum(addr, len) & 0xffff;
  85. }
  86. losum = 0;
  87. hisum = 0;
  88. odd = 0;
  89. while(len) {
  90. x = blen;
  91. if(len < x)
  92. x = len;
  93. csum = ptclbsum(addr, x);
  94. if(odd)
  95. hisum += csum;
  96. else
  97. losum += csum;
  98. odd = (odd+x) & 1;
  99. len -= x;
  100. bp = bp->next;
  101. if(bp == nil)
  102. break;
  103. blen = BLEN(bp);
  104. addr = bp->rptr;
  105. }
  106. losum += hisum>>8;
  107. losum += (hisum&0xff)<<8;
  108. while((csum = losum>>16) != 0)
  109. losum = csum + (losum & 0xffff);
  110. return ~losum & 0xffff;
  111. }
  112. ushort
  113. ipcsum(uchar *addr)
  114. {
  115. int len;
  116. ulong sum;
  117. sum = 0;
  118. len = (addr[0]&0xf)<<2;
  119. while(len > 0) {
  120. sum += (addr[0]<<8) | addr[1] ;
  121. len -= 2;
  122. addr += 2;
  123. }
  124. sum = (sum & 0xffff) + (sum >> 16);
  125. sum = (sum & 0xffff) + (sum >> 16);
  126. return (sum^0xffff);
  127. }