xref: /freebsd/contrib/wpa/src/utils/radiotap_iter.h (revision fd5e3f3ec6c6248e892c9e7b2f17da3bfe7b6837)
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 	uint32_t *_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