2009-01-18 20:37:16 +00:00
/* packet-nbap-template.c
2005-10-24 21:16:44 +00:00
* Routines for UMTS Node B Application Part ( NBAP ) packet dissection
2009-01-18 20:37:16 +00:00
* Copyright 2005 , 2009 Anders Broman < anders . broman @ ericsson . com >
2005-10-24 21:16:44 +00:00
*
2006-05-21 05:12:17 +00:00
* Wireshark - Network traffic analyzer
* By Gerald Combs < gerald @ wireshark . org >
2005-10-24 21:16:44 +00:00
* 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
2012-06-28 22:56:06 +00:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA .
2005-10-24 21:16:44 +00:00
*
* Ref : 3 GPP TS 25.433 version 6.6 .0 Release 6
*/
2012-09-20 01:29:52 +00:00
# include "config.h"
2005-10-24 21:16:44 +00:00
2009-10-28 05:13:31 +00:00
# include <epan/packet.h>
# include <epan/sctpppids.h>
2007-05-01 22:05:11 +00:00
# include <epan/asn1.h>
2012-05-04 15:10:31 +00:00
# include <epan/conversation.h>
2012-07-18 07:45:19 +00:00
# include <epan/expert.h>
2012-07-31 06:56:13 +00:00
# include <epan/prefs.h>
# include <epan/uat.h>
2007-05-01 22:05:11 +00:00
2005-10-24 21:16:44 +00:00
# include "packet-per.h"
2012-05-04 06:31:31 +00:00
# include "packet-isup.h"
2012-05-07 16:09:49 +00:00
# include "packet-umts_fp.h"
2012-07-16 13:11:20 +00:00
# include "packet-umts_mac.h"
2012-05-30 11:48:05 +00:00
# include "packet-rrc.h"
2017-06-17 20:27:33 +00:00
# include "packet-umts_rlc.h"
2012-07-16 13:11:20 +00:00
# include "packet-nbap.h"
2005-10-24 21:16:44 +00:00
2007-08-13 11:15:39 +00:00
# ifdef _MSC_VER
/* disable: "warning C4146: unary minus operator applied to unsigned type, result still unsigned" */
# pragma warning(disable:4146)
# endif
2005-10-24 21:16:44 +00:00
# define PNAME "UTRAN Iub interface NBAP signalling"
# define PSNAME "NBAP"
# define PFNAME "nbap"
2012-07-18 07:45:19 +00:00
# define NBAP_IGNORE_PORT 255
2012-07-31 06:56:13 +00:00
2012-05-15 15:00:52 +00:00
/* Debug */
2012-05-22 11:53:12 +00:00
#if 0
2015-10-04 14:27:02 +00:00
# define nbap_debug(...) g_warning(__VA_ARGS__)
2012-05-15 15:00:52 +00:00
# else
2015-10-04 14:27:02 +00:00
# define nbap_debug(...)
2012-05-15 15:00:52 +00:00
# endif
2012-05-04 15:10:31 +00:00
2013-12-09 06:20:42 +00:00
void proto_register_nbap ( void ) ;
void proto_reg_handoff_nbap ( void ) ;
2012-05-04 15:10:31 +00:00
/* Global variables */
2013-08-05 20:15:06 +00:00
static dissector_handle_t fp_handle ;
2012-05-04 15:10:31 +00:00
static guint32 transportLayerAddress_ipv4 ;
static guint16 BindingID_port ;
2017-04-14 10:41:37 +00:00
static guint32 ul_scrambling_code ;
2012-07-18 07:45:19 +00:00
static guint32 com_context_id ;
2012-08-10 15:22:50 +00:00
static int cfn ;
2012-05-04 15:10:31 +00:00
2017-05-04 15:09:42 +00:00
wmem_tree_t * nbap_scrambling_code_crncc_map = NULL ;
wmem_tree_t * nbap_crncc_urnti_map = NULL ;
2007-08-13 11:15:39 +00:00
# include "packet-nbap-val.h"
2005-10-24 21:16:44 +00:00
/* Initialize the protocol and registered fields */
static int proto_nbap = - 1 ;
2009-04-22 16:11:53 +00:00
static int hf_nbap_transportLayerAddress_ipv4 = - 1 ;
static int hf_nbap_transportLayerAddress_ipv6 = - 1 ;
2012-05-04 06:31:31 +00:00
static int hf_nbap_transportLayerAddress_nsap = - 1 ;
2005-10-24 21:16:44 +00:00
# include "packet-nbap-hf.c"
/* Initialize the subtree pointers */
static int ett_nbap = - 1 ;
2009-04-22 16:11:53 +00:00
static int ett_nbap_TransportLayerAddress = - 1 ;
2012-05-04 06:31:31 +00:00
static int ett_nbap_TransportLayerAddress_nsap = - 1 ;
2012-05-30 11:48:05 +00:00
static int ett_nbap_ib_sg_data = - 1 ;
2005-10-24 21:16:44 +00:00
# include "packet-nbap-ett.c"
2013-06-03 03:42:36 +00:00
static expert_field ei_nbap_no_find_comm_context_id = EI_INIT ;
static expert_field ei_nbap_no_find_port_info = EI_INIT ;
static expert_field ei_nbap_no_set_comm_context_id = EI_INIT ;
static expert_field ei_nbap_hsdsch_entity_not_specified = EI_INIT ;
2012-05-22 11:53:12 +00:00
extern int proto_fp ;
2016-07-01 00:41:45 +00:00
static dissector_handle_t nbap_handle ;
2012-05-09 12:01:16 +00:00
/*
* Structure to build information needed to dissect the FP flow beeing set up .
*/
struct _nbap_msg_info_for_fp
{
guint32 ProcedureCode ;
guint32 ddMode ;
gboolean is_uplink ;
2012-05-28 20:34:27 +00:00
gint channel ; /* see definitions in packet-umts_fp.h Channel types */
2012-05-09 12:01:16 +00:00
guint8 dch_crc_present ; /* 0=No, 1=Yes, 2=Unknown */
} ;
2012-05-15 15:00:52 +00:00
typedef struct
{
2012-05-19 06:20:05 +00:00
gint num_dch_in_flow ;
gint next_dch ;
2012-05-28 20:34:27 +00:00
gint num_ul_chans ;
gint ul_chan_tf_size [ MAX_FP_CHANS ] ;
gint ul_chan_num_tbs [ MAX_FP_CHANS ] ;
gint num_dl_chans ;
gint dl_chan_tf_size [ MAX_FP_CHANS ] ;
gint dl_chan_num_tbs [ MAX_FP_CHANS ] ;
2012-05-15 15:00:52 +00:00
2012-05-28 20:34:27 +00:00
} nbap_dch_channel_info_t ;
2012-05-15 15:00:52 +00:00
2013-09-20 14:19:31 +00:00
nbap_dch_channel_info_t nbap_dch_chnl_info [ 256 ] ;
2012-05-22 11:53:12 +00:00
2012-07-31 06:56:13 +00:00
/* Struct to collect E-DCH data in a packet
2012-05-22 11:53:12 +00:00
* As the address data comes before the ddi entries
* we save the address to be able to find the conversation and update the
* conversation data .
*/
typedef struct
{
address crnc_address ;
2012-05-28 20:34:27 +00:00
guint16 crnc_port ;
gint no_ddi_entries ;
guint8 edch_ddi [ MAX_EDCH_DDIS ] ;
guint edch_macd_pdu_size [ MAX_EDCH_DDIS ] ;
guint8 edch_type ; /* 1 means T2 */
2012-07-16 13:11:20 +00:00
guint8 lchId [ MAX_EDCH_DDIS ] ; /*Logical channel ids.*/
2012-05-22 11:53:12 +00:00
2012-05-28 20:34:27 +00:00
} nbap_edch_channel_info_t ;
2012-05-22 11:53:12 +00:00
2012-05-28 20:34:27 +00:00
nbap_edch_channel_info_t nbap_edch_channel_info [ maxNrOfEDCHMACdFlows ] ;
2012-05-22 11:53:12 +00:00
2012-08-10 15:22:50 +00:00
typedef struct
{
guint32 crnc_address ;
guint16 crnc_port [ maxNrOfEDCHMACdFlows ] ;
} nbap_edch_port_info_t ;
2012-05-28 13:38:40 +00:00
typedef struct
{
2012-05-28 20:34:27 +00:00
address crnc_address ;
guint16 crnc_port ;
enum fp_rlc_mode rlc_mode ;
guint32 hsdsch_physical_layer_category ;
2012-07-16 13:11:20 +00:00
guint8 entity ; /* "ns" means type 1 and "ehs" means type 2, type 3 == ?*/
2012-05-28 20:34:27 +00:00
} nbap_hsdsch_channel_info_t ;
2012-05-28 13:38:40 +00:00
2012-05-28 20:34:27 +00:00
nbap_hsdsch_channel_info_t nbap_hsdsch_channel_info [ maxNrOfMACdFlows ] ;
2012-05-28 13:38:40 +00:00
2012-07-16 13:11:20 +00:00
typedef struct
{
address crnc_address ;
guint16 crnc_port ;
enum fp_rlc_mode rlc_mode ;
2012-07-26 08:15:20 +00:00
2012-07-16 13:11:20 +00:00
} nbap_common_channel_info_t ;
nbap_common_channel_info_t nbap_common_channel_info [ maxNrOfMACdFlows ] ; /*TODO: Fix this!*/
2012-05-15 15:00:52 +00:00
gint g_num_dch_in_flow ;
2012-05-16 13:05:27 +00:00
/* maxNrOfTFs INTEGER ::= 32 */
2017-05-19 09:28:36 +00:00
gint g_dch_ids_in_flow_list [ maxNrOfTFs ] ;
2012-07-16 13:11:20 +00:00
gint hsdsch_macdflow_ids [ maxNrOfMACdFlows ] ;
2012-07-26 08:15:20 +00:00
gint hrnti ;
2012-07-27 08:10:31 +00:00
guint node_b_com_context_id ;
2016-07-19 20:11:55 +00:00
static wmem_tree_t * edch_flow_port_map = NULL ;
2012-08-10 15:22:50 +00:00
2012-08-10 18:41:40 +00:00
/*Stuff for mapping NodeB-Comuncation Context ID to CRNC Communication Context ID*/
2012-07-27 08:10:31 +00:00
typedef struct com_ctxt_ {
/*guint nodeb_context;*/
guint crnc_context ;
guint frame_num ;
2012-11-16 09:41:26 +00:00
} nbap_com_context_id_t ;
2012-07-27 08:10:31 +00:00
gboolean crcn_context_present = FALSE ;
2016-07-19 20:11:55 +00:00
static wmem_tree_t * com_context_map ;
2012-07-27 08:10:31 +00:00
2012-05-09 12:01:16 +00:00
struct _nbap_msg_info_for_fp g_nbap_msg_info_for_fp ;
2005-10-24 21:16:44 +00:00
/* Global variables */
2005-10-25 18:38:47 +00:00
static guint32 ProcedureCode ;
static guint32 ProtocolIE_ID ;
static guint32 ddMode ;
2007-08-13 11:15:39 +00:00
static const gchar * ProcedureID ;
2012-07-31 06:56:13 +00:00
static guint32 t_dch_id , dch_id , prev_dch_id , commonphysicalchannelid , e_dch_macdflow_id , hsdsch_macdflow_id = 3 ,
2012-07-16 13:11:20 +00:00
e_dch_ddi_value , logical_channel_id , common_macdflow_id ;
2012-05-22 15:39:12 +00:00
static guint32 MACdPDU_Size , commontransportchannelid ;
2012-05-15 15:00:52 +00:00
static guint num_items ;
2012-05-22 15:39:12 +00:00
static gint paging_indications ;
2012-05-30 11:48:05 +00:00
static guint32 ib_type , segment_type ;
2012-05-15 15:00:52 +00:00
enum TransportFormatSet_type_enum
{
2012-05-30 18:27:40 +00:00
NBAP_DCH_UL ,
NBAP_DCH_DL ,
NBAP_CPCH ,
NBAP_FACH ,
NBAP_PCH
2012-05-15 15:00:52 +00:00
} ;
enum TransportFormatSet_type_enum transportFormatSet_type ;
2005-10-24 21:16:44 +00:00
2012-07-31 06:56:13 +00:00
/* This table is used externally from FP, MAC and such, TODO: merge this with
* lch_contents [ ] */
guint8 lchId_type_table [ ] = {
2016-01-02 01:09:14 +00:00
MAC_CONTENT_UNKNOWN , /* Shouldn't happen*/
MAC_CONTENT_DCCH , /* 1 to 4 SRB => DCCH*/
2012-07-31 06:56:13 +00:00
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 ,
2016-01-02 01:09:14 +00:00
MAC_CONTENT_DCCH , /* 8 SRB => DCCH*/
2012-07-31 06:56:13 +00:00
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*/
2016-01-02 01:09:14 +00:00
MAC_CONTENT_PS_DTCH , /* 14 Interactive PS => DTCH*/
MAC_CONTENT_CCCH /* This is CCCH? */
2012-07-31 06:56:13 +00:00
} ;
2016-02-10 11:47:20 +00:00
/* Mapping logicalchannel id to RLC_MODE */
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 */
} ;
2012-07-31 06:56:13 +00:00
/* Preference variables */
/* Array with preference variables for easy looping, TODO: merge this with
* lchId_type_table [ ] */
2016-01-02 01:09:14 +00:00
static int lch_contents [ 16 ] = {
MAC_CONTENT_DCCH ,
MAC_CONTENT_DCCH ,
MAC_CONTENT_DCCH ,
MAC_CONTENT_DCCH ,
MAC_CONTENT_CS_DTCH ,
MAC_CONTENT_CS_DTCH ,
MAC_CONTENT_CS_DTCH ,
MAC_CONTENT_DCCH ,
MAC_CONTENT_PS_DTCH ,
MAC_CONTENT_UNKNOWN ,
MAC_CONTENT_PS_DTCH ,
MAC_CONTENT_PS_DTCH ,
MAC_CONTENT_CS_DTCH ,
MAC_CONTENT_PS_DTCH ,
MAC_CONTENT_CCCH ,
MAC_CONTENT_DCCH
} ;
2012-07-31 06:56:13 +00:00
static const enum_val_t content_types [ ] = {
{ " MAC_CONTENT_UNKNOWN " , " MAC_CONTENT_UNKNOWN " , MAC_CONTENT_UNKNOWN } ,
{ " MAC_CONTENT_DCCH " , " MAC_CONTENT_DCCH " , MAC_CONTENT_DCCH } ,
{ " MAC_CONTENT_PS_DTCH " , " MAC_CONTENT_PS_DTCH " , MAC_CONTENT_PS_DTCH } ,
{ " MAC_CONTENT_CS_DTCH " , " MAC_CONTENT_CS_DTCH " , MAC_CONTENT_CS_DTCH } ,
{ " MAC_CONTENT_CCCH " , " MAC_CONTENT_CCCH " , MAC_CONTENT_CCCH } ,
{ NULL , NULL , - 1 } } ;
typedef struct {
const char * name ;
const char * title ;
const char * description ;
} preference_strings ;
/* This is used when registering preferences, name, title, description */
static const preference_strings ch_strings [ ] = {
{ " lch1_content " , " Logical Channel 1 Content " , " foo " } ,
{ " lch2_content " , " Logical Channel 2 Content " , " foo " } ,
{ " lch3_content " , " Logical Channel 3 Content " , " foo " } ,
{ " lch4_content " , " Logical Channel 4 Content " , " foo " } ,
{ " lch5_content " , " Logical Channel 5 Content " , " foo " } ,
{ " lch6_content " , " Logical Channel 6 Content " , " foo " } ,
{ " lch7_content " , " Logical Channel 7 Content " , " foo " } ,
{ " lch8_content " , " Logical Channel 8 Content " , " foo " } ,
{ " lch9_content " , " Logical Channel 9 Content " , " foo " } ,
{ " lch10_content " , " Logical Channel 10 Content " , " foo " } ,
{ " lch11_content " , " Logical Channel 11 Content " , " foo " } ,
{ " lch12_content " , " Logical Channel 12 Content " , " foo " } ,
{ " lch13_content " , " Logical Channel 13 Content " , " foo " } ,
{ " lch14_content " , " Logical Channel 14 Content " , " foo " } ,
{ " lch15_content " , " Logical Channel 15 Content " , " foo " } ,
{ " lch16_content " , " Logical Channel 16 Content " , " foo " } } ;
2012-07-16 13:11:20 +00:00
2007-08-13 11:15:39 +00:00
/* Dissector tables */
static dissector_table_t nbap_ies_dissector_table ;
static dissector_table_t nbap_extension_dissector_table ;
static dissector_table_t nbap_proc_imsg_dissector_table ;
static dissector_table_t nbap_proc_sout_dissector_table ;
static dissector_table_t nbap_proc_uout_dissector_table ;
2005-10-24 21:16:44 +00:00
2012-09-10 21:40:21 +00:00
static int dissect_ProtocolIEFieldValue ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * ) ;
static int dissect_ProtocolExtensionFieldExtensionValue ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * ) ;
static int dissect_InitiatingMessageValue ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * ) ;
static int dissect_SuccessfulOutcomeValue ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * ) ;
static int dissect_UnsuccessfulOutcomeValue ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * ) ;
2005-10-24 21:16:44 +00:00
2012-07-18 07:45:19 +00:00
/*Easy way to add hsdhsch binds for corner cases*/
2013-06-03 04:25:31 +00:00
static void add_hsdsch_bind ( packet_info * pinfo ) ;
2012-07-16 13:11:20 +00:00
2005-10-24 21:16:44 +00:00
# include "packet-nbap-fn.c"
2012-09-10 21:40:21 +00:00
static int dissect_ProtocolIEFieldValue ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data _U_ )
2007-08-13 11:15:39 +00:00
{
2014-06-21 00:36:59 +00:00
return ( dissector_try_uint_new ( nbap_ies_dissector_table , ProtocolIE_ID , tvb , pinfo , tree , FALSE , NULL ) ) ? tvb_captured_length ( tvb ) : 0 ;
2005-10-24 21:16:44 +00:00
}
2012-09-10 21:40:21 +00:00
static int dissect_ProtocolExtensionFieldExtensionValue ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data _U_ )
2007-08-13 11:15:39 +00:00
{
2014-06-21 00:36:59 +00:00
return ( dissector_try_uint_new ( nbap_extension_dissector_table , ProtocolIE_ID , tvb , pinfo , tree , FALSE , NULL ) ) ? tvb_captured_length ( tvb ) : 0 ;
2005-10-24 21:16:44 +00:00
}
2012-09-10 21:40:21 +00:00
static int dissect_InitiatingMessageValue ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data _U_ )
2007-08-13 11:15:39 +00:00
{
if ( ! ProcedureID ) return 0 ;
2014-06-21 00:36:59 +00:00
return ( dissector_try_string ( nbap_proc_imsg_dissector_table , ProcedureID , tvb , pinfo , tree , NULL ) ) ? tvb_captured_length ( tvb ) : 0 ;
2005-10-24 21:16:44 +00:00
}
2012-09-10 21:40:21 +00:00
static int dissect_SuccessfulOutcomeValue ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data _U_ )
2007-08-13 11:15:39 +00:00
{
if ( ! ProcedureID ) return 0 ;
2014-06-21 00:36:59 +00:00
return ( dissector_try_string ( nbap_proc_sout_dissector_table , ProcedureID , tvb , pinfo , tree , NULL ) ) ? tvb_captured_length ( tvb ) : 0 ;
2007-08-13 11:15:39 +00:00
}
2005-10-24 21:16:44 +00:00
2012-09-10 21:40:21 +00:00
static int dissect_UnsuccessfulOutcomeValue ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data _U_ )
2007-08-13 11:15:39 +00:00
{
if ( ! ProcedureID ) return 0 ;
2014-06-21 00:36:59 +00:00
return ( dissector_try_string ( nbap_proc_uout_dissector_table , ProcedureID , tvb , pinfo , tree , NULL ) ) ? tvb_captured_length ( tvb ) : 0 ;
2005-10-24 21:16:44 +00:00
}
2013-06-03 04:25:31 +00:00
static void add_hsdsch_bind ( packet_info * pinfo ) {
2012-07-18 07:45:19 +00:00
address null_addr ;
conversation_t * conversation = NULL ;
umts_fp_conversation_info_t * umts_fp_conversation_info ;
2017-05-19 09:28:36 +00:00
fp_hsdsch_channel_info_t * fp_hsdsch_channel_info = NULL ;
2012-07-18 07:45:19 +00:00
guint32 i ;
if ( pinfo - > fd - > flags . visited ) {
return ;
}
2013-02-26 04:42:26 +00:00
/* Set port to zero use that as an indication of whether we have data or not */
2015-11-26 04:44:52 +00:00
clear_address ( & null_addr ) ;
2012-07-18 07:45:19 +00:00
for ( i = 0 ; i < maxNrOfMACdFlows ; i + + ) {
if ( nbap_hsdsch_channel_info [ i ] . crnc_port ! = 0 ) {
2016-01-24 03:40:51 +00:00
conversation = find_conversation ( pinfo - > num , & ( nbap_hsdsch_channel_info [ i ] . crnc_address ) , & null_addr ,
2012-07-18 07:45:19 +00:00
PT_UDP ,
nbap_hsdsch_channel_info [ i ] . crnc_port , 0 , NO_ADDR_B ) ;
2012-07-31 06:56:13 +00:00
2012-07-18 07:45:19 +00:00
if ( conversation = = NULL ) {
/* It's not part of any conversation - create a new one. */
2016-01-24 03:40:51 +00:00
conversation = conversation_new ( pinfo - > num , & ( nbap_hsdsch_channel_info [ i ] . crnc_address ) ,
2012-07-18 07:45:19 +00:00
& null_addr , PT_UDP , nbap_hsdsch_channel_info [ i ] . crnc_port ,
0 , NO_ADDR2 | NO_PORT2 ) ;
/* Set dissector */
conversation_set_dissector ( conversation , fp_handle ) ;
2012-07-31 06:56:13 +00:00
2012-07-18 07:45:19 +00:00
if ( pinfo - > link_dir = = P2P_DIR_DL ) {
2013-09-15 14:33:38 +00:00
umts_fp_conversation_info = wmem_new0 ( wmem_file_scope ( ) , umts_fp_conversation_info_t ) ;
2012-07-18 07:45:19 +00:00
/* Fill in the HSDSCH relevant data */
umts_fp_conversation_info - > iface_type = IuB_Interface ;
umts_fp_conversation_info - > division = Division_FDD ;
umts_fp_conversation_info - > channel = CHANNEL_HSDSCH ;
umts_fp_conversation_info - > dl_frame_number = 0 ;
2016-01-24 03:40:51 +00:00
umts_fp_conversation_info - > ul_frame_number = pinfo - > num ;
2015-10-29 03:12:53 +00:00
copy_address_wmem ( wmem_file_scope ( ) , & ( umts_fp_conversation_info - > crnc_address ) , & nbap_hsdsch_channel_info [ i ] . crnc_address ) ;
2012-07-18 07:45:19 +00:00
umts_fp_conversation_info - > crnc_port = nbap_hsdsch_channel_info [ i ] . crnc_port ;
2012-07-31 06:56:13 +00:00
2017-05-19 09:28:36 +00:00
fp_hsdsch_channel_info = wmem_new0 ( wmem_file_scope ( ) , fp_hsdsch_channel_info_t ) ;
umts_fp_conversation_info - > channel_specific_info = ( void * ) fp_hsdsch_channel_info ;
2012-07-18 07:45:19 +00:00
/*Added june 3, normally just the iterator variable*/
2017-05-19 09:28:36 +00:00
fp_hsdsch_channel_info - > hsdsch_macdflow_id = i ; /*hsdsch_macdflow_ids[i];*/ /* hsdsch_macdflow_id;*/
2012-07-31 06:56:13 +00:00
2012-07-18 07:45:19 +00:00
/* Cheat and use the DCH entries */
umts_fp_conversation_info - > num_dch_in_flow + + ;
2017-05-19 09:28:36 +00:00
umts_fp_conversation_info - > dch_ids_in_flow_list [ umts_fp_conversation_info - > num_dch_in_flow - 1 ] = i ;
2012-07-18 07:45:19 +00:00
2012-07-31 06:56:13 +00:00
/*XXX: Is this craziness, what is physical_layer? */
2012-07-18 07:45:19 +00:00
if ( nbap_hsdsch_channel_info [ i ] . entity = = entity_not_specified ) {
/*Error*/
2013-06-03 03:42:36 +00:00
expert_add_info ( pinfo , NULL , & ei_nbap_hsdsch_entity_not_specified ) ;
2012-07-18 07:45:19 +00:00
} else {
2017-05-19 09:28:36 +00:00
fp_hsdsch_channel_info - > hsdsch_entity = ( enum fp_hsdsch_entity ) nbap_hsdsch_channel_info [ i ] . entity ;
2012-07-18 07:45:19 +00:00
}
umts_fp_conversation_info - > rlc_mode = nbap_hsdsch_channel_info [ i ] . rlc_mode ;
set_umts_fp_conv_data ( conversation , umts_fp_conversation_info ) ;
}
}
}
}
2007-08-13 11:15:39 +00:00
2012-07-18 07:45:19 +00:00
}
2012-07-31 06:56:13 +00:00
2012-07-27 08:10:31 +00:00
static void nbap_init ( void ) {
2015-06-27 22:33:42 +00:00
guint8 i ;
/*Initialize*/
2016-07-19 20:11:55 +00:00
com_context_map = wmem_tree_new_autoreset ( wmem_epan_scope ( ) , wmem_file_scope ( ) ) ;
2013-02-26 04:42:26 +00:00
2016-07-19 20:11:55 +00:00
/*Initialize structure for muxed flow indication*/
edch_flow_port_map = wmem_tree_new_autoreset ( wmem_epan_scope ( ) , wmem_file_scope ( ) ) ;
2013-02-26 04:42:26 +00:00
2017-05-04 15:09:42 +00:00
/*Initializing Scrambling Code to C-RNC Context & C-RNC Context to U-RNTI maps*/
nbap_scrambling_code_crncc_map = wmem_tree_new_autoreset ( wmem_epan_scope ( ) , wmem_file_scope ( ) ) ;
nbap_crncc_urnti_map = wmem_tree_new_autoreset ( wmem_epan_scope ( ) , wmem_file_scope ( ) ) ;
2012-07-31 06:56:13 +00:00
for ( i = 0 ; i < 15 ; i + + ) {
2016-01-02 01:09:14 +00:00
lchId_type_table [ i + 1 ] = lch_contents [ i ] ;
2015-06-27 22:33:42 +00:00
}
2012-07-27 08:10:31 +00:00
}
2015-06-27 22:33:42 +00:00
2014-10-06 13:31:47 +00:00
static int
dissect_nbap ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data )
2005-10-24 21:16:44 +00:00
{
proto_item * nbap_item = NULL ;
proto_tree * nbap_tree = NULL ;
2012-07-18 07:45:19 +00:00
int i ;
2005-10-24 21:16:44 +00:00
/* make entry in the Protocol column on summary display */
2009-08-09 06:26:46 +00:00
col_set_str ( pinfo - > cinfo , COL_PROTOCOL , " NBAP " ) ;
2005-10-24 21:16:44 +00:00
2007-08-13 11:15:39 +00:00
/* create the nbap protocol tree */
2011-10-21 02:10:19 +00:00
nbap_item = proto_tree_add_item ( tree , proto_nbap , tvb , 0 , - 1 , ENC_NA ) ;
2007-08-13 11:15:39 +00:00
nbap_tree = proto_item_add_subtree ( nbap_item , ett_nbap ) ;
2011-10-21 02:10:19 +00:00
2012-07-18 07:45:19 +00:00
/*Do a little cleanup just as a precaution*/
for ( i = 0 ; i < maxNrOfMACdFlows ; i + + ) {
nbap_hsdsch_channel_info [ i ] . entity = hs ;
}
2017-04-14 10:41:37 +00:00
ul_scrambling_code = 0 ;
2012-07-16 13:11:20 +00:00
2014-10-06 13:31:47 +00:00
return dissect_NBAP_PDU_PDU ( tvb , pinfo , nbap_tree , data ) ;
2012-07-16 13:11:20 +00:00
}
2012-07-31 06:56:13 +00:00
/*--- proto_register_nbap -------------------------------------------*/
void proto_register_nbap ( void )
2012-07-16 13:11:20 +00:00
{
2012-07-31 06:56:13 +00:00
module_t * nbap_module ;
guint8 i ;
/* List of fields */
static hf_register_info hf [ ] = {
{ & hf_nbap_transportLayerAddress_ipv4 ,
{ " transportLayerAddress IPv4 " , " nbap.transportLayerAddress_ipv4 " ,
FT_IPv4 , BASE_NONE , NULL , 0 ,
NULL , HFILL } } ,
{ & hf_nbap_transportLayerAddress_ipv6 ,
{ " transportLayerAddress IPv6 " , " nbap.transportLayerAddress_ipv6 " ,
FT_IPv6 , BASE_NONE , NULL , 0 ,
NULL , HFILL } } ,
{ & hf_nbap_transportLayerAddress_nsap ,
{ " transportLayerAddress NSAP " , " nbap.transportLayerAddress_NSAP " ,
FT_BYTES , BASE_NONE , NULL , 0 ,
NULL , HFILL } } ,
# include "packet-nbap-hfarr.c"
} ;
/* List of subtrees */
static gint * ett [ ] = {
& ett_nbap ,
& ett_nbap_TransportLayerAddress ,
& ett_nbap_TransportLayerAddress_nsap ,
& ett_nbap_ib_sg_data ,
# include "packet-nbap-ettarr.c"
} ;
2013-06-03 03:42:36 +00:00
static ei_register_info ei [ ] = {
{ & ei_nbap_no_set_comm_context_id , { " nbap.no_set_comm_context_id " , PI_MALFORMED , PI_WARN , " Couldn't not set Communication Context-ID, fragments over reconfigured channels might fail " , EXPFILL } } ,
{ & ei_nbap_no_find_comm_context_id , { " nbap.no_find_comm_context_id " , PI_MALFORMED , PI_WARN , " Couldn't not find Communication Context-ID, unable to reconfigure this E-DCH flow. " , EXPFILL } } ,
{ & ei_nbap_no_find_port_info , { " nbap.no_find_port_info " , PI_MALFORMED , PI_WARN , " Couldn't not find port information for reconfigured E-DCH flow, unable to reconfigure " , EXPFILL } } ,
{ & ei_nbap_hsdsch_entity_not_specified , { " nbap.hsdsch_entity_not_specified " , PI_MALFORMED , PI_ERROR , " HSDSCH Entity not specified! " , EXPFILL } } ,
} ;
expert_module_t * expert_nbap ;
2012-07-31 06:56:13 +00:00
/* Register protocol */
proto_nbap = proto_register_protocol ( PNAME , PSNAME , PFNAME ) ;
/* Register fields and subtrees */
proto_register_field_array ( proto_nbap , hf , array_length ( hf ) ) ;
proto_register_subtree_array ( ett , array_length ( ett ) ) ;
2013-06-03 03:42:36 +00:00
expert_nbap = expert_register_protocol ( proto_nbap ) ;
expert_register_field_array ( expert_nbap , ei , array_length ( ei ) ) ;
2012-07-31 06:56:13 +00:00
/* Register dissector */
2016-07-01 00:41:45 +00:00
nbap_handle = register_dissector ( " nbap " , dissect_nbap , proto_nbap ) ;
2012-07-31 06:56:13 +00:00
nbap_module = prefs_register_protocol ( proto_nbap , NULL ) ;
/* Register preferences for mapping logical channel IDs to MAC content types. */
for ( i = 0 ; i < 16 ; i + + ) {
2016-01-02 01:09:14 +00:00
prefs_register_enum_preference ( nbap_module , ch_strings [ i ] . name , ch_strings [ i ] . title , ch_strings [ i ] . description , & lch_contents [ i ] , content_types , FALSE ) ;
2012-07-31 06:56:13 +00:00
}
2012-07-16 13:11:20 +00:00
2012-07-31 06:56:13 +00:00
/* Register dissector tables */
2016-08-30 22:51:54 +00:00
nbap_ies_dissector_table = register_dissector_table ( " nbap.ies " , " NBAP-PROTOCOL-IES " , proto_nbap , FT_UINT32 , BASE_DEC ) ;
nbap_extension_dissector_table = register_dissector_table ( " nbap.extension " , " NBAP-PROTOCOL-EXTENSION " , proto_nbap , FT_UINT32 , BASE_DEC ) ;
nbap_proc_imsg_dissector_table = register_dissector_table ( " nbap.proc.imsg " , " NBAP-ELEMENTARY-PROCEDURE InitiatingMessage " , proto_nbap , FT_STRING , BASE_NONE ) ;
nbap_proc_sout_dissector_table = register_dissector_table ( " nbap.proc.sout " , " NBAP-ELEMENTARY-PROCEDURE SuccessfulOutcome " , proto_nbap , FT_STRING , BASE_NONE ) ;
nbap_proc_uout_dissector_table = register_dissector_table ( " nbap.proc.uout " , " NBAP-ELEMENTARY-PROCEDURE UnsuccessfulOutcome " , proto_nbap , FT_STRING , BASE_NONE ) ;
2005-10-24 21:16:44 +00:00
2012-07-27 08:10:31 +00:00
register_init_routine ( nbap_init ) ;
}
2012-07-26 08:15:20 +00:00
2012-07-27 08:10:31 +00:00
/*
2012-11-14 16:46:57 +00:00
* # define EXTRA_PPI 1
*/
2005-10-24 21:16:44 +00:00
/*--- proto_reg_handoff_nbap ---------------------------------------*/
void
proto_reg_handoff_nbap ( void )
{
2012-05-04 15:10:31 +00:00
fp_handle = find_dissector ( " fp " ) ;
2010-12-20 05:35:29 +00:00
dissector_add_uint ( " sctp.ppi " , NBAP_PAYLOAD_PROTOCOL_ID , nbap_handle ) ;
2012-07-26 08:15:20 +00:00
# ifdef EXTRA_PPI
2014-06-20 16:43:28 +00:00
dissector_add_uint ( " sctp.ppi " , 17 , nbap_handle ) ;
2012-07-26 08:15:20 +00:00
# endif
2014-06-20 16:43:28 +00:00
dissector_add_for_decode_as ( " sctp.port " , nbap_handle ) ;
2005-10-24 21:16:44 +00:00
2007-08-13 11:15:39 +00:00
# include "packet-nbap-dis-tab.c"
2005-10-24 21:16:44 +00:00
}