wireshark/epan/dissectors/packet-ieee80211-radio.c

737 lines
22 KiB
C
Raw Normal View History

/* packet-ieee80211-radio.c
* Routines for pseudo 802.11 header dissection
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* Copied from README.developer
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "config.h"
#include <epan/packet.h>
#include <wiretap/wtap.h>
#include "packet-ieee80211.h"
void proto_register_ieee80211_radio(void);
void proto_reg_handoff_ieee80211_radio(void);
static dissector_handle_t wlan_radio_handle;
static dissector_handle_t ieee80211_handle;
static int proto_wlan_radio = -1;
/* ************************************************************************* */
/* Header field info values for radio information */
/* ************************************************************************* */
static int hf_wlan_radio_phy_band = -1;
static int hf_wlan_radio_data_rate = -1;
static int hf_wlan_radio_mcs_index = -1;
static int hf_wlan_radio_bandwidth = -1;
static int hf_wlan_radio_short_gi = -1;
static int hf_wlan_radio_channel = -1;
static int hf_wlan_radio_frequency = -1;
static int hf_wlan_radio_signal_percent = -1;
static int hf_wlan_radio_signal_dbm = -1;
static int hf_wlan_radio_noise_percent = -1;
static int hf_wlan_radio_noise_dbm = -1;
static int hf_wlan_radio_timestamp = -1;
static const value_string phy_band_vals[] = {
{ PHDR_802_11_PHY_BAND_11_FHSS, "802.11 FHSS" },
{ PHDR_802_11_PHY_BAND_11B, "802.11b" },
{ PHDR_802_11_PHY_BAND_11A, "802.11a" },
{ PHDR_802_11_PHY_BAND_11G, "802.11g" },
{ PHDR_802_11_PHY_BAND_11G_PURE, "802.11g (pure-g)" },
{ PHDR_802_11_PHY_BAND_11G_MIXED, "802.11g (mixed g/b)" },
{ PHDR_802_11_PHY_BAND_11A_108, "802.11a (turbo)" },
{ PHDR_802_11_PHY_BAND_11G_PURE_108, "802.11g (pure-g, turbo)" },
{ PHDR_802_11_PHY_BAND_11G_MIXED_108, "802.11g (mixed g/b, turbo)" },
{ PHDR_802_11_PHY_BAND_11G_STURBO, "802.11g (static turbo)" },
{ PHDR_802_11_PHY_BAND_11N, "802.11n" },
{ PHDR_802_11_PHY_BAND_11N_5GHZ, "802.11n (5 GHz)" },
{ PHDR_802_11_PHY_BAND_11N_2_4GHZ, "802.11n (2.4 GHz)" },
{ PHDR_802_11_PHY_BAND_11AC, "802.11ac" },
{ 0, NULL }
};
static const value_string bandwidth_vals[] = {
{ PHDR_802_11_BANDWIDTH_20_MHZ, "20 MHz" },
{ PHDR_802_11_BANDWIDTH_40_MHZ, "40 MHz" },
{ PHDR_802_11_BANDWIDTH_20_20L, "20 MHz + 20 MHz lower" },
{ PHDR_802_11_BANDWIDTH_20_20U, "20 MHz + 20 MHz upper" },
{ PHDR_802_11_BANDWIDTH_80_MHZ, "80 MHz" },
{ PHDR_802_11_BANDWIDTH_40_40L, "40 MHz + 40 MHz lower" },
{ PHDR_802_11_BANDWIDTH_40_40U, "40 MHz + 40 MHz upper" },
{ PHDR_802_11_BANDWIDTH_20LL, "20LL" },
{ PHDR_802_11_BANDWIDTH_20LU, "20LU" },
{ PHDR_802_11_BANDWIDTH_20UL, "20UL" },
{ PHDR_802_11_BANDWIDTH_20UU, "20UU" },
{ PHDR_802_11_BANDWIDTH_160_MHZ, "160 MHz" },
{ PHDR_802_11_BANDWIDTH_80_80L, "80 MHz + 80 MHz lower" },
{ PHDR_802_11_BANDWIDTH_80_80U, "80 MHz + 80 MHz upper" },
{ PHDR_802_11_BANDWIDTH_40LL, "40LL" },
{ PHDR_802_11_BANDWIDTH_40LU, "40LU" },
{ PHDR_802_11_BANDWIDTH_40UL, "40UL" },
{ PHDR_802_11_BANDWIDTH_40UU, "40UU" },
{ PHDR_802_11_BANDWIDTH_20LLL, "20LLL" },
{ PHDR_802_11_BANDWIDTH_20LLU, "20LLU" },
{ PHDR_802_11_BANDWIDTH_20LUL, "20LUL" },
{ PHDR_802_11_BANDWIDTH_20LUU, "20LUU" },
{ PHDR_802_11_BANDWIDTH_20ULL, "20ULL" },
{ PHDR_802_11_BANDWIDTH_20ULU, "20ULU" },
{ PHDR_802_11_BANDWIDTH_20UUL, "20UUL" },
{ PHDR_802_11_BANDWIDTH_20UUU, "20UUU" },
{ 0, NULL }
};
/*
* Data rates corresponding to a given 802.11n MCS index, bandwidth, and
* guard interval.
*
* Indices are:
*
* the MCS index (0-76);
*
* 0 for 20 MHz, 1 for 40 MHz;
*
* 0 for a long guard interval, 1 for a short guard interval.
*/
WS_DLL_PUBLIC_DEF
const float ieee80211_float_htrates[MAX_MCS_INDEX+1][2][2] = {
/* MCS 0 */
{ /* 20 Mhz */ { 6.5f, /* SGI */ 7.2f, },
/* 40 Mhz */ { 13.5f, /* SGI */ 15.0f, },
},
/* MCS 1 */
{ /* 20 Mhz */ { 13.0f, /* SGI */ 14.4f, },
/* 40 Mhz */ { 27.0f, /* SGI */ 30.0f, },
},
/* MCS 2 */
{ /* 20 Mhz */ { 19.5f, /* SGI */ 21.7f, },
/* 40 Mhz */ { 40.5f, /* SGI */ 45.0f, },
},
/* MCS 3 */
{ /* 20 Mhz */ { 26.0f, /* SGI */ 28.9f, },
/* 40 Mhz */ { 54.0f, /* SGI */ 60.0f, },
},
/* MCS 4 */
{ /* 20 Mhz */ { 39.0f, /* SGI */ 43.3f, },
/* 40 Mhz */ { 81.0f, /* SGI */ 90.0f, },
},
/* MCS 5 */
{ /* 20 Mhz */ { 52.0f, /* SGI */ 57.8f, },
/* 40 Mhz */ { 108.0f, /* SGI */ 120.0f, },
},
/* MCS 6 */
{ /* 20 Mhz */ { 58.5f, /* SGI */ 65.0f, },
/* 40 Mhz */ { 121.5f, /* SGI */ 135.0f, },
},
/* MCS 7 */
{ /* 20 Mhz */ { 65.0f, /* SGI */ 72.2f, },
/* 40 Mhz */ { 135.0f, /* SGI */ 150.0f, },
},
/* MCS 8 */
{ /* 20 Mhz */ { 13.0f, /* SGI */ 14.4f, },
/* 40 Mhz */ { 27.0f, /* SGI */ 30.0f, },
},
/* MCS 9 */
{ /* 20 Mhz */ { 26.0f, /* SGI */ 28.9f, },
/* 40 Mhz */ { 54.0f, /* SGI */ 60.0f, },
},
/* MCS 10 */
{ /* 20 Mhz */ { 39.0f, /* SGI */ 43.3f, },
/* 40 Mhz */ { 81.0f, /* SGI */ 90.0f, },
},
/* MCS 11 */
{ /* 20 Mhz */ { 52.0f, /* SGI */ 57.8f, },
/* 40 Mhz */ { 108.0f, /* SGI */ 120.0f, },
},
/* MCS 12 */
{ /* 20 Mhz */ { 78.0f, /* SGI */ 86.7f, },
/* 40 Mhz */ { 162.0f, /* SGI */ 180.0f, },
},
/* MCS 13 */
{ /* 20 Mhz */ { 104.0f, /* SGI */ 115.6f, },
/* 40 Mhz */ { 216.0f, /* SGI */ 240.0f, },
},
/* MCS 14 */
{ /* 20 Mhz */ { 117.0f, /* SGI */ 130.0f, },
/* 40 Mhz */ { 243.0f, /* SGI */ 270.0f, },
},
/* MCS 15 */
{ /* 20 Mhz */ { 130.0f, /* SGI */ 144.4f, },
/* 40 Mhz */ { 270.0f, /* SGI */ 300.0f, },
},
/* MCS 16 */
{ /* 20 Mhz */ { 19.5f, /* SGI */ 21.7f, },
/* 40 Mhz */ { 40.5f, /* SGI */ 45.0f, },
},
/* MCS 17 */
{ /* 20 Mhz */ { 39.0f, /* SGI */ 43.3f, },
/* 40 Mhz */ { 81.0f, /* SGI */ 90.0f, },
},
/* MCS 18 */
{ /* 20 Mhz */ { 58.5f, /* SGI */ 65.0f, },
/* 40 Mhz */ { 121.5f, /* SGI */ 135.0f, },
},
/* MCS 19 */
{ /* 20 Mhz */ { 78.0f, /* SGI */ 86.7f, },
/* 40 Mhz */ { 162.0f, /* SGI */ 180.0f, },
},
/* MCS 20 */
{ /* 20 Mhz */ { 117.0f, /* SGI */ 130.0f, },
/* 40 Mhz */ { 243.0f, /* SGI */ 270.0f, },
},
/* MCS 21 */
{ /* 20 Mhz */ { 156.0f, /* SGI */ 173.3f, },
/* 40 Mhz */ { 324.0f, /* SGI */ 360.0f, },
},
/* MCS 22 */
{ /* 20 Mhz */ { 175.5f, /* SGI */ 195.0f, },
/* 40 Mhz */ { 364.5f, /* SGI */ 405.0f, },
},
/* MCS 23 */
{ /* 20 Mhz */ { 195.0f, /* SGI */ 216.7f, },
/* 40 Mhz */ { 405.0f, /* SGI */ 450.0f, },
},
/* MCS 24 */
{ /* 20 Mhz */ { 26.0f, /* SGI */ 28.9f, },
/* 40 Mhz */ { 54.0f, /* SGI */ 60.0f, },
},
/* MCS 25 */
{ /* 20 Mhz */ { 52.0f, /* SGI */ 57.8f, },
/* 40 Mhz */ { 108.0f, /* SGI */ 120.0f, },
},
/* MCS 26 */
{ /* 20 Mhz */ { 78.0f, /* SGI */ 86.7f, },
/* 40 Mhz */ { 162.0f, /* SGI */ 180.0f, },
},
/* MCS 27 */
{ /* 20 Mhz */ { 104.0f, /* SGI */ 115.6f, },
/* 40 Mhz */ { 216.0f, /* SGI */ 240.0f, },
},
/* MCS 28 */
{ /* 20 Mhz */ { 156.0f, /* SGI */ 173.3f, },
/* 40 Mhz */ { 324.0f, /* SGI */ 360.0f, },
},
/* MCS 29 */
{ /* 20 Mhz */ { 208.0f, /* SGI */ 231.1f, },
/* 40 Mhz */ { 432.0f, /* SGI */ 480.0f, },
},
/* MCS 30 */
{ /* 20 Mhz */ { 234.0f, /* SGI */ 260.0f, },
/* 40 Mhz */ { 486.0f, /* SGI */ 540.0f, },
},
/* MCS 31 */
{ /* 20 Mhz */ { 260.0f, /* SGI */ 288.9f, },
/* 40 Mhz */ { 540.0f, /* SGI */ 600.0f, },
},
/* MCS 32 */
{ /* 20 Mhz */ { 0.0f, /* SGI */ 0.0f, }, /* not valid */
/* 40 Mhz */ { 6.0f, /* SGI */ 6.7f, },
},
/* MCS 33 */
{ /* 20 Mhz */ { 39.0f, /* SGI */ 43.3f, },
/* 40 Mhz */ { 81.0f, /* SGI */ 90.0f, },
},
/* MCS 34 */
{ /* 20 Mhz */ { 52.0f, /* SGI */ 57.8f, },
/* 40 Mhz */ { 108.0f, /* SGI */ 120.0f, },
},
/* MCS 35 */
{ /* 20 Mhz */ { 65.0f, /* SGI */ 72.2f, },
/* 40 Mhz */ { 135.0f, /* SGI */ 150.0f, },
},
/* MCS 36 */
{ /* 20 Mhz */ { 58.5f, /* SGI */ 65.0f, },
/* 40 Mhz */ { 121.5f, /* SGI */ 135.0f, },
},
/* MCS 37 */
{ /* 20 Mhz */ { 78.0f, /* SGI */ 86.7f, },
/* 40 Mhz */ { 162.0f, /* SGI */ 180.0f, },
},
/* MCS 38 */
{ /* 20 Mhz */ { 97.5f, /* SGI */ 108.3f, },
/* 40 Mhz */ { 202.5f, /* SGI */ 225.0f, },
},
/* MCS 39 */
{ /* 20 Mhz */ { 52.0f, /* SGI */ 57.8f, },
/* 40 Mhz */ { 108.0f, /* SGI */ 120.0f, },
},
/* MCS 40 */
{ /* 20 Mhz */ { 65.0f, /* SGI */ 72.2f, },
/* 40 Mhz */ { 135.0f, /* SGI */ 150.0f, },
},
/* MCS 41 */
{ /* 20 Mhz */ { 65.0f, /* SGI */ 72.2f, },
/* 40 Mhz */ { 135.0f, /* SGI */ 150.0f, },
},
/* MCS 42 */
{ /* 20 Mhz */ { 78.0f, /* SGI */ 86.7f, },
/* 40 Mhz */ { 162.0f, /* SGI */ 180.0f, },
},
/* MCS 43 */
{ /* 20 Mhz */ { 91.0f, /* SGI */ 101.1f, },
/* 40 Mhz */ { 189.0f, /* SGI */ 210.0f, },
},
/* MCS 44 */
{ /* 20 Mhz */ { 91.0f, /* SGI */ 101.1f, },
/* 40 Mhz */ { 189.0f, /* SGI */ 210.0f, },
},
/* MCS 45 */
{ /* 20 Mhz */ { 104.0f, /* SGI */ 115.6f, },
/* 40 Mhz */ { 216.0f, /* SGI */ 240.0f, },
},
/* MCS 46 */
{ /* 20 Mhz */ { 78.0f, /* SGI */ 86.7f, },
/* 40 Mhz */ { 162.0f, /* SGI */ 180.0f, },
},
/* MCS 47 */
{ /* 20 Mhz */ { 97.5f, /* SGI */ 108.3f, },
/* 40 Mhz */ { 202.5f, /* SGI */ 225.0f, },
},
/* MCS 48 */
{ /* 20 Mhz */ { 97.5f, /* SGI */ 108.3f, },
/* 40 Mhz */ { 202.5f, /* SGI */ 225.0f, },
},
/* MCS 49 */
{ /* 20 Mhz */ { 117.0f, /* SGI */ 130.0f, },
/* 40 Mhz */ { 243.0f, /* SGI */ 270.0f, },
},
/* MCS 50 */
{ /* 20 Mhz */ { 136.5f, /* SGI */ 151.7f, },
/* 40 Mhz */ { 283.5f, /* SGI */ 315.0f, },
},
/* MCS 51 */
{ /* 20 Mhz */ { 136.5f, /* SGI */ 151.7f, },
/* 40 Mhz */ { 283.5f, /* SGI */ 315.0f, },
},
/* MCS 52 */
{ /* 20 Mhz */ { 156.0f, /* SGI */ 173.3f, },
/* 40 Mhz */ { 324.0f, /* SGI */ 360.0f, },
},
/* MCS 53 */
{ /* 20 Mhz */ { 65.0f, /* SGI */ 72.2f, },
/* 40 Mhz */ { 135.0f, /* SGI */ 150.0f, },
},
/* MCS 54 */
{ /* 20 Mhz */ { 78.0f, /* SGI */ 86.7f, },
/* 40 Mhz */ { 162.0f, /* SGI */ 180.0f, },
},
/* MCS 55 */
{ /* 20 Mhz */ { 91.0f, /* SGI */ 101.1f, },
/* 40 Mhz */ { 189.0f, /* SGI */ 210.0f, },
},
/* MCS 56 */
{ /* 20 Mhz */ { 78.0f, /* SGI */ 86.7f, },
/* 40 Mhz */ { 162.0f, /* SGI */ 180.0f, },
},
/* MCS 57 */
{ /* 20 Mhz */ { 91.0f, /* SGI */ 101.1f, },
/* 40 Mhz */ { 189.0f, /* SGI */ 210.0f, },
},
/* MCS 58 */
{ /* 20 Mhz */ { 104.0f, /* SGI */ 115.6f, },
/* 40 Mhz */ { 216.0f, /* SGI */ 240.0f, },
},
/* MCS 59 */
{ /* 20 Mhz */ { 117.0f, /* SGI */ 130.0f, },
/* 40 Mhz */ { 243.0f, /* SGI */ 270.0f, },
},
/* MCS 60 */
{ /* 20 Mhz */ { 104.0f, /* SGI */ 115.6f, },
/* 40 Mhz */ { 216.0f, /* SGI */ 240.0f, },
},
/* MCS 61 */
{ /* 20 Mhz */ { 117.0f, /* SGI */ 130.0f, },
/* 40 Mhz */ { 243.0f, /* SGI */ 270.0f, },
},
/* MCS 62 */
{ /* 20 Mhz */ { 130.0f, /* SGI */ 144.4f, },
/* 40 Mhz */ { 270.0f, /* SGI */ 300.0f, },
},
/* MCS 63 */
{ /* 20 Mhz */ { 130.0f, /* SGI */ 144.4f, },
/* 40 Mhz */ { 270.0f, /* SGI */ 300.0f, },
},
/* MCS 64 */
{ /* 20 Mhz */ { 143.0f, /* SGI */ 158.9f, },
/* 40 Mhz */ { 297.0f, /* SGI */ 330.0f, },
},
/* MCS 65 */
{ /* 20 Mhz */ { 97.5f, /* SGI */ 108.3f, },
/* 40 Mhz */ { 202.5f, /* SGI */ 225.0f, },
},
/* MCS 66 */
{ /* 20 Mhz */ { 117.0f, /* SGI */ 130.0f, },
/* 40 Mhz */ { 243.0f, /* SGI */ 270.0f, },
},
/* MCS 67 */
{ /* 20 Mhz */ { 136.5f, /* SGI */ 151.7f, },
/* 40 Mhz */ { 283.5f, /* SGI */ 315.0f, },
},
/* MCS 68 */
{ /* 20 Mhz */ { 117.0f, /* SGI */ 130.0f, },
/* 40 Mhz */ { 243.0f, /* SGI */ 270.0f, },
},
/* MCS 69 */
{ /* 20 Mhz */ { 136.5f, /* SGI */ 151.7f, },
/* 40 Mhz */ { 283.5f, /* SGI */ 315.0f, },
},
/* MCS 70 */
{ /* 20 Mhz */ { 156.0f, /* SGI */ 173.3f, },
/* 40 Mhz */ { 324.0f, /* SGI */ 360.0f, },
},
/* MCS 71 */
{ /* 20 Mhz */ { 175.5f, /* SGI */ 195.0f, },
/* 40 Mhz */ { 364.5f, /* SGI */ 405.0f, },
},
/* MCS 72 */
{ /* 20 Mhz */ { 156.0f, /* SGI */ 173.3f, },
/* 40 Mhz */ { 324.0f, /* SGI */ 360.0f, },
},
/* MCS 73 */
{ /* 20 Mhz */ { 175.5f, /* SGI */ 195.0f, },
/* 40 Mhz */ { 364.5f, /* SGI */ 405.0f, },
},
/* MCS 74 */
{ /* 20 Mhz */ { 195.0f, /* SGI */ 216.7f, },
/* 40 Mhz */ { 405.0f, /* SGI */ 450.0f, },
},
/* MCS 75 */
{ /* 20 Mhz */ { 195.0f, /* SGI */ 216.7f, },
/* 40 Mhz */ { 405.0f, /* SGI */ 450.0f, },
},
/* MCS 76 */
{ /* 20 Mhz */ { 214.5f, /* SGI */ 238.3f, },
/* 40 Mhz */ { 445.5f, /* SGI */ 495.0f, },
},
};
static gint ett_wlan_radio = -1;
/*
* Dissect 802.11 with a variable-length link-layer header and a pseudo-
* header containing radio information.
*/
static int
dissect_wlan_radio (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void *data)
{
struct ieee_802_11_phdr *phdr = (struct ieee_802_11_phdr *)data;
proto_item *ti = NULL;
proto_tree *radio_tree = NULL;
float data_rate = 0.0f;
gboolean have_data_rate = FALSE;
col_set_str(pinfo->cinfo, COL_PROTOCOL, "Radio");
col_clear(pinfo->cinfo, COL_INFO);
/* Calculate the data rate, if we have the necessary data */
if (phdr->presence_flags & PHDR_802_11_HAS_DATA_RATE) {
data_rate = phdr->data_rate * 0.5f;
have_data_rate = TRUE;
} else {
/* This applies only to 802.11n and 802.11ac */
if (phdr->presence_flags & PHDR_802_11_HAS_PHY_BAND) {
switch (phdr->phy_band) {
case PHDR_802_11_PHY_BAND_11N:
case PHDR_802_11_PHY_BAND_11N_5GHZ:
case PHDR_802_11_PHY_BAND_11N_2_4GHZ:
/* Do we have all the fields we need to look it up? */
{
#define PHDR_802_11_ALL_MCS_FIELDS \
(PHDR_802_11_HAS_MCS_INDEX | \
PHDR_802_11_HAS_BANDWIDTH | \
PHDR_802_11_HAS_SHORT_GI)
guint bandwidth_40;
if ((phdr->presence_flags & PHDR_802_11_ALL_MCS_FIELDS) == PHDR_802_11_ALL_MCS_FIELDS) {
bandwidth_40 =
(phdr->bandwidth == PHDR_802_11_BANDWIDTH_40_MHZ) ?
1 : 0;
if (phdr->mcs_index < MAX_MCS_INDEX) {
data_rate = ieee80211_float_htrates[phdr->mcs_index][bandwidth_40][phdr->short_gi];
have_data_rate = TRUE;
}
}
}
break;
}
}
}
/* Add the radio information to the column information */
if (have_data_rate)
col_add_fstr(pinfo->cinfo, COL_TX_RATE, "%.1f", data_rate);
if (phdr->presence_flags & PHDR_802_11_HAS_SIGNAL_DBM) {
col_add_fstr(pinfo->cinfo, COL_RSSI, "%u dBm", phdr->signal_dbm);
} else if (phdr->presence_flags & PHDR_802_11_HAS_SIGNAL_PERCENT) {
col_add_fstr(pinfo->cinfo, COL_RSSI, "%u%%", phdr->signal_percent);
}
if (tree) {
ti = proto_tree_add_item(tree, proto_wlan_radio, tvb, 0, 0, ENC_NA);
radio_tree = proto_item_add_subtree (ti, ett_wlan_radio);
if (phdr->presence_flags & PHDR_802_11_HAS_PHY_BAND) {
proto_tree_add_uint(radio_tree, hf_wlan_radio_phy_band, tvb, 0, 0,
phdr->phy_band);
}
if (phdr->presence_flags & PHDR_802_11_HAS_MCS_INDEX) {
proto_tree_add_uint(radio_tree, hf_wlan_radio_mcs_index, tvb, 0, 0,
phdr->mcs_index);
}
if (phdr->presence_flags & PHDR_802_11_HAS_BANDWIDTH) {
proto_tree_add_uint(radio_tree, hf_wlan_radio_bandwidth, tvb, 0, 0,
phdr->bandwidth);
}
if (phdr->presence_flags & PHDR_802_11_HAS_SHORT_GI) {
proto_tree_add_boolean(radio_tree, hf_wlan_radio_short_gi, tvb, 0, 0,
phdr->short_gi);
}
if (have_data_rate) {
proto_tree_add_float_format_value(radio_tree, hf_wlan_radio_data_rate, tvb, 0, 0,
data_rate,
"%.1f Mb/s",
data_rate);
}
if (phdr->presence_flags & PHDR_802_11_HAS_CHANNEL) {
col_add_fstr(pinfo->cinfo, COL_FREQ_CHAN, "%u", phdr->channel);
proto_tree_add_uint(radio_tree, hf_wlan_radio_channel, tvb, 0, 0,
phdr->channel);
}
if (phdr->presence_flags & PHDR_802_11_HAS_FREQUENCY) {
col_add_fstr(pinfo->cinfo, COL_FREQ_CHAN, "%u MHz", phdr->frequency);
proto_tree_add_uint_format_value(radio_tree, hf_wlan_radio_frequency, tvb, 0, 0,
phdr->frequency,
"%u MHz",
phdr->frequency);
}
if (phdr->presence_flags & PHDR_802_11_HAS_SIGNAL_PERCENT) {
col_add_fstr(pinfo->cinfo, COL_RSSI, "%u%%", phdr->signal_percent);
proto_tree_add_uint_format_value(radio_tree, hf_wlan_radio_signal_percent, tvb, 0, 0,
phdr->signal_percent,
"%u%%",
phdr->signal_percent);
}
if (phdr->presence_flags & PHDR_802_11_HAS_SIGNAL_DBM) {
col_add_fstr(pinfo->cinfo, COL_RSSI, "%d dBm", phdr->signal_dbm);
proto_tree_add_int_format_value(radio_tree, hf_wlan_radio_signal_dbm, tvb, 0, 0,
phdr->signal_dbm,
"%d dBm",
phdr->signal_dbm);
}
if (phdr->presence_flags & PHDR_802_11_HAS_NOISE_PERCENT) {
proto_tree_add_uint_format_value(radio_tree, hf_wlan_radio_noise_percent, tvb, 0, 0,
phdr->noise_percent,
"%u%%",
phdr->noise_percent);
}
if (phdr->presence_flags & PHDR_802_11_HAS_NOISE_DBM) {
proto_tree_add_int_format_value(radio_tree, hf_wlan_radio_noise_dbm, tvb, 0, 0,
phdr->noise_dbm,
"%d dBm",
phdr->noise_dbm);
}
if (phdr->presence_flags & PHDR_802_11_HAS_TSF_TIMESTAMP) {
proto_tree_add_uint64(radio_tree, hf_wlan_radio_timestamp, tvb, 0, 0,
phdr->tsf_timestamp);
}
}
/* dissect the 802.11 packet next */
pinfo->current_proto = "IEEE 802.11";
return call_dissector_with_data(ieee80211_handle, tvb, pinfo, tree, data);
}
static hf_register_info hf_wlan_radio[] = {
{&hf_wlan_radio_phy_band,
{"PHY type and band", "wlan_radio.phy_band", FT_UINT32, BASE_DEC, VALS(phy_band_vals), 0,
NULL, HFILL }},
{&hf_wlan_radio_data_rate,
{"Data rate", "wlan_radio.data_rate", FT_FLOAT, BASE_NONE, NULL, 0,
"Data rate (bits/s)", HFILL }},
{&hf_wlan_radio_mcs_index,
{"MCS index", "wlan_radio.mcs_index", FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
{&hf_wlan_radio_bandwidth,
{"Bandwidth", "wlan_radio.bandwidth", FT_UINT32, BASE_DEC, VALS(bandwidth_vals), 0,
NULL, HFILL }},
{&hf_wlan_radio_short_gi,
{"Short GI", "wlan_radio.short_gi", FT_BOOLEAN, 0, NULL, 0,
NULL, HFILL }},
{&hf_wlan_radio_channel,
{"Channel", "wlan_radio.channel", FT_UINT8, BASE_DEC, NULL, 0,
"802.11 channel number that this frame was sent/received on", HFILL }},
{&hf_wlan_radio_frequency,
{"Frequency", "wlan_radio.frequency", FT_UINT16, BASE_DEC, NULL, 0,
"Center frequency of the 802.11 channel that this frame was sent/received on", HFILL }},
{&hf_wlan_radio_signal_percent,
{"Signal strength (percentage)", "wlan_radio.signal_dbm", FT_UINT8, BASE_DEC, NULL, 0,
"Signal strength, as percentage of maximum RSSI", HFILL }},
{&hf_wlan_radio_signal_dbm,
{"Signal strength (dBm)", "wlan_radio.signal_dbm", FT_INT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
{&hf_wlan_radio_noise_percent,
{"Noise level (percentage)", "wlan_radio.noise_percentage", FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
{&hf_wlan_radio_noise_dbm,
{"Noise level (dBm)", "wlan_radio.noise_dbm", FT_INT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
{&hf_wlan_radio_timestamp,
{"TSF timestamp", "wlan_radio.timestamp", FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL }},
};
static gint *tree_array[] = {
&ett_wlan_radio
};
void proto_register_ieee80211_radio(void)
{
proto_wlan_radio = proto_register_protocol("802.11 radio information", "802.11 Radio",
"wlan_radio");
proto_register_field_array(proto_wlan_radio, hf_wlan_radio, array_length(hf_wlan_radio));
proto_register_subtree_array(tree_array, array_length(tree_array));
wlan_radio_handle = new_register_dissector("wlan_radio", dissect_wlan_radio, proto_wlan_radio);
}
void proto_reg_handoff_ieee80211_radio(void)
{
/* Register handoff to radio-header dissectors */
dissector_add_uint("wtap_encap", WTAP_ENCAP_IEEE_802_11_WITH_RADIO,
wlan_radio_handle);
ieee80211_handle = find_dissector("wlan");
}
/*
* Editor modelines
*
* Local Variables:
* c-basic-offset: 2
* tab-width: 8
* indent-tabs-mode: nil
* End:
*
* ex: set shiftwidth=2 tabstop=8 expandtab:
* :indentSize=2:tabSize=8:noTabs=true:
*/