Cleaned up splitt between old and new dissection style.

A lot of conversion still needed.

svn path=/trunk/; revision=35580
This commit is contained in:
Anders Broman 2011-01-19 09:35:34 +00:00
parent 6b24548858
commit 3c491eee6b
1 changed files with 443 additions and 107 deletions

View File

@ -33,6 +33,7 @@
#include <math.h>
#include <glib.h>
#include <epan/packet.h>
#include <epan/expert.h>
#include <prefs.h>
#include "packet-bssgp.h"
@ -76,6 +77,7 @@ static int bssgp_decode_nri = 0;
static guint bssgp_nri_length = 4;
static packet_info *gpinfo;
static proto_tree *parent_tree;
static dissector_handle_t llc_handle;
static dissector_handle_t rrlp_handle;
static dissector_handle_t data_handle;
@ -114,9 +116,13 @@ static int hf_bssgp_cr_bit = -1;
static int hf_bssgp_t_bit = -1;
static int hf_bssgp_a_bit = -1;
static int hf_bssgp_precedence = -1;
static int hf_bssgp_serv_utran_cco = -1;
static int hf_bssgp_serv_eutran_cco = -1;
static int hf_bssgp_sub_prof_id_f_rat_freq_prio = -1;
/* Initialize the subtree pointers */
static gint ett_bssgp = -1;
static gint ett_bssgp_new = -1;
static gint ett_bssgp_qos_profile = -1;
static gint ett_bssgp_gprs_timer = -1;
static gint ett_bssgp_cell_identifier = -1;
@ -3499,7 +3505,8 @@ decode_iei_service_utran_cco(bssgp_ie_t *ie, build_info_t *bi, int ie_start_offs
{ 0, "Network initiated cell change order procedure to UTRAN should be performed" },
{ 1, "Network initiated cell change order procedure to UTRAN should not be performed" },
{ 2, "Network initiated cell change order procedure to UTRAN shall not be performed" },
{ 0, NULL },
{ 3, " If received, shall be interpreted as no information available (bits 4-5 valid)" },
{ 0, NULL },
/* Otherwise "No information available" */
};
@ -6138,8 +6145,23 @@ decode_pdu(build_info_t *bi) {
}
/*
* 11.3 Information Element Identifier (IEI)
*/
/*
* 11.3.1 Alignment octets
*/
static guint16
de_bssgp_aligment_octets(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
curr_offset = offset;
proto_tree_add_text(tree, tvb, curr_offset, len, "%u Spare octet(s)",len);
return(len);
}
/*
* 11.3.2 Bmax default MS 123
* 11.3.3 BSS Area Indication 123
@ -6155,25 +6177,143 @@ The Delay Value field is coded as a 16-bit integer value in units of centi-secon
coding provides a range of over 10 minutes in increments of 10 ms. As a special case, the hexadecimal value 0xFFFF
(decimal 65 535) shall be interpreted as "infinite delay".
*/
static guint16
de_bssgp_bvc_meas(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
curr_offset = offset;
proto_tree_add_item(tree, hf_bssgp_delay_val, tvb, curr_offset, 2, ENC_NA);
curr_offset+=2;
return(curr_offset-offset);
}
/*
* 11.3.8 Cause
*/
/*
* 11.3.9 Cell Identifier
*/
/*
* octets 3-8 Octets 3 to 8 contain the value part (starting with octet 2) of the
* Routing Area Identification IE defined in 3GPP TS 24.008, not
* including 3GPP TS 24.008 IEI
* Octets 9 and 10 contain the value part (starting with octet 2) of the
* Cell Identity IE defined in 3GPP TS 24.008, not including
* 3GPP TS 24.008 IEI (10.5.1.1)
*/
static guint16
de_bssgp_cell_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string, int string_len)
{
guint32 curr_offset;
guint16 ci;
curr_offset = offset;
curr_offset = curr_offset + de_gmm_rai(tvb, tree, curr_offset , 6, add_string, string_len);
/*Why doesn't this work? ( add_string will not contain RAI + CI )
* curr_offset = curr_offset + de_cell_id(tvb, tree, curr_offset , 2, add_string, string_len);
*/
ci = tvb_get_ntohs(tvb, offset);
proto_tree_add_item(tree, hf_bssgp_ci, tvb, offset, 2, ENC_BIG_ENDIAN);
curr_offset+=2;
if (add_string)
g_snprintf(add_string, string_len, " %s, CI %u", add_string, ci);
return(curr_offset-offset);
}
/*
* 11.3.10 Channel needed
*/
/* Rest of element coded as the value part of the Channel Needed
* PDU defined in 3GPP TS 29.018, not including 3GPP TS 29.018
* IEI and 3GPP TS 29.018 length indicator
*/
/*
* 11.3.11 DRX Parameters
*/
/*
* Rest of element coded as the value part defined in
* 3GPP TS 24.008, not including 3GPP TS 24.008 IEI and
* 3GPP TS 24.008 octet length indicator
*/
/*
* 11.3.12 eMLPP-Priority
*/
/*
* 11.3.13 Flush Action
*/
/*
* 11.3.14 IMSI
*/
/* Octets 3-n contain an IMSI coded as the value part of the Mobile
* Identity IE defined in 3GPP TS 24.008
* (NOTE 1)
* NOTE 1: The Type of identity field in the Mobile Identity IE shall be ignored by
* the receiver.
*/
/*
* 11.3.15 LLC-PDU
*/
static guint16
de_bssgp_llc_pdu(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
tvbuff_t *next_tvb=NULL;
guint32 curr_offset;
curr_offset = offset;
if(len > 0){
next_tvb = tvb_new_subset_remaining(tvb, curr_offset);
proto_tree_add_text(tree, tvb, curr_offset, len, "LLC Data");
}
if(next_tvb){
if (llc_handle) {
call_dissector(llc_handle, next_tvb, gpinfo, parent_tree);
}
else if (data_handle) {
call_dissector(data_handle, next_tvb, gpinfo, parent_tree);
}
}
return(len);
}
/*
* 11.3.16 LLC Frames Discarded
* 11.3.17 Location Area
* 11.3.18 LSA Identifier List
*/
/* Rest of element coded as in 3GPP TS 48.008, not including
* 3GPP TS 48.008 IEI and 3GPP TS 48.008 length indicator
*/
/*
* 11.3.19 LSA Information
*/
/* Rest of element coded as in 3GPP TS 48.008, not including
* 3GPP TS 48.008 IEI and 3GPP TS 48.008 length indicator
*/
/*
* 11.3.20 Mobile Id
*/
/*
* 11.3.21 MS Bucket Size
* 11.3.22 MS Radio Access Capability 130
* 11.3.23 OMC Id 130
*/
/*
* 11.3.22 MS Radio Access Capability
*/
/* Rest of element coded as the value part defined in
* 3GPP TS 24.008, not including 3GPP TS 24.008 IEI and
* 3GPP TS 24.008 octet length indicator.
*/
/*
* 11.3.23 OMC Id
* 11.3.24 PDU In Error
*/
/*
@ -6203,6 +6343,10 @@ coding provides a range of over 10 minutes in increments of 10 ms. As a special
/*
* 11.3.27 Priority
*/
/* Rest of element coded as the value part of the Priority IE defined in
* 3GPP TS 48.008, not including 3GPP TS 48.008 IEI and
* 3GPP TS 48.008 length indicator
*/
/*
* 11.3.28 QoS Profile
*/
@ -6228,19 +6372,38 @@ const value_string bssgp_peak_rate_gran_vals[] = {
{ 0x3, "100000 bits/s increments" },
{ 0, NULL }
};
static const value_string bssap_precedence_ul[] = {
{ 0, "High priority" },
{ 1, "Normal priority" },
{ 2, "Low priority" },
{ 0, NULL },
};
static const value_string bssap_precedence_dl[] = {
{ 0, "Radio priority 1" },
{ 1, "Radio priority 2" },
{ 2, "Radio priority 3" },
{ 3, "Radio priority 4" },
{ 4, "Radio priority unknown" },
{ 0, NULL },
};
static guint16
de_bssgp_qos_profile(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
proto_item *pi;
proto_item *pi, *pre_item;
guint32 curr_offset;
guint16 peak_bit_rate;
guint8 rate_gran;
guint8 rate_gran, precedence;
int link_dir;
curr_offset = offset;
/* octet 3-4 Peak bit rate provided by the network (note)
* NOTE: The bit rate 0 (zero) shall mean "best effort" in this IE.
*/
link_dir = gpinfo->link_dir;
peak_bit_rate = tvb_get_ntohs(tvb, curr_offset);
pi = proto_tree_add_text(tree, tvb, curr_offset, 1, "Peak bit rate: ");
if (peak_bit_rate == 0) {
@ -6283,18 +6446,25 @@ de_bssgp_qos_profile(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
proto_tree_add_item(tree, hf_bssgp_cr_bit, tvb, curr_offset, 1, ENC_NA);
proto_tree_add_item(tree, hf_bssgp_t_bit, tvb, curr_offset, 1, ENC_NA);
proto_tree_add_item(tree, hf_bssgp_a_bit, tvb, curr_offset, 1, ENC_NA);
proto_tree_add_item(tree, hf_bssgp_precedence, tvb, curr_offset, 1, ENC_NA);
precedence = tvb_get_guint8(tvb, curr_offset) & 0x7;
pre_item = proto_tree_add_item(tree, hf_bssgp_precedence, tvb, curr_offset, 1, ENC_NA);
if(link_dir == P2P_DIR_DL){
proto_item_append_text(pre_item, " %s", val_to_str_const((guint32)precedence, bssap_precedence_dl, "Radio Priority Unknown(Radio priority 3)"));
}else{
proto_item_append_text(pre_item, " %s", val_to_str_const((guint32)precedence, bssap_precedence_ul, "Priority Unknown(Low priority)"));
}
curr_offset++;
return(curr_offset-offset);
}
/*
* 11.3.29 Radio Cause
* 11.3.30 RA-Cap-UPD-Cause 135
* 11.3.31 Routeing Area 135
* 11.3.32 R_default_MS 135
* 11.3.33 Suspend Reference Number 136
* 11.3.34 Tag 136
* 11.3.30 RA-Cap-UPD-Cause
* 11.3.31 Routeing Area
* 11.3.32 R_default_MS
* 11.3.33 Suspend Reference Number
* 11.3.34 Tag
*/
/*
* 11.3.35 Temporary logical link Identity (TLLI)
@ -6307,16 +6477,75 @@ de_bssgp_qos_profile(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
* 11.3.38 Trace Type 137
* 11.3.39 Transaction Id 137
* 11.3.40 Trigger Id 137
* 11.3.41 Number of octets affected 137
* 11.3.42 Packet Flow Identifier (PFI) 138
* 11.3.42a (void) 138
* 11.3.43 Aggregate BSS QoS Profile 138
* 11.3.44 GPRS Timer 138
* 11.3.45 Feature Bitmap 139
* 11.3.46 Bucket Full Ratio 140
* 11.3.47 Service UTRAN CCO 140
* 11.3.48 NSEI (Network Service Entity Identifier) 141
* 11.3.49 RRLP APDU 141
* 11.3.41 Number of octets affected
*/
/*
* 11.3.42 Packet Flow Identifier (PFI)
*/
/* Rest of element coded as the value part of the Packet Flow
* Identifier information element in 3GPP TS 24.008, not including
* 3GPP TS 24.008 IEI
*/
/*
* 11.3.42a (void)
*/
/*
* 11.3.43 Aggregate BSS QoS Profile
*/
/*
* 11.3.44 GPRS Timer
*/
/*
* 11.3.45 Feature Bitmap
*/
/*
* 11.3.46 Bucket Full Ratio
*/
/*
* 11.3.47 Service UTRAN CCO
*/
static const value_string bssgp_service_utran_cco_vals[] = {
{ 0, "Network initiated cell change order procedure to UTRAN should be performed" },
{ 1, "Network initiated cell change order procedure to UTRAN should not be performed" },
{ 2, "Network initiated cell change order procedure to UTRAN shall not be performed" },
{ 3, " If received, shall be interpreted as no information available (bits 4-5 valid)" },
{ 0, NULL },
/* Otherwise "No information available" */
};
static const value_string bssgp_service_eutran_cco_vals[] = {
{ 0, "If received, shall be interpreted as no information available" },
{ 1, "Network initiated cell change order to E-UTRAN or PS handover to E-UTRAN procedure should be performed" },
{ 2, "Network initiated cell change order to E-UTRAN or PS handover to E-UTRAN procedure should not be performed" },
{ 3, "Network initiated cell change order to E-UTRAN or PS handover to E-UTRAN procedure shall not be performed" },
{ 0, NULL },
/* Otherwise "No information available" */
};
static guint16
de_bssgp_serv_utran_cco(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
curr_offset = offset;
/* Service EUTRAN CCO Value part */
proto_tree_add_item(tree, hf_bssgp_serv_eutran_cco, tvb, curr_offset, 1, ENC_NA);
/* Service UTRAN CCO Value part */
proto_tree_add_item(tree, hf_bssgp_serv_utran_cco, tvb, curr_offset, 1, ENC_NA);
curr_offset++;
return(curr_offset-offset);
}
/*
* 11.3.48 NSEI (Network Service Entity Identifier)
*/
/*
* 11.3.49 RRLP APDU
*/
/*
* 11.3.50 LCS QoS 141
* 11.3.51 LCS Client Type 142
* 11.3.52 Requested GPS Assistance Data 142
@ -6389,34 +6618,71 @@ de_bssgp_qos_profile(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
* 11.3.92 Time to MBMS Data Transfer 170
* 11.3.93 MBMS Session Repetition Number 171
* 11.3.94 Inter RAT Handover Info 171
* 11.3.95 PS Handover Command 171
* 11.3.95a PS Handover Indications 171
* 11.3.95b SI/PSI Container 172
* 11.3.95c Active PFCs List 173
* 11.3.96 Velocity Data 173
* 11.3.97 DTM Handover Command 173
* 11.3.98 CS Indication 174
* 11.3.99 Requested GANSS Assistance Data 174
* 11.3.100 GANSS Location Type 174
* 11.3.101 GANSS Positioning Data 174
* 11.3.102 Flow Control Granularity 175
* 11.3.103 eNB Identifier 175
* 11.3.104 E-UTRAN Inter RAT Handover Info 176
* 11.3.105 Subscriber Profile ID for RAT/Frequency priority 176
* 11.3.106 Request for Inter-RAT Handover Info 176
* 11.3.107 Reliable Inter-RAT Handover Info 177
* 11.3.108 SON Transfer Application Identity 177
* 11.3.109 CSG Identifier 177
* 11.3.110 Tracking Area Code 178
* 11.3.111 Redirect Attempt Flag 178
* 11.3.112 Redirection Indication 178
* 11.3.113 Redirection Completed 179
* 11.3.95 PS Handover Command
* 11.3.95a PS Handover Indications
* 11.3.95b SI/PSI Container
* 11.3.95c Active PFCs List
* 11.3.96 Velocity Data
* 11.3.97 DTM Handover Command
* 11.3.98 CS Indication
* 11.3.99 Requested GANSS Assistance Data
* 11.3.100 GANSS Location Type
* 11.3.101 GANSS Positioning Data
* 11.3.102 Flow Control Granularity
* 11.3.103 eNB Identifier
* 11.3.104 E-UTRAN Inter RAT Handover Info
*/
/*
* 11.3.105 Subscriber Profile ID for RAT/Frequency priority
*/
static guint16
de_bssgp_sub_prof_id_f_rat_freq_prio(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
guint8 value;
curr_offset = offset;
/* Octet 3 contains a number in binary representation ranging from 0 to 255.
* The Subscriber Profile ID for RAT/Frequency priority is given by
* the indicated value +1.
*/
value = tvb_get_guint8(tvb,curr_offset) + 1;
proto_tree_add_uint(tree, hf_bssgp_sub_prof_id_f_rat_freq_prio, tvb, curr_offset, 1, value);
curr_offset++;
return(curr_offset-offset);
}
/*
* 11.3.106 Request for Inter-RAT Handover Info
* 11.3.107 Reliable Inter-RAT Handover Info
* 11.3.108 SON Transfer Application Identity
* 11.3.109 CSG Identifier
* 11.3.110 Tracking Area Code
* 11.3.111 Redirect Attempt Flag
* 11.3.112 Redirection Indication
* 11.3.113 Redirection Completed
*/
const value_string bssgp_elem_strings[] = {
{ 0x00, "PDU Lifetime" }, /* 11.3.25 PDU Lifetime */
{ 0x00, "QoS Profile" }, /* 11.3.28 QoS Profile */
{ 0x00, "Alignment Octets" }, /* 11.3.1 Alignment octets */
{ 0x00, "Alignment Octets" }, /* 11.3.1 Alignment octets */
/* 11.3.2 Bmax default MS */
/* 11.3.3 BSS Area Indication */
/* 11.3.4 Bucket Leak Rate (R) */
/* 11.3.5 BVC Bucket Size */
/* 11.3.6 BVCI (BSSGP Virtual Connection Identifier) */
{ 0x00, "BVC Measurement" }, /* 11.3.7 BVC Measurement */
/* 11.3.8 Cause */
{ 0x00, "Cell Identifier" }, /* 111.3.9 Cell Identifier */
{ 0x00, "IMSI" }, /* 11.3.14 IMSI */
{ 0x00, "LLC-PDU" }, /* 11.3.15 LLC-PDU */
{ 0x00, "PDU Lifetime" }, /* 11.3.25 PDU Lifetime */
{ 0x00, "QoS Profile" }, /* 11.3.28 QoS Profile */
{ 0x00, "Service UTRAN CCO" }, /* 11.3.47 Service UTRAN CCO */
{ 0x00, "Subscriber Profile ID for RAT/Frequency priority" }, /* 11.3.105 Subscriber Profile ID for RAT/Frequency priority */
{ 0, NULL }
};
@ -6425,18 +6691,29 @@ gint ett_bssgp_elem[NUM_BSSGP_ELEM];
typedef enum
{
DE_BSSGP_ALIGNMENT_OCTETS, /* 11.3.1 Alignment octets */
DE_BSSGP_BVC_MEAS, /* 11.3.7 BVC Measurement */
DE_BSSGP_CELL_ID, /* 11.3.9 Cell Identifier */
DE_BSSGP_IMSI, /* 11.3.14 IMSI */
DE_BSSGP_LLC_PDU, /* 11.3.15 LLC-PDU */
DE_BSSGP_PDU_LIFETIME, /* 11.3.25 PDU Lifetime */
DE_BSSGP_QOS_PROFILE, /* 11.3.28 QoS Profile */
DE_BSSGP_ALIGNMENT_OCTETS, /* 11.3.1 Alignment octets */
DE_BSSGP_COMMON_NONE /* NONE */
DE_BSSGP_SERV_UTRAN_CCO, /* 11.3.47 Service UTRAN CCO */
DE_BSSGP_SUB_PROF_ID_F_RAT_FRQ_PRIO, /* 11.3.105 Subscriber Profile ID for RAT/Frequency priority */
DE_BSSGP_NONE /* NONE */
}
bssgp_elem_idx_t;
guint16 (*bssgp_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len) = {
de_bssgp_aligment_octets, /* 11.3.1 Alignment octets */
de_bssgp_bvc_meas, /* 11.3.7 BVC Measurement */
de_bssgp_cell_id, /* 11.3.9 Cell Identifier */
de_mid, /* 11.3.14 IMSI */
de_bssgp_llc_pdu, /* 11.3.15 LLC-PDU */
de_bssgp_pdu_lifetime, /* 11.3.25 PDU Lifetime */
de_bssgp_qos_profile, /* 11.3.28 QoS Profile */
NULL, /* 11.3.35 Temporary logical link Identity (TLLI) TS 44.018 */
NULL, /* 11.3.1 Alignment octets */
de_bssgp_serv_utran_cco, /* 11.3.47 Service UTRAN CCO */
de_bssgp_sub_prof_id_f_rat_freq_prio, /* 11.3.105 Subscriber Profile ID for RAT/Frequency priority */
NULL, /* NONE */
};
@ -6466,52 +6743,93 @@ bssap_dl_unitdata(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
/* PDU Lifetime PDU Lifetime/11.3.25 M TLV 4 */
ELEM_MAND_TELV(0x16, BSSGP_PDU_TYPE, DE_BSSGP_PDU_LIFETIME, NULL);
/* MS Radio Access Capability (note 2) */
/* MS Radio Access Capability/11.3.22 O TLV 7-? */
/* MS Radio Access Capability (note 2) MS Radio Access Capability/11.3.22 O TLV 7-? */
ELEM_OPT_TELV(0x13, GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP , NULL);
/* Priority (note 3) Priority/11.3.27 O TLV 3 */
ELEM_OPT_TELV(0x0b, GSM_A_PDU_TYPE_BSSMAP, BE_PRIO, NULL);
/* DRX Parameters DRX Parameters/11.3.11 O TLV 4 */
ELEM_OPT_TELV(0x0a , GSM_A_PDU_TYPE_GM, DE_DRX_PARAM , NULL);
/* IMSI IMSI/11.3.14 O TLV 5-10 */
ELEM_OPT_TELV(0x0d, BSSGP_PDU_TYPE, DE_BSSGP_IMSI , NULL);
/* TLLI (old) TLLI/11.3.35 O TLV 6 */
ELEM_OPT_TELV(0x1f, GSM_A_PDU_TYPE_RR, DE_RR_TLLI , " - old");
/* PFI PFI/11.3.42 O TLV 3 */
ELEM_OPT_TELV( 0x28 , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID , NULL);
/* LSA Information LSA Information/11.3.19 O TLV 7-? */
ELEM_OPT_TELV(0x27, GSM_A_PDU_TYPE_BSSMAP, BE_LSA_INFO, NULL);
/* Service UTRAN CCO Service UTRAN CCO/11.3.47 O TLV 3 */
ELEM_OPT_TELV(0x3d, BSSGP_PDU_TYPE, DE_BSSGP_SERV_UTRAN_CCO, NULL);
/* Subscriber Profile ID for RAT/Frequency priority (note 5)
* Subscriber Profile ID for RAT/Frequency priority/11.3.105 O TLV 3
*/
ELEM_OPT_TELV(0x81, BSSGP_PDU_TYPE, DE_BSSGP_SUB_PROF_ID_F_RAT_FRQ_PRIO, NULL);
/* Alignment octets Alignment octets/11.3.1 O TLV 2-5 */
ELEM_OPT_TELV(0x00, BSSGP_PDU_TYPE, DE_BSSGP_ALIGNMENT_OCTETS, NULL);
/* LLC-PDU (note 4) LLC-PDU/11.3.15 M TLV 2-? */
ELEM_OPT_TELV(0x0e, BSSGP_PDU_TYPE, DE_BSSGP_LLC_PDU, NULL);
/* Remove me */
consumed = len;
EXTRANEOUS_DATA_CHECK(curr_len, 0);
EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, gpinfo);
}
/*
* 10.2.2 UL-UNITDATA 94
* 10.2.3 RA-CAPABILITY 95
* 10.2.4 (void) 95
* 10.2.5 DL-MBMS-UNITDATA 95
* 10.2.6 UL-MBMS-UNITDATA 96
* 10.3 PDU functional definitions and contents at GMM SAP 96
* 10.3.1 PAGING PS 96
* 10.3.2 PAGING CS 97
* 10.3.3 RA-CAPABILITY-UPDATE 97
* 10.3.4 RA-CAPABILITY-UPDATE-ACK 98
* 10.3.5 RADIO-STATUS 98
* 10.3.6 SUSPEND 98
* 10.3.7 SUSPEND-ACK 99
* 10.3.8 SUSPEND-NACK 99
* 10.3.9 RESUME 99
* 10.3.10 RESUME-ACK 100
* 10.3.11 RESUME-NACK 100
* 10.4 PDU functional definitions and contents at NM SAP 100
* 10.4.1 FLUSH-LL 100
* 10.4.2 FLUSH-LL-ACK 101
* 10.4.3 LLC-DISCARDED 101
* 10.4.4 FLOW-CONTROL-BVC 102
* 10.4.5 FLOW-CONTROL-BVC-ACK 102
* 10.4.6 FLOW-CONTROL-MS 102
* 10.4.7 FLOW-CONTROL-MS-ACK 103
* 10.2.2 UL-UNITDATA
*/
static void
bssap_ul_unitdata(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
{
guint32 curr_offset;
guint32 consumed;
guint curr_len;
curr_offset = offset;
curr_len = len;
/* This PDU transfers an MS's LLC-PDU and its associated radio interface information across the Gb-interface.
* Direction: BSS to SGSN
*/
gpinfo->link_dir = P2P_DIR_UL;
/* TLLI TLLI/11.3.35 M V 4 */
ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TLLI);
/* QoS Profile QoS Profile/11.3.28 M V 3 */
ELEM_MAND_V(BSSGP_PDU_TYPE, DE_BSSGP_QOS_PROFILE);
/* Cell Identifier Cell Identifier/11.3.9 M TLV 10 */
ELEM_OPT_TELV(0x08, BSSGP_PDU_TYPE, DE_BSSGP_CELL_ID , NULL);
/* PFI PFI/11.3.42 O TLV 3 */
ELEM_OPT_TELV(0x28 , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID , NULL);
/* LSA Identifier List LSA Identifier List/11.3.18 O TLV 3-? */
ELEM_OPT_TLV(0x26, GSM_A_PDU_TYPE_BSSMAP, BE_LSA_ID_LIST, NULL);
/* Alignment octets Alignment octets/11.3.1 O TLV 2-5 */
ELEM_OPT_TELV(0x00, BSSGP_PDU_TYPE, DE_BSSGP_ALIGNMENT_OCTETS, NULL);
/* LLC-PDU (note) LLC-PDU/11.3.15 M TLV 2-? */
ELEM_OPT_TELV(0x0e, BSSGP_PDU_TYPE, DE_BSSGP_LLC_PDU, NULL);
EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, gpinfo);
}
/*
* 10.2.3 RA-CAPABILITY
* 10.2.4 (void)
* 10.2.5 DL-MBMS-UNITDATA
* 10.2.6 UL-MBMS-UNITDATA
* 10.3 PDU functional definitions and contents at GMM SAP
* 10.3.1 PAGING PS
* 10.3.2 PAGING CS
* 10.3.3 RA-CAPABILITY-UPDATE
* 10.3.4 RA-CAPABILITY-UPDATE-ACK
* 10.3.5 RADIO-STATUS
* 10.3.6 SUSPEND
* 10.3.7 SUSPEND-ACK
* 10.3.8 SUSPEND-NACK
* 10.3.9 RESUME
* 10.3.10 RESUME-ACK
* 10.3.11 RESUME-NACK
* 10.4 PDU functional definitions and contents at NM SAP
* 10.4.1 FLUSH-LL
* 10.4.2 FLUSH-LL-ACK
* 10.4.3 LLC-DISCARDED
* 10.4.4 FLOW-CONTROL-BVC
* 10.4.5 FLOW-CONTROL-BVC-ACK
* 10.4.6 FLOW-CONTROL-MS
* 10.4.7 FLOW-CONTROL-MS-ACK
* 10.4.8 BVC-BLOCK 103
* 10.4.9 BVC-BLOCK-ACK 103
* 10.4.10 BVC-UNBLOCK 103
@ -6564,13 +6882,15 @@ bssap_dl_unitdata(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
static const value_string bssgp_msg_strings[] = {
/* 0x00 */ { BSSGP_PDU_DL_UNITDATA, "DL-UNITDATA" }, /* 10.2.1 DL-UNITDATA */
/* 0x01 */ { BSSGP_PDU_UL_UNITDATA, "UL-UNITDATA" }, /* 10.2.2 UL-UNITDATA */
{ 0, NULL }
};
#define NUM_BSSGP_MSG (sizeof(bssgp_msg_strings)/sizeof(value_string))
static gint ett_bssgp_msg[NUM_BSSGP_MSG];
static void (*bssgp_msg_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
bssap_dl_unitdata, /* UNITDATA */
bssap_dl_unitdata, /* 10.2.1 DL-UNITDATA */
bssap_ul_unitdata, /* 10.2.2 UL-UNITDATA */
NULL, /* NONE */
};
@ -6594,11 +6914,6 @@ dissect_bssgp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_item *ti;
proto_tree *bssgp_tree;
/* RAB */
#if 0 /* previously commented out by C++ style comment */
proto_item *item;
proto_tree *bssgp_tree;
#endif
int offset = 0;
guint32 len;
const gchar *msg_str = NULL;
@ -6609,9 +6924,9 @@ dissect_bssgp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
/* Save pinfo */
gpinfo = pinfo;
parent_tree = tree;
len = tvb_length(tvb);
/* end */
bi.tvb = tvb;
bi.pinfo = pinfo;
@ -6630,37 +6945,42 @@ dissect_bssgp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if (tree) {
ti = proto_tree_add_item(tree, proto_bssgp, tvb, 0, -1, ENC_NA);
bssgp_tree = proto_item_add_subtree(ti, ett_bssgp);
proto_tree_add_item(bssgp_tree, hf_bssgp_msg_type, tvb, 0, 1, ENC_NA);
/* Messge type IE*/
msg_fcn = NULL;
ett_tree = -1;
hf_idx = -1;
msg_str = NULL;
get_bssgp_msg_params(oct, &msg_str, &ett_tree, &hf_idx, &msg_fcn);
bi.bssgp_tree = bssgp_tree;
}
/* Messge type IE*/
msg_fcn = NULL;
ett_tree = -1;
hf_idx = -1;
msg_str = NULL;
get_bssgp_msg_params(oct, &msg_str, &ett_tree, &hf_idx, &msg_fcn);
col_add_str(pinfo->cinfo, COL_INFO, val_to_str(bi.pdutype,
tab_bssgp_pdu_types,
"Unknown PDU type"));
decode_pdu(&bi);
/* Experimental new dissection code */
if(oct<1){
proto_tree_add_text(tree, tvb, offset, -1, "BSSGP New dissection");
/* PDU's with msg no lover than this value are converted to common dissection style */
if(oct>2){
proto_tree_add_item(bssgp_tree, hf_bssgp_msg_type, tvb, 0, 1, ENC_NA);
decode_pdu(&bi);
}else{
/* New dissection code, aligning the dissector with the other GSM/UMTS/LTE dissectors
* to make it possible to share IE dissection as IE's are shared between specs.
* old code is keept untill transition is complete.
*/
if(msg_str){
col_add_fstr(pinfo->cinfo, COL_INFO, "%s", msg_str);
}else{
proto_tree_add_text(tree, tvb, offset, 1,"Unknown message 0x%x",oct);
proto_tree_add_text(bssgp_tree, tvb, offset, 1,"Unknown message 0x%x",oct);
return;
}
/*
* Add SGSAP message name
* Add BSSGP message name
*/
proto_tree_add_item(tree, hf_idx, tvb, offset, 1, FALSE);
proto_tree_add_item(bssgp_tree, hf_idx, tvb, offset, 1, FALSE);
offset++;
@ -6669,13 +6989,13 @@ dissect_bssgp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
*/
if (msg_fcn == NULL)
{
proto_tree_add_text(tree, tvb, offset, len - offset, "Message Elements");
proto_tree_add_text(bssgp_tree, tvb, offset, len - offset, "Message Elements");
}
else
{
/* If calling any "gsm" ie dissectors needing pinfo */
gsm_a_dtap_pinfo = pinfo;
(*msg_fcn)(tvb, tree, offset, len - offset);
(*msg_fcn)(tvb, bssgp_tree, offset, len - offset);
}
}/*End new dissection */
@ -6832,11 +7152,26 @@ proto_register_bssgp(void)
{ "Precedence", "bssgp.a_bit",
FT_UINT8, BASE_DEC, NULL, 0x07,
NULL, HFILL }
},
{ &hf_bssgp_serv_utran_cco,
{ "Service UTRAN CCO", "bssgp.serv_utran_cco",
FT_UINT8, BASE_DEC, VALS(bssgp_service_utran_cco_vals), 0x07,
NULL, HFILL }
},
{ &hf_bssgp_serv_eutran_cco,
{ "Service EUTRAN CCO", "bssgp.serv_eutran_cco",
FT_UINT8, BASE_DEC, VALS(bssgp_service_eutran_cco_vals), 0x18,
NULL, HFILL }
},
{ &hf_bssgp_sub_prof_id_f_rat_freq_prio,
{ "Subscriber Profile ID for RAT/Frequency priority", "bssgp.sub_prof_id_f_rat_freq_prio",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
};
/* Setup protocol subtree array */
#define NUM_INDIVIDUAL_ELEMS 44
#define NUM_INDIVIDUAL_ELEMS 45
gint *ett[NUM_INDIVIDUAL_ELEMS +
NUM_BSSGP_ELEM +
NUM_BSSGP_MSG];
@ -6884,6 +7219,7 @@ proto_register_bssgp(void)
ett[41] = &ett_bssgp_msrac_multislot_capability;
ett[42] = &ett_bssgp_tlli;
ett[43] = &ett_bssgp_tmsi_ptmsi;
ett[44] = &ett_bssgp_new;
last_offset = NUM_INDIVIDUAL_ELEMS;