libpcap Извлечение заголовка Radiotap

У меня есть код, использующий функции ieee80211_radiotap_iterator_init() и ieee80211_radiotap_iterator_next() из radiotap-parser.c,

Я не уверен, что я делаю неправильно, может быть, кто-то может просветить меня? Я использую пример кода из документация более или менее без изменений, она очень хорошо соответствует тому, чего я пытался достичь:

/* where packet is `const u_char *packet' */
struct ieee80211_radiotap_iterator rti;
struct ieee80211_radiotap_header *rth = ( struct ieee80211_radiotap_header * ) packet;

/* 802.11 frame starts here */
struct wi_frame *fr= ( struct wi_frame * ) ( packet + rth->it_len );

/* Set up the iteration */
int ret = ieee80211_radiotap_iterator_init(&rti, rth, rth->it_len);

/* Loop until we've consumed all the fields */
while(!ret) {
  printf("Itteration: %d\n", count++);
  ret = ieee80211_radiotap_iterator_next(&rti);
  if(ret) {
    /*
     * The problem is here, I'm dropping into this clause with 
     * a value of `1` consistently, that doesn't match my platform's
     * definition of EINVAL or ENOENT.
     */
    continue;
  }
  switch(rti.this_arg_index) {
  default:
    printf("Constant: %d\n", *rti.this_arg);
    break;
  }
}

Я думаю, что в этом коде есть ограниченные возможности для того, чтобы что-то испортить, я смущен тем, что 1 возвращается из ieee80211_radiotap_iterator_next(), что, согласно имплементации, не похоже на условие ошибки в реализация.

Я фильтрую пакеты типа "(type mgt) and (not type mgt subtype beacon)", и я даже не уверен, будет ли libpcap включать эти атрибуты, когда для канала данных установлено значение DLT_IEEE802_11_RADIO?


person Lee Hambley    schedule 10.05.2013    source источник


Ответы (1)


Первый:

Я фильтрую пакеты типа «(тип mgt) и (не маяк подтипа mgt)», и я даже не уверен, будет ли libpcap включать эти атрибуты, когда для канала данных установлено значение DLT_IEEE802_11_RADIO?

Так и будет. Код фильтра, созданный для DLT_IEEE802_11_RADIO, извлекает длину заголовка радиоотвода и пропускает заголовок радиоотвода, поэтому он просто пропустит заголовок радиоотвода и проверит следующий за ним заголовок 802.11.

Второй:

реализация

Вы связались с двумя разными реализациями ieee80211_radiotap_iterator_next() — тот, что на radiotap-parser.c, в котором ieee80211_radiotap_iterator_next() возвращает "следующий текущий индекс аргумента" в случае успеха, а из ядра Linux, в котором ieee80211_radiotap_iterator_next() возвращает 0 в случае успеха. Если вы используете код итератора radiotap из radiotap-parser.c, не обращайте внимания на код из ядра Linux, так как он ведет себя не так, как тот, который вы используете.

person Community    schedule 10.05.2013
comment
Спасибо, парень, я не уверен, как использовать результат пользовательской реализации ieee80211_radiotap_iterator_next(). Но я продолжу копать. Я даже не предполагал, что будут две параллельные реализации одних и тех же двух функций! - person Lee Hambley; 12.05.2013