Заголовок C pcap 802.11

 struct mgmt_header_t {
    u_int16_t   fc;     /* 2 bytes */
    u_int16_t   duration;   /* 2 bytes */
    u_int8_t    da[6];      /* 6 bytes */
    u_int8_t    sa[6];      /* 6 bytes */
    u_int8_t    bssid[6];   /* 6 bytes */
    u_int16_t   seq_ctrl;   /* 2 bytes */
};

void my_callback(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
    //printf("********* New Packet Arrived *********\n");
    //printf("Jacked a packet with length [%d]\n", header->len);    

    struct mgmt_header_t *mac_header = (struct mgmt_header_t *) (packet+24);
    if (mac_header->fc > 255 )
        printf("comon");

Я знаю, что mac_header находится в нужном месте, потому что я получаю от него MAC-адреса, и они правильные, но проблема в том, что fc никогда не превышает 255, поэтому левый байт всегда равен нулю.

ОБНОВИТЬ:


Я думаю, что понял это прямо сейчас, спасибо за парня и отта - для справки, вот мой полный пример http://pcap-wireless.blogspot.com/2011/11/post-2-80211-mac-header.html


person cap10ibrahim    schedule 13.11.2011    source источник


Ответы (2)


Чтобы процитировать раздел 7.1.1 «Соглашения» IEEE Std 802.11-2007:

На рисунках все биты внутри полей пронумерованы от 0 до k, где длина поля равна k + 1 бит. Границы октетов внутри поля можно получить, взяв номера битов поля по модулю 8. Октеты в числовых полях, которые длиннее одного октета, изображаются в порядке возрастания значимости, от бита с самым низким номером к биту с самым высоким номером. Октеты в полях длиннее одного октета отправляются в PLCP в порядке от октета, содержащего биты с наименьшим номером, до октета, содержащего биты с наибольшим номером.

«Октеты в полях длиннее одного октета отправляются в PLCP в порядке от октета, содержащего биты с наименьшим номером, до октета, содержащего биты с наибольшим номером». означает, что поля передаются в порядке little-endian, а не big-endian. Следовательно, 16-битное поле со значением 0x0080 будет передано как октет (байт) со значением 0x80, за которым следует октет со значением 0x00.

Это означает, что в шестнадцатеричном дампе Wiretap вы увидите 80 00, но это означает 0x0080, а не 0x8000.

Кстати, обратите внимание, что длина заголовка radiotap не гарантируется в 24 байта; заголовок включает поле длины (с прямым порядком байтов), определяющее длину заголовка.

person Community    schedule 13.11.2011

Первые 8 бит поля fc или ноль, если это запрос ассоциации. Но разве вы не пропускаете заголовок, назначая (packet+24)? Можете ли вы добавить шестнадцатеричный дамп первых 32 байтов пакета?

person ott--    schedule 13.11.2011
comment
я не пропускаю, есть что-то, называемое заголовком Radiotap длиной 24 байта, но мне нужна ваша помощь с этим, возможно, это связано с тем, как хранятся числа (big endian), я смотрел на wirehark пакет, это 8000 (hex), но wirehark прочитал это как 0x0080 - person cap10ibrahim; 13.11.2011
comment
0x0080 в порядке, Wireshark идентифицирует его как маяк? - person ott--; 14.11.2011