aboutsummaryrefslogtreecommitdiffstats
path: root/asn1/rrc
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2012-07-26 08:15:20 +0000
committerAnders Broman <anders.broman@ericsson.com>2012-07-26 08:15:20 +0000
commitaed65b0c7b2bf94aaf60805b26c84d9c511249dc (patch)
tree411e000b270d409943a480c9a60996c9790c7968 /asn1/rrc
parent65ebfc9db449b0ef759a295bd94dca17f3eb43ae (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.c39
-rw-r--r--asn1/rrc/packet-rrc-template.h5
-rw-r--r--asn1/rrc/rrc.cnf65
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