diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2020-03-25 15:30:16 +0100 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2021-10-20 17:27:51 +0200 |
commit | df364a1156f7fc07149ff93859b8b46c033a76fd (patch) | |
tree | 69f6ff1d36467d1a9879ae20b97da5099677b249 /epan | |
parent | ffdc5622d1be97af10987c2d8677b0456ae04e88 (diff) |
WIP: gm: Decode GSM GM MS RA Capabilities IE with RLCMAC CSN1 decoderpespin/racap
Tested with a sample pcap file containing an GSM GM packet (Attach
Request) with an MS Radio Access Capabilities IE containing several entries.
TODO:
* Check if by dropping the ad-hoc decoder we lose support/features.
* Drop de_gmm_ms_radio_acc_cap and replace it with
de_gmm_ms_radio_acc_cap_rlcmac(), since there are other users of that
function in other protocol dissectors. Then all benefit from the
change. More than 1k lines of code can be dropped.
* Some general clean up required
Change-Id: I096eafcb5ca31d0ad1fa63561f43853ee4e7a40f
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-gsm_a_gm.c | 15 | ||||
-rw-r--r-- | epan/dissectors/packet-gsm_rlcmac.c | 17 |
2 files changed, 29 insertions, 3 deletions
diff --git a/epan/dissectors/packet-gsm_a_gm.c b/epan/dissectors/packet-gsm_a_gm.c index 5c023b1ad3..9be79c87e4 100644 --- a/epan/dissectors/packet-gsm_a_gm.c +++ b/epan/dissectors/packet-gsm_a_gm.c @@ -91,6 +91,7 @@ #include <epan/expert.h> #include <epan/ipproto.h> #include <epan/etypes.h> +#include "packet-gsm_rlcmac.h" #include "packet-ber.h" #include "packet-gsm_a_common.h" #include "packet-e212.h" @@ -609,6 +610,7 @@ static expert_field ei_gsm_a_gm_missing_mandatory_element = EI_INIT; static dissector_handle_t rrc_irat_ho_info_handle; static dissector_handle_t lte_rrc_ue_eutra_cap_handle; static dissector_handle_t nbifom_handle; +static dissector_handle_t rlcmac_racap_handle; static dissector_table_t gprs_sm_pco_subdissector_table; /* GPRS SM PCO PPP Protocols */ @@ -1664,6 +1666,16 @@ static const value_string gsm_a_gm_ec_pch_mon_support_vals[] = { }; guint16 +de_gmm_ms_radio_acc_cap_rlcmac(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) +{ + tvbuff_t *payload_tvb; + payload_tvb = tvb_new_subset_length(tvb, offset, len); + + call_dissector(rlcmac_racap_handle, payload_tvb, pinfo, tree); + return len; +} + +guint16 de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { guint32 curr_offset; @@ -6372,7 +6384,7 @@ guint16 (*gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_ de_gmm_imeisv_req, /* IMEISV Request */ de_gmm_rec_npdu_lst, /* Receive N-PDU Numbers List */ de_gmm_ms_net_cap, /* MS Network Capability */ - de_gmm_ms_radio_acc_cap, /* MS Radio Access Capability */ + de_gmm_ms_radio_acc_cap_rlcmac, /* MS Radio Access Capability */ de_gmm_cause, /* GMM Cause */ de_gmm_rai, /* Routing Area Identification */ de_gmm_rai2, /* Routing Area Identification 2 */ @@ -9681,6 +9693,7 @@ proto_reg_handoff_gsm_a_gm(void) rrc_irat_ho_info_handle = find_dissector_add_dependency("rrc.irat.irat_ho_info", proto_a_gm); lte_rrc_ue_eutra_cap_handle = find_dissector_add_dependency("lte-rrc.ue_eutra_cap", proto_a_gm); nbifom_handle = find_dissector_add_dependency("nbifom", proto_a_gm); + rlcmac_racap_handle = find_dissector_add_dependency("gsm_rlcmac_racap", proto_a_gm); } /* diff --git a/epan/dissectors/packet-gsm_rlcmac.c b/epan/dissectors/packet-gsm_rlcmac.c index c05a267a84..faad983858 100644 --- a/epan/dissectors/packet-gsm_rlcmac.c +++ b/epan/dissectors/packet-gsm_rlcmac.c @@ -2819,13 +2819,11 @@ CSN_DESCR_END (MS_RA_capability_value_t) * This one would be used to decode for instance MS RA Capabilities IE SGSN->MS on the PCU. * However, an ad-hoc decoder is used in this scenario in wireshark: See packet-gsm_a_gm.c de_gmm_ms_radio_acc_cap(). */ -#if 0 static const CSN_DESCR_BEGIN (MS_Radio_Access_capability_t) M_REC_TARRAY_1(MS_Radio_Access_capability_t, MS_RA_capability_value, MS_RA_capability_value_t, Count_MS_RA_capability_value, &hf_ms_ra_capability_value), M_PADDING_BITS(MS_Radio_Access_capability_t, &hf_padding), CSN_DESCR_END (MS_Radio_Access_capability_t) -#endif /* TS44.060 section 12.30 "MS Radio Access Capability 2". Same as above but without spare bits */ static const @@ -9903,6 +9901,20 @@ dissect_gsm_ec_rlcmac_uplink(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree return dissect_gsm_rlcmac_uplink(tvb, pinfo, tree, &rlc_mac); } +static int +dissect_gsm_rlcmac_racap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +{ + csnStream_t ar; + MS_Radio_Access_capability_t racap = {0}; + int len = tvb_reported_length(tvb); + guint16 bit_length = len * 8; + + csnStreamInit(&ar, 0, bit_length, pinfo); + + csnStreamDissector(tree, &ar, CSNDESCR(MS_Radio_Access_capability_t), tvb, &racap, ett_gsm_rlcmac); + return len; +} + void proto_register_gsm_rlcmac(void) { @@ -18620,6 +18632,7 @@ proto_register_gsm_rlcmac(void) proto_register_subtree_array(ett, array_length(ett)); expert_gsm_rlcmac = expert_register_protocol(proto_gsm_rlcmac); expert_register_field_array(expert_gsm_rlcmac, ei, array_length(ei)); + register_dissector("gsm_rlcmac_racap", dissect_gsm_rlcmac_racap, proto_gsm_rlcmac); register_dissector("gsm_rlcmac_ul", dissect_gsm_rlcmac_uplink, proto_gsm_rlcmac); register_dissector("gsm_rlcmac_dl", dissect_gsm_rlcmac_downlink, proto_gsm_rlcmac); register_dissector("gsm_ec_rlcmac_ul", dissect_gsm_ec_rlcmac_uplink, proto_gsm_rlcmac); |