0

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)"いますが、データ リンクがDLT_IEEE802_11_RADIO?

4

1 に答える 1

1

初め:

タイプ「(type mgt) および (not type mgt subtype beacon)」のパケットをフィルタリングしていますが、データ リンクが DLT_IEEE802_11_RADIO に設定されている場合に libpcap にこれらの属性が含まれるかどうかさえわかりません。

そうなる。DLT_IEEE802_11_RADIO 用に生成されたフィルター コードは、ラジオタップ ヘッダーの長さをフェッチし、ラジオタップ ヘッダーをスキップするため、ラジオタップ ヘッダーをスキップして、それに続く 802.11 ヘッダーをチェックします。

2番:

実装

radiotap - parser.c の2 つの異なる実装にリンクしました。これは、成功すると「次の現在の引数インデックス」を返します。Linux kernel のものは、成功すると 0を返します。使用している radiotap イテレータ コードが radiotap-parser.c のものである場合、Linux カーネルのコードにはまったく注意を払う必要はありません。ieee80211_radiotap_iterator_next()ieee80211_radiotap_iterator_next()ieee80211_radiotap_iterator_next()

于 2013-05-10T18:45:05.353 に答える