bcmutils.c
上传用户:yuanda199
上传日期:2022-06-26
资源大小:412k
文件大小:17k
源码类别:

VxWorks

开发平台:

C/C++

  1. /*
  2.     Copyright 2001, Broadcom Corporation
  3.     All Rights Reserved.
  4.     
  5.     This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
  6.     the contents of this file may not be disclosed to third parties, copied or
  7.     duplicated in any form, in whole or in part, without the prior written
  8.     permission of Broadcom Corporation.
  9. */
  10. /*
  11.  * Misc useful OS-independent routines.
  12.  *
  13.  * Copyright(c) 2001 Broadcom Corporation
  14.  * $Id: bcmutils.c,v 1.1 Broadcom SDK $
  15.  */
  16. #include <hnbutypedefs.h>
  17. #include <osl.h>
  18. #include <bcmutils.h>
  19. #define _U 0x01 /* upper */
  20. #define _L 0x02 /* lower */
  21. #define _D 0x04 /* digit */
  22. #define _C 0x08 /* cntrl */
  23. #define _P 0x10 /* punct */
  24. #define _S 0x20 /* white space (space/lf/tab) */
  25. #define _X 0x40 /* hex digit */
  26. #define _SP 0x80 /* hard space (0x20) */
  27. static unsigned char _ctype[] = {
  28. _C,_C,_C,_C,_C,_C,_C,_C, /* 0-7 */
  29. _C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C, /* 8-15 */
  30. _C,_C,_C,_C,_C,_C,_C,_C, /* 16-23 */
  31. _C,_C,_C,_C,_C,_C,_C,_C, /* 24-31 */
  32. _S|_SP,_P,_P,_P,_P,_P,_P,_P, /* 32-39 */
  33. _P,_P,_P,_P,_P,_P,_P,_P, /* 40-47 */
  34. _D,_D,_D,_D,_D,_D,_D,_D, /* 48-55 */
  35. _D,_D,_P,_P,_P,_P,_P,_P, /* 56-63 */
  36. _P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U, /* 64-71 */
  37. _U,_U,_U,_U,_U,_U,_U,_U, /* 72-79 */
  38. _U,_U,_U,_U,_U,_U,_U,_U, /* 80-87 */
  39. _U,_U,_U,_P,_P,_P,_P,_P, /* 88-95 */
  40. _P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L, /* 96-103 */
  41. _L,_L,_L,_L,_L,_L,_L,_L, /* 104-111 */
  42. _L,_L,_L,_L,_L,_L,_L,_L, /* 112-119 */
  43. _L,_L,_L,_P,_P,_P,_P,_C, /* 120-127 */
  44. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 128-143 */
  45. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 144-159 */
  46. _S|_SP,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,   /* 160-175 */
  47. _P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,       /* 176-191 */
  48. _U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,       /* 192-207 */
  49. _U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L,       /* 208-223 */
  50. _L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,       /* 224-239 */
  51. _L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L        /* 240-255 */
  52. };
  53. #define __ismask(x) (_ctype[(int)(unsigned char)(x)])
  54. #define isalnum(c) ((__ismask(c)&(_U|_L|_D)) != 0)
  55. #define isalpha(c) ((__ismask(c)&(_U|_L)) != 0)
  56. #define iscntrl(c) ((__ismask(c)&(_C)) != 0)
  57. #define isdigit(c) ((__ismask(c)&(_D)) != 0)
  58. #define isgraph(c) ((__ismask(c)&(_P|_U|_L|_D)) != 0)
  59. #define islower(c) ((__ismask(c)&(_L)) != 0)
  60. #define isprint(c) ((__ismask(c)&(_P|_U|_L|_D|_SP)) != 0)
  61. #define ispunct(c) ((__ismask(c)&(_P)) != 0)
  62. #define isspace(c) ((__ismask(c)&(_S)) != 0)
  63. #define isupper(c) ((__ismask(c)&(_U)) != 0)
  64. #define isxdigit(c) ((__ismask(c)&(_D|_X)) != 0)
  65. static uchar
  66. bcm_toupper(uchar c)
  67. {
  68. if (islower(c))
  69. c -= 'a'-'A';
  70. return (c);
  71. }
  72. ulong
  73. bcm_strtoul(char *cp, char **endp, uint base)
  74. {
  75. ulong result, value;
  76. if (base == 0) {
  77. if (cp[0] == '0') {
  78. if ((cp[1] == 'x') || (cp[1] == 'X')) {
  79. base = 16;
  80. cp = &cp[2];
  81. } else {
  82. base = 8;
  83. cp = &cp[1];
  84. }
  85. } else
  86. base = 10;
  87. }
  88. result = 0;
  89. while (isxdigit(*cp) &&
  90.        (value = isdigit(*cp) ? *cp-'0' : bcm_toupper(*cp)-'A'+10) < base) {
  91. result = result*base + value;
  92. cp++;
  93. }
  94. if (endp)
  95. *endp = (char *)cp;
  96. return (result);
  97. }
  98. uint
  99. bcm_atoi(char *s)
  100. {
  101. uint n;
  102. n = 0;
  103. while (isdigit(*s))
  104. n = (n * 10) + *s++ - '0';
  105. return (n);
  106. }
  107. void
  108. deadbeef(char *p, uint len)
  109. {
  110. static uchar meat[] = { 0xde, 0xad, 0xbe, 0xef };
  111. while (len-- > 0) {
  112. *p = meat[((uint)p) & 3];
  113. p++;
  114. }
  115. }
  116. /* pretty hex print a contiguous buffer */
  117. void
  118. prhex(char *msg, uchar *buf, uint nbytes)
  119. {
  120. char line[256];
  121. char* p;
  122. uint i;
  123. if (msg && (msg[0] != ''))
  124. printf("%s: ", msg);
  125. p = line;
  126. for (i = 0; i < nbytes; i++) {
  127. if (i % 16 == 0) {
  128. p += sprintf(p, "%04d: ", i); /* line prefix */
  129. }
  130. p += sprintf(p, "%02x ", buf[i]);
  131. if (i % 16 == 15) {
  132. printf("%sn", line); /* flush line */
  133. p = line;
  134. }
  135. }
  136. /* flush last partial line */
  137. if (p != line)
  138. printf("%sn", line);
  139. }
  140. /* pretty hex print a pkt buffer chain */
  141. void
  142. prpkt(char *msg, void *drv, void *p0)
  143. {
  144. void *p;
  145. if (msg && (msg[0] != ''))
  146. printf("%s: ", msg);
  147. for (p = p0; p; p = PKTNEXT(drv, p))
  148. prhex(NULL, PKTDATA(drv, p), PKTLEN(drv, p));
  149. }
  150. uchar*
  151. bcm_ether_ntoa(char *ea, char *buf)
  152. {
  153. sprintf(buf,"%x:%x:%x:%x:%x:%x",
  154. ea[0]&0xff, ea[1]&0xff, ea[2]&0xff, ea[3]&0xff, ea[4]&0xff, ea[5]&0xff);
  155. return (buf);
  156. }
  157. /* parse a xx:xx:xx:xx:xx:xx format ethernet address */
  158. void
  159. bcm_ether_atoe(char *p, char *ea)
  160. {
  161. int i;
  162. for (i = 0; i < 6; i++) {
  163. ea[i] = (char) bcm_strtoul(p, &p, 16);
  164. if (*p == '') /* just bail on error */
  165. break;
  166. p++;
  167. }
  168. }
  169. int
  170. bcm_isprint(uchar c)
  171. {
  172. return (isprint(c));
  173. }
  174. /* 
  175.  * Traverse a string of 1-byte tag/1-byte length/variable-length value 
  176.  * triples, returning a pointer to the substring whose first element 
  177.  * matches tag
  178.  */
  179. uint8 *
  180. bcm_parse_tlvs(uint8 *buf, int buflen, uint key)
  181. {
  182. uint8 *cp;
  183. int totlen;
  184. cp = buf;
  185. totlen = buflen;
  186. /* find tagged parameter */
  187. while (totlen > 0) {
  188. uint tag, len;
  189. tag = *cp;
  190. if (tag == key)
  191. return (cp);
  192. len = *(cp + 1);
  193. cp += (len + 2);
  194. totlen -= (len + 2);
  195. }
  196. return NULL;
  197. }
  198. void
  199. pktqinit(struct pktq *q, int maxlen)
  200. {
  201. q->head = q->tail = NULL;
  202. q->maxlen = maxlen;
  203. q->len = 0;
  204. }
  205. void
  206. pktenq(struct pktq *q, void *p, bool lifo)
  207. {
  208. ASSERT(PKTLINK(p) == NULL);
  209. PKTSETLINK(p, NULL);
  210. if (q->tail == NULL) {
  211. ASSERT(q->head == NULL);
  212. q->head = q->tail = p;
  213. }
  214. else {
  215. ASSERT(q->head);
  216. ASSERT(PKTLINK(q->tail) == NULL);
  217. if (lifo) {
  218. PKTSETLINK(p, q->head);
  219. q->head = p;
  220. } else {
  221. PKTSETLINK(q->tail, p);
  222. q->tail = p;
  223. }
  224. }
  225. q->len++;
  226. }
  227. void*
  228. pktdeq(struct pktq *q)
  229. {
  230. void *p;
  231. if ((p = q->head)) {
  232. ASSERT(q->tail);
  233. q->head = PKTLINK(p);
  234. PKTSETLINK(p, NULL);
  235. q->len--;
  236. if (q->head == NULL)
  237. q->tail = NULL;
  238. }
  239. else {
  240. ASSERT(q->tail == NULL);
  241. }
  242. return (p);
  243. }
  244. /*******************************************************************************
  245.  * crc8
  246.  *
  247.  * Computes a crc8 over the input data using the polynomial:
  248.  *
  249.  *       x^8 + x^7 +x^6 + x^4 + x^2 + 1
  250.  *
  251.  * The caller provides the initial value (either CRC8_INIT_VALUE
  252.  * or the previous returned value) to allow for processing of 
  253.  * discontiguous blocks of data.  When generating the CRC the
  254.  * caller is responsible for complementing the final return value
  255.  * and inserting it into the byte stream.  When checking, a final
  256.  * return value of CRC8_GOOD_VALUE indicates a valid CRC.
  257.  *
  258.  * Reference: Dallas Semiconductor Application Note 27
  259.  *   Williams, Ross N., "A Painless Guide to CRC Error Detection Algorithms", 
  260.  *     ver 3, Aug 1993, ross@guest.adelaide.edu.au, Rocksoft Pty Ltd.,
  261.  *     ftp://ftp.rocksoft.com/clients/rocksoft/papers/crc_v3.txt
  262.  *
  263.  ******************************************************************************/
  264. static uint8 crc8_table[256] = {
  265.     0x00, 0xF7, 0xB9, 0x4E, 0x25, 0xD2, 0x9C, 0x6B,
  266.     0x4A, 0xBD, 0xF3, 0x04, 0x6F, 0x98, 0xD6, 0x21,
  267.     0x94, 0x63, 0x2D, 0xDA, 0xB1, 0x46, 0x08, 0xFF,
  268.     0xDE, 0x29, 0x67, 0x90, 0xFB, 0x0C, 0x42, 0xB5,
  269.     0x7F, 0x88, 0xC6, 0x31, 0x5A, 0xAD, 0xE3, 0x14,
  270.     0x35, 0xC2, 0x8C, 0x7B, 0x10, 0xE7, 0xA9, 0x5E,
  271.     0xEB, 0x1C, 0x52, 0xA5, 0xCE, 0x39, 0x77, 0x80,
  272.     0xA1, 0x56, 0x18, 0xEF, 0x84, 0x73, 0x3D, 0xCA,
  273.     0xFE, 0x09, 0x47, 0xB0, 0xDB, 0x2C, 0x62, 0x95,
  274.     0xB4, 0x43, 0x0D, 0xFA, 0x91, 0x66, 0x28, 0xDF,
  275.     0x6A, 0x9D, 0xD3, 0x24, 0x4F, 0xB8, 0xF6, 0x01,
  276.     0x20, 0xD7, 0x99, 0x6E, 0x05, 0xF2, 0xBC, 0x4B,
  277.     0x81, 0x76, 0x38, 0xCF, 0xA4, 0x53, 0x1D, 0xEA,
  278.     0xCB, 0x3C, 0x72, 0x85, 0xEE, 0x19, 0x57, 0xA0,
  279.     0x15, 0xE2, 0xAC, 0x5B, 0x30, 0xC7, 0x89, 0x7E,
  280.     0x5F, 0xA8, 0xE6, 0x11, 0x7A, 0x8D, 0xC3, 0x34,
  281.     0xAB, 0x5C, 0x12, 0xE5, 0x8E, 0x79, 0x37, 0xC0,
  282.     0xE1, 0x16, 0x58, 0xAF, 0xC4, 0x33, 0x7D, 0x8A,
  283.     0x3F, 0xC8, 0x86, 0x71, 0x1A, 0xED, 0xA3, 0x54,
  284.     0x75, 0x82, 0xCC, 0x3B, 0x50, 0xA7, 0xE9, 0x1E,
  285.     0xD4, 0x23, 0x6D, 0x9A, 0xF1, 0x06, 0x48, 0xBF,
  286.     0x9E, 0x69, 0x27, 0xD0, 0xBB, 0x4C, 0x02, 0xF5,
  287.     0x40, 0xB7, 0xF9, 0x0E, 0x65, 0x92, 0xDC, 0x2B,
  288.     0x0A, 0xFD, 0xB3, 0x44, 0x2F, 0xD8, 0x96, 0x61,
  289.     0x55, 0xA2, 0xEC, 0x1B, 0x70, 0x87, 0xC9, 0x3E,
  290.     0x1F, 0xE8, 0xA6, 0x51, 0x3A, 0xCD, 0x83, 0x74,
  291.     0xC1, 0x36, 0x78, 0x8F, 0xE4, 0x13, 0x5D, 0xAA,
  292.     0x8B, 0x7C, 0x32, 0xC5, 0xAE, 0x59, 0x17, 0xE0,
  293.     0x2A, 0xDD, 0x93, 0x64, 0x0F, 0xF8, 0xB6, 0x41,
  294.     0x60, 0x97, 0xD9, 0x2E, 0x45, 0xB2, 0xFC, 0x0B,
  295.     0xBE, 0x49, 0x07, 0xF0, 0x9B, 0x6C, 0x22, 0xD5,
  296.     0xF4, 0x03, 0x4D, 0xBA, 0xD1, 0x26, 0x68, 0x9F
  297. };
  298. #define CRC_INNER_LOOP(n, c, x) 
  299.     (c) = ((c) >> 8) ^ crc##n##_table[((c) ^ (x)) & 0xff]
  300. uint8
  301. crc8(
  302. uint8 *pdata, /* pointer to array of data to process */
  303. uint  nbytes, /* number of input data bytes to process */
  304. uint8 crc /* either CRC8_INIT_VALUE or previous return value */
  305. )
  306. {
  307. /* hard code the crc loop instead of using CRC_INNER_LOOP macro
  308.  * to avoid the undefined and unnecessary (uint8 >> 8) operation. */
  309. while (nbytes-- > 0)
  310. crc = crc8_table[(crc ^ *pdata++) & 0xff];
  311. return crc;
  312. }
  313. /*******************************************************************************
  314.  * crc16
  315.  *
  316.  * Computes a crc16 over the input data using the polynomial:
  317.  *
  318.  *       x^16 + x^12 +x^5 + 1
  319.  *
  320.  * The caller provides the initial value (either CRC16_INIT_VALUE
  321.  * or the previous returned value) to allow for processing of 
  322.  * discontiguous blocks of data.  When generating the CRC the
  323.  * caller is responsible for complementing the final return value
  324.  * and inserting it into the byte stream.  When checking, a final
  325.  * return value of CRC16_GOOD_VALUE indicates a valid CRC.
  326.  *
  327.  * Reference: Dallas Semiconductor Application Note 27
  328.  *   Williams, Ross N., "A Painless Guide to CRC Error Detection Algorithms", 
  329.  *     ver 3, Aug 1993, ross@guest.adelaide.edu.au, Rocksoft Pty Ltd.,
  330.  *     ftp://ftp.rocksoft.com/clients/rocksoft/papers/crc_v3.txt
  331.  *
  332.  ******************************************************************************/
  333. static uint16 crc16_table[256] = {
  334.     0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF,
  335.     0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7,
  336.     0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E,
  337.     0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876,
  338.     0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD,
  339.     0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5,
  340.     0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C,
  341.     0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974,
  342.     0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB,
  343.     0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3,
  344.     0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A,
  345.     0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72,
  346.     0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9,
  347.     0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1,
  348.     0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738,
  349.     0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70,
  350.     0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7,
  351.     0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF,
  352.     0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036,
  353.     0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E,
  354.     0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5,
  355.     0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD,
  356.     0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134,
  357.     0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C,
  358.     0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3,
  359.     0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB,
  360.     0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232,
  361.     0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A,
  362.     0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1,
  363.     0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9,
  364.     0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330,
  365.     0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78
  366. };
  367. uint16
  368. crc16(
  369.     uint8 *pdata,  /* pointer to array of data to process */
  370.     uint nbytes, /* number of input data bytes to process */
  371.     uint16 crc     /* either CRC16_INIT_VALUE or previous return value */
  372. )
  373. {
  374.     while (nbytes-- > 0)
  375.         CRC_INNER_LOOP(16, crc, *pdata++);
  376.     return crc;
  377. }
  378. static uint32 crc32_table[256] = {
  379.     0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
  380.     0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
  381.     0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
  382.     0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
  383.     0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
  384.     0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
  385.     0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
  386.     0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
  387.     0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
  388.     0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
  389.     0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
  390.     0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
  391.     0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
  392.     0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
  393.     0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
  394.     0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
  395.     0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
  396.     0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
  397.     0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
  398.     0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
  399.     0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
  400.     0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
  401.     0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
  402.     0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
  403.     0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
  404.     0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
  405.     0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
  406.     0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
  407.     0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
  408.     0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
  409.     0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
  410.     0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
  411.     0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
  412.     0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
  413.     0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
  414.     0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
  415.     0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
  416.     0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
  417.     0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
  418.     0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
  419.     0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
  420.     0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
  421.     0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
  422.     0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
  423.     0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
  424.     0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
  425.     0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
  426.     0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
  427.     0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
  428.     0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
  429.     0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
  430.     0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
  431.     0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
  432.     0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
  433.     0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
  434.     0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
  435.     0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
  436.     0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
  437.     0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
  438.     0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
  439.     0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
  440.     0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
  441.     0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
  442.     0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
  443. };
  444. uint32
  445. crc32(
  446.     uint8 *pdata,  /* pointer to array of data to process */
  447.     uint   nbytes, /* number of input data bytes to process */
  448.     uint32 crc     /* either CRC32_INIT_VALUE or previous return value */
  449. )
  450. {
  451.     uint8 *pend;
  452. #ifdef __mips__
  453.     uint8 tmp[4];
  454.     ulong *tptr = (ulong *)tmp;
  455. /* in case the beginning of the buffer isn't aligned */
  456. pend = (uint8 *)((uint)(pdata + 3) & 0xfffffffc);
  457. nbytes -= (pend - pdata);
  458. while (pdata < pend)
  459. CRC_INNER_LOOP(32, crc, *pdata++);
  460.     /* handle bulk of data as 32-bit words */
  461.     pend = pdata + (nbytes & 0xfffffffc);
  462.     while (pdata < pend) {
  463. *tptr = *((ulong *)pdata)++;
  464.         CRC_INNER_LOOP(32, crc, tmp[0]);
  465.         CRC_INNER_LOOP(32, crc, tmp[1]);
  466.         CRC_INNER_LOOP(32, crc, tmp[2]);
  467.         CRC_INNER_LOOP(32, crc, tmp[3]);
  468.     }
  469.     /* 1-3 bytes at end of buffer */
  470.     pend = pdata + (nbytes & 0x03);
  471.     while (pdata < pend)
  472.         CRC_INNER_LOOP(32, crc, *pdata++);
  473. #else
  474.     pend = pdata + nbytes;
  475.     while (pdata < pend)
  476.         CRC_INNER_LOOP(32, crc, *pdata++);
  477. #endif
  478.        
  479.     return crc;
  480. }
  481. #ifdef BCMDBG
  482. #define CLEN  1499
  483. #define CBUFSIZ  (CLEN+4)
  484. #define CNBUFS 5
  485. void testcrc32(void)
  486. {
  487. uint j,k,l;
  488. uint8 *buf;
  489. uint len[CNBUFS];
  490. uint32 crcr;
  491. uint32 crc32tv[CNBUFS] =
  492. {0xd2cb1faa, 0xd385c8fa, 0xf5b4f3f3, 0x55789e20, 0x00343110};
  493. ASSERT((buf = MALLOC(CBUFSIZ*CNBUFS)) != NULL);
  494. /* step through all possible alignments */
  495. for (l=0;l<=4;l++) {
  496. for (j=0; j<CNBUFS; j++) {
  497. len[j] = CLEN;
  498. for (k=0; k<len[j]; k++)
  499. *(buf + j*CBUFSIZ + (k+l)) = (j+k) & 0xff;
  500. }
  501. for (j=0; j<CNBUFS; j++) {
  502. crcr = crc32(buf + j*CBUFSIZ + l, len[j], CRC32_INIT_VALUE);
  503. ASSERT(crcr == crc32tv[j]);
  504. }
  505. }
  506. MFREE(buf, CBUFSIZ*CNBUFS);
  507. return;
  508. }
  509. #endif