185732ac8SCy Schubert /*
285732ac8SCy Schubert * 32-bit CRC for FCS calculation
385732ac8SCy Schubert * Copyright (c) 2010, Jouni Malinen <j@w1.fi>
485732ac8SCy Schubert *
585732ac8SCy Schubert * This software may be distributed under the terms of the BSD license.
685732ac8SCy Schubert * See README for more details.
785732ac8SCy Schubert */
885732ac8SCy Schubert
985732ac8SCy Schubert #include "utils/includes.h"
1085732ac8SCy Schubert
1185732ac8SCy Schubert #include "utils/common.h"
1285732ac8SCy Schubert #include "utils/crc32.h"
1385732ac8SCy Schubert
1485732ac8SCy Schubert /*
1585732ac8SCy Schubert * IEEE 802.11 FCS CRC32
1685732ac8SCy Schubert * G(x) = x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 +
1785732ac8SCy Schubert * x^5 + x^4 + x^2 + x + 1
1885732ac8SCy Schubert */
1985732ac8SCy Schubert static const u32 crc32_table[256] = {
2085732ac8SCy Schubert 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
2185732ac8SCy Schubert 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
2285732ac8SCy Schubert 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
2385732ac8SCy Schubert 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
2485732ac8SCy Schubert 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
2585732ac8SCy Schubert 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
2685732ac8SCy Schubert 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
2785732ac8SCy Schubert 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
2885732ac8SCy Schubert 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
2985732ac8SCy Schubert 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
3085732ac8SCy Schubert 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
3185732ac8SCy Schubert 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
3285732ac8SCy Schubert 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
3385732ac8SCy Schubert 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
3485732ac8SCy Schubert 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
3585732ac8SCy Schubert 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
3685732ac8SCy Schubert 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
3785732ac8SCy Schubert 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
3885732ac8SCy Schubert 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
3985732ac8SCy Schubert 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
4085732ac8SCy Schubert 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
4185732ac8SCy Schubert 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
4285732ac8SCy Schubert 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
4385732ac8SCy Schubert 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
4485732ac8SCy Schubert 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
4585732ac8SCy Schubert 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
4685732ac8SCy Schubert 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
4785732ac8SCy Schubert 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
4885732ac8SCy Schubert 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
4985732ac8SCy Schubert 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
5085732ac8SCy Schubert 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
5185732ac8SCy Schubert 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
5285732ac8SCy Schubert 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
5385732ac8SCy Schubert 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
5485732ac8SCy Schubert 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
5585732ac8SCy Schubert 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
5685732ac8SCy Schubert 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
5785732ac8SCy Schubert 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
5885732ac8SCy Schubert 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
5985732ac8SCy Schubert 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
6085732ac8SCy Schubert 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
6185732ac8SCy Schubert 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
6285732ac8SCy Schubert 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
6385732ac8SCy Schubert 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
6485732ac8SCy Schubert 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
6585732ac8SCy Schubert 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
6685732ac8SCy Schubert 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
6785732ac8SCy Schubert 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
6885732ac8SCy Schubert 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
6985732ac8SCy Schubert 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
7085732ac8SCy Schubert 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
7185732ac8SCy Schubert 0x2d02ef8d
7285732ac8SCy Schubert };
7385732ac8SCy Schubert
7485732ac8SCy Schubert
ieee80211_crc32(const u8 * frame,size_t frame_len)75*a90b9d01SCy Schubert u32 ieee80211_crc32(const u8 *frame, size_t frame_len)
7685732ac8SCy Schubert {
7785732ac8SCy Schubert size_t i;
7885732ac8SCy Schubert u32 crc;
7985732ac8SCy Schubert
8085732ac8SCy Schubert crc = 0xFFFFFFFF;
8185732ac8SCy Schubert for (i = 0; i < frame_len; i++)
8285732ac8SCy Schubert crc = crc32_table[(crc ^ frame[i]) & 0xff] ^ (crc >> 8);
8385732ac8SCy Schubert
8485732ac8SCy Schubert return ~crc;
8585732ac8SCy Schubert }
86