summaryrefslogtreecommitdiff
path: root/epan/dissectors/packet-ieee80211-radio.c
diff options
context:
space:
mode:
authorSimon Barber <simon.barber@meraki.net>2015-12-23 12:06:40 -0800
committerMichael Mann <mmann78@netscape.net>2015-12-25 02:44:30 +0000
commit8fa7e2fb3468efe659bee2ea4f7eec450c6cc31d (patch)
tree66f5d2fdb9b605c319ede57a8d13e1fe917e2383 /epan/dissectors/packet-ieee80211-radio.c
parentffa9e938e24779470c664ea8eca1e452ce025f97 (diff)
downloadwireshark-8fa7e2fb3468efe659bee2ea4f7eec450c6cc31d.tar.gz
Refactoring: Use data bits per symbol MCS table to calculate rates and
remove redundant HT MCS/rate table. Preparation for duration calculations that will use this data as well. Change-Id: Iee4fb2eefb00eaa53a6368eca4ed60f705ff49df Reviewed-on: https://code.wireshark.org/review/12856 Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/dissectors/packet-ieee80211-radio.c')
-rw-r--r--epan/dissectors/packet-ieee80211-radio.c423
1 files changed, 34 insertions, 389 deletions
diff --git a/epan/dissectors/packet-ieee80211-radio.c b/epan/dissectors/packet-ieee80211-radio.c
index b71e505c58..5b3af9dfcd 100644
--- a/epan/dissectors/packet-ieee80211-radio.c
+++ b/epan/dissectors/packet-ieee80211-radio.c
@@ -148,404 +148,48 @@ static const value_string fec_vals[] = {
};
/*
- * 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.
+ * Lookup for the MCS index (0-76)
+ * returning the number of data bits per symbol
+ * assumes 52 subcarriers (20MHz)
+ * symbols are 4us for long guard interval, 3.6us for short guard interval
+ * Note: MCS 32 is special - only valid for 40Mhz channel.
*/
-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, },
- },
+WS_DLL_PUBLIC_DEF const guint16 ieee80211_ht_Dbps[MAX_MCS_INDEX+1] = {
+ /* MCS 0 - 1 stream */
+ 26, 52, 78, 104, 156, 208, 234, 260,
- /* MCS 6 */
- { /* 20 Mhz */ { 58.5f, /* SGI */ 65.0f, },
- /* 40 Mhz */ { 121.5f, /* SGI */ 135.0f, },
- },
+ /* MCS 8 - 2 stream */
+ 52, 104, 156, 208, 312, 416, 468, 520,
- /* MCS 7 */
- { /* 20 Mhz */ { 65.0f, /* SGI */ 72.2f, },
- /* 40 Mhz */ { 135.0f, /* SGI */ 150.0f, },
- },
+ /* MCS 16 - 3 stream */
+ 78, 156, 234, 312, 468, 624, 702, 780,
- /* MCS 8 */
- { /* 20 Mhz */ { 13.0f, /* SGI */ 14.4f, },
- /* 40 Mhz */ { 27.0f, /* SGI */ 30.0f, },
- },
+ /* MCS 24 - 4 stream */
+ 104, 208, 312, 416, 624, 832, 936, 1040,
- /* MCS 9 */
- { /* 20 Mhz */ { 26.0f, /* SGI */ 28.9f, },
- /* 40 Mhz */ { 54.0f, /* SGI */ 60.0f, },
- },
+ /* MCS 32 - 1 stream */
+ 12, /* only valid for 40Mhz - 11a/g DUP mode */
- /* 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 33 - 2 stream */
+ 156, 208, 260, 234, 312, 390,
- /* 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 39 - 3 stream */
+ 208, 260, 260, 312, 364, 364, 416, 312, 390, 390, 468, 546, 546, 624,
- /* 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 53 - 4 stream */
+ 260, 312, 364, 312, 364, 416, 468, 416, 468, 520, 520, 572,
+ 390, 468, 546, 468, 546, 624, 702, 624, 702, 780, 780, 858
+};
- /* MCS 75 */
- { /* 20 Mhz */ { 195.0f, /* SGI */ 216.7f, },
- /* 40 Mhz */ { 405.0f, /* SGI */ 450.0f, },
- },
+/*
+ * Calculates data rate corresponding to a given 802.11n MCS index,
+ * bandwidth, and guard interval.
+ */
+float ieee80211_htrate(int mcs_index, gboolean bandwidth, gboolean short_gi)
+{
+ return (float)(ieee80211_ht_Dbps[mcs_index] * (bandwidth ? 108 : 52) / 52.0 / (short_gi ? 3.6 : 4.0));
+}
- /* MCS 76 */
- { /* 20 Mhz */ { 214.5f, /* SGI */ 238.3f, },
- /* 40 Mhz */ { 445.5f, /* SGI */ 495.0f, },
- },
-};
#define MAX_MCS_VHT_INDEX 9
@@ -648,6 +292,7 @@ static const struct mcs_vht_info ieee80211_vhtinfo[MAX_MCS_VHT_INDEX+1] = {
}
};
+
static gint ett_wlan_radio = -1;
static gint ett_wlan_radio_11ac_user = -1;
@@ -783,7 +428,7 @@ dissect_wlan_radio (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void
(phdr->phy_info.info_11n.bandwidth == PHDR_802_11_BANDWIDTH_40_MHZ) ?
1 : 0;
if (phdr->phy_info.info_11n.mcs_index < MAX_MCS_INDEX) {
- data_rate = ieee80211_float_htrates[phdr->phy_info.info_11n.mcs_index][bandwidth_40][phdr->phy_info.info_11n.short_gi];
+ data_rate = ieee80211_htrate(phdr->phy_info.info_11n.mcs_index, bandwidth_40, phdr->phy_info.info_11n.short_gi);
have_data_rate = TRUE;
}
}