diff options
author | S. Shapira <sswsdev@gmail.com> | 2017-05-12 00:03:29 +0300 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2017-05-12 19:42:20 +0000 |
commit | 900695547b096b1be34fb58bea98c0474e9c72ab (patch) | |
tree | e8bd6461c49c8c925503db686364655e9512688d /epan/dissectors/asn1/rrc | |
parent | a8228fa80bd584ec8cb093cc868add56bf9346b6 (diff) |
UMTS Iub: Resolve U-RNTI for C-RNTI
This commit includes logic used to store pairs of C-RNTIs and U-RNTIs based on allocations in RRC and logic to retrive those when encountering C-RNTIs in the MAC header for DCCH over FACH/RACH.
Change-Id: I629ab061b7a73416e5730a980480b81a1aaade11
Reviewed-on: https://code.wireshark.org/review/21607
Petri-Dish: Anders Broman <a.broman58@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/asn1/rrc')
-rw-r--r-- | epan/dissectors/asn1/rrc/packet-rrc-template.c | 70 | ||||
-rw-r--r-- | epan/dissectors/asn1/rrc/packet-rrc-template.h | 2 | ||||
-rw-r--r-- | epan/dissectors/asn1/rrc/rrc.cnf | 74 |
3 files changed, 124 insertions, 22 deletions
diff --git a/epan/dissectors/asn1/rrc/packet-rrc-template.c b/epan/dissectors/asn1/rrc/packet-rrc-template.c index 2af4f2b1a3..1b24415209 100644 --- a/epan/dissectors/asn1/rrc/packet-rrc-template.c +++ b/epan/dissectors/asn1/rrc/packet-rrc-template.c @@ -45,6 +45,8 @@ #include "packet-gsm_a_common.h" #include "packet-nbap.h" #include "packet-umts_fp.h" +#include "packet-umts_mac.h" +#include "packet-rlc.h" #ifdef _MSC_VER /* disable: "warning C4049: compiler limit : terminating line number emission" */ @@ -57,10 +59,14 @@ #define PSNAME "RRC" #define PFNAME "rrc" -extern int proto_fp; /*Handler to FP*/ +extern int proto_fp; /*Handler to FP*/ +extern int proto_umts_mac; /*Handler to MAC*/ +extern int proto_rlc; /*Handler to RLC*/ GTree * hsdsch_muxed_flows = NULL; GTree * rrc_ciph_inf = NULL; +GTree * rrc_scrambling_code_urnti = NULL; +wmem_tree_t* rrc_rach_urnti_crnti_map = NULL; static int msg_type _U_; /*****************************************************************************/ @@ -81,6 +87,7 @@ typedef struct umts_rrc_private_data_t guint32 s_rnc_id; /* The S-RNC ID part of a U-RNTI */ guint32 s_rnti; /* The S-RNTI part of a U-RNTI */ guint32 new_u_rnti; + guint32 current_u_rnti; guint32 scrambling_code; enum nas_sys_info_gsm_map cn_domain; } umts_rrc_private_data_t; @@ -101,62 +108,74 @@ static umts_rrc_private_data_t* umts_rrc_get_private_data(asn1_ctx_t *actx) static guint32 private_data_get_s_rnc_id(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->s_rnc_id; + umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx); + return private_data->s_rnc_id; } static void private_data_set_s_rnc_id(asn1_ctx_t *actx, guint32 s_rnc_id) { - umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx); - private_data->s_rnc_id = s_rnc_id; + umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx); + private_data->s_rnc_id = s_rnc_id; } static guint32 private_data_get_s_rnti(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->s_rnti; + umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx); + return private_data->s_rnti; } static void private_data_set_s_rnti(asn1_ctx_t *actx, guint32 s_rnti) { - umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx); - private_data->s_rnti = s_rnti; + umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx); + private_data->s_rnti = s_rnti; } static guint32 private_data_get_new_u_rnti(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->new_u_rnti; + umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx); + return private_data->new_u_rnti; } static void private_data_set_new_u_rnti(asn1_ctx_t *actx, guint32 new_u_rnti) { - umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx); - private_data->new_u_rnti = new_u_rnti; + umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx); + private_data->new_u_rnti = new_u_rnti; +} + +static guint32 private_data_get_current_u_rnti(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->current_u_rnti; +} + +static void private_data_set_current_u_rnti(asn1_ctx_t *actx, guint32 current_u_rnti) +{ + umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx); + private_data->current_u_rnti = current_u_rnti; } static guint32 private_data_get_scrambling_code(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->scrambling_code; + umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx); + return private_data->scrambling_code; } static void private_data_set_scrambling_code(asn1_ctx_t *actx, guint32 scrambling_code) { - umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx); - private_data->scrambling_code = scrambling_code; + umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx); + private_data->scrambling_code = scrambling_code; } static enum nas_sys_info_gsm_map private_data_get_cn_domain(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->cn_domain; + umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx); + return private_data->cn_domain; } static void private_data_set_cn_domain(asn1_ctx_t *actx, enum nas_sys_info_gsm_map cn_domain) { - umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx); - private_data->cn_domain = cn_domain; + umts_rrc_private_data_t *private_data = (umts_rrc_private_data_t*)umts_rrc_get_private_data(actx); + private_data->cn_domain = cn_domain; } /*****************************************************************************/ @@ -351,6 +370,15 @@ rrc_init(void) { NULL, /* data pointer, optional */ NULL, rrc_free_value); + + /*Initialize Scrambling code to U-RNTI dictionary*/ + rrc_scrambling_code_urnti = g_tree_new_full(rrc_key_cmp, + NULL, + NULL, + NULL); + + /* Global U-RNTI / C-RNTI map to be used in RACH channels */ + rrc_rach_urnti_crnti_map = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope()); } static void diff --git a/epan/dissectors/asn1/rrc/packet-rrc-template.h b/epan/dissectors/asn1/rrc/packet-rrc-template.h index 6ae2b0661d..72efe6c20e 100644 --- a/epan/dissectors/asn1/rrc/packet-rrc-template.h +++ b/epan/dissectors/asn1/rrc/packet-rrc-template.h @@ -60,5 +60,7 @@ typedef struct rrc_ciph_info_ extern GTree * hsdsch_muxed_flows; extern GTree * rrc_ciph_inf; +extern GTree * rrc_scrambling_code_urnti; +extern wmem_tree_t* rrc_rach_urnti_crnti_map; #endif /* PACKET_RRC_H */ diff --git a/epan/dissectors/asn1/rrc/rrc.cnf b/epan/dissectors/asn1/rrc/rrc.cnf index d444fcbbc8..1f471f7850 100644 --- a/epan/dissectors/asn1/rrc/rrc.cnf +++ b/epan/dissectors/asn1/rrc/rrc.cnf @@ -787,16 +787,88 @@ HNBName TYPE=FT_STRING DISPLAY=STR_UNICODE s_rnti = private_data_get_s_rnti(actx); if(s_rnc_id != 0 && s_rnti != 0) { u_rnti_value = (s_rnc_id << 20) | s_rnti; - /* We are looking for new allocated U-RNTIs, not previously used ones */ + /* Distinguishing between new allocated U-RNTIs and previously used ones */ if (is_new_urnti) { private_data_set_new_u_rnti(actx, u_rnti_value); } + else { + private_data_set_current_u_rnti(actx, u_rnti_value); + } /* Adding U-RNTI value to it's tree item */ proto_item_append_text(actx->created_item,": %%08x", u_rnti_value); } private_data_set_s_rnc_id(actx, 0); private_data_set_s_rnti(actx, 0); +#.FN_BODY C-RNTI VAL_PTR = &c_rnti_tvb + fp_info *fpinf = NULL; + umts_mac_info *macinf = NULL; + rlc_info *rlcinf = NULL; + conversation_t *p_conv; + umts_fp_conversation_info_t *umts_fp_conversation_info = NULL; + fp_fach_channel_info_t *fp_fach_channel_info = NULL; + tvbuff_t * c_rnti_tvb = NULL; + guint16 c_rnti = 0; + guint32 u_rnti = 0; + fp_crnti_allocation_info_t *fp_crnti_allocation_info = NULL; +%(DEFAULT_BODY)s + if (!c_rnti_tvb) + return offset; + + if(tvb_reported_length(c_rnti_tvb)>=2){ + c_rnti = tvb_get_ntohs(c_rnti_tvb,0); + } + + if(actx->pinfo->fd->flags.visited) /* Frame was already checked*/ + return offset; + + /* Trying to figure where to get the U-RNTI from Either from an ASN.1 field (if this is CCCH) or RLC's attached info (if this is DCCH) */ + fpinf = (fp_info *)p_get_proto_data(wmem_file_scope(), actx->pinfo, proto_fp, 0); + macinf = (umts_mac_info *)p_get_proto_data(wmem_file_scope(), actx->pinfo, proto_umts_mac, 0); + rlcinf = (rlc_info *)p_get_proto_data(wmem_file_scope(), actx->pinfo, proto_rlc, 0); + if (fpinf && macinf && rlcinf) { + switch(macinf->content[fpinf->cur_tb]){ + case MAC_DCCH: + u_rnti = rlcinf->urnti[fpinf->cur_tb]; + break; + case MAC_CCCH: + default: + u_rnti = private_data_get_current_u_rnti(actx); + break; + } + } + else { + /* Either FP, MAC or RLC info is missing - looking for ASN.1 field as last resort*/ + u_rnti = private_data_get_current_u_rnti(actx); + } + + if(u_rnti == 0 || c_rnti == 0) /* U-RNTI missing or failed to parse C-RNTI */ + return offset; + + /* Both U-RNTI and C-RNTI present - storing the match*/ + fp_crnti_allocation_info = wmem_new0(wmem_file_scope(), fp_crnti_allocation_info_t); + fp_crnti_allocation_info->urnti = u_rnti; + fp_crnti_allocation_info->alloc_frame_number = actx->pinfo->num; + + /* Finding FP conversation info */ + p_conv = (conversation_t *)find_conversation(actx->pinfo->num, &actx->pinfo->net_dst, &actx->pinfo->net_src, + actx->pinfo->ptype, + actx->pinfo->destport, actx->pinfo->srcport, NO_ADDR_B); + + /* If the current FP channel is FACH, Adding the C-RNTI / U-RNTI match to the FACH's RNTIs map*/ + if (p_conv != NULL) { + umts_fp_conversation_info = (umts_fp_conversation_info_t *)conversation_get_proto_data(p_conv, proto_fp); + if (umts_fp_conversation_info && umts_fp_conversation_info->channel == CHANNEL_FACH_FDD) { + fp_fach_channel_info = (fp_fach_channel_info_t *)umts_fp_conversation_info->channel_specific_info; + if(fp_fach_channel_info) { + wmem_tree_insert32(fp_fach_channel_info->crnti_to_urnti_map, c_rnti, (void *)fp_crnti_allocation_info); + } + } + } + + /* Also adding the C-RNTI / U-RNTI match to the global RNTIs map for the RACH channel */ + wmem_tree_insert32(rrc_rach_urnti_crnti_map, c_rnti, (void *)fp_crnti_allocation_info); + #.FN_BODY UL-ScramblingCode VAL_PTR = &scrambling_code guint32 scrambling_code; %(DEFAULT_BODY)s |