cksumLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:2k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* cksumLib.c - checksum routine */
  2. /* Copyright 1992-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01d,15oct01,rae  merged from truestack version 01d (SPRs 30521, 64231, 67304)
  7. 01c,19oct00,rae  fixed error with little endian targets and odd packet sizes
  8.                  (spr# 30521)
  9. 01b,04jul92,smb  added everything above sys/types.h
  10. 01a,23mar92,jmm  taken from net source  
  11. */
  12. /*
  13. DESCRIPTION
  14. */
  15. #include "vxWorks.h"
  16. #include "sys/types.h"
  17. /*******************************************************************************
  18. *
  19. * checksum - portable internet checksum calculation routine
  20. *
  21. * This checksums the buffer <pAddr> of length <len>.  This routine differs
  22. * from the standard checksum algorithm (in_cksum) in that it checksums a buffer
  23. * while the other checksums an mbuf chain.  For of a description of the
  24. * internet checksum algorithm, please refer to RFC 1071.
  25. *
  26. * RETURNS: checksum
  27. *
  28. * NOMANUAL
  29. */
  30. u_short checksum
  31.     (
  32.     u_short *           pAddr,                  /* pointer to buffer  */
  33.     int                 len                     /* length of buffer   */
  34.     )
  35.     {
  36.     int         nLeft   = len;
  37.     int         sum     = 0;
  38.     u_short *   w       = pAddr;
  39.     u_short     answer;
  40.     while (nLeft > 1)
  41.         {
  42.         sum     += *w++;
  43.         nLeft   -= 2;
  44.         }
  45.     if (nLeft == 1)
  46. #if _BYTE_ORDER == _BIG_ENDIAN
  47.         sum += 0 | ((*(u_char *) w) << 8);
  48. #else
  49.         sum += *(u_char *) w;
  50. #endif
  51.     sum = (sum >> 16) + (sum & 0xffff);
  52.     sum += (sum >> 16);
  53.     answer = sum;
  54.     return (~answer & 0xffff);
  55.     }