libpcap Radiotap标头提取

时间:2013-05-10 13:07:06

标签: c linux libpcap tcpdump 802.11

我有一些代码正在使用radiotap-parser.c中的ieee80211_radiotap_iterator_init()ieee80211_radiotap_iterator_next()函数,

我不确定我做错了什么,也许有人可以教育我?我或多或少地使用了来自the documentation的示例代码而没有修改,它非常适合我想要实现的目标:

/* 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()感到困惑,根据实现情况,这似乎不是一个错误条件在the implementation

我正在过滤"(type mgt) and (not type mgt subtype beacon)"类型的数据包,我甚至不确定当数据链接设置为DLT_IEEE802_11_RADIO时libpcap是否会包含这些属性?

1 个答案:

答案 0 :(得分:1)

首先:

  

我正在过滤类型为“(类型mgt)和(不是类型mgt子类型信标)的数据包”,当数据链接设置为DLT_IEEE802_11_RADIO时,我甚至不确定libpcap是否包含这些属性?

会的。为DLT_IEEE802_11_RADIO生成的过滤器代码获取radiotap标头长度并跳过radiotap标头,因此它将跳过radiotap标头并检查其后的802.11标头。

第二

  

实施

您链接到ieee80211_radiotap_iterator_next() - the one at radiotap-parser.c的两个不同实现,其中ieee80211_radiotap_iterator_next()在成功时返回“下一个当前arg索引”,并{{ 3}},其中ieee80211_radiotap_iterator_next()成功时返回0。如果您使用的radiotap迭代器代码是radiotap-parser.c中的代码,则不要对Linux内核中的代码进行任何关注,因为它的行为与您使用的行为不同。