18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef __RADIOTAP_ITER_H 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define __RADIOTAP_ITER_H 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 47dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt#include <stdint.h> 58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "radiotap.h" 68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Radiotap header iteration 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * implemented in radiotap.c 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 107dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 117dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidtstruct radiotap_override { 127dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt uint8_t field; 137dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt uint8_t align:4, size:4; 147dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt}; 157dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 167dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidtstruct radiotap_align_size { 177dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt uint8_t align:4, size:4; 187dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt}; 197dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 207dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidtstruct ieee80211_radiotap_namespace { 217dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt const struct radiotap_align_size *align_size; 227dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt int n_bits; 237dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt uint32_t oui; 247dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt uint8_t subns; 257dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt}; 267dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 277dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidtstruct ieee80211_radiotap_vendor_namespaces { 287dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt const struct ieee80211_radiotap_namespace *ns; 297dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt int n_ns; 307dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt}; 317dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * struct ieee80211_radiotap_iterator - tracks walk thru present radiotap args 347dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @this_arg_index: index of current arg, valid after each successful call 357dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * to ieee80211_radiotap_iterator_next() 367dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @this_arg: pointer to current radiotap arg; it is valid after each 377dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * call to ieee80211_radiotap_iterator_next() but also after 387dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * ieee80211_radiotap_iterator_init() where it will point to 397dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * the beginning of the actual data portion 407dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @this_arg_size: length of the current arg, for convenience 417dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @current_namespace: pointer to the current namespace definition 427dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * (or internally %NULL if the current namespace is unknown) 437dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @is_radiotap_ns: indicates whether the current namespace is the default 447dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * radiotap namespace or not 457dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * 467dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @overrides: override standard radiotap fields 477dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @n_overrides: number of overrides 487dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * 497dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @_rtheader: pointer to the radiotap header we are walking through 507dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @_max_length: length of radiotap header in cpu byte ordering 517dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @_arg_index: next argument index 527dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @_arg: next argument pointer 537dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @_next_bitmap: internal pointer to next present u32 547dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @_bitmap_shifter: internal shifter for curr u32 bitmap, b0 set == arg present 557dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @_vns: vendor namespace definitions 567dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @_next_ns_data: beginning of the next namespace's data 577dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @_reset_on_ext: internal; reset the arg index to 0 when going to the 587dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * next bitmap word 597dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * 607dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * Describes the radiotap parser state. Fields prefixed with an underscore 617dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * must not be used by users of the parser, only by the parser internally. 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct ieee80211_radiotap_iterator { 657dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt struct ieee80211_radiotap_header *_rtheader; 667dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt const struct ieee80211_radiotap_vendor_namespaces *_vns; 677dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt const struct ieee80211_radiotap_namespace *current_namespace; 687dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 697dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt unsigned char *_arg, *_next_ns_data; 707dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt uint32_t *_next_bitmap; 717dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned char *this_arg; 737dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt#ifdef RADIOTAP_SUPPORT_OVERRIDES 747dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt const struct radiotap_override *overrides; 757dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt int n_overrides; 767dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt#endif 777dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt int this_arg_index; 787dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt int this_arg_size; 797dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 807dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt int is_radiotap_ns; 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 827dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt int _max_length; 837dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt int _arg_index; 847dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt uint32_t _bitmap_shifter; 857dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt int _reset_on_ext; 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int ieee80211_radiotap_iterator_init( 897dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt struct ieee80211_radiotap_iterator *iterator, 907dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt struct ieee80211_radiotap_header *radiotap_header, 917dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt int max_length, const struct ieee80211_radiotap_vendor_namespaces *vns); 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int ieee80211_radiotap_iterator_next( 947dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt struct ieee80211_radiotap_iterator *iterator); 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* __RADIOTAP_ITER_H */ 97