crc32.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:1k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* 
  2.  * Based on linux-2.5/lib/crc32 by Matt Domsch <Matt_Domsch@dell.com>
  3.  *
  4.  * FIXME: Remove in 2.5  
  5.  */
  6. #include <linux/kernel.h>
  7. #include <linux/module.h>
  8. #include <linux/types.h>
  9. #include <linux/slab.h>
  10. #include <linux/init.h>
  11. #include <asm/atomic.h>
  12. #include "crc32.h"
  13. #define CRCPOLY_BE 0x04c11db7
  14. #define CRC_BE_BITS 8
  15. static u32 *bnep_crc32_table;
  16. /*
  17.  * This code is in the public domain; copyright abandoned.
  18.  * Liability for non-performance of this code is limited to the amount
  19.  * you paid for it.  Since it is distributed for free, your refund will
  20.  * be very very small.  If it breaks, you get to keep both pieces.
  21.  */
  22. u32 bnep_crc32(u32 crc, unsigned char const *p, size_t len)
  23. {
  24. while (len--)
  25. crc = (crc << 8) ^ bnep_crc32_table[(crc >> 24) ^ *p++];
  26. return crc;
  27. }
  28. int __init bnep_crc32_init(void)
  29. {
  30. unsigned i, j;
  31. u32 crc = 0x80000000;
  32. bnep_crc32_table = kmalloc((1 << CRC_BE_BITS) * sizeof(u32), GFP_KERNEL);
  33. if (!bnep_crc32_table)
  34. return -ENOMEM;
  35. bnep_crc32_table[0] = 0;
  36. for (i = 1; i < 1 << CRC_BE_BITS; i <<= 1) {
  37. crc = (crc << 1) ^ ((crc & 0x80000000) ? CRCPOLY_BE : 0);
  38. for (j = 0; j < i; j++)
  39. bnep_crc32_table[i + j] = crc ^ bnep_crc32_table[j];
  40. }
  41. return 0;
  42. }
  43. void __exit bnep_crc32_cleanup(void)
  44. {
  45. if (bnep_crc32_table)
  46. kfree(bnep_crc32_table);
  47. bnep_crc32_table = NULL;
  48. }