linux/include/net/ieee80211_radiotap.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2003, 2004 David Young.  All rights reserved.
   3 *
   4 * Redistribution and use in source and binary forms, with or without
   5 * modification, are permitted provided that the following conditions
   6 * are met:
   7 * 1. Redistributions of source code must retain the above copyright
   8 *    notice, this list of conditions and the following disclaimer.
   9 * 2. Redistributions in binary form must reproduce the above copyright
  10 *    notice, this list of conditions and the following disclaimer in the
  11 *    documentation and/or other materials provided with the distribution.
  12 * 3. The name of David Young may not be used to endorse or promote
  13 *    products derived from this software without specific prior
  14 *    written permission.
  15 *
  16 * THIS SOFTWARE IS PROVIDED BY DAVID YOUNG ``AS IS'' AND ANY
  17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  18 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
  19 * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DAVID
  20 * YOUNG BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
  22 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  25 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
  27 * OF SUCH DAMAGE.
  28 */
  29
  30/*
  31 * Modifications to fit into the linux IEEE 802.11 stack,
  32 * Mike Kershaw (dragorn@kismetwireless.net)
  33 */
  34
  35#ifndef IEEE80211RADIOTAP_H
  36#define IEEE80211RADIOTAP_H
  37
  38#include <linux/if_ether.h>
  39#include <linux/kernel.h>
  40#include <asm/unaligned.h>
  41
  42/* Base version of the radiotap packet header data */
  43#define PKTHDR_RADIOTAP_VERSION         0
  44
  45/* A generic radio capture format is desirable. There is one for
  46 * Linux, but it is neither rigidly defined (there were not even
  47 * units given for some fields) nor easily extensible.
  48 *
  49 * I suggest the following extensible radio capture format. It is
  50 * based on a bitmap indicating which fields are present.
  51 *
  52 * I am trying to describe precisely what the application programmer
  53 * should expect in the following, and for that reason I tell the
  54 * units and origin of each measurement (where it applies), or else I
  55 * use sufficiently weaselly language ("is a monotonically nondecreasing
  56 * function of...") that I cannot set false expectations for lawyerly
  57 * readers.
  58 */
  59
  60/*
  61 * The radio capture header precedes the 802.11 header.
  62 * All data in the header is little endian on all platforms.
  63 */
  64struct ieee80211_radiotap_header {
  65        u8 it_version;          /* Version 0. Only increases
  66                                 * for drastic changes,
  67                                 * introduction of compatible
  68                                 * new fields does not count.
  69                                 */
  70        u8 it_pad;
  71        __le16 it_len;          /* length of the whole
  72                                 * header in bytes, including
  73                                 * it_version, it_pad,
  74                                 * it_len, and data fields.
  75                                 */
  76        __le32 it_present;      /* A bitmap telling which
  77                                 * fields are present. Set bit 31
  78                                 * (0x80000000) to extend the
  79                                 * bitmap by another 32 bits.
  80                                 * Additional extensions are made
  81                                 * by setting bit 31.
  82                                 */
  83} __packed;
  84
  85/* Name                                 Data type    Units
  86 * ----                                 ---------    -----
  87 *
  88 * IEEE80211_RADIOTAP_TSFT              __le64       microseconds
  89 *
  90 *      Value in microseconds of the MAC's 64-bit 802.11 Time
  91 *      Synchronization Function timer when the first bit of the
  92 *      MPDU arrived at the MAC. For received frames, only.
  93 *
  94 * IEEE80211_RADIOTAP_CHANNEL           2 x __le16   MHz, bitmap
  95 *
  96 *      Tx/Rx frequency in MHz, followed by flags (see below).
  97 *
  98 * IEEE80211_RADIOTAP_FHSS              __le16       see below
  99 *
 100 *      For frequency-hopping radios, the hop set (first byte)
 101 *      and pattern (second byte).
 102 *
 103 * IEEE80211_RADIOTAP_RATE              u8           500kb/s
 104 *
 105 *      Tx/Rx data rate
 106 *
 107 * IEEE80211_RADIOTAP_DBM_ANTSIGNAL     s8           decibels from
 108 *                                                   one milliwatt (dBm)
 109 *
 110 *      RF signal power at the antenna, decibel difference from
 111 *      one milliwatt.
 112 *
 113 * IEEE80211_RADIOTAP_DBM_ANTNOISE      s8           decibels from
 114 *                                                   one milliwatt (dBm)
 115 *
 116 *      RF noise power at the antenna, decibel difference from one
 117 *      milliwatt.
 118 *
 119 * IEEE80211_RADIOTAP_DB_ANTSIGNAL      u8           decibel (dB)
 120 *
 121 *      RF signal power at the antenna, decibel difference from an
 122 *      arbitrary, fixed reference.
 123 *
 124 * IEEE80211_RADIOTAP_DB_ANTNOISE       u8           decibel (dB)
 125 *
 126 *      RF noise power at the antenna, decibel difference from an
 127 *      arbitrary, fixed reference point.
 128 *
 129 * IEEE80211_RADIOTAP_LOCK_QUALITY      __le16       unitless
 130 *
 131 *      Quality of Barker code lock. Unitless. Monotonically
 132 *      nondecreasing with "better" lock strength. Called "Signal
 133 *      Quality" in datasheets.  (Is there a standard way to measure
 134 *      this?)
 135 *
 136 * IEEE80211_RADIOTAP_TX_ATTENUATION    __le16       unitless
 137 *
 138 *      Transmit power expressed as unitless distance from max
 139 *      power set at factory calibration.  0 is max power.
 140 *      Monotonically nondecreasing with lower power levels.
 141 *
 142 * IEEE80211_RADIOTAP_DB_TX_ATTENUATION __le16       decibels (dB)
 143 *
 144 *      Transmit power expressed as decibel distance from max power
 145 *      set at factory calibration.  0 is max power.  Monotonically
 146 *      nondecreasing with lower power levels.
 147 *
 148 * IEEE80211_RADIOTAP_DBM_TX_POWER      s8           decibels from
 149 *                                                   one milliwatt (dBm)
 150 *
 151 *      Transmit power expressed as dBm (decibels from a 1 milliwatt
 152 *      reference). This is the absolute power level measured at
 153 *      the antenna port.
 154 *
 155 * IEEE80211_RADIOTAP_FLAGS             u8           bitmap
 156 *
 157 *      Properties of transmitted and received frames. See flags
 158 *      defined below.
 159 *
 160 * IEEE80211_RADIOTAP_ANTENNA           u8           antenna index
 161 *
 162 *      Unitless indication of the Rx/Tx antenna for this packet.
 163 *      The first antenna is antenna 0.
 164 *
 165 * IEEE80211_RADIOTAP_RX_FLAGS          __le16       bitmap
 166 *
 167 *     Properties of received frames. See flags defined below.
 168 *
 169 * IEEE80211_RADIOTAP_TX_FLAGS          __le16       bitmap
 170 *
 171 *     Properties of transmitted frames. See flags defined below.
 172 *
 173 * IEEE80211_RADIOTAP_RTS_RETRIES       u8           data
 174 *
 175 *     Number of rts retries a transmitted frame used.
 176 *
 177 * IEEE80211_RADIOTAP_DATA_RETRIES      u8           data
 178 *
 179 *     Number of unicast retries a transmitted frame used.
 180 *
 181 * IEEE80211_RADIOTAP_MCS       u8, u8, u8              unitless
 182 *
 183 *     Contains a bitmap of known fields/flags, the flags, and
 184 *     the MCS index.
 185 *
 186 * IEEE80211_RADIOTAP_AMPDU_STATUS      u32, u16, u8, u8        unitless
 187 *
 188 *      Contains the AMPDU information for the subframe.
 189 */
 190enum ieee80211_radiotap_type {
 191        IEEE80211_RADIOTAP_TSFT = 0,
 192        IEEE80211_RADIOTAP_FLAGS = 1,
 193        IEEE80211_RADIOTAP_RATE = 2,
 194        IEEE80211_RADIOTAP_CHANNEL = 3,
 195        IEEE80211_RADIOTAP_FHSS = 4,
 196        IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5,
 197        IEEE80211_RADIOTAP_DBM_ANTNOISE = 6,
 198        IEEE80211_RADIOTAP_LOCK_QUALITY = 7,
 199        IEEE80211_RADIOTAP_TX_ATTENUATION = 8,
 200        IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9,
 201        IEEE80211_RADIOTAP_DBM_TX_POWER = 10,
 202        IEEE80211_RADIOTAP_ANTENNA = 11,
 203        IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12,
 204        IEEE80211_RADIOTAP_DB_ANTNOISE = 13,
 205        IEEE80211_RADIOTAP_RX_FLAGS = 14,
 206        IEEE80211_RADIOTAP_TX_FLAGS = 15,
 207        IEEE80211_RADIOTAP_RTS_RETRIES = 16,
 208        IEEE80211_RADIOTAP_DATA_RETRIES = 17,
 209
 210        IEEE80211_RADIOTAP_MCS = 19,
 211        IEEE80211_RADIOTAP_AMPDU_STATUS = 20,
 212
 213        /* valid in every it_present bitmap, even vendor namespaces */
 214        IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29,
 215        IEEE80211_RADIOTAP_VENDOR_NAMESPACE = 30,
 216        IEEE80211_RADIOTAP_EXT = 31
 217};
 218
 219/* Channel flags. */
 220#define IEEE80211_CHAN_TURBO    0x0010  /* Turbo channel */
 221#define IEEE80211_CHAN_CCK      0x0020  /* CCK channel */
 222#define IEEE80211_CHAN_OFDM     0x0040  /* OFDM channel */
 223#define IEEE80211_CHAN_2GHZ     0x0080  /* 2 GHz spectrum channel. */
 224#define IEEE80211_CHAN_5GHZ     0x0100  /* 5 GHz spectrum channel */
 225#define IEEE80211_CHAN_PASSIVE  0x0200  /* Only passive scan allowed */
 226#define IEEE80211_CHAN_DYN      0x0400  /* Dynamic CCK-OFDM channel */
 227#define IEEE80211_CHAN_GFSK     0x0800  /* GFSK channel (FHSS PHY) */
 228
 229/* For IEEE80211_RADIOTAP_FLAGS */
 230#define IEEE80211_RADIOTAP_F_CFP        0x01    /* sent/received
 231                                                 * during CFP
 232                                                 */
 233#define IEEE80211_RADIOTAP_F_SHORTPRE   0x02    /* sent/received
 234                                                 * with short
 235                                                 * preamble
 236                                                 */
 237#define IEEE80211_RADIOTAP_F_WEP        0x04    /* sent/received
 238                                                 * with WEP encryption
 239                                                 */
 240#define IEEE80211_RADIOTAP_F_FRAG       0x08    /* sent/received
 241                                                 * with fragmentation
 242                                                 */
 243#define IEEE80211_RADIOTAP_F_FCS        0x10    /* frame includes FCS */
 244#define IEEE80211_RADIOTAP_F_DATAPAD    0x20    /* frame has padding between
 245                                                 * 802.11 header and payload
 246                                                 * (to 32-bit boundary)
 247                                                 */
 248#define IEEE80211_RADIOTAP_F_BADFCS     0x40    /* bad FCS */
 249
 250/* For IEEE80211_RADIOTAP_RX_FLAGS */
 251#define IEEE80211_RADIOTAP_F_RX_BADPLCP 0x0002  /* frame has bad PLCP */
 252
 253/* For IEEE80211_RADIOTAP_TX_FLAGS */
 254#define IEEE80211_RADIOTAP_F_TX_FAIL    0x0001  /* failed due to excessive
 255                                                 * retries */
 256#define IEEE80211_RADIOTAP_F_TX_CTS     0x0002  /* used cts 'protection' */
 257#define IEEE80211_RADIOTAP_F_TX_RTS     0x0004  /* used rts/cts handshake */
 258#define IEEE80211_RADIOTAP_F_TX_NOACK   0x0008  /* don't expect an ack */
 259
 260
 261/* For IEEE80211_RADIOTAP_MCS */
 262#define IEEE80211_RADIOTAP_MCS_HAVE_BW          0x01
 263#define IEEE80211_RADIOTAP_MCS_HAVE_MCS         0x02
 264#define IEEE80211_RADIOTAP_MCS_HAVE_GI          0x04
 265#define IEEE80211_RADIOTAP_MCS_HAVE_FMT         0x08
 266#define IEEE80211_RADIOTAP_MCS_HAVE_FEC         0x10
 267
 268#define IEEE80211_RADIOTAP_MCS_BW_MASK          0x03
 269#define         IEEE80211_RADIOTAP_MCS_BW_20    0
 270#define         IEEE80211_RADIOTAP_MCS_BW_40    1
 271#define         IEEE80211_RADIOTAP_MCS_BW_20L   2
 272#define         IEEE80211_RADIOTAP_MCS_BW_20U   3
 273#define IEEE80211_RADIOTAP_MCS_SGI              0x04
 274#define IEEE80211_RADIOTAP_MCS_FMT_GF           0x08
 275#define IEEE80211_RADIOTAP_MCS_FEC_LDPC         0x10
 276
 277/* For IEEE80211_RADIOTAP_AMPDU_STATUS */
 278#define IEEE80211_RADIOTAP_AMPDU_REPORT_ZEROLEN         0x0001
 279#define IEEE80211_RADIOTAP_AMPDU_IS_ZEROLEN             0x0002
 280#define IEEE80211_RADIOTAP_AMPDU_LAST_KNOWN             0x0004
 281#define IEEE80211_RADIOTAP_AMPDU_IS_LAST                0x0008
 282#define IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_ERR          0x0010
 283#define IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_KNOWN        0x0020
 284
 285/* helpers */
 286static inline int ieee80211_get_radiotap_len(unsigned char *data)
 287{
 288        struct ieee80211_radiotap_header *hdr =
 289                (struct ieee80211_radiotap_header *)data;
 290
 291        return get_unaligned_le16(&hdr->it_len);
 292}
 293
 294#endif                          /* IEEE80211_RADIOTAP_H */
 295
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.