aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-mac-lte.c
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2016-10-14 08:20:02 +0200
committerPascal Quantin <pascal.quantin@gmail.com>2016-10-14 09:30:36 +0000
commit0aae3b1eaacc1cdb74ef81875776b7b496a46939 (patch)
tree1a668aca4552365733819f2e5a04138da68aad93 /epan/dissectors/packet-mac-lte.c
parent66f1baa64957f42edb8927fcdb2f64131fd415ad (diff)
MAC LTE: add dissection of NB-IoT RAR
Change-Id: I81b6ad65732dd11e5af040ec79b0175a7f06b070 Reviewed-on: https://code.wireshark.org/review/18196 Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-mac-lte.c')
-rw-r--r--epan/dissectors/packet-mac-lte.c321
1 files changed, 208 insertions, 113 deletions
diff --git a/epan/dissectors/packet-mac-lte.c b/epan/dissectors/packet-mac-lte.c
index a15ec8a170..f92efe64b2 100644
--- a/epan/dissectors/packet-mac-lte.c
+++ b/epan/dissectors/packet-mac-lte.c
@@ -194,6 +194,12 @@ static int hf_mac_lte_rar_ul_grant_msg3_pusch_nb_idx_ce_mode_b = -1;
static int hf_mac_lte_rar_ul_grant_msg3_pusch_res_alloc_ce_mode_b = -1;
static int hf_mac_lte_rar_ul_grant_nb_rep_msg3_pusch_ce_mode_b = -1;
static int hf_mac_lte_rar_ul_grant_tbs_ce_mode_b = -1;
+static int hf_mac_lte_rar_ul_grant_ul_subcarrier_spacing = -1;
+static int hf_mac_lte_rar_ul_grant_subcarrier_indication = -1;
+static int hf_mac_lte_rar_ul_grant_scheduling_delay = -1;
+static int hf_mac_lte_rar_ul_grant_msg3_repetition_number = -1;
+static int hf_mac_lte_rar_ul_grant_mcs_index = -1;
+static int hf_mac_lte_rar_ul_grant_padding_nb_mode = -1;
static int hf_mac_lte_rar_temporary_crnti = -1;
/* Common channel control values */
@@ -770,6 +776,37 @@ static const value_string rar_ul_grant_nb_rep_msg3_pusch_ce_mode_b_vals[] =
};
+static const true_false_string ul_subcarrier_spacing_val =
+{
+ "15 kHz",
+ "3.75 kHz"
+};
+
+
+static const value_string scheduling_delay_vals[]=
+{
+ { 0, "k0 = 8"},
+ { 1, "k0 = 16"},
+ { 2, "k0 = 32"},
+ { 3, "k0 = 64"},
+ { 0, NULL}
+};
+
+
+static const value_string msg3_rep_nb_vals[] =
+{
+ { 0, "1"},
+ { 1, "2"},
+ { 2, "4"},
+ { 3, "8"},
+ { 4, "16"},
+ { 5, "32"},
+ { 6, "64"},
+ { 7, "128"},
+ { 0, NULL}
+};
+
+
static const value_string buffer_size_vals[] =
{
{ 0, "BS = 0"},
@@ -2816,140 +2853,162 @@ static gint dissect_rar_entry(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre
/* Create subtree for UL grant break-down */
ul_grant_tree = proto_item_add_subtree(ul_grant_ti, ett_mac_lte_rar_ul_grant);
- switch (p_mac_lte_info->ceMode) {
- case no_ce_mode:
- default:
- /* Hopping flag (1 bit) */
- proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_hopping,
- tvb, offset, 1, ENC_BIG_ENDIAN);
-
- /* Fixed sized resource block assignment (10 bits) */
- proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_fsrba,
- tvb, offset, 2, ENC_BIG_ENDIAN);
+ if (p_mac_lte_info->nbMode == no_nb_mode) {
+ switch (p_mac_lte_info->ceMode) {
+ case no_ce_mode:
+ default:
+ /* Hopping flag (1 bit) */
+ proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_hopping,
+ tvb, offset, 1, ENC_BIG_ENDIAN);
- /* Truncated Modulation and coding scheme (4 bits) */
- proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_tmcs,
- tvb, offset+1, 2, ENC_BIG_ENDIAN);
+ /* Fixed sized resource block assignment (10 bits) */
+ proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_fsrba,
+ tvb, offset, 2, ENC_BIG_ENDIAN);
- /* TPC command for scheduled PUSCH (3 bits) */
- proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_tcsp,
- tvb, offset+2, 1, ENC_BIG_ENDIAN);
+ /* Truncated Modulation and coding scheme (4 bits) */
+ proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_tmcs,
+ tvb, offset+1, 2, ENC_BIG_ENDIAN);
- /* UL delay (1 bit) */
- proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_ul_delay,
- tvb, offset+2, 1, ENC_BIG_ENDIAN);
+ /* TPC command for scheduled PUSCH (3 bits) */
+ proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_tcsp,
+ tvb, offset+2, 1, ENC_BIG_ENDIAN);
- /* CQI request (1 bit) */
- proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_cqi_request,
- tvb, offset+2, 1, ENC_BIG_ENDIAN);
+ /* UL delay (1 bit) */
+ proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_ul_delay,
+ tvb, offset+2, 1, ENC_BIG_ENDIAN);
- offset += 3;
- break;
+ /* CQI request (1 bit) */
+ proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_cqi_request,
+ tvb, offset+2, 1, ENC_BIG_ENDIAN);
- case ce_mode_a:
- if (p_mac_lte_info->nUlRb == 0) {
- /* UL bandwidth is unknown; do not dissect UL grant */
offset += 3;
break;
- }
- bits_offset = (offset<<3) + 4;
+ case ce_mode_a:
+ if (p_mac_lte_info->nUlRb == 0) {
+ /* UL bandwidth is unknown; do not dissect UL grant */
+ offset += 3;
+ break;
+ }
- /* Msg3 PUSCH narrowband index (0 to 4 bits) */
- if (p_mac_lte_info->nUlRb == 15) {
- proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_pusch_nb_idx_ce_mode_a,
- tvb, bits_offset, 1, ENC_BIG_ENDIAN);
- bits_offset += 1;
- } else if (p_mac_lte_info->nUlRb == 25) {
- proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_pusch_nb_idx_ce_mode_a,
- tvb, bits_offset, 2, ENC_BIG_ENDIAN);
+ bits_offset = (offset<<3) + 4;
+
+ /* Msg3 PUSCH narrowband index (0 to 4 bits) */
+ if (p_mac_lte_info->nUlRb == 15) {
+ proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_pusch_nb_idx_ce_mode_a,
+ tvb, bits_offset, 1, ENC_BIG_ENDIAN);
+ bits_offset += 1;
+ } else if (p_mac_lte_info->nUlRb == 25) {
+ proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_pusch_nb_idx_ce_mode_a,
+ tvb, bits_offset, 2, ENC_BIG_ENDIAN);
+ bits_offset += 2;
+ } else if (p_mac_lte_info->nUlRb == 50) {
+ proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_pusch_nb_idx_ce_mode_a,
+ tvb, bits_offset, 3, ENC_BIG_ENDIAN);
+ bits_offset += 3;
+ } else if ((p_mac_lte_info->nUlRb == 75) || (p_mac_lte_info->nUlRb == 100)) {
+ proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_pusch_nb_idx_ce_mode_a,
+ tvb, bits_offset, 4, ENC_BIG_ENDIAN);
+ bits_offset += 4;
+ }
+
+ /* Msg3 PUSCH Resource allocation (4 bits) */
+ proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_pusch_res_alloc_ce_mode_a,
+ tvb, bits_offset, 4, ENC_BIG_ENDIAN);
+ bits_offset += 4;
+
+ /* Number of Repetitions for Msg3 PUSCH (2 bits) */
+ proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_nb_rep_msg3_pusch_ce_mode_a,
+ tvb, bits_offset, 2, ENC_BIG_ENDIAN);
bits_offset += 2;
- } else if (p_mac_lte_info->nUlRb == 50) {
- proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_pusch_nb_idx_ce_mode_a,
- tvb, bits_offset, 3, ENC_BIG_ENDIAN);
+
+ /* MCS (3 bits) */
+ proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_mcs_ce_mode_a,
+ tvb, bits_offset, 3, ENC_BIG_ENDIAN);
bits_offset += 3;
- } else if ((p_mac_lte_info->nUlRb == 75) || (p_mac_lte_info->nUlRb == 100)) {
- proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_pusch_nb_idx_ce_mode_a,
- tvb, bits_offset, 4, ENC_BIG_ENDIAN);
- bits_offset += 4;
- }
- /* Msg3 PUSCH Resource allocation (4 bits) */
- proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_pusch_res_alloc_ce_mode_a,
- tvb, bits_offset, 4, ENC_BIG_ENDIAN);
- bits_offset += 4;
-
- /* Number of Repetitions for Msg3 PUSCH (2 bits) */
- proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_nb_rep_msg3_pusch_ce_mode_a,
- tvb, bits_offset, 2, ENC_BIG_ENDIAN);
- bits_offset += 2;
-
- /* MCS (3 bits) */
- proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_mcs_ce_mode_a,
- tvb, bits_offset, 3, ENC_BIG_ENDIAN);
- bits_offset += 3;
-
- /* TPC (3 bits) */
- proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_tpc_ce_mode_a,
- tvb, bits_offset, 3, ENC_BIG_ENDIAN);
- bits_offset += 3;
-
- /* CSI request (1 bit) */
- proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_csi_request_ce_mode_a,
- tvb, bits_offset, 1, ENC_BIG_ENDIAN);
- bits_offset += 1;
-
- /* UL delay (1 bit) */
- proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_ul_delay_ce_mode_a,
- tvb, bits_offset, 1, ENC_BIG_ENDIAN);
- bits_offset += 1;
-
- /* Msg3/4 MPDCCH narrowband index (2 bits) */
- proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_msg4_mpdcch_nb_idx,
- tvb, bits_offset, 2, ENC_BIG_ENDIAN);
- bits_offset += 2;
-
- /* Optional padding (0 to 4 bits) to complete the 20 bits UL Grant */
- if (p_mac_lte_info->nUlRb == 6) {
- proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_padding_ce_mode_a,
- tvb, bits_offset, 4, ENC_BIG_ENDIAN);
- } else if (p_mac_lte_info->nUlRb == 15) {
- proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_padding_ce_mode_a,
+ /* TPC (3 bits) */
+ proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_tpc_ce_mode_a,
tvb, bits_offset, 3, ENC_BIG_ENDIAN);
- } else if (p_mac_lte_info->nUlRb == 25) {
- proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_padding_ce_mode_a,
- tvb, bits_offset, 2, ENC_BIG_ENDIAN);
- } else if (p_mac_lte_info->nUlRb == 50) {
- proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_padding_ce_mode_a,
+ bits_offset += 3;
+
+ /* CSI request (1 bit) */
+ proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_csi_request_ce_mode_a,
tvb, bits_offset, 1, ENC_BIG_ENDIAN);
- }
+ bits_offset += 1;
- offset += 3;
- break;
+ /* UL delay (1 bit) */
+ proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_ul_delay_ce_mode_a,
+ tvb, bits_offset, 1, ENC_BIG_ENDIAN);
+ bits_offset += 1;
- case ce_mode_b:
- /* Msg3 PUSCH narrowband index (2 bits) */
- proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_pusch_nb_idx_ce_mode_b,
- tvb, offset, 1, ENC_BIG_ENDIAN);
+ /* Msg3/4 MPDCCH narrowband index (2 bits) */
+ proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_msg4_mpdcch_nb_idx,
+ tvb, bits_offset, 2, ENC_BIG_ENDIAN);
+ bits_offset += 2;
- /* Msg3 PUSCH Resource allocation (3 bits) */
- proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_pusch_res_alloc_ce_mode_b,
- tvb, offset, 2, ENC_BIG_ENDIAN);
+ /* Optional padding (0 to 4 bits) to complete the 20 bits UL Grant */
+ if (p_mac_lte_info->nUlRb == 6) {
+ proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_padding_ce_mode_a,
+ tvb, bits_offset, 4, ENC_BIG_ENDIAN);
+ } else if (p_mac_lte_info->nUlRb == 15) {
+ proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_padding_ce_mode_a,
+ tvb, bits_offset, 3, ENC_BIG_ENDIAN);
+ } else if (p_mac_lte_info->nUlRb == 25) {
+ proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_padding_ce_mode_a,
+ tvb, bits_offset, 2, ENC_BIG_ENDIAN);
+ } else if (p_mac_lte_info->nUlRb == 50) {
+ proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_padding_ce_mode_a,
+ tvb, bits_offset, 1, ENC_BIG_ENDIAN);
+ }
- /* Number of Repetitions for Msg3 PUSCH (3 bits) */
- proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_nb_rep_msg3_pusch_ce_mode_b,
- tvb, offset+1, 1, ENC_BIG_ENDIAN);
+ offset += 3;
+ break;
- /* TBS (2 bits) */
- proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_tbs_ce_mode_b,
- tvb, offset+1, 1, ENC_BIG_ENDIAN);
+ case ce_mode_b:
+ /* Msg3 PUSCH narrowband index (2 bits) */
+ proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_pusch_nb_idx_ce_mode_b,
+ tvb, offset, 1, ENC_BIG_ENDIAN);
- /* Msg3/4 MPDCCH narrowband index (2 bits) */
- proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_msg4_mpdcch_nb_idx,
- tvb, ((offset+1)<<3)+6, 2, ENC_BIG_ENDIAN);
+ /* Msg3 PUSCH Resource allocation (3 bits) */
+ proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_pusch_res_alloc_ce_mode_b,
+ tvb, offset, 2, ENC_BIG_ENDIAN);
- offset += 2;
- break;
+ /* Number of Repetitions for Msg3 PUSCH (3 bits) */
+ proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_nb_rep_msg3_pusch_ce_mode_b,
+ tvb, offset+1, 1, ENC_BIG_ENDIAN);
+
+ /* TBS (2 bits) */
+ proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_tbs_ce_mode_b,
+ tvb, offset+1, 1, ENC_BIG_ENDIAN);
+
+ /* Msg3/4 MPDCCH narrowband index (2 bits) */
+ proto_tree_add_bits_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_msg4_mpdcch_nb_idx,
+ tvb, ((offset+1)<<3)+6, 2, ENC_BIG_ENDIAN);
+
+ offset += 2;
+ break;
+ }
+ } else {
+ /* Uplink subcarrier spacing (1 bit) */
+ proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_ul_subcarrier_spacing, tvb, offset, 1, ENC_BIG_ENDIAN);
+
+ /* Subcarrier indication (6 bits) */
+ proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_subcarrier_indication, tvb, offset, 2, ENC_BIG_ENDIAN);
+
+ /* Scheduling delay (2 bits) */
+ proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_scheduling_delay, tvb, offset+1, 1, ENC_BIG_ENDIAN);
+
+ /* Msg3 repetition number (3 bits) */
+ proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_msg3_repetition_number, tvb, offset+1, 1, ENC_BIG_ENDIAN);
+
+ /* MCS index (3 bits) */
+ proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_mcs_index, tvb, offset+2, 1, ENC_BIG_ENDIAN);
+
+ /* Padding (5 bits) */
+ proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_padding_nb_mode, tvb, offset+2, 1, ENC_BIG_ENDIAN);
+
+ offset += 3;
}
/* Temporary C-RNTI */
@@ -8081,7 +8140,7 @@ void proto_register_mac_lte(void)
}
},
{ &hf_mac_lte_rar_ul_grant_msg3_pusch_res_alloc_ce_mode_b,
- { "Msg3 PUSCH Resource allocation",
+ { "Msg3 PUSCH resource allocation",
"mac-lte.rar.ul-grant.msg3-pusch-res-alloc", FT_UINT16, BASE_DEC, NULL, 0x0380,
NULL, HFILL
}
@@ -8098,6 +8157,42 @@ void proto_register_mac_lte(void)
NULL, HFILL
}
},
+ { &hf_mac_lte_rar_ul_grant_ul_subcarrier_spacing,
+ { "Uplink subcarrier spacing",
+ "mac-lte.rar.ul-grant.ul-subcarrier-spacing", FT_BOOLEAN, 8, TFS(&ul_subcarrier_spacing_val), 0x08,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_rar_ul_grant_subcarrier_indication,
+ { "Subcarrier indication",
+ "mac-lte.rar.ul-grant.subcarrier-indication", FT_UINT16, BASE_DEC, NULL, 0x07e0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_rar_ul_grant_scheduling_delay,
+ { "Scheduling delay",
+ "mac-lte.rar.ul-grant.scheduling-delay", FT_UINT8, BASE_DEC, VALS(scheduling_delay_vals), 0x18,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_rar_ul_grant_msg3_repetition_number,
+ { "Msg3 repetition number",
+ "mac-lte.rar.ul-grant.msg3-repetition-number", FT_UINT8, BASE_DEC, VALS(msg3_rep_nb_vals), 0x07,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_rar_ul_grant_mcs_index,
+ { "MCS index",
+ "mac-lte.rar.ul-grant.mcs-index", FT_UINT8, BASE_DEC, NULL, 0xe0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_lte_rar_ul_grant_padding_nb_mode,
+ { "Padding",
+ "mac-lte.rar.ul-grant.padding", FT_UINT8, BASE_HEX, NULL, 0x1f,
+ NULL, HFILL
+ }
+ },
{ &hf_mac_lte_rar_temporary_crnti,
{ "Temporary C-RNTI",
"mac-lte.rar.temporary-crnti", FT_UINT16, BASE_DEC, NULL, 0x0,