aboutsummaryrefslogtreecommitdiffstats
path: root/asn1
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2012-07-16 13:11:20 +0000
committerAnders Broman <anders.broman@ericsson.com>2012-07-16 13:11:20 +0000
commitfe630ec1dfb3ce6d383fe0a7a05d70dcb1b2f370 (patch)
tree4b1f7e40db7593460cd81410140f754493469202 /asn1
parentf41a04b7ab86337be4d88f7aff1128c4d1d673d0 (diff)
From Jacob Nordgren and Rishie Sharma:
Updated conversation handling to dissect FP/MAC/RLC svn path=/trunk/; revision=43749
Diffstat (limited to 'asn1')
-rw-r--r--asn1/nbap/Makefile.common1
-rw-r--r--asn1/nbap/nbap.cnf165
-rw-r--r--asn1/nbap/packet-nbap-template.c85
-rw-r--r--asn1/nbap/packet-nbap-template.h116
4 files changed, 356 insertions, 11 deletions
diff --git a/asn1/nbap/Makefile.common b/asn1/nbap/Makefile.common
index 1ca54db53d..0d9c6ed6a8 100644
--- a/asn1/nbap/Makefile.common
+++ b/asn1/nbap/Makefile.common
@@ -36,6 +36,7 @@ EXTRA_DIST = \
Makefile.nmake \
$(ASN_FILE_LIST) \
packet-$(PROTOCOL_NAME)-template.c \
+ packet-$(PROTOCOL_NAME)-template.h \
$(PROTOCOL_NAME).cnf
SRC_FILES = \
diff --git a/asn1/nbap/nbap.cnf b/asn1/nbap/nbap.cnf
index 18c6965d43..d1362ae09e 100644
--- a/asn1/nbap/nbap.cnf
+++ b/asn1/nbap/nbap.cnf
@@ -1,6 +1,8 @@
# nbap.cnf
# nbap conformation file
-# Copyright 2005 Anders Broman
+# Copyright 2005 - 2012 Anders Broman
+# Modified 2012 by Jacob Nordgren <jacob.nordgren@ericsson.com> and
+# Rishie Sharma <rishie.sharma@ericsson.com>
# $Id$
#.OPT
@@ -648,10 +650,14 @@ nbap_dch_chnl_info[commonphysicalchannelid].next_dch = 0;
nbap_dch_chnl_info[commontransportchannelid].next_dch = 0;
#.FN_BODY E-DCH-MACdFlow-ID VAL_PTR = &e_dch_macdflow_id
+
%(DEFAULT_BODY)s
+
#.FN_BODY HSDSCH-MACdFlow-ID VAL_PTR = &hsdsch_macdflow_id
+
%(DEFAULT_BODY)s
+hsdsch_macdflow_ids[num_items-1] = hsdsch_macdflow_id;
#.FN_BODY BindingID VAL_PTR = &parameter_tvb
tvbuff_t *parameter_tvb=NULL;
@@ -1087,6 +1093,7 @@ dch_id = 0xFFFFFFFF;
conversation_set_dissector(conversation, fp_handle);
if(actx->pinfo->link_dir==P2P_DIR_DL){
umts_fp_conversation_info = se_new0(umts_fp_conversation_info_t);
+
/* Fill in the data */
umts_fp_conversation_info->iface_type = IuB_Interface;
umts_fp_conversation_info->division = Division_FDD;
@@ -1099,6 +1106,8 @@ dch_id = 0xFFFFFFFF;
/* DCH's in this flow */
umts_fp_conversation_info->dch_crc_present = g_nbap_msg_info_for_fp.dch_crc_present;
+
+ /*UPLINK*/
/* Set data for First or single channel */
umts_fp_conversation_info->fp_dch_channel_info[0].num_ul_chans = num_tf = nbap_dch_chnl_info[dch_id].num_ul_chans;
for (j = 0; j < num_tf; j++) {
@@ -1112,14 +1121,18 @@ dch_id = 0xFFFFFFFF;
umts_fp_conversation_info->fp_dch_channel_info[0].dl_chan_tf_size[j] = nbap_dch_chnl_info[dch_id].dl_chan_tf_size[j];
umts_fp_conversation_info->fp_dch_channel_info[0].dl_chan_num_tbs[j] = nbap_dch_chnl_info[dch_id].dl_chan_num_tbs[j];
}
-
+
/* Set data for associated DCH's if we have any */
i = dch_id;
umts_fp_conversation_info->dchs_in_flow_list[0] = dch_id;
while(nbap_dch_chnl_info[i].next_dch != 0){
+
+
i = nbap_dch_chnl_info[i].next_dch;
umts_fp_conversation_info->num_dch_in_flow++;
- umts_fp_conversation_info->dchs_in_flow_list[umts_fp_conversation_info->num_dch_in_flow] = i;
+ umts_fp_conversation_info->dchs_in_flow_list[umts_fp_conversation_info->num_dch_in_flow] = i; /*Set transport channel id*/
+
+ /*Setting Logical Channel's for this DCH*/
/* Traffic flows per DCH(UL) */
umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].num_ul_chans = num_tf = nbap_dch_chnl_info[i].num_ul_chans;
for (j = 0; j < num_tf; j++) {
@@ -1138,6 +1151,9 @@ dch_id = 0xFFFFFFFF;
umts_fp_conversation_info->dchs_in_flow_list[umts_fp_conversation_info->num_dch_in_flow] = i;
set_umts_fp_conv_data(conversation, umts_fp_conversation_info);
}
+
+ nbap_debug1("Total number of chans for the flow will be: %%d", umts_fp_conversation_info->num_dch_in_flow);
+
}
@@ -1183,6 +1199,7 @@ BindingID_port = 0;
umts_fp_conversation_info->ul_frame_number = actx->pinfo->fd->num;
SE_COPY_ADDRESS(&(umts_fp_conversation_info->crnc_address), &dst_addr);
umts_fp_conversation_info->crnc_port = BindingID_port;
+
umts_fp_conversation_info->rlc_mode = FP_RLC_MODE_UNKNOWN;
/* Set address for collection of DDI entries */
@@ -1223,6 +1240,8 @@ guint32 no_ddi_entries, i;
for (i = 0; i < no_ddi_entries; i++) {
p_conv_data->edch_ddi[i] = nbap_edch_channel_info[e_dch_macdflow_id].edch_ddi[i];
p_conv_data->edch_macd_pdu_size[i] = nbap_edch_channel_info[e_dch_macdflow_id].edch_macd_pdu_size[i];
+
+ p_conv_data->edch_lchId[i] = nbap_edch_channel_info[e_dch_macdflow_id].lchId[i]; /*lchId_type_table[nbap_edch_channel_info[e_dch_macdflow_id].lchId[i]];*/
nbap_debug3("E-DCH-MACdFlow-Specific-InfoItem: e_dch_macdflow_id %%u edch_ddi %%u edch_macd_pdu_size %%u",
e_dch_macdflow_id,
nbap_edch_channel_info[e_dch_macdflow_id].edch_ddi[i],
@@ -1232,7 +1251,13 @@ guint32 no_ddi_entries, i;
p_conv_data->dch_crc_present = g_nbap_msg_info_for_fp.dch_crc_present;
- p_conv_data->edch_type = 0; /* 1 means T2 */
+ /* Figure out which type of E-DCH frame, based on DDI value (DDI = 0 => type 2)*/
+ if( 0 == e_dch_ddi_value ){
+ p_conv_data->edch_type = 1; /* 1 means T2 */
+ }else{
+
+ p_conv_data->edch_type = 0; /* 1 means T2 */
+ }
/* use to display e_dch_macdflow_id */
p_conv_data->num_dch_in_flow = 1;
p_conv_data->dchs_in_flow_list[0] = e_dch_macdflow_id;
@@ -1267,6 +1292,15 @@ guint32 no_ddi_entries, i;
}
nbap_edch_channel_info[e_dch_macdflow_id].edch_macd_pdu_size[num_items-1] = MACdPDU_Size;
+
+#.FN_BODY LogicalChannelID VAL_PTR = &logical_channel_id
+ /* Set logical channel id for this entry*/
+%(DEFAULT_BODY)s
+
+
+ nbap_edch_channel_info[e_dch_macdflow_id].lchId[num_items-1] = logical_channel_id;
+
+
#.FN_BODY RLC-Mode VAL_PTR = &rlc_mode
guint32 rlc_mode;
@@ -1280,6 +1314,8 @@ guint32 no_ddi_entries, i;
/* rLC-UM */
nbap_hsdsch_channel_info[hsdsch_macdflow_id].rlc_mode = FP_RLC_UM;
break;
+ default:
+ break;
}
#.FN_BODY UE-Capability-Information/hSDSCH-Physical-Layer-Category VAL_PTR = &hsdsch_physical_layer_category
@@ -1289,12 +1325,17 @@ guint32 no_ddi_entries, i;
nbap_hsdsch_channel_info[hsdsch_macdflow_id].hsdsch_physical_layer_category = hsdsch_physical_layer_category;
+#.FN_BODY HSDSCH-MACdFlows-Information
+ num_items = 0;
+
+%(DEFAULT_BODY)s
+
#.FN_BODY HSDSCH-MACdFlow-Specific-InfoItem
address dst_addr;
transportLayerAddress_ipv4 = 0;
BindingID_port = 0;
-
+ num_items++;
%(DEFAULT_BODY)s
if (actx->pinfo->fd->flags.visited||transportLayerAddress_ipv4==0||BindingID_port == 0)
@@ -1311,6 +1352,22 @@ guint32 no_ddi_entries, i;
nbap_hsdsch_channel_info[hsdsch_macdflow_id].crnc_port = BindingID_port;
+#.FN_BODY HSDSCH-MACdPDUSizeFormat
+ /*
+ * Set the channel entity i.e the type of the hsdch channels (if this is present entity = ehs)
+ */
+int i;
+
+%(DEFAULT_BODY)s
+ /* */
+ for (i = 0; i < maxNrOfMACdFlows; i++) {
+ if (nbap_hsdsch_channel_info[i].crnc_port != 0){
+ nbap_hsdsch_channel_info[i].entity = ehs;
+ nbap_debug1("Setting entity = ehs for HSDSCH channel: %%d\n",i);
+ }
+ }
+
+
#.FN_BODY HSDSCH-FDD-Information
/*
* Collect the information about the HSDSCH MACdFlows set up conversation(s) and set the conversation data.
@@ -1325,6 +1382,8 @@ guint32 no_ddi_entries, i;
for (i = 0; i < maxNrOfMACdFlows; i++) {
nbap_hsdsch_channel_info[i].crnc_port = 0;
nbap_hsdsch_channel_info[i].rlc_mode = FP_RLC_MODE_UNKNOWN;
+ /*XXX: Added 29 jun*/
+ nbap_hsdsch_channel_info[i].entity = entity_not_specified; /* Maybe this should default to entity = hs*/
}
}
@@ -1367,15 +1426,24 @@ guint32 no_ddi_entries, i;
umts_fp_conversation_info->ul_frame_number = actx->pinfo->fd->num;
SE_COPY_ADDRESS(&(umts_fp_conversation_info->crnc_address), &nbap_hsdsch_channel_info[i].crnc_address);
umts_fp_conversation_info->crnc_port = nbap_hsdsch_channel_info[i].crnc_port;
-
+
+ /*Added june 3, normally just the iterator variable*/
+ umts_fp_conversation_info->hsdsch_macdflow_id = i ; /*hsdsch_macdflow_ids[i];*/ /* hsdsch_macdflow_id;*/
+
/* Cheat and use the DCH entries */
umts_fp_conversation_info->num_dch_in_flow++;
umts_fp_conversation_info->dchs_in_flow_list[umts_fp_conversation_info->num_dch_in_flow -1] = i;
- if(nbap_hsdsch_channel_info[i].hsdsch_physical_layer_category > 12){
- umts_fp_conversation_info->hsdsch_entity = ehs;
+ /*XXX: Is this craziness, what is physical_layer? */
+ if(nbap_hsdsch_channel_info[i].entity == entity_not_specified ){
+
+ if(nbap_hsdsch_channel_info[i].hsdsch_physical_layer_category > 12){
+ umts_fp_conversation_info->hsdsch_entity = ehs;
+ }else{
+ umts_fp_conversation_info->hsdsch_entity = hs;
+ }
}else{
- umts_fp_conversation_info->hsdsch_entity = hs;
+ umts_fp_conversation_info->hsdsch_entity = nbap_hsdsch_channel_info[i].entity;
}
umts_fp_conversation_info->rlc_mode = nbap_hsdsch_channel_info[i].rlc_mode;
set_umts_fp_conv_data(conversation, umts_fp_conversation_info);
@@ -1384,6 +1452,85 @@ guint32 no_ddi_entries, i;
}
}
+#.FN_BODY Common-MACFlow-ID VAL_PTR = &common_macdflow_id
+
+%(DEFAULT_BODY)s
+
+
+/*hsdsch_macdflow_ids[num_items-1] = hsdsch_macdflow_id;*/
+/*THIS STUFF IST NOT DONE YET!*/
+#.FN_BODY CommonMACFlow-Specific-InfoItem
+ address dst_addr;
+ transportLayerAddress_ipv4 = 0;
+ BindingID_port = 0;
+ num_items++;
+
+%(DEFAULT_BODY)s
+
+ if (actx->pinfo->fd->flags.visited||transportLayerAddress_ipv4==0||BindingID_port == 0)
+ {
+ return offset;
+ }
+
+ dst_addr.type=AT_IPv4;
+ dst_addr.len=4;
+ dst_addr.data=(guint8 *)&transportLayerAddress_ipv4;
+
+ /* Set address for collection of common entries */
+ COPY_ADDRESS(&(nbap_common_channel_info[common_macdflow_id].crnc_address),&dst_addr);
+ nbap_common_channel_info[common_macdflow_id].crnc_port = BindingID_port;
+
+
+#.FN_BODY HSDSCH-Common-System-InformationFDD
+umts_fp_conversation_info_t *umts_fp_conversation_info = NULL;
+address null_addr;
+conversation_t *conversation = NULL;
+
+int i;
+
+ if (!actx->pinfo->fd->flags.visited){
+ /* Set port to zero use that as an indication of wether we have data or not */
+ for (i = 0; i < maxNrOfCommonMACFlows; i++) {
+ nbap_common_channel_info[i].crnc_port = 0;
+ nbap_common_channel_info[i].rlc_mode = FP_RLC_MODE_UNKNOWN;
+
+ }
+
+ }
+%(DEFAULT_BODY)s
+
+ /* Set port to zero use that as an indication of wether we have data or not */
+ SET_ADDRESS(&null_addr, AT_NONE, 0, NULL);
+ for (i = 0; i < maxNrOfCommonMACFlows; i++) {
+ if (nbap_common_channel_info[i].crnc_port != 0){
+
+ conversation = find_conversation(actx->pinfo->fd->num, &(nbap_common_channel_info[i].crnc_address), &null_addr,
+ PT_UDP,
+ nbap_common_channel_info[i].crnc_port, 0, NO_ADDR_B);
+
+ if (conversation == NULL) {
+ conversation = conversation_new(actx->pinfo->fd->num, &(nbap_common_channel_info[i].crnc_address),
+ &null_addr, PT_UDP, nbap_common_channel_info[i].crnc_port,
+ 0, NO_ADDR2|NO_PORT2);
+
+ /* Set dissector */
+ conversation_set_dissector(conversation, fp_handle);
+ /*Set NBAP configuration to lower layers*/
+ if(actx->pinfo->link_dir==P2P_DIR_DL){
+
+ umts_fp_conversation_info = se_new0(umts_fp_conversation_info_t);
+ umts_fp_conversation_info->channel = CHANNEL_HSDSCH_COMMON;
+
+ set_umts_fp_conv_data(conversation, umts_fp_conversation_info);
+ }
+
+ }
+
+
+ }
+ }
+
+
#.REGISTER_NEW
diff --git a/asn1/nbap/packet-nbap-template.c b/asn1/nbap/packet-nbap-template.c
index 0cfc9f6da3..5905e6b8a8 100644
--- a/asn1/nbap/packet-nbap-template.c
+++ b/asn1/nbap/packet-nbap-template.c
@@ -39,7 +39,10 @@
#include "packet-per.h"
#include "packet-isup.h"
#include "packet-umts_fp.h"
+#include "packet-umts_mac.h"
#include "packet-rrc.h"
+#include "packet-rlc.h"
+#include "packet-nbap.h"
#ifdef _MSC_VER
/* disable: "warning C4146: unary minus operator applied to unsigned type, result still unsigned" */
@@ -129,6 +132,7 @@ typedef struct
guint8 edch_ddi[MAX_EDCH_DDIS];
guint edch_macd_pdu_size[MAX_EDCH_DDIS];
guint8 edch_type; /* 1 means T2 */
+ guint8 lchId[MAX_EDCH_DDIS]; /*Logical channel ids.*/
} nbap_edch_channel_info_t;
@@ -140,13 +144,25 @@ typedef struct
guint16 crnc_port;
enum fp_rlc_mode rlc_mode;
guint32 hsdsch_physical_layer_category;
+ guint8 entity; /* "ns" means type 1 and "ehs" means type 2, type 3 == ?*/
} nbap_hsdsch_channel_info_t;
nbap_hsdsch_channel_info_t nbap_hsdsch_channel_info[maxNrOfMACdFlows];
+typedef struct
+{
+ address crnc_address;
+ guint16 crnc_port;
+ enum fp_rlc_mode rlc_mode;
+} nbap_common_channel_info_t;
+
+nbap_common_channel_info_t nbap_common_channel_info[maxNrOfMACdFlows]; /*TODO: Fix this!*/
+
gint g_num_dch_in_flow;
/* maxNrOfTFs INTEGER ::= 32 */
gint g_dchs_in_flow_list[maxNrOfTFs];
+
+gint hsdsch_macdflow_ids[maxNrOfMACdFlows];
struct _nbap_msg_info_for_fp g_nbap_msg_info_for_fp;
/* Global variables */
@@ -154,7 +170,8 @@ static guint32 ProcedureCode;
static guint32 ProtocolIE_ID;
static guint32 ddMode;
static const gchar *ProcedureID;
-static guint32 t_dch_id, dch_id, prev_dch_id, commonphysicalchannelid, e_dch_macdflow_id, hsdsch_macdflow_id, e_dch_ddi_value;
+static guint32 t_dch_id, dch_id, prev_dch_id, commonphysicalchannelid, e_dch_macdflow_id, hsdsch_macdflow_id=3,
+ e_dch_ddi_value,logical_channel_id,common_macdflow_id;
static guint32 MACdPDU_Size, commontransportchannelid;
static guint num_items;
static gint paging_indications;
@@ -171,6 +188,16 @@ enum TransportFormatSet_type_enum
enum TransportFormatSet_type_enum transportFormatSet_type;
+/****************************/
+/* GUI Stuff */
+typedef struct _attribute_type_t {
+ gchar* attribute_type;
+ gchar* attribute_desc;
+} attribute_type_t;
+static attribute_type_t* attribute_types = NULL;
+static guint num_attribute_types = 0;
+static GHashTable* attribute_types_hash = NULL;
+
/* Dissector tables */
static dissector_table_t nbap_ies_dissector_table;
static dissector_table_t nbap_extension_dissector_table;
@@ -184,6 +211,7 @@ static int dissect_InitiatingMessageValue(tvbuff_t *tvb, packet_info *pinfo, pro
static int dissect_SuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
static int dissect_UnsuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+
#include "packet-nbap-fn.c"
static int dissect_ProtocolIEFieldValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
@@ -230,6 +258,30 @@ dissect_nbap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
dissect_NBAP_PDU_PDU(tvb, pinfo, nbap_tree);
}
+static void
+attribute_types_initialize_cb(void)
+{
+}
+static void
+attribute_types_free_cb(void*r)
+{
+}
+static void
+attribute_types_update_cb(void *r, const char **err)
+{
+ g_warning("Running attr types update");
+
+
+}
+
+static void *
+attribute_types_copy_cb(void* n, const void* o, size_t siz _U_)
+{
+
+
+ return NULL;
+}
+
/*--- proto_register_nbap -------------------------------------------*/
void proto_register_nbap(void) {
@@ -260,7 +312,15 @@ void proto_register_nbap(void) {
#include "packet-nbap-ettarr.c"
};
-
+ /* UAT for header fields */
+ /* static uat_field_t custom_attribute_types_uat_fields[] = {
+ UAT_FLD_CSTRING(attribute_types, attribute_type, "Attribute type", "Attribute type"),
+ UAT_FLD_CSTRING(attribute_types, attribute_desc, "Description", "Description of the value matching type"),
+ UAT_END_FIELDS
+ };
+ */
+ /*uat_t *attributes_uat;*/
+
/* Register protocol */
proto_nbap = proto_register_protocol(PNAME, PSNAME, PFNAME);
/* Register fields and subtrees */
@@ -270,6 +330,27 @@ void proto_register_nbap(void) {
/* Register dissector */
register_dissector("nbap", dissect_nbap, proto_nbap);
+ /* Setting up GUI stuff*/
+ /* UAT */
+ /*attributes_uat = uat_new("Custom NBAP maps",
+ sizeof(attribute_type_t),
+ "custom_ldap_attribute_types",
+ TRUE,
+ (void*) &attribute_types,
+ &num_attribute_types,
+ UAT_CAT_FIELDS,
+ NULL,
+ attribute_types_copy_cb,
+ attribute_types_update_cb,
+ attribute_types_free_cb,
+ attribute_types_initialize_cb,
+ custom_attribute_types_uat_fields);*/
+
+ /*prefs_register_uat_preference(nbap_module, "custom_ldap_attribute_types",
+ "Custom AttributeValue types",
+ "A table to define custom LDAP attribute type values for which fields can be setup and used for filtering/data extraction etc.",
+ attributes_uat);*/
+
/* Register dissector tables */
nbap_ies_dissector_table = register_dissector_table("nbap.ies", "NBAP-PROTOCOL-IES", FT_UINT32, BASE_DEC);
nbap_extension_dissector_table = register_dissector_table("nbap.extension", "NBAP-PROTOCOL-EXTENSION", FT_UINT32, BASE_DEC);
diff --git a/asn1/nbap/packet-nbap-template.h b/asn1/nbap/packet-nbap-template.h
new file mode 100644
index 0000000000..e6703b4711
--- /dev/null
+++ b/asn1/nbap/packet-nbap-template.h
@@ -0,0 +1,116 @@
+/* packet-nbap-template.h
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef PACKET_NBAP_H
+#define PACKET_NBAP_H
+
+/*
+ * Ericsson specific mapping for various dissector settings.
+ * Must be altered for other equipment.
+ */
+
+/*Array are indexed on logical channel id, meaning they need to be defined for 1-15*/
+/* Mapping from logical channel id to MAC content type ie. DCCH or DTCH*/
+static const guint8 lchId_type_table[]= {
+ MAC_CONTENT_UNKNOWN, /*Should't happen*/
+ MAC_CONTENT_DCCH, /* 1 to 4 SRB => DCCH*/
+ MAC_CONTENT_DCCH,
+ MAC_CONTENT_DCCH,
+ MAC_CONTENT_DCCH,
+ MAC_CONTENT_CS_DTCH, /* 5 to 7 Conv CS speech => ?*/
+ MAC_CONTENT_CS_DTCH,
+ MAC_CONTENT_CS_DTCH,
+ MAC_CONTENT_DCCH, /* 8 SRB => DCCH*/
+ MAC_CONTENT_PS_DTCH, /* 9 maps to DTCH*/
+ MAC_CONTENT_UNKNOWN, /* 10 Conv CS unknown*/
+ MAC_CONTENT_PS_DTCH, /* 11 Interactive PS => DTCH*/
+ MAC_CONTENT_PS_DTCH, /* 12 Streaming PS => DTCH*/
+ MAC_CONTENT_CS_DTCH, /* 13 Streaming CS*/
+ MAC_CONTENT_PS_DTCH, /* 14 Interatictive PS => DTCH*/
+ MAC_CONTENT_UNKNOWN /* This is CCCH? */
+
+};
+
+/* Mapping logicalchannel id to RLC_MODE */
+static const guint8 lchId_rlc_map[] = {
+ 0,
+ RLC_UM, /* Logical channel id = 1 is SRB1 which uses RLC_UM*/
+ RLC_AM,
+ RLC_AM,
+ RLC_AM,
+ RLC_TM, /*5 to 7 Conv CS Speech*/
+ RLC_TM,
+ RLC_TM, /*...*/
+ RLC_AM,
+ RLC_AM,
+ RLC_AM,
+ RLC_AM,
+ RLC_AM,
+ RLC_AM,
+ RLC_AM,
+ RLC_AM, /* This is CCCH which is UM?, probably not */
+ };
+
+/* 1 to 8*/
+static const guint8 hsdsch_macdflow_id_rlc_map[] = {
+ RLC_UM, /*1 SRB */
+ RLC_AM, /*2 Interactive PS*/
+ RLC_AM, /*3 Interatcive PS*/
+ RLC_UNKNOWN_MODE, /*4 ???*/
+ RLC_AM, /*5 Streaming PS*/
+ RLC_UNKNOWN_MODE,
+ RLC_UNKNOWN_MODE
+ };
+
+/* Mapping hsdsch MACd-FlowId to MAC_CONTENT, basically flowid = 1 (0) => SRB*/
+/* 1 to 8*/
+static const guint8 hsdsch_macdflow_id_mac_content_map[] = {
+ MAC_CONTENT_DCCH, /*1 SRB */
+ MAC_CONTENT_PS_DTCH, /*2 Interactive PS*/
+ MAC_CONTENT_PS_DTCH, /*3 Interatcive PS*/
+ RLC_UNKNOWN_MODE, /*4 ???*/
+ MAC_CONTENT_PS_DTCH, /*5 Streaming PS*/
+ RLC_UNKNOWN_MODE,
+ RLC_UNKNOWN_MODE,
+ RLC_UNKNOWN_MODE
+ };
+
+/* Make fake logical channel id's based on MACdFlow-ID's*/
+static const guint8 fake_lchid_macd_flow[] = {0,9,14,11,0,12};
+
+static const value_string lchid_name_resolve[] = {
+ {1,"DCCH"}, /* 1 to 4 SRB => DCCH*/
+ {2,"DCCH"},
+ {3,"DCCH"},
+ {4,"DCCH"},
+ {8,"DCCH"}, /* 8 SRB => DCCH*/
+ {9,"DTCH"}, /*9 maps to DTCH*/
+ {10,"UNKNOWN"}, /*10 Conv CS unknown*/
+ {11,"DTCH"}, /*11 Interactive PS => DTCH*/
+ {12,"DTCH"}, /*12 13 Streaming PS => DTCH*/
+ {13,"DTCH"},
+ {14,"DTCH"}, /*14 Interatictive PS => DTCH*/
+ {15,"MAC_CONTENT_UNKNOWN"},
+ {0, NULL} /* This is CCCH? */
+};
+#endif