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