0

我有一些使用函数的代码ieee80211_radiotap_iterator_init()ieee80211_radiotap_iterator_next()from 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

4

1 回答 1

1

第一的:

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

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

第二:

实施

您链接到了两个不同的实现ieee80211_radiotap_iterator_next()-一个在 radiotap-parser.c,其中ieee80211_radiotap_iterator_next()在成功时返回“下一个当前参数索引”,另一个来自 Linux kernel,在ieee80211_radiotap_iterator_next()成功时返回 0。如果您使用的 radiotap 迭代器代码是 radiotap-parser.c 中的代码,请不要注意 Linux 内核中的代码,因为它的行为方式与您使用的方式不同。

于 2013-05-10T18:45:05.353 回答