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

VxWorks

开发平台:

C/C++

  1. /* rpcCksum.c - xdr checksum filter for UDP trame */
  2. /* Copyright 1995-1998 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01d,22jan98,c_c  Removed EXT_FUNC references.
  8. 01c,15jan96,elp added windll.h to see external function macros
  9. WIN32 DLL external functions are called through pointers.
  10. 01b,21jun95,tpr changed code inside xdrCksum().
  11. 01a,12jun95,tpr created.
  12. */
  13. /*
  14. DESCRIPTION
  15. This XDR filter either computes the XDR stream checksun and put this
  16. value inside the stream or checks that the xdr stream checksum match the
  17. checksum inside the stream.
  18. */
  19. /* includes */
  20. #include <rpc/rpc.h>
  21. #include "wdbP.h"
  22. #ifdef HOST
  23. #include "wpwrutil.h"
  24. #endif /* HOST */
  25. /* defines */
  26. #define WDB_CKSUM_FLAG 0xffff0000
  27. #define WDB_XDR_STREAM_MAX_SIZE 0x1000
  28. /* statics */
  29. LOCAL BOOL xdr_wdb_cksum_enabled = TRUE;
  30. /******************************************************************************
  31. *
  32. * xdrCksum - returns the ones compliment checksum of some memory.
  33. *
  34. * NOMANUAL
  35. */
  36. UINT32 xdrCksum
  37.     (
  38.     unsigned short * pAddr, /* start of buffer */
  39.     int len /* size of buffer in bytes */
  40.     )
  41.     {
  42.     UINT32 sum = 0;
  43.     BOOL swap = FALSE;
  44.     /* take care of unaligned buffer address */
  45.     if ((UINT32)pAddr & 0x1)
  46. {
  47. sum += *((unsigned char *) pAddr);
  48. pAddr = (unsigned short *)(((unsigned char *)pAddr) + 1);
  49. len--;
  50. swap = TRUE;
  51. }
  52.     /* evaluate checksum */
  53.     while (len > 1)
  54. {
  55. sum += * (pAddr ++);
  56. len -= 2;
  57. }
  58.     /* take care of last byte */
  59.     if (len > 0)
  60. sum = sum + ((*(unsigned char *) pAddr) << 8);
  61.     /* fold to 16 bits */
  62.     sum = (sum & 0xffff) + (sum >> 16);
  63.     sum = (sum & 0xffff) + (sum >> 16);
  64.     /* swap if we started on unaligned address */
  65.     if (swap)
  66. sum = ((sum & 0x00ff) << 8) | ((sum & 0xff00) >> 8);
  67.     return (~sum);
  68.     }
  69. /*******************************************************************************
  70. *
  71. * xdr_CHECKSUM - checksum an XDR stream
  72. *
  73. * When data are encoded in the XDR stream, this function computes the
  74. * checksum of the XDR stream pointer to by <xdr>. The checksum is performed
  75. * between the start point of the XDR stream and the current position in the
  76. * stream. The XDR stream size and checksum value are placed in the stream
  77. * at the <xdrStreamSizePos> and <xdrCksumValPos> position.
  78. *
  79. * When data are decoded from the stream, the filter verifies that the stream
  80. * checksum value match the checkum value inside the stream. One of the checksum
  81. * feature is when the checksum value of a buffer is included inside this buffer,
  82. * its checksum value is equal to zero. This feature is used by this function
  83. * to check if checksum values are equal.
  84. *
  85. * RETURN: TRUE no error was detected otherwise FALSE.
  86. */
  87. BOOL xdr_CHECKSUM
  88.     (
  89.     XDR * xdrs, /* xdr to compute/check the checksum */
  90.     UINT32 xdrCksumVal, /* xdr stream checksum value */
  91.     UINT32 xdrStreamSize, /* xdr stream size */
  92.     UINT32 xdrCksumValPos, /* checksum value inside the steam */
  93.     UINT32 xdrStreamSizePos /* stream size inside the xdr steam */
  94.     )
  95.     {
  96.     long * xdrStreamAddr; /* xdr stream buffer address */
  97.     u_int xdrStreamPos; /* xdr strean current position */
  98.     u_int cksum = 0x00;   /* checksum() return value */
  99.     switch (xdrs->x_op)
  100. {
  101. case XDR_ENCODE:
  102.     /* return if the xdr stream checksum capability is not enabled */
  103.     if (!xdr_wdb_cksum_enabled)
  104. return (TRUE);
  105.     /* save the current position in the xdr stream */
  106.     xdrStreamPos = XDR_GETPOS (xdrs);
  107.     /* get the xdr stream address */
  108.     if ((xdrStreamAddr = xdr_inline (xdrs, 0)) == NULL)
  109. return (FALSE);
  110.     /* compute the xdr stream start address */
  111.     xdrStreamAddr = (long *) ((char *) xdrStreamAddr - xdrStreamPos +
  112.      sizeof (UINT32));
  113.     /* set the current position at the xdr stream size value */
  114.     if (!XDR_SETPOS (xdrs, xdrStreamSizePos))
  115. return (FALSE);
  116.     /* compute the XDR stream size */
  117.     xdrStreamSize = xdrStreamPos - sizeof (UINT32);
  118.     /* save the xdr stream size into the xdr stream */
  119.     if (!xdr_UINT32 (xdrs, &xdrStreamSize))
  120. return (FALSE);
  121.     /* checksum the xdr stream */
  122.     cksum = (u_int) xdrCksum ((unsigned short *) xdrStreamAddr,
  123. xdrStreamSize);
  124.     cksum = htons (cksum);
  125.     /* set the flag to signal the xdr stream checksum is available */
  126.     cksum |= WDB_CKSUM_FLAG;
  127.     /* set the current position at the xdr stream checksum value */
  128.     if (!XDR_SETPOS (xdrs, xdrCksumValPos))
  129. return (FALSE);
  130.     /* put the xdr stream checksum value in the xdr steam */
  131.     if (!xdr_UINT32 (xdrs, &cksum))
  132. return (FALSE);
  133.     /* restore the current position in the xdr stream */
  134.     if (!XDR_SETPOS (xdrs, xdrStreamPos))
  135. return (FALSE);
  136.             break;
  137. case XDR_DECODE:
  138.     if (!xdr_wdb_cksum_enabled) 
  139. {
  140.         /* 
  141.          * if the xdr stream checksum capability is desabled and the
  142.          * checksum is performed on the reveiced stream then turn on
  143.          * the checksum capability and control checkum coherency.
  144.          */
  145. if (xdrCksumVal & WDB_CKSUM_FLAG)
  146.     xdr_wdb_cksum_enabled = TRUE;
  147. else 
  148.     return (TRUE);
  149. }
  150.     else 
  151. if (!(xdrCksumVal & WDB_CKSUM_FLAG))
  152.     {
  153.     /*
  154.      * Turn off checksum capability because the reveiced
  155.      * stream is sent without its checksum.
  156.      */
  157. #ifdef HOST
  158.     wpwrLogWarn ("The agent doesn't provide XDR stream checksumn");
  159. #endif
  160.     xdr_wdb_cksum_enabled = FALSE;
  161.     return (TRUE);
  162.     }
  163.     /* save the current position in the xdr stream */
  164.     xdrStreamPos = XDR_GETPOS (xdrs);
  165.     /* get the xdr stream address */
  166.     if ((xdrStreamAddr = xdr_inline (xdrs, 0)) == NULL)
  167. return (FALSE);
  168.     /* compute the xdr stream start address */
  169.     xdrStreamAddr = (long *) ((char *) xdrStreamAddr - xdrStreamPos +
  170. sizeof (UINT32));
  171.     /*
  172.      * check the xdr stream size is not too big. The size
  173.      * field may be corrupted.
  174.      */
  175.     if (WDB_XDR_STREAM_MAX_SIZE < xdrStreamSize)
  176. return (FALSE);
  177.     /* checksum the xdr stream */
  178.     cksum = (u_int) xdrCksum ((unsigned short *) xdrStreamAddr,
  179. xdrStreamSize);
  180.     /* 
  181.      * if the received stream is not corrupted its checksun value 
  182.      * should be equal to zero because its checksum value is inside
  183.      * the stream.
  184.      * if checksum is different from 0 then the received stream is 
  185.      * corrupted. So return FLASE .
  186.      */
  187.     if ((cksum & ~WDB_CKSUM_FLAG) != 0)
  188. return (FALSE);
  189.             break;
  190. default:
  191.     break;
  192. }
  193.      return (TRUE);
  194.      }