checksum.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #ifndef __ASM_GENERIC_CHECKSUM_H
  2. #define __ASM_GENERIC_CHECKSUM_H
  3. /*
  4. * computes the checksum of a memory block at buff, length len,
  5. * and adds in "sum" (32-bit)
  6. *
  7. * returns a 32-bit number suitable for feeding into itself
  8. * or csum_tcpudp_magic
  9. *
  10. * this function must be called with even lengths, except
  11. * for the last fragment, which may be odd
  12. *
  13. * it's best to have buff aligned on a 32-bit boundary
  14. */
  15. extern __wsum csum_partial(const void *buff, int len, __wsum sum);
  16. /*
  17. * the same as csum_partial, but copies from src while it
  18. * checksums
  19. *
  20. * here even more important to align src and dst on a 32-bit (or even
  21. * better 64-bit) boundary
  22. */
  23. extern __wsum csum_partial_copy(const void *src, void *dst, int len, __wsum sum);
  24. /*
  25. * the same as csum_partial_copy, but copies from user space.
  26. *
  27. * here even more important to align src and dst on a 32-bit (or even
  28. * better 64-bit) boundary
  29. */
  30. extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst,
  31. int len, __wsum sum, int *csum_err);
  32. #ifndef csum_partial_copy_nocheck
  33. #define csum_partial_copy_nocheck(src, dst, len, sum) \
  34. csum_partial_copy((src), (dst), (len), (sum))
  35. #endif
  36. #ifndef ip_fast_csum
  37. /*
  38. * This is a version of ip_compute_csum() optimized for IP headers,
  39. * which always checksum on 4 octet boundaries.
  40. */
  41. extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
  42. #endif
  43. #ifndef csum_fold
  44. /*
  45. * Fold a partial checksum
  46. */
  47. static inline __sum16 csum_fold(__wsum csum)
  48. {
  49. u32 sum = (__force u32)csum;
  50. sum = (sum & 0xffff) + (sum >> 16);
  51. sum = (sum & 0xffff) + (sum >> 16);
  52. return (__force __sum16)~sum;
  53. }
  54. #endif
  55. #ifndef csum_tcpudp_nofold
  56. /*
  57. * computes the checksum of the TCP/UDP pseudo-header
  58. * returns a 16-bit checksum, already complemented
  59. */
  60. extern __wsum
  61. csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
  62. unsigned short proto, __wsum sum);
  63. #endif
  64. #ifndef csum_tcpudp_magic
  65. static inline __sum16
  66. csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len,
  67. unsigned short proto, __wsum sum)
  68. {
  69. return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
  70. }
  71. #endif
  72. /*
  73. * this routine is used for miscellaneous IP-like checksums, mainly
  74. * in icmp.c
  75. */
  76. extern __sum16 ip_compute_csum(const void *buff, int len);
  77. #endif /* __ASM_GENERIC_CHECKSUM_H */