mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 08:44:21 +08:00
2874c5fd28
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms of the gnu general public license as published by the free software foundation either version 2 of the license or at your option any later version extracted by the scancode license scanner the SPDX license identifier GPL-2.0-or-later has been chosen to replace the boilerplate/reference in 3029 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190527070032.746973796@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
81 lines
2.0 KiB
C
81 lines
2.0 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* CRC32C
|
|
*@Article{castagnoli-crc,
|
|
* author = { Guy Castagnoli and Stefan Braeuer and Martin Herrman},
|
|
* title = {{Optimization of Cyclic Redundancy-Check Codes with 24
|
|
* and 32 Parity Bits}},
|
|
* journal = IEEE Transactions on Communication,
|
|
* year = {1993},
|
|
* volume = {41},
|
|
* number = {6},
|
|
* pages = {},
|
|
* month = {June},
|
|
*}
|
|
* Used by the iSCSI driver, possibly others, and derived from the
|
|
* the iscsi-crc.c module of the linux-iscsi driver at
|
|
* http://linux-iscsi.sourceforge.net.
|
|
*
|
|
* Following the example of lib/crc32, this function is intended to be
|
|
* flexible and useful for all users. Modules that currently have their
|
|
* own crc32c, but hopefully may be able to use this one are:
|
|
* net/sctp (please add all your doco to here if you change to
|
|
* use this one!)
|
|
* <endoflist>
|
|
*
|
|
* Copyright (c) 2004 Cisco Systems, Inc.
|
|
*/
|
|
|
|
#include <crypto/hash.h>
|
|
#include <linux/err.h>
|
|
#include <linux/init.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/module.h>
|
|
#include <linux/crc32c.h>
|
|
|
|
static struct crypto_shash *tfm;
|
|
|
|
u32 crc32c(u32 crc, const void *address, unsigned int length)
|
|
{
|
|
SHASH_DESC_ON_STACK(shash, tfm);
|
|
u32 ret, *ctx = (u32 *)shash_desc_ctx(shash);
|
|
int err;
|
|
|
|
shash->tfm = tfm;
|
|
*ctx = crc;
|
|
|
|
err = crypto_shash_update(shash, address, length);
|
|
BUG_ON(err);
|
|
|
|
ret = *ctx;
|
|
barrier_data(ctx);
|
|
return ret;
|
|
}
|
|
|
|
EXPORT_SYMBOL(crc32c);
|
|
|
|
static int __init libcrc32c_mod_init(void)
|
|
{
|
|
tfm = crypto_alloc_shash("crc32c", 0, 0);
|
|
return PTR_ERR_OR_ZERO(tfm);
|
|
}
|
|
|
|
static void __exit libcrc32c_mod_fini(void)
|
|
{
|
|
crypto_free_shash(tfm);
|
|
}
|
|
|
|
const char *crc32c_impl(void)
|
|
{
|
|
return crypto_shash_driver_name(tfm);
|
|
}
|
|
EXPORT_SYMBOL(crc32c_impl);
|
|
|
|
module_init(libcrc32c_mod_init);
|
|
module_exit(libcrc32c_mod_fini);
|
|
|
|
MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>");
|
|
MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations");
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_SOFTDEP("pre: crc32c");
|