summaryrefslogtreecommitdiff
path: root/epan/dissectors/asn1
diff options
context:
space:
mode:
authorS. Shapira <sswsdev@gmail.com>2017-05-12 00:03:29 +0300
committerAnders Broman <a.broman58@gmail.com>2017-05-12 19:42:20 +0000
commit900695547b096b1be34fb58bea98c0474e9c72ab (patch)
treee8bd6461c49c8c925503db686364655e9512688d /epan/dissectors/asn1
parenta8228fa80bd584ec8cb093cc868add56bf9346b6 (diff)
downloadwireshark-900695547b096b1be34fb58bea98c0474e9c72ab.tar.gz
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')
-rw-r--r--epan/dissectors/asn1/nbap/nbap.cnf12
-rw-r--r--epan/dissectors/asn1/rrc/packet-rrc-template.c70
-rw-r--r--epan/dissectors/asn1/rrc/packet-rrc-template.h2
-rw-r--r--epan/dissectors/asn1/rrc/rrc.cnf74
4 files changed, 136 insertions, 22 deletions
diff --git a/epan/dissectors/asn1/nbap/nbap.cnf b/epan/dissectors/asn1/nbap/nbap.cnf
index 2bcdcc6f21..30bf5b8785 100644
--- a/epan/dissectors/asn1/nbap/nbap.cnf
+++ b/epan/dissectors/asn1/nbap/nbap.cnf
@@ -748,6 +748,7 @@ hsdsch_macdflow_ids[num_items-1] = hsdsch_macdflow_id;
#.FN_BODY RACH-ParametersItem-CTCH-SetupRqstFDD
address dst_addr, null_addr;
conversation_t *conversation;
+fp_rach_channel_info_t* fp_rach_channel_info;
umts_fp_conversation_info_t *umts_fp_conversation_info;
int j, num_tf;
@@ -789,6 +790,12 @@ transportFormatSet_type = NBAP_CPCH;
umts_fp_conversation_info->crnc_port = BindingID_port;
umts_fp_conversation_info->rlc_mode = FP_RLC_MODE_UNKNOWN;
+ /* Adding the 'channel specific info' for RACH */
+ fp_rach_channel_info = wmem_new0(wmem_file_scope(), fp_rach_channel_info_t);
+ fp_rach_channel_info->crnti_to_urnti_map = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
+ umts_fp_conversation_info->channel_specific_info = (void*)fp_rach_channel_info;
+
+
/*Save unique UE-identifier */
umts_fp_conversation_info->com_context_id = crcn_context_present ? com_context_id : 1;
@@ -949,6 +956,7 @@ num_items = 1;
address dst_addr, null_addr;
conversation_t *conversation;
+fp_fach_channel_info_t* fp_fach_channel_info;
umts_fp_conversation_info_t *umts_fp_conversation_info;
int i, j, num_tf;
@@ -993,6 +1001,10 @@ transportFormatSet_type = NBAP_CPCH;
/*Save unique UE-identifier */
umts_fp_conversation_info->com_context_id = crcn_context_present ? com_context_id : 1;
+ /* Adding the 'channel specific info' for FACH */
+ fp_fach_channel_info = wmem_new0(wmem_file_scope(), fp_fach_channel_info_t);
+ fp_fach_channel_info->crnti_to_urnti_map = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
+ umts_fp_conversation_info->channel_specific_info = (void*)fp_fach_channel_info;
/* DCH's in this flow */
umts_fp_conversation_info->dch_crc_present = g_nbap_msg_info_for_fp.dch_crc_present;
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