2012-07-17 38 views
5

Mã dưới đây có tính toán chính xác giá trị FCS của khung 802.11 không dây?
Bởi vì giá trị được tạo bởi mã bên dưới không khớp với giá trị được hiển thị bởi Wireshark.802.11 FCS (CRC32)

const uint32_t crctable[] = { 
    0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 
    0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L, 
    0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 
    0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L, 
    0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, 
    0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 
    0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL, 
    0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 
    0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L, 
    0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, 
    0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 
    0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L, 
    0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 
    0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L, 
    0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, 
    0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 
    0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L, 
    0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 
    0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L, 
    0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, 
    0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 
    0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L, 
    0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 
    0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL, 
    0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, 
    0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 
    0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L, 
    0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 
    0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL, 
    0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, 
    0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 
    0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL 
}; 

uint32_t crc32(uint32_t bytes_sz, const uint8_t *bytes) 
{ 
    uint32_t crc = ~0; 
    uint32_t i; 
    for(i = 0; i < bytes_sz; ++i) { 
     crc = crctable[(crc^bytes[i]) & 0xff]^(crc >> 8); 
    } 
    return ~crc; 
} 


Tôi gọi hàm trên theo cách sau đây:

uint32_t crc = crc32(header->len - 4, packet); 


nơi tiêu đề là kiểu:

struct pcap_pkthdr *header; 

Các thông tin tiêu đề được xử lý bởi pcap callback :

void my_callback(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) 

Tôi đã nhận mã cho crc32() và crctable [] từ this link

Một EDIT 2 năm sau:

Đoạn mã trên của crc32() làm việc; dòng
printf("0x%x\n",crc32(sizeof(MSG)-16-4,MSG+16));
in quyền 802.11 CRC, trong đó:

MSG là một mảng (unsigned char[]) thông điệp byte sao chép và dán từ Wireshark;

16 là kích thước tiêu đề radiotap,

4 là kích thước của FCS (frame check sequence, crc32, ít về cuối nhỏ = thứ tự x86).

+0

kiểm tra một số giá trị bằng séc đã biết và kiểm tra lại. Nếu họ không phù hợp với bạn có lẽ là sai. – RedX

+0

@RedX Tôi đã thử nghiệm nó với tổng kiểm tra được tạo ra bởi wireshark và chúng không khớp. Bạn có thể vui lòng cho tôi biết vấn đề với mã ở trên là gì? – bengaluriga

+0

Có nhiều ẩn số với crc32 wireshark và cách bạn kiểm tra mã của mình. Truy cập http://www.lammertbies.nl/comm/info/crc-calculation.html và đặt một số trong đó tính toán tổng kiểm tra và xem nó có khớp với tổng kiểm tra của bạn hay không. – RedX

Trả lời

3

Giá trị được trả về bởi pcap_datalink() cho số pcap_t mà bạn đang chụp hoặc từ đó bạn đang đọc tệp chụp là gì?

Trừ khi đó là DLT_IEEE802_11 (với giá trị 105), gói không phải là gói 802.11 hoặc không phải là chỉ gói 802.11.

Nếu, ví dụ, là DLT_EN10MB, đó là gói Ethernet (bạn có thể nhận được từ bộ điều hợp 802.11, đặc biệt nếu bạn không chụp ở chế độ màn hình) và nếu là DLT_IEEE802_11_RADIO, nó bắt đầu bằng "radiotap" tiêu đề như được mô tả tại radiotap.org Web site và bạn cần bỏ qua tiêu đề radiotap để chuyển đến khung 802.11, và chỉ kiểm tra khung 802.11.

(Ngoài ra, đối với một số bộ điều hợp Atheros, khung 802.11 sẽ có một số đệm được thêm vào giữa tiêu đề 802.11 và 802.11 trọng tải, mà bạn phải loại bỏ khi kiểm tra; nếu bạn có tiêu đề radiotap, được chỉ định bởi "khung có phần đệm giữa tiêu đề 802.11 và tải trọng (tới ranh giới 32 bit)" trong the flags field.)

+1

Cảm ơn rất nhiều. Bạn thông minh. Bạn đã giải quyết vấn đề. pcap_datalink() trả lại DLT_IEEE802_11_RADIO. Và tôi đã kiểm tra trường cờ của tiêu đề radiotap, thẻ không dây của tôi không thực hiện bất kỳ vùng đệm dữ liệu nào. Vì vậy, tôi áp dụng crc32() chức năng trên gói bỏ qua tiêu đề radiotap (và trừ đi 4 byte cuối cùng của gói) và có giá trị tổng kiểm tra phù hợp với của wireshark. Cảm ơn một tấn một lần nữa. – bengaluriga

0

Một số phần cứng có khả năng giảm tải kiểm tra tổng kiểm tra, có hiệu quả cung cấp các gói kiểm tra đã được xác minh trước cho CPU thay vì gánh nặng CPU bằng xác minh kiểm tra. Theo wireshark's page on checksums, điều này có thể rời khỏi trường kiểm tra bằng số không hoặc rác.

Trong điều kiện như vậy, gói sẽ vẫn được xử lý vì hệ điều hành biết rằng kiểm tra đã được xác minh trong NIC. Hệ điều hành sẽ không vứt bỏ gói tin do một kiểm tra không hợp lệ vì nó biết NIC đã được xác nhận kiểm tra.

+0

được thêm vào kiểm tra tổng kiểm tra offload –

+0

Đây là tổng kiểm tra 802.11, không phải là kiểm tra Internet, vì vậy toàn bộ gói chịu sự kiểm tra, và kiểm tra được phần cứng kết nối lại trên bộ định tuyến trong khi truyền tải qua gói. . –

+0

@GuyHarris Cảm ơn bạn đã làm rõ. –

Các vấn đề liên quan