89 lines
2.9 KiB
C
89 lines
2.9 KiB
C
/*
|
|
* Radiotap parser
|
|
*
|
|
* Copyright 2007 Andy Green <andy@warmcat.com>
|
|
* Copyright 2009 Johannes Berg <johannes@sipsolutions.net>
|
|
*
|
|
* SPDX-License-Identifier: (ISC OR GPL-2.0-only)
|
|
*/
|
|
|
|
#ifndef __RADIOTAP_ITER_H
|
|
#define __RADIOTAP_ITER_H
|
|
|
|
#define RADIOTAP_SUPPORT_OVERRIDES
|
|
|
|
#include <glib.h>
|
|
#include "packet-ieee80211-radiotap-defs.h"
|
|
|
|
/* Radiotap header iteration
|
|
* implemented in radiotap.c
|
|
*/
|
|
|
|
struct radiotap_override {
|
|
guint8 field;
|
|
guint align:4, size:4;
|
|
};
|
|
|
|
struct radiotap_align_size {
|
|
guint align:4, size:4;
|
|
};
|
|
|
|
struct ieee80211_radiotap_namespace {
|
|
const struct radiotap_align_size *align_size;
|
|
int n_bits;
|
|
guint32 oui;
|
|
guint8 subns;
|
|
};
|
|
|
|
struct ieee80211_radiotap_vendor_namespaces {
|
|
const struct ieee80211_radiotap_namespace *ns;
|
|
int n_ns;
|
|
};
|
|
|
|
/**
|
|
* struct ieee80211_radiotap_iterator - tracks walk thru present radiotap args
|
|
*
|
|
* Describes the radiotap parser state. Fields prefixed with an underscore
|
|
* must not be used by users of the parser, only by the parser internally.
|
|
*/
|
|
|
|
struct ieee80211_radiotap_iterator {
|
|
struct ieee80211_radiotap_header *_rtheader; /**< pointer to the radiotap header we are walking through */
|
|
const struct ieee80211_radiotap_vendor_namespaces *_vns; /**< vendor namespace definitions*/
|
|
const struct ieee80211_radiotap_namespace *current_namespace; /**< pointer to the current namespace definition (or internally
|
|
%NULL if the current namespace is unknown)*/
|
|
|
|
unsigned char *_arg, *_next_ns_data; /**< beginning of the next namespace's data */
|
|
guint32 *_next_bitmap; /**< internal pointer to next present u32 */
|
|
|
|
unsigned char *this_arg; /**< pointer to current radiotap arg; it is valid after each call
|
|
to ieee80211_radiotap_iterator_next() but also after
|
|
ieee80211_radiotap_iterator_init() where it will point to
|
|
the beginning of the actual data portion */
|
|
#ifdef RADIOTAP_SUPPORT_OVERRIDES
|
|
const struct radiotap_override *overrides; /**< override standard radiotap fields */
|
|
int n_overrides; /**< number of overrides */
|
|
#endif
|
|
int this_arg_index; /**< index of current arg, valid after each successful call to
|
|
ieee80211_radiotap_iterator_next() */
|
|
int this_arg_size; /**< length of the current arg, for convenience*/
|
|
|
|
int is_radiotap_ns;
|
|
int tlv_mode;
|
|
|
|
int _max_length; /**< length of radiotap header in cpu byte ordering */
|
|
int _arg_index; /**< next argument index */
|
|
guint32 _bitmap_shifter; /**< internal shifter for curr u32 bitmap, b0 set == arg present */
|
|
int _reset_on_ext; /**< internal; reset the arg index to 0 when going to the next bitmap word */
|
|
};
|
|
|
|
extern int ieee80211_radiotap_iterator_init(
|
|
struct ieee80211_radiotap_iterator *iterator,
|
|
struct ieee80211_radiotap_header *radiotap_header,
|
|
int max_length, const struct ieee80211_radiotap_vendor_namespaces *vns);
|
|
|
|
extern int ieee80211_radiotap_iterator_next(
|
|
struct ieee80211_radiotap_iterator *iterator);
|
|
|
|
#endif /* __RADIOTAP_ITER_H */
|