1ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe/* crc32 -- calculate and POSIX.2 checksum
2ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   Copyright (C) 92, 1995-1999 Free Software Foundation, Inc.
3ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
4ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   This program is free software; you can redistribute it and/or modify
5ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   it under the terms of the GNU General Public License as published by
6ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   the Free Software Foundation; either version 2, or (at your option)
7ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   any later version.
8ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
9ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   This program is distributed in the hope that it will be useful,
10ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   but WITHOUT ANY WARRANTY; without even the implied warranty of
11ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   GNU General Public License for more details.
13ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
14ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   You should have received a copy of the GNU General Public License
15ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   along with this program; if not, write to the Free Software Foundation,
16ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
17ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1813ddcb169f28e87e493f49887c7b06050d008c9cJens Axboe#include <inttypes.h>
19ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include "crc32.h"
20ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
2113ddcb169f28e87e493f49887c7b06050d008c9cJens Axboestatic const uint32_t crctab[256] = {
22ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x0,
23ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B,
24ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x1A864DB2, 0x1E475005, 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6,
25ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x2B4BCB61, 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD,
26ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x4C11DB70, 0x48D0C6C7, 0x4593E01E, 0x4152FDA9, 0x5F15ADAC,
27ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x5BD4B01B, 0x569796C2, 0x52568B75, 0x6A1936C8, 0x6ED82B7F,
28ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x639B0DA6, 0x675A1011, 0x791D4014, 0x7DDC5DA3, 0x709F7B7A,
29ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x745E66CD, 0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039,
30ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5, 0xBE2B5B58,
31ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xBAEA46EF, 0xB7A96036, 0xB3687D81, 0xAD2F2D84, 0xA9EE3033,
32ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xA4AD16EA, 0xA06C0B5D, 0xD4326D90, 0xD0F37027, 0xDDB056FE,
33ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xD9714B49, 0xC7361B4C, 0xC3F706FB, 0xCEB42022, 0xCA753D95,
34ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1, 0xE13EF6F4,
35ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D, 0x34867077, 0x30476DC0,
36ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x3D044B19, 0x39C556AE, 0x278206AB, 0x23431B1C, 0x2E003DC5,
37ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x2AC12072, 0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16,
38ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x018AEB13, 0x054BF6A4, 0x0808D07D, 0x0CC9CDCA, 0x7897AB07,
39ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x7C56B6B0, 0x71159069, 0x75D48DDE, 0x6B93DDDB, 0x6F52C06C,
40ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x6211E6B5, 0x66D0FB02, 0x5E9F46BF, 0x5A5E5B08, 0x571D7DD1,
41ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x53DC6066, 0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA,
42ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E, 0xBFA1B04B,
43ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xBB60ADFC, 0xB6238B25, 0xB2E29692, 0x8AAD2B2F, 0x8E6C3698,
44ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x832F1041, 0x87EE0DF6, 0x99A95DF3, 0x9D684044, 0x902B669D,
45ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x94EA7B2A, 0xE0B41DE7, 0xE4750050, 0xE9362689, 0xEDF73B3E,
46ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2, 0xC6BCF05F,
47ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686, 0xD5B88683, 0xD1799B34,
48ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xDC3ABDED, 0xD8FBA05A, 0x690CE0EE, 0x6DCDFD59, 0x608EDB80,
49ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x644FC637, 0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB,
50ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x4F040D56, 0x4BC510E1, 0x46863638, 0x42472B8F, 0x5C007B8A,
51ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x58C1663D, 0x558240E4, 0x51435D53, 0x251D3B9E, 0x21DC2629,
52ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x2C9F00F0, 0x285E1D47, 0x36194D42, 0x32D850F5, 0x3F9B762C,
53ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x3B5A6B9B, 0x0315D626, 0x07D4CB91, 0x0A97ED48, 0x0E56F0FF,
54ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623, 0xF12F560E,
55ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xF5EE4BB9, 0xF8AD6D60, 0xFC6C70D7, 0xE22B20D2, 0xE6EA3D65,
56ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xEBA91BBC, 0xEF68060B, 0xD727BBB6, 0xD3E6A601, 0xDEA580D8,
57ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xDA649D6F, 0xC423CD6A, 0xC0E2D0DD, 0xCDA1F604, 0xC960EBB3,
58ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7, 0xAE3AFBA2,
59ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B, 0x9B3660C6, 0x9FF77D71,
60ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x92B45BA8, 0x9675461F, 0x8832161A, 0x8CF30BAD, 0x81B02D74,
61ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x857130C3, 0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640,
62ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x4E8EE645, 0x4A4FFBF2, 0x470CDD2B, 0x43CDC09C, 0x7B827D21,
63ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x7F436096, 0x7200464F, 0x76C15BF8, 0x68860BFD, 0x6C47164A,
64ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x61043093, 0x65C52D24, 0x119B4BE9, 0x155A565E, 0x18197087,
65ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x1CD86D30, 0x029F3D35, 0x065E2082, 0x0B1D065B, 0x0FDC1BEC,
66ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088, 0x2497D08D,
67ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x2056CD3A, 0x2D15EBE3, 0x29D4F654, 0xC5A92679, 0xC1683BCE,
68ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xCC2B1D17, 0xC8EA00A0, 0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB,
69ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xDBEE767C, 0xE3A1CBC1, 0xE760D676, 0xEA23F0AF, 0xEEE2ED18,
70ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4, 0x89B8FD09,
71ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x8D79E0BE, 0x803AC667, 0x84FBDBD0, 0x9ABC8BD5, 0x9E7D9662,
72ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0x933EB0BB, 0x97FFAD0C, 0xAFB010B1, 0xAB710D06, 0xA6322BDF,
73ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe  0xA2F33668, 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4
74ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe};
75ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
7625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboeuint32_t fio_crc32(const void *buffer, unsigned long length)
77ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
78ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	const unsigned char *cp = (const unsigned char *) buffer;
7913ddcb169f28e87e493f49887c7b06050d008c9cJens Axboe	uint32_t crc = 0;
80ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
81ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	while (length--)
82ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		crc = (crc << 8) ^ crctab[((crc >> 24) ^ *(cp++)) & 0xFF];
83ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
84ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return crc;
85ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
86