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