checksum.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  arch/s390/lib/checksum.c
  3.  *    S390 fast network checksum routines
  4.  *
  5.  *  S390 version
  6.  *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
  7.  *    Author(s): Ulrich Hild        (first version),
  8.  *               Martin Schwidefsky (schwidefsky@de.ibm.com),
  9.  *               Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
  10.  *
  11.  * This file contains network checksum routines
  12.  */
  13.  
  14. #include <linux/string.h>
  15. #include <linux/types.h>
  16. #include <asm/uaccess.h>
  17. #include <asm/byteorder.h>
  18. #include <asm/checksum.h>
  19. /*
  20.  * computes a partial checksum, e.g. for TCP/UDP fragments
  21.  */
  22. unsigned int
  23. csum_partial (const unsigned char *buff, int len, unsigned int sum)
  24. {
  25. register_pair rp;
  26.   /*
  27.    * Experiments with ethernet and slip connections show that buff
  28.    * is aligned on either a 2-byte or 4-byte boundary.
  29.    */
  30. rp.subreg.even = (unsigned long) buff;
  31. rp.subreg.odd = (unsigned long) len;
  32.         __asm__ __volatile__ (
  33.                 "0:  cksm %0,%1n"    /* do checksum on longs */
  34.                 "    jo   0bn"
  35.                 : "+&d" (sum), "+&a" (rp) : : "cc" );
  36.         return sum;
  37. }
  38. /*
  39.  * Fold a partial checksum without adding pseudo headers
  40.  */
  41. unsigned short csum_fold(unsigned int sum)
  42. {
  43. register_pair rp;
  44. __asm__ __volatile__ (
  45. "    slr  %N1,%N1n" /* %0 = H L */
  46. "    lr   %1,%0n"   /* %0 = H L, %1 = H L 0 0 */
  47. "    srdl %1,16n"   /* %0 = H L, %1 = 0 H L 0 */
  48. "    alr  %1,%N1n"  /* %0 = H L, %1 = L H L 0 */
  49. "    alr  %0,%1n"   /* %0 = H+L+C L+H */
  50. "    srl  %0,16n"   /* %0 = H+L+C */
  51. : "+&d" (sum), "=d" (rp) : : "cc" );
  52. return ((unsigned short) ~sum);
  53. }