diff options
author | Pascal Quantin <pascal.quantin@gmail.com> | 2017-07-04 22:02:14 +0200 |
---|---|---|
committer | Pascal Quantin <pascal.quantin@gmail.com> | 2017-07-04 20:48:28 +0000 |
commit | a45ed8a222d3b571aab77c711dfed85009e3d7a9 (patch) | |
tree | a43f780120102e568244662793abc41dd42dc118 /epan/dissectors/packet-rlc-lte.c | |
parent | 365c8312475d02e55b3293e1e5f2c66ce4f0a5e5 (diff) |
RLC LTE: fix dissection of NB-IoT PDUs
While we are at it, let's cache the dissector handles
Change-Id: Ied301f0e9dc42da38976ba606df008b1e7e45102
Reviewed-on: https://code.wireshark.org/review/22518
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-rlc-lte.c')
-rw-r--r-- | epan/dissectors/packet-rlc-lte.c | 58 |
1 files changed, 44 insertions, 14 deletions
diff --git a/epan/dissectors/packet-rlc-lte.c b/epan/dissectors/packet-rlc-lte.c index 4e9a0db14a..e068031127 100644 --- a/epan/dissectors/packet-rlc-lte.c +++ b/epan/dissectors/packet-rlc-lte.c @@ -105,6 +105,18 @@ extern int proto_pdcp_lte; static dissector_handle_t pdcp_lte_handle; static dissector_handle_t ip_handle; +static dissector_handle_t lte_rrc_mcch; +static dissector_handle_t lte_rrc_ul_ccch; +static dissector_handle_t lte_rrc_dl_ccch; +static dissector_handle_t lte_rrc_bcch_bch; +static dissector_handle_t lte_rrc_bcch_dl_sch; +static dissector_handle_t lte_rrc_pcch; +static dissector_handle_t lte_rrc_ul_ccch_nb; +static dissector_handle_t lte_rrc_dl_ccch_nb; +static dissector_handle_t lte_rrc_bcch_bch_nb; +static dissector_handle_t lte_rrc_bcch_dl_sch_nb; +static dissector_handle_t lte_rrc_pcch_nb; + static int rlc_lte_tap = -1; @@ -878,7 +890,13 @@ static void show_PDU_in_tree(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb if (params && (params->id != id)) { params = NULL; } - p_pdcp_lte_info->seqnum_length = params ? params->pdcp_sn_bits : 12; + if (params) { + p_pdcp_lte_info->seqnum_length = params->pdcp_sn_bits; + } else if (rlc_info->nbMode == rlc_nb_mode) { + p_pdcp_lte_info->seqnum_length = 7; + } else { + p_pdcp_lte_info->seqnum_length = 12; + } break; default: @@ -899,7 +917,6 @@ static void show_PDU_in_tree(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb else if (global_rlc_lte_call_rrc_for_mcch && (rlc_info->channelType == CHANNEL_TYPE_MCCH)) { /* Send whole PDU to RRC */ static tvbuff_t *rrc_tvb = NULL; - volatile dissector_handle_t protocol_handle; /* Get tvb for passing to LTE RRC dissector */ if (reassembly_info == NULL) { @@ -911,11 +928,8 @@ static void show_PDU_in_tree(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb reassembly_show_source(reassembly_info, tree, tvb, offset); } - /* Get dissector handle */ - protocol_handle = find_dissector("lte_rrc.mcch"); - TRY { - call_dissector_only(protocol_handle, rrc_tvb, pinfo, tree, NULL); + call_dissector_only(lte_rrc_mcch, rrc_tvb, pinfo, tree, NULL); } CATCH_ALL { } @@ -2028,26 +2042,31 @@ static void dissect_rlc_lte_tm(tvbuff_t *tvb, packet_info *pinfo, if (global_rlc_lte_call_rrc_for_ccch) { tvbuff_t *rrc_tvb = tvb_new_subset_remaining(tvb, offset); - volatile dissector_handle_t protocol_handle = 0; + volatile dissector_handle_t protocol_handle; switch (p_rlc_lte_info->channelType) { case CHANNEL_TYPE_CCCH: if (p_rlc_lte_info->direction == DIRECTION_UPLINK) { - protocol_handle = find_dissector("lte_rrc.ul_ccch"); + protocol_handle = (p_rlc_lte_info->nbMode == rlc_nb_mode) ? + lte_rrc_ul_ccch_nb : lte_rrc_ul_ccch; } else { - protocol_handle = find_dissector("lte_rrc.dl_ccch"); + protocol_handle = (p_rlc_lte_info->nbMode == rlc_nb_mode) ? + lte_rrc_dl_ccch_nb : lte_rrc_dl_ccch; } break; case CHANNEL_TYPE_BCCH_BCH: - protocol_handle = find_dissector("lte_rrc.bcch_bch"); + protocol_handle = (p_rlc_lte_info->nbMode == rlc_nb_mode) ? + lte_rrc_bcch_bch_nb : lte_rrc_bcch_bch; break; case CHANNEL_TYPE_BCCH_DL_SCH: - protocol_handle = find_dissector("lte_rrc.bcch_dl_sch"); + protocol_handle = (p_rlc_lte_info->nbMode == rlc_nb_mode) ? + lte_rrc_bcch_dl_sch_nb : lte_rrc_bcch_dl_sch; break; case CHANNEL_TYPE_PCCH: - protocol_handle = find_dissector("lte_rrc.pcch"); + protocol_handle = (p_rlc_lte_info->nbMode == rlc_nb_mode) ? + lte_rrc_pcch_nb : lte_rrc_pcch; break; case CHANNEL_TYPE_SRB: @@ -3701,8 +3720,19 @@ void proto_reg_handoff_rlc_lte(void) /* Add as a heuristic UDP dissector */ heur_dissector_add("udp", dissect_rlc_lte_heur, "RLC-LTE over UDP", "rlc_lte_udp", proto_rlc_lte, HEURISTIC_DISABLE); - pdcp_lte_handle = find_dissector_add_dependency("pdcp-lte", proto_rlc_lte); - ip_handle = find_dissector_add_dependency("ip", proto_rlc_lte); + pdcp_lte_handle = find_dissector_add_dependency("pdcp-lte", proto_rlc_lte); + ip_handle = find_dissector_add_dependency("ip", proto_rlc_lte); + lte_rrc_mcch = find_dissector_add_dependency("lte_rrc.mcch", proto_rlc_lte); + lte_rrc_ul_ccch = find_dissector_add_dependency("lte_rrc.ul_ccch", proto_rlc_lte); + lte_rrc_dl_ccch = find_dissector_add_dependency("lte_rrc.dl_dcch", proto_rlc_lte); + lte_rrc_bcch_bch = find_dissector_add_dependency("lte_rrc.bcch_bch", proto_rlc_lte); + lte_rrc_bcch_dl_sch = find_dissector_add_dependency("lte_rrc.bcch_dl_sch", proto_rlc_lte); + lte_rrc_pcch = find_dissector_add_dependency("lte_rrc.pcch", proto_rlc_lte); + lte_rrc_ul_ccch_nb = find_dissector_add_dependency("lte_rrc.ul_ccch.nb", proto_rlc_lte); + lte_rrc_dl_ccch_nb = find_dissector_add_dependency("lte_rrc.dl_ccch.nb", proto_rlc_lte); + lte_rrc_bcch_bch_nb = find_dissector_add_dependency("lte_rrc.bcch_bch.nb", proto_rlc_lte); + lte_rrc_bcch_dl_sch_nb = find_dissector_add_dependency("lte_rrc.bcch_dl_sch.nb", proto_rlc_lte); + lte_rrc_pcch_nb = find_dissector_add_dependency("lte_rrc.pcch.nb", proto_rlc_lte); } /* |