/* packet-ieee80211-radio.c * Routines for pseudo 802.11 header dissection * * Wireshark - Network traffic analyzer * By Gerald Combs * 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 #include #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) { proto_tree_add_uint(radio_tree, hf_wlan_radio_channel, tvb, 0, 0, phdr->channel); } if (phdr->presence_flags & PHDR_802_11_HAS_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) { 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) { 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: */