wpa_supplicant / hostapd
2.5
|
Radiotap parser. More...
#include "radiotap_iter.h"
#include "platform.h"
Functions | |
int | ieee80211_radiotap_iterator_init (struct ieee80211_radiotap_iterator *iterator, struct ieee80211_radiotap_header *radiotap_header, int max_length, const struct ieee80211_radiotap_vendor_namespaces *vns) |
radiotap parser iterator initialization More... | |
int | ieee80211_radiotap_iterator_next (struct ieee80211_radiotap_iterator *iterator) |
return next radiotap parser iterator arg More... | |
Radiotap parser.
Copyright 2009 Johannes Berg johan nes@ sipso luti ons.n et
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation.
Alternatively, this software may be distributed under the terms of BSD license.
See COPYING for more details.
int ieee80211_radiotap_iterator_init | ( | struct ieee80211_radiotap_iterator * | iterator, |
struct ieee80211_radiotap_header * | radiotap_header, | ||
int | max_length, | ||
const struct ieee80211_radiotap_vendor_namespaces * | vns | ||
) |
radiotap parser iterator initialization
iterator | radiotap_iterator to initialize |
radiotap_header | radiotap header to parse |
max_length | total length we can parse into (eg, whole packet length) |
This function initializes an opaque iterator struct which can then be passed to ieee80211_radiotap_iterator_next() to visit every radiotap argument which is present in the header. It knows about extended present headers and handles them.
How to use: call __ieee80211_radiotap_iterator_init() to init a semi-opaque iterator struct ieee80211_radiotap_iterator (no need to init the struct beforehand) checking for a good 0 return code. Then loop calling __ieee80211_radiotap_iterator_next()... it returns either 0, -ENOENT if there are no more args to parse, or -EINVAL if there is a problem. The iterator's this_arg member points to the start of the argument associated with the current argument index that is present, which can be found in the iterator's this_arg_index member. This arg index corresponds to the IEEE80211_RADIOTAP_... defines.
Radiotap header length: You can find the CPU-endian total radiotap header length in iterator->max_length after executing ieee80211_radiotap_iterator_init() successfully.
Alignment Gotcha: You must take care when dereferencing iterator.this_arg for multibyte types... the pointer is not aligned. Use get_unaligned((type *)iterator.this_arg) to dereference iterator.this_arg for type "type" safely on all arches.
Example code: parse.c
int ieee80211_radiotap_iterator_next | ( | struct ieee80211_radiotap_iterator * | iterator | ) |
return next radiotap parser iterator arg
iterator | radiotap_iterator to move to next arg (if any) |
This function provides the next radiotap arg index (IEEE80211_RADIOTAP_*) in this_arg_index and sets this_arg to point to the payload for the field. It takes care of alignment handling and extended present fields. this_arg can be changed by the caller (eg, incremented to move inside a compound argument like IEEE80211_RADIOTAP_CHANNEL). The args pointed to are in little-endian format whatever the endianess of your CPU.
Alignment Gotcha: You must take care when dereferencing iterator.this_arg for multibyte types... the pointer is not aligned. Use get_unaligned((type *)iterator.this_arg) to dereference iterator.this_arg for type "type" safely on all arches.