diff options
author | Darien Spencer <cusneud@mail.com> | 2017-08-27 22:10:48 +0300 |
---|---|---|
committer | Pascal Quantin <pascal.quantin@gmail.com> | 2017-09-15 20:39:34 +0000 |
commit | 875a46d1b54da3b2dcf0deb586de7745cabfa51f (patch) | |
tree | 8584b432d19117d825cbf3b3c0b74ad8d3f6267a /epan/dissectors/asn1 | |
parent | e84c2e03e47cac0682ba03323ee0d7f6ff7d7b10 (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.c | 26 | ||||
-rw-r--r-- | epan/dissectors/asn1/rrc/rrc.cnf | 79 |
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 |