10a73ee0aSchristos /* 20a73ee0aSchristos * 32-bit CRC for FCS calculation 30a73ee0aSchristos * Copyright (c) 2010, Jouni Malinen <j@w1.fi> 40a73ee0aSchristos * 50a73ee0aSchristos * This software may be distributed under the terms of the BSD license. 60a73ee0aSchristos * See README for more details. 70a73ee0aSchristos */ 80a73ee0aSchristos 90a73ee0aSchristos #include "utils/includes.h" 100a73ee0aSchristos 110a73ee0aSchristos #include "utils/common.h" 120a73ee0aSchristos #include "utils/crc32.h" 130a73ee0aSchristos 140a73ee0aSchristos /* 150a73ee0aSchristos * IEEE 802.11 FCS CRC32 160a73ee0aSchristos * G(x) = x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + 170a73ee0aSchristos * x^5 + x^4 + x^2 + x + 1 180a73ee0aSchristos */ 190a73ee0aSchristos static const u32 crc32_table[256] = { 200a73ee0aSchristos 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 210a73ee0aSchristos 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 220a73ee0aSchristos 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 230a73ee0aSchristos 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 240a73ee0aSchristos 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 250a73ee0aSchristos 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 260a73ee0aSchristos 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 270a73ee0aSchristos 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 280a73ee0aSchristos 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 290a73ee0aSchristos 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 300a73ee0aSchristos 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 310a73ee0aSchristos 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 320a73ee0aSchristos 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 330a73ee0aSchristos 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 340a73ee0aSchristos 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 350a73ee0aSchristos 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 360a73ee0aSchristos 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 370a73ee0aSchristos 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 380a73ee0aSchristos 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 390a73ee0aSchristos 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 400a73ee0aSchristos 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 410a73ee0aSchristos 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 420a73ee0aSchristos 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 430a73ee0aSchristos 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 440a73ee0aSchristos 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 450a73ee0aSchristos 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 460a73ee0aSchristos 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 470a73ee0aSchristos 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 480a73ee0aSchristos 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 490a73ee0aSchristos 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 500a73ee0aSchristos 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 510a73ee0aSchristos 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 520a73ee0aSchristos 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 530a73ee0aSchristos 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 540a73ee0aSchristos 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 550a73ee0aSchristos 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 560a73ee0aSchristos 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 570a73ee0aSchristos 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 580a73ee0aSchristos 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 590a73ee0aSchristos 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 600a73ee0aSchristos 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 610a73ee0aSchristos 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 620a73ee0aSchristos 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 630a73ee0aSchristos 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 640a73ee0aSchristos 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 650a73ee0aSchristos 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 660a73ee0aSchristos 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 670a73ee0aSchristos 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 680a73ee0aSchristos 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 690a73ee0aSchristos 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 700a73ee0aSchristos 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 710a73ee0aSchristos 0x2d02ef8d 720a73ee0aSchristos }; 730a73ee0aSchristos 740a73ee0aSchristos 75*bb618362Schristos u32 ieee80211_crc32(const u8 *frame, size_t frame_len) 760a73ee0aSchristos { 770a73ee0aSchristos size_t i; 780a73ee0aSchristos u32 crc; 790a73ee0aSchristos 800a73ee0aSchristos crc = 0xFFFFFFFF; 810a73ee0aSchristos for (i = 0; i < frame_len; i++) 820a73ee0aSchristos crc = crc32_table[(crc ^ frame[i]) & 0xff] ^ (crc >> 8); 830a73ee0aSchristos 840a73ee0aSchristos return ~crc; 850a73ee0aSchristos } 86