linux/arch/h8300/include/asm/checksum.h
<<
>>
Prefs
   1#ifndef _H8300_CHECKSUM_H
   2#define _H8300_CHECKSUM_H
   3
   4/*
   5 * computes the checksum of a memory block at buff, length len,
   6 * and adds in "sum" (32-bit)
   7 *
   8 * returns a 32-bit number suitable for feeding into itself
   9 * or csum_tcpudp_magic
  10 *
  11 * this function must be called with even lengths, except
  12 * for the last fragment, which may be odd
  13 *
  14 * it's best to have buff aligned on a 32-bit boundary
  15 */
  16__wsum csum_partial(const void *buff, int len, __wsum sum);
  17
  18/*
  19 * the same as csum_partial, but copies from src while it
  20 * checksums
  21 *
  22 * here even more important to align src and dst on a 32-bit (or even
  23 * better 64-bit) boundary
  24 */
  25
  26__wsum csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum);
  27
  28
  29/*
  30 * the same as csum_partial_copy, but copies from user space.
  31 *
  32 * here even more important to align src and dst on a 32-bit (or even
  33 * better 64-bit) boundary
  34 */
  35
  36extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst,
  37                                                int len, __wsum sum, int *csum_err);
  38
  39__sum16 ip_fast_csum(const void *iph, unsigned int ihl);
  40
  41
  42/*
  43 *      Fold a partial checksum
  44 */
  45
  46static inline __sum16 csum_fold(__wsum sum)
  47{
  48        __asm__("mov.l %0,er0\n\t"
  49                "add.w e0,r0\n\t"
  50                "xor.w e0,e0\n\t"
  51                "rotxl.w e0\n\t"
  52                "add.w e0,r0\n\t"
  53                "sub.w e0,e0\n\t"
  54                "mov.l er0,%0"
  55                : "=r"(sum)
  56                : "0"(sum)
  57                : "er0");
  58        return (__force __sum16)~sum;
  59}
  60
  61
  62/*
  63 * computes the checksum of the TCP/UDP pseudo-header
  64 * returns a 16-bit checksum, already complemented
  65 */
  66
  67static inline __wsum
  68csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
  69                  unsigned short proto, __wsum sum)
  70{
  71        __asm__ ("sub.l er0,er0\n\t"
  72                 "add.l %2,%0\n\t"
  73                 "addx  #0,r0l\n\t"
  74                 "add.l %3,%0\n\t"
  75                 "addx  #0,r0l\n\t"
  76                 "add.l %4,%0\n\t"
  77                 "addx  #0,r0l\n\t"
  78                 "add.l er0,%0\n\t"
  79                 "bcc   1f\n\t"
  80                 "inc.l #1,%0\n"
  81                 "1:"
  82                 : "=&r" (sum)
  83                 : "0" (sum), "r" (daddr), "r" (saddr), "r" (len + proto)
  84                 :"er0");
  85        return sum;
  86}
  87
  88static inline __sum16
  89csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len,
  90                  unsigned short proto, __wsum sum)
  91{
  92        return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum));
  93}
  94
  95/*
  96 * this routine is used for miscellaneous IP-like checksums, mainly
  97 * in icmp.c
  98 */
  99
 100extern __sum16 ip_compute_csum(const void *buff, int len);
 101
 102#endif /* _H8300_CHECKSUM_H */
 103