Home | History | Annotate | Download | only in utils
      1 #ifndef __RADIOTAP_ITER_H
      2 #define __RADIOTAP_ITER_H
      3 
      4 #include <stdint.h>
      5 #include "radiotap.h"
      6 
      7 /* Radiotap header iteration
      8  *   implemented in radiotap.c
      9  */
     10 
     11 struct radiotap_override {
     12 	uint8_t field;
     13 	uint8_t align:4, size:4;
     14 };
     15 
     16 struct radiotap_align_size {
     17 	uint8_t align:4, size:4;
     18 };
     19 
     20 struct ieee80211_radiotap_namespace {
     21 	const struct radiotap_align_size *align_size;
     22 	int n_bits;
     23 	uint32_t oui;
     24 	uint8_t subns;
     25 };
     26 
     27 struct ieee80211_radiotap_vendor_namespaces {
     28 	const struct ieee80211_radiotap_namespace *ns;
     29 	int n_ns;
     30 };
     31 
     32 /**
     33  * struct ieee80211_radiotap_iterator - tracks walk thru present radiotap args
     34  * @this_arg_index: index of current arg, valid after each successful call
     35  *	to ieee80211_radiotap_iterator_next()
     36  * @this_arg: pointer to current radiotap arg; it is valid after each
     37  *	call to ieee80211_radiotap_iterator_next() but also after
     38  *	ieee80211_radiotap_iterator_init() where it will point to
     39  *	the beginning of the actual data portion
     40  * @this_arg_size: length of the current arg, for convenience
     41  * @current_namespace: pointer to the current namespace definition
     42  *	(or internally %NULL if the current namespace is unknown)
     43  * @is_radiotap_ns: indicates whether the current namespace is the default
     44  *	radiotap namespace or not
     45  *
     46  * @overrides: override standard radiotap fields
     47  * @n_overrides: number of overrides
     48  *
     49  * @_rtheader: pointer to the radiotap header we are walking through
     50  * @_max_length: length of radiotap header in cpu byte ordering
     51  * @_arg_index: next argument index
     52  * @_arg: next argument pointer
     53  * @_next_bitmap: internal pointer to next present u32
     54  * @_bitmap_shifter: internal shifter for curr u32 bitmap, b0 set == arg present
     55  * @_vns: vendor namespace definitions
     56  * @_next_ns_data: beginning of the next namespace's data
     57  * @_reset_on_ext: internal; reset the arg index to 0 when going to the
     58  *	next bitmap word
     59  *
     60  * Describes the radiotap parser state. Fields prefixed with an underscore
     61  * must not be used by users of the parser, only by the parser internally.
     62  */
     63 
     64 struct ieee80211_radiotap_iterator {
     65 	struct ieee80211_radiotap_header *_rtheader;
     66 	const struct ieee80211_radiotap_vendor_namespaces *_vns;
     67 	const struct ieee80211_radiotap_namespace *current_namespace;
     68 
     69 	unsigned char *_arg, *_next_ns_data;
     70 	le32 *_next_bitmap;
     71 
     72 	unsigned char *this_arg;
     73 #ifdef RADIOTAP_SUPPORT_OVERRIDES
     74 	const struct radiotap_override *overrides;
     75 	int n_overrides;
     76 #endif
     77 	int this_arg_index;
     78 	int this_arg_size;
     79 
     80 	int is_radiotap_ns;
     81 
     82 	int _max_length;
     83 	int _arg_index;
     84 	uint32_t _bitmap_shifter;
     85 	int _reset_on_ext;
     86 };
     87 
     88 extern int ieee80211_radiotap_iterator_init(
     89 	struct ieee80211_radiotap_iterator *iterator,
     90 	struct ieee80211_radiotap_header *radiotap_header,
     91 	int max_length, const struct ieee80211_radiotap_vendor_namespaces *vns);
     92 
     93 extern int ieee80211_radiotap_iterator_next(
     94 	struct ieee80211_radiotap_iterator *iterator);
     95 
     96 #endif /* __RADIOTAP_ITER_H */
     97