diff options
author | Anders Broman <anders.broman@ericsson.com> | 2012-07-26 08:15:20 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2012-07-26 08:15:20 +0000 |
commit | aed65b0c7b2bf94aaf60805b26c84d9c511249dc (patch) | |
tree | 411e000b270d409943a480c9a60996c9790c7968 /asn1/rrc | |
parent | 65ebfc9db449b0ef759a295bd94dca17f3eb43ae (diff) |
From Jacob Nordgren and Rishie Sharma:
- RRC now configures logical channels in HS-DSCH hs, and some HSDSCH common support added
- RLC: modifed memory management, MAC: dch would set the incorrect logical channel for RLC
svn path=/trunk/; revision=44027
Diffstat (limited to 'asn1/rrc')
-rw-r--r-- | asn1/rrc/packet-rrc-template.c | 39 | ||||
-rw-r--r-- | asn1/rrc/packet-rrc-template.h | 5 | ||||
-rw-r--r-- | asn1/rrc/rrc.cnf | 65 |
3 files changed, 109 insertions, 0 deletions
diff --git a/asn1/rrc/packet-rrc-template.c b/asn1/rrc/packet-rrc-template.c index def3d07e97..85a7f131ca 100644 --- a/asn1/rrc/packet-rrc-template.c +++ b/asn1/rrc/packet-rrc-template.c @@ -34,11 +34,14 @@ #include <glib.h> #include <epan/packet.h> #include <epan/asn1.h> +#include <epan/conversation.h> +#include <epan/expert.h> #include "packet-ber.h" #include "packet-per.h" #include "packet-rrc.h" #include "packet-gsm_a_common.h" +#include "packet-umts_fp.h" #ifdef _MSC_VER /* disable: "warning C4049: compiler limit : terminating line number emission" */ @@ -51,6 +54,9 @@ #define PSNAME "RRC" #define PFNAME "rrc" +extern int proto_fp; /*Handler to FP*/ + + static dissector_handle_t gsm_a_dtap_handle; static dissector_handle_t rrc_ue_radio_access_cap_info_handle=NULL; static dissector_handle_t rrc_pcch_handle=NULL; @@ -118,11 +124,15 @@ static const true_false_string rrc_eutra_feat_group_ind_4_val = { "Undefined - Supported", "Undefined - Not supported" }; +static int flowd,type; + +static tvbuff_t * hrnti; #include "packet-rrc-fn.c" #include "packet-rrc.h" + static void dissect_rrc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { @@ -168,6 +178,31 @@ dissect_rrc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } } } +gint rrc_key_cmp(gconstpointer a_ptr, gconstpointer b_ptr, gpointer ignore _U_){ + if( GPOINTER_TO_INT(a_ptr) > GPOINTER_TO_INT(b_ptr) ){ + return -1; + } + return GPOINTER_TO_INT(a_ptr) < GPOINTER_TO_INT(b_ptr); +} +void rrc_free_key(gpointer key _U_){ + /*Key's should be de allocated elsewhere.*/ + + } +void rrc_free_value(gpointer value ){ + g_free(value); + } +void rrc_init(void){ + + /*Cleanup*/ + if(hsdsch_muxed_flows){ + g_tree_destroy(hsdsch_muxed_flows); + } + /*Initialize*/ + hsdsch_muxed_flows = g_tree_new_full(rrc_key_cmp, + NULL, /* data pointer, optional */ + rrc_free_key, + rrc_free_value); +} /*--- proto_register_rrc -------------------------------------------*/ void proto_register_rrc(void) { @@ -216,6 +251,10 @@ void proto_register_rrc(void) { #include "packet-rrc-dis-reg.c" + + + + register_init_routine(rrc_init); } diff --git a/asn1/rrc/packet-rrc-template.h b/asn1/rrc/packet-rrc-template.h index 86c7db5b70..ea21f0ffe6 100644 --- a/asn1/rrc/packet-rrc-template.h +++ b/asn1/rrc/packet-rrc-template.h @@ -26,6 +26,7 @@ #define PACKET_RRC_H #include <epan/asn1.h> /* Needed for non asn1 dissectors?*/ + extern int proto_rrc; #include "packet-rrc-exp.h" @@ -44,5 +45,9 @@ typedef struct rrc_info { enum rrc_message_type msgtype[MAX_RRC_FRAMES]; } rrc_info; +/*Stores how many channels we have detected for a HS-DSCH MAC-flow*/ +#define MAX_NUM_HSDHSCH_MACDFLOW 8 +guint8 num_chans_per_flow[MAX_NUM_HSDHSCH_MACDFLOW]; +GTree * hsdsch_muxed_flows; #endif /* PACKET_RRC_H */ diff --git a/asn1/rrc/rrc.cnf b/asn1/rrc/rrc.cnf index 4ab1f1111a..a5925a67a0 100644 --- a/asn1/rrc/rrc.cnf +++ b/asn1/rrc/rrc.cnf @@ -656,5 +656,70 @@ HNBName TYPE=FT_STRING DISPLAY=BASE_NONE } rrc_nas_sys_info_gsm_map_type = RRC_NAS_SYS_INFO_CN_COMMON; +/*Here we try to figure out which HS-DSCH channels are multiplexed*/ +/*TODO: Should this also be made under r7?*/ +#.FN_BODY DL-TransportChannelType-r5 VAL_PTR = &type + + gint *flowd_p; + gint *cur_val=NULL; + guint16 hr=0; + + %(DEFAULT_BODY)s + + /*TODO: This should probably be done better*/ + if(type == 4){ /*If this is type HS-DSCH*/ + num_chans_per_flow[flowd]++; + + + if(num_chans_per_flow[flowd] > 1 ){ + + if(hrnti == NULL){ + expert_add_info_format(actx->pinfo, NULL, PI_MALFORMED, PI_WARN, "Did not detect any H-RNTI "); + } + else{ + /*Read the H-RNTI value*/ + hr = tvb_get_bits16(hrnti,0,16,FALSE); + } + /*If it doesnt exists, insert it*/ + if( (cur_val=g_tree_lookup(hsdsch_muxed_flows, GINT_TO_POINTER((gint)hr))) == NULL ){ + + flowd_p = (guint*)g_malloc0(sizeof(gint*)); + *flowd_p = (1<<flowd); /*Set the bit to mark it as true*/ + g_tree_insert(hsdsch_muxed_flows, GINT_TO_POINTER((gint)hr), flowd_p); + + }else{ + *cur_val = (1<<flowd) | *cur_val; + + } + + } + + } + + +#.FN_BODY DL-LogicalChannelMapping-r5 + + %(DEFAULT_BODY)s + +#.FN_BODY DL-LogicalChannelMapping-r7 + + %(DEFAULT_BODY)s +#.FN_BODY LogicalChannelIdentity + + %(DEFAULT_BODY)s + +#.FN_BODY MAC-d-FlowIdentity VAL_PTR = &flowd + %(DEFAULT_BODY)s + +#.FN_BODY SRB_InformationSetupList2_r6 + + %(DEFAULT_BODY)s + /*Clear memory*/ + memset(num_chans_per_flow,0,sizeof(guint8)); + +#.FN_BODY H_RNTI VAL_PTR = &hrnti + + + #.END |