diff options
author | Pascal Quantin <pascal.quantin@gmail.com> | 2016-10-14 08:20:02 +0200 |
---|---|---|
committer | Pascal Quantin <pascal.quantin@gmail.com> | 2016-10-14 09:30:36 +0000 |
commit | 0aae3b1eaacc1cdb74ef81875776b7b496a46939 (patch) | |
tree | 1a668aca4552365733819f2e5a04138da68aad93 /epan/dissectors/packet-mac-lte.c | |
parent | 66f1baa64957f42edb8927fcdb2f64131fd415ad (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.c | 321 |
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, |