home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / cris / include / asm / checksum.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  2.0 KB  |  84 lines

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