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

VxWorks

开发平台:

C/C++

  1. /* in_cksum.c - internet checksum routines */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5.  * Copyright (c) 1988, 1992, 1993
  6.  * The Regents of the University of California.  All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  * This product includes software developed by the University of
  19.  * California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  *
  36.  * @(#)in_cksum.c 8.1 (Berkeley) 6/10/93
  37.  */
  38. /*
  39. modification history
  40. --------------------
  41. 01b,12oct01,rae  merge from truestack ver 01c base o1a (compiler warnings)
  42. 01a,03mar96,vin  created from BSD4.4 stuff.
  43. */
  44. #include "vxWorks.h"
  45. #include "net/systm.h"
  46. #include "net/mbuf.h"
  47. #ifdef INCHKSUM_PORTABLE
  48. #include "stdio.h"
  49. /*
  50.  * Checksum routine for Internet Protocol family headers (Portable Version).
  51.  *
  52.  * This routine is very heavily used in the network
  53.  * code and should be modified for each CPU to be as fast as possible.
  54.  */
  55. #define ADDCARRY(x)  (x > 65535 ? x -= 65535 : x)
  56. #define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; ADDCARRY(sum);}
  57. int
  58. in_cksum(m, len)
  59. register struct mbuf *m;
  60. register int len;
  61. {
  62. register u_short *w;
  63. register int sum = 0;
  64. register int mlen = 0;
  65. int byte_swapped = 0;
  66. union {
  67. char c[2];
  68. u_short s;
  69. } s_util;
  70. union {
  71. u_short s[2];
  72. long l;
  73. } l_util;
  74. for (;m && len; m = m->m_next) {
  75. if (m->m_len == 0)
  76. continue;
  77. w = mtod(m, u_short *);
  78. if (mlen == -1) {
  79. /*
  80.  * The first byte of this mbuf is the continuation
  81.  * of a word spanning between this mbuf and the
  82.  * last mbuf.
  83.  *
  84.  * s_util.c[0] is already saved when scanning previous 
  85.  * mbuf.
  86.  */
  87. s_util.c[1] = *(char *)w;
  88. sum += s_util.s;
  89. w = (u_short *)((char *)w + 1);
  90. mlen = m->m_len - 1;
  91. len--;
  92. } else
  93. mlen = m->m_len;
  94. if (len < mlen)
  95. mlen = len;
  96. len -= mlen;
  97. /*
  98.  * Force to even boundary.
  99.  */
  100. if ((1 & (int) w) && (mlen > 0)) {
  101. REDUCE;
  102. sum <<= 8;
  103. s_util.c[0] = *(u_char *)w;
  104. w = (u_short *)((char *)w + 1);
  105. mlen--;
  106. byte_swapped = 1;
  107. }
  108. /*
  109.  * Unroll the loop to make overhead from
  110.  * branches &c small.
  111.  */
  112. while ((mlen -= 32) >= 0) {
  113. sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3];
  114. sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7];
  115. sum += w[8]; sum += w[9]; sum += w[10]; sum += w[11];
  116. sum += w[12]; sum += w[13]; sum += w[14]; sum += w[15];
  117. w += 16;
  118. }
  119. mlen += 32;
  120. while ((mlen -= 8) >= 0) {
  121. sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3];
  122. w += 4;
  123. }
  124. mlen += 8;
  125. if (mlen == 0 && byte_swapped == 0)
  126. continue;
  127. REDUCE;
  128. while ((mlen -= 2) >= 0) {
  129. sum += *w++;
  130. }
  131. if (byte_swapped) {
  132. REDUCE;
  133. sum <<= 8;
  134. byte_swapped = 0;
  135. if (mlen == -1) {
  136. s_util.c[1] = *(char *)w;
  137. sum += s_util.s;
  138. mlen = 0;
  139. } else
  140. mlen = -1;
  141. } else if (mlen == -1)
  142. s_util.c[0] = *(char *)w;
  143. }
  144. if (len)
  145. printf("cksum: out of datan");
  146. if (mlen == -1) {
  147. /* The last mbuf has odd # of bytes. Follow the
  148.    standard (the odd byte may be shifted left by 8 bits
  149.    or not as determined by endian-ness of the machine) */
  150. s_util.c[1] = 0;
  151. sum += s_util.s;
  152. }
  153. REDUCE;
  154. return (~sum & 0xffff);
  155. }
  156. #else
  157. #include "logLib.h"
  158. extern int cksum();
  159. /*******************************************************************************
  160. *
  161. * in_cksum - Checksum routine for Internet Protocol family headers
  162. *
  163. * Unportable version that calls architecture dependent routine cksum ().
  164. */
  165. int in_cksum (m, len)
  166.     FAST struct mbuf *m;
  167.     FAST int len;
  168.     {
  169.     FAST u_short sum = 0;
  170.     FAST int mlen = 0;
  171.     FAST int slen = 0;
  172.     while ((m != NULL) && (len != 0))
  173. {
  174. if ((mlen = m->m_len) > 0)
  175.     {
  176.     if (len < mlen)
  177. mlen = len;
  178.     sum = cksum (sum, mtod(m, u_short *), mlen, slen);
  179.     slen += mlen;
  180.     len -= mlen;
  181.     }
  182. m = m->m_next;
  183. }
  184.     if (len != 0)
  185. logMsg ("cksum: out of datan",0,0,0,0,0,0);
  186.     return (~sum & 0xffff);
  187.     }
  188. #endif /* INCHKSUM_PORTABLE */