aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/asn1
diff options
context:
space:
mode:
authorDarien Spencer <cusneud@mail.com>2017-08-27 22:10:48 +0300
committerPascal Quantin <pascal.quantin@gmail.com>2017-09-15 20:39:34 +0000
commit875a46d1b54da3b2dcf0deb586de7745cabfa51f (patch)
tree8584b432d19117d825cbf3b3c0b74ad8d3f6267a /epan/dissectors/asn1
parente84c2e03e47cac0682ba03323ee0d7f6ff7d7b10 (diff)
UMTS RRC: Call E.212 Dissector
Calling E.212 dissector for MCC-MNC pairs/IMSIs found in RRC messages Change-Id: I1cbb4fe552323b65c761cdf7a721e8b93f297106 Reviewed-on: https://code.wireshark.org/review/23520 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/asn1')
-rw-r--r--epan/dissectors/asn1/rrc/packet-rrc-template.c26
-rw-r--r--epan/dissectors/asn1/rrc/rrc.cnf79
2 files changed, 105 insertions, 0 deletions
diff --git a/epan/dissectors/asn1/rrc/packet-rrc-template.c b/epan/dissectors/asn1/rrc/packet-rrc-template.c
index 625741cca6..1c51dbdef3 100644
--- a/epan/dissectors/asn1/rrc/packet-rrc-template.c
+++ b/epan/dissectors/asn1/rrc/packet-rrc-template.c
@@ -90,6 +90,8 @@ typedef struct umts_rrc_private_data_t
guint32 current_u_rnti;
guint32 scrambling_code;
enum nas_sys_info_gsm_map cn_domain;
+ wmem_strbuf_t* digits_strbuf; /* A collection of digits in a string. Used for reconstructing IMSIs or MCC-MNC pairs */
+ gboolean digits_strbuf_parsing_failed_flag; /* Whether an error occured when creating the IMSI/MCC-MNC pair string */
guint32 rbid;
guint32 rlc_ciphering_sqn; /* Sequence number where ciphering starts in a given bearer */
rrc_ciphering_info* ciphering_info;
@@ -181,6 +183,30 @@ static void private_data_set_cn_domain(asn1_ctx_t *actx, enum nas_sys_info_gsm_m
private_data->cn_domain = cn_domain;
}
+static wmem_strbuf_t* private_data_get_digits_strbuf(asn1_ctx_t *actx)
+{
+ umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx);
+ return private_data->digits_strbuf;
+}
+
+static void private_data_set_digits_strbuf(asn1_ctx_t *actx, wmem_strbuf_t* digits_strbuf)
+{
+ umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx);
+ private_data->digits_strbuf = digits_strbuf;
+}
+
+static gboolean private_data_get_digits_strbuf_parsing_failed_flag(asn1_ctx_t *actx)
+{
+ umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx);
+ return private_data->digits_strbuf_parsing_failed_flag;
+}
+
+static void private_data_set_digits_strbuf_parsing_failed_flag(asn1_ctx_t *actx, gboolean digits_strbuf_parsing_failed_flag)
+{
+ umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx);
+ private_data->digits_strbuf_parsing_failed_flag = digits_strbuf_parsing_failed_flag;
+}
+
static guint32 private_data_get_rbid(asn1_ctx_t *actx)
{
umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx);
diff --git a/epan/dissectors/asn1/rrc/rrc.cnf b/epan/dissectors/asn1/rrc/rrc.cnf
index 2be5a30863..f0a01b5a8e 100644
--- a/epan/dissectors/asn1/rrc/rrc.cnf
+++ b/epan/dissectors/asn1/rrc/rrc.cnf
@@ -694,6 +694,85 @@ HandoverFromUTRANCommand-GSM-r6-IEs/gsm-message/single-GSM-Message single-GSM-Me
curr_bit_offset++;
}
+#.FN_BODY PLMN-Identity
+ wmem_strbuf_t* mcc_mnc_strbuf;
+ guint32 string_len;
+ gchar* mcc_mnc_string;
+ tvbuff_t* mcc_mnc_tvb;
+
+ /* Reset the digits string in the private data struct */
+ /* Maximal length: 6 = 3 digits MCC + 3 digits MNC + trailing '\0'*/
+ mcc_mnc_strbuf = wmem_strbuf_sized_new(actx->pinfo->pool,7,7);
+ private_data_set_digits_strbuf(actx, mcc_mnc_strbuf);
+ /* Reset parsing failure flag*/
+ private_data_set_digits_strbuf_parsing_failed_flag(actx, FALSE);
+%(DEFAULT_BODY)s
+ /* Check for parsing errors */
+ if(private_data_get_digits_strbuf_parsing_failed_flag(actx)) {
+ return offset;
+ }
+
+ /* Extracing the string collected in the strbuf */
+ string_len = (guint32)wmem_strbuf_get_len(mcc_mnc_strbuf);
+ mcc_mnc_string = wmem_strbuf_finalize(mcc_mnc_strbuf);
+
+ /* Creating TVB from extracted string*/
+ mcc_mnc_tvb = tvb_new_child_real_data(tvb, (guint8*)mcc_mnc_string, string_len, string_len);
+ add_new_data_source(actx->pinfo, mcc_mnc_tvb, "MCC-MNC");
+
+ /* Calling E.212 */
+ dissect_e212_mcc_mnc_in_utf8_address(mcc_mnc_tvb, actx->pinfo, tree, 0);
+
+#.FN_BODY IMSI-GSM-MAP
+ wmem_strbuf_t* imsi_strbuf;
+ guint32 string_len;
+ gchar* imsi_string;
+ tvbuff_t* imsi_tvb;
+
+ /* Reset the digits string in the private data struct */
+ imsi_strbuf = wmem_strbuf_sized_new(actx->pinfo->pool,16,16);
+ private_data_set_digits_strbuf(actx, imsi_strbuf);
+ /* Reset parsing failure flag*/
+ private_data_set_digits_strbuf_parsing_failed_flag(actx, FALSE);
+%(DEFAULT_BODY)s
+ /* Check for parsing errors */
+ if(private_data_get_digits_strbuf_parsing_failed_flag(actx)) {
+ return offset;
+ }
+
+ /* Extracing the string collected in the strbuf */
+ string_len = (guint32)wmem_strbuf_get_len(imsi_strbuf);
+ imsi_string = wmem_strbuf_finalize(imsi_strbuf);
+
+ /* Creating TVB from extracted string*/
+ imsi_tvb = tvb_new_child_real_data(tvb, (guint8*)imsi_string, string_len, string_len);
+ add_new_data_source(actx->pinfo, imsi_tvb, "IMSI");
+
+ /* Calling E.212 */
+ dissect_e212_utf8_imsi(imsi_tvb,actx->pinfo,tree,0,string_len);
+
+#.FN_BODY Digit VAL_PTR = &digit
+ guint32 digit;
+ gchar digit_char;
+ wmem_strbuf_t* digits_strbuf; /* The string of either an IMSI or a MCC-MNC pair */
+%(DEFAULT_BODY)s
+
+ if(private_data_get_digits_strbuf_parsing_failed_flag(actx)) {
+ return offset;
+ }
+
+ digits_strbuf = private_data_get_digits_strbuf(actx);
+ if(digit > 9) {
+ private_data_set_digits_strbuf_parsing_failed_flag(actx, TRUE);
+ return offset;
+ }
+
+ /* Converting to the matching gchar */
+ digit_char = (gchar)(digit + '0');
+
+ /* Appending to the digits string */
+ wmem_strbuf_append_c(digits_strbuf, digit_char);
+
#.FN_BODY RSR-VCC-Info/ims-Information VAL_PTR = &imsInformation_tvb
tvbuff_t *imsInformation_tvb=NULL;
%(DEFAULT_BODY)s