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
11struct radiotap_override {
12	uint8_t field;
13	uint8_t align:4, size:4;
14};
15
16struct radiotap_align_size {
17	uint8_t align:4, size:4;
18};
19
20struct 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
27struct 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
64struct 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
88extern 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
93extern int ieee80211_radiotap_iterator_next(
94	struct ieee80211_radiotap_iterator *iterator);
95
96#endif /* __RADIOTAP_ITER_H */
97