gsm_a: Export needed functions

bssap: Dissect most of the IE:s

svn path=/trunk/; revision=17143
This commit is contained in:
Anders Broman 2006-02-02 15:16:51 +00:00
parent b63bc8410a
commit e77ec7864f
3 changed files with 346 additions and 77 deletions

View File

@ -53,6 +53,7 @@
#include <epan/prefs.h>
#include "packet-bssap.h"
#include "packet-gsm_a.h"
#include "packet-e212.h"
#define BSSAP 0
#define BSAP 1
@ -281,6 +282,7 @@ static int hf_bssap_extension = -1;
static int hf_bssap_type_of_number = -1;
static int hf_bssap_numbering_plan_id = -1;
static int hf_bssap_sgsn_number = -1;
static int hf_bssap_call_priority = -1;
static int hf_bssap_gprs_loc_upd_type_ie = -1;
static int hf_bssap_Gs_cause_ie = -1;
static int hf_bssap_imei_ie = -1;
@ -292,6 +294,22 @@ static int hf_bssap_ulink_tnl_pld_cntrl_amd_inf_ie = -1;
static int hf_bssap_emlpp_prio_ie = -1;
static int hf_bssap_gprs_erroneous_msg_ie = -1;
static int hf_bssap_gprs_loc_upd_type = -1;
static int hf_bssap_Gs_cause = -1;
static int hf_bssap_imsi_det_from_gprs_serv_type = -1;
static int hf_bssap_info_req = -1;
static int hf_bssap_loc_inf_age = -1;
static int hf_bssap_mobile_station_state = -1;
static int hf_bssap_ptmsi = -1;
static int hf_bssap_tmsi = -1;
static int hf_bssap_tmsi_status = -1;
static int hf_bssap_tom_prot_disc = -1;
static int hf_bssap_e_bit = -1;
static int hf_bssap_tunnel_prio = -1;
static int hf_bssap_global_cn_id = -1;
static int hf_bssap_plmn_id = -1;
static int hf_bssap_cn_id = -1;
static int hf_bssap_cell_global_id = -1;
/* Initialize the subtree pointers */
static gint ett_bssap = -1;
@ -314,6 +332,7 @@ static gint ett_bassp_Gs_cause = -1;
static gint ett_bassp_imei = -1;
static gint ett_bassp_imesiv = -1;
static gint ett_bssap_cell_global_id = -1;
static gint ett_bssap_cgi = -1;
static gint ett_bssap_channel_needed = -1;
static gint ett_bssap_dlink_tnl_pld_cntrl_amd_inf = -1;
static gint ett_bssap_ulink_tnl_pld_cntrl_amd_inf = -1;
@ -324,6 +343,8 @@ static gint ett_bssap_mobile_station_state = -1;
static gint ett_bssap_ptmsi = -1;
static gint ett_bssap_reject_cause = -1;
static gint ett_bssap_service_area_id =-1;
static gint ett_bssap_global_cn_id = -1;
static gint ett_bssap_plmn = -1;
static dissector_handle_t data_handle;
@ -597,6 +618,8 @@ dissect_bssap_cell_global_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
{
proto_item *item = NULL;
proto_tree *ie_tree = NULL;
proto_item *cgi_item = NULL;
proto_tree *cgi_tree = NULL;
guint8 ie_len;
ie_len = tvb_get_guint8(tvb,offset+1);
@ -612,10 +635,22 @@ dissect_bssap_cell_global_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
* of the cell global id IE defined in 3GPP TS 48.018 (not including
* 3GPP TS 48.018 IEI and 3GPP TS 48.018 length indicator).
*/
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
cgi_item= proto_tree_add_item(ie_tree, hf_bssap_cell_global_id, tvb, offset, ie_len, FALSE);
cgi_tree = proto_item_add_subtree(cgi_item, ett_bssap_cgi);
/* 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
*/
de_gmm_rai(tvb, cgi_tree, offset, ie_len, NULL, 0);
/* 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
*/
offset = offset + 6;
de_cell_id(tvb, cgi_tree, offset, ie_len, NULL, 0);
offset = offset + 2;
return offset + ie_len;
return offset;
}
/* 18.4.2 Channel needed */
@ -637,6 +672,7 @@ dissect_bssap_channel_needed(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
/*
* The rest of the information element is coded as the IEI part and the
* value part of the Channel Needed IE defined in 3GPP TS 44.018.
* 10.5.2.8 Channel Needed
*/
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
@ -677,6 +713,18 @@ dissect_bssap_dlink_tunnel_paylod_control_and_info(tvbuff_t *tvb, packet_info *p
}
/* 18.4.4 eMLPP Priority */
/* Call priority */
static const value_string bssap_call_priority_values[] = {
{ 0x00, "No priority applied" },
{ 0x01, "Call priority level 4" },
{ 0x02, "Call priority level 3" },
{ 0x03, "Call priority level 2" },
{ 0x04, "Call priority level 1" },
{ 0x05, "Call priority level 0" },
{ 0x06, "Call priority level B" },
{ 0x07, "Call priority level A" },
{ 0, NULL }
};
static int
dissect_bssap_emlpp_priority(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
{
@ -695,9 +743,12 @@ dissect_bssap_emlpp_priority(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
/* The rest of the information element is coded as the value part of
the eMLPP-Priority IE defined in 3GPP TS 48.008 (not including
3GPP TS 48.008 IEI and 3GPP TS 48.008 length indicator).
3.2.2.56 eMLPP Priority
The call priority field (bit 3 to 1 of octet 2) is coded in the same way
as the call priority field (bit 3 to 1 of octet 5) in the Descriptive group
or broadcast call reference information element as defined in 3GPP TS 24.008.
*/
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
proto_tree_add_item(ie_tree, hf_bssap_call_priority, tvb, offset, ie_len, FALSE);
return offset + ie_len;
@ -720,9 +771,9 @@ dissect_bssap_gprs_erroneous_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
/* GPRS location update type value (octet 3) */
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
/* Erroneous message including the message type. */
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
return offset + ie_len;
@ -751,14 +802,35 @@ dissect_bssap_gprs_location_update_type(tvbuff_t *tvb, packet_info *pinfo, proto
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
/* GPRS location update type value (octet 3) */
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
proto_tree_add_item(ie_tree, hf_bssap_gprs_loc_upd_type, tvb, offset, ie_len, FALSE);
return offset + ie_len;
}
/* Gs Cause value (octet 3) */
static const value_string bssap_Gs_cause_values[] = {
{ 0x00, "Normal, unspecified in this version of the protocol." },
{ 0x01, "IMSI detached for GPRS services" },
{ 0x02, "IMSI detached for GPRS and non-GPRS services" },
{ 0x03, "IMSI unknown" },
{ 0x04, "IMSI detached for non-GPRS services" },
{ 0x05, "IMSI implicitly detached for non-GPRS services" },
{ 0x06, "MS unreachable" },
{ 0x07, "Message not compatible with the protocol state" },
{ 0x08, "Missing mandatory information element" },
{ 0x09, "Invalid mandatory information" },
{ 0x0a, "Conditional IE error" },
{ 0x0b, "Semantically incorrect message" },
{ 0x0c, "Message unknown" },
{ 0x0d, "Address error" },
{ 0x0e, "TOM functionality not supported" },
{ 0x0f, "Ciphering request cannot be accommodated" },
{ 0, NULL }
};
/* 18.4.7 Gs cause */
static int
dissect_bssap_Gs_cause(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
@ -776,7 +848,7 @@ dissect_bssap_Gs_cause(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
/* Gs Cause value (octet 3) */
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
proto_tree_add_item(ie_tree, hf_bssap_Gs_cause, tvb, offset, ie_len, FALSE);
return offset + ie_len;
@ -798,6 +870,9 @@ dissect_bssap_imei(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offs
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
/* The IMEI is coded as a sequence of BCD digits, compressed two into each octet.
* The IMEI consists of 15 digits (see 3GPP TS 23.003).
*/
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
@ -820,9 +895,11 @@ dissect_bssap_imesiv(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int of
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
/* The IMEISV is coded as a sequence of BCD digits, compressed two into each octet.
* The IMEISV consists of 16 digits (see 3GPP TS 23.003).
*/
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
return offset + ie_len;
}
@ -854,6 +931,13 @@ dissect_bssap_imsi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offs
return offset + ie_len;
}
static const value_string bssap_imsi_det_from_gprs_serv_type_values[] = {
{ 0x00, "Interpreted as reserved in this version of the protocol" },
{ 0x01, "Network initiated IMSI detach from GPRS service" },
{ 0x02, "MS initiated IMSI detach from GPRS service" },
{ 0x03, "GPRS services not allowed" },
{ 0, NULL }
};
/* 18.4.11 IMSI detach from GPRS service type */
static int
@ -871,7 +955,8 @@ dissect_bssap_imsi_det_from_gprs_serv_type(tvbuff_t *tvb, packet_info *pinfo, pr
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
/* IMSI detach from GPRS service type value (octet 3)*/
proto_tree_add_item(ie_tree, hf_bssap_imsi_det_from_gprs_serv_type, tvb, offset, ie_len, FALSE);
return offset + ie_len;
@ -899,7 +984,19 @@ dissect_bssap_imsi_det_from_non_gprs_serv_type(tvbuff_t *tvb, packet_info *pinfo
return offset + ie_len;
}
static const value_string bssap_info_req_values[] = {
{ 0x00, "Interpreted as Not supported in this version of the protocol." },
{ 0x01, "PTMSI" },
{ 0x02, "IMEI" },
{ 0x03, "IMEISV" },
{ 0x04, "PTMSI and IMEI" },
{ 0x05, "PTMSI and IMEISV" },
{ 0x06, "IMEI and IMEISV" },
{ 0x07, "PTMSI, IMEI, and IMEISV" },
{ 0x08, "Mobile location information" },
{ 0x09, "TMSI" },
{ 0, NULL }
};
/* 18.4.13 Information requested */
static int
dissect_bssap_info_req(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
@ -916,7 +1013,8 @@ dissect_bssap_info_req(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
/*Information requested value (octet 3) */
proto_tree_add_item(ie_tree, hf_bssap_info_req, tvb, offset, ie_len, FALSE);
return offset + ie_len;
@ -938,8 +1036,12 @@ dissect_bssap_loc_area_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, i
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
/* The rest of the information element is coded as the value part of
* the location area identifier IE defined in 3GPP TS 48.018 (not
* including 3GPP TS 48.018 IEI and 3GPP TS 48.018 length
* indicator).
*/
de_lai(tvb, ie_tree, offset, ie_len, NULL, 0);
return offset + ie_len;
@ -960,7 +1062,18 @@ dissect_bssap_loaction_information_age(tvbuff_t *tvb, packet_info *pinfo, proto_
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
/* The rest of the IE is coded as the value part of the
* AgeOfLocationInformation as specified in 3GPP TS 29.002.:
* AgeOfLocationInformation ::= INTEGER (0..32767)
* -- the value represents the elapsed time in minutes since the last
* -- network contact of the mobile station (i.e. the actuality of the
* -- location information).
* -- value '0' indicates that the MS is currently in contact with the
* -- network
* -- value '32767' indicates that the location information is at least
* -- 32767 minutes old
*/
proto_tree_add_item(ie_tree, hf_bssap_loc_inf_age, tvb, offset, ie_len, FALSE);
return offset + ie_len;
@ -982,8 +1095,14 @@ dissect_bssap_MM_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
/* User information: This field is composed of one or more of the
* information elements of the MM information message as defined
* 3GPP TS 24.008, excluding the Protocol discriminator, Skip
* indicator and Message type. This field includes the IEI and length
* indicatior of the other information elements.
*/
dtap_mm_mm_info(tvb, ie_tree, offset, ie_len);
return offset + ie_len;
@ -994,7 +1113,7 @@ dissect_bssap_mobile_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int
{
proto_item *item = NULL;
proto_tree *ie_tree = NULL;
guint8 ie_len;
guint ie_len;
ie_len = tvb_get_guint8(tvb,offset+1);
item = proto_tree_add_item(tree, hf_bssap_mobile_id_ie, tvb, offset, ie_len+2, FALSE);
@ -1004,7 +1123,11 @@ dissect_bssap_mobile_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
/* The rest of the information element is coded as the value part of
* the mobile identity IE defined in 3GPP TS 24.008 (not including
* 3GPP TS 24.008 IEI and 3GPP TS 24.008 length indicator).
*/
de_mid(tvb, ie_tree, offset, ie_len, NULL, 0);
return offset + ie_len;
@ -1026,13 +1149,28 @@ dissect_bssap_mobile_stn_cls_mrk1(tvbuff_t *tvb, packet_info *pinfo, proto_tree
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
/* The rest of the information element is coded as the value part of
* the mobile station classmark 1 IE defined in 3GPP TS 24.008 (not
* including 3GPP TS 24.008 IEI)
*/
de_ms_cm_1(tvb, ie_tree, offset, ie_len, NULL, 0);
return offset + ie_len;
}
/* 18.4.19 Mobile station state */
static const value_string bssap_mobile_station_state_values[] = {
{ 0x00, "IDLE or PMM-DETACHED" },
{ 0x01, "STANDBY or PMM-IDLE, 0 PDP contexts active" },
{ 0x02, "STANDBY or PMM-IDLE, 1 or more PDP contexts active" },
{ 0x03, "SUSPENDED, 0 PDP contexts active" },
{ 0x04, "SUSPENDED, 1 or more PDP contexts active" },
{ 0x05, "READY or PMM-CONNECTED, 0 PDP contexts active" },
{ 0x06, "READY or PMM-CONNECTED, 1 or more PDP contexts active" },
{ 0x07, "IMSI unknown" },
{ 0x08, "Information requested not supported" },
{ 0, NULL }
};
static int
dissect_bssap_mobile_station_state(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
{
@ -1048,7 +1186,8 @@ dissect_bssap_mobile_station_state(tvbuff_t *tvb, packet_info *pinfo, proto_tree
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
/* Mobile station state value (octet 3) */
proto_tree_add_item(ie_tree, hf_bssap_mobile_station_state, tvb, offset, ie_len, FALSE);
return offset + ie_len;
@ -1069,7 +1208,10 @@ dissect_bssap_ptmsi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int off
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
/* The PTMSI consists of 4 octets. It can be coded using a full hexadecimal representation
* (see 3GPP TS 23.003).
*/
proto_tree_add_item(ie_tree, hf_bssap_ptmsi, tvb, offset, ie_len, FALSE);
return offset + ie_len;
@ -1090,7 +1232,11 @@ dissect_bssap_reject_cause(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
/* The rest of the information element is coded as the value part of
* the reject cause IE defined in 3GPP TS 24.008, not including
* 3GPP TS 24.008 IEI.
*/
de_rej_cause(tvb, ie_tree, offset, ie_len, NULL, 0);
return offset + ie_len;
@ -1112,6 +1258,10 @@ dissect_bssap_service_area_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
/* The rest of the information element is coded as the the value part
* of the SAI IE defined in 3GPP TS 25.413 (not including
* 3GPP TS 25.413 IEI and 3GPP TS 25.413 length indicator).
*/
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
@ -1120,6 +1270,7 @@ dissect_bssap_service_area_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre
}
/* 18.4.22 SGSN number */
static const true_false_string bssap_extension_value = {
"No Extension",
"Extension"
@ -1168,7 +1319,10 @@ dissect_bssap_tmsi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offs
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
/* The TMSI consists of 4 octets. It can be coded using a full hexadecimal representation
* (see 3GPP TS 23.003).
*/
proto_tree_add_item(ie_tree, hf_bssap_tmsi, tvb, offset, ie_len, FALSE);
return offset + ie_len;
@ -1176,6 +1330,10 @@ dissect_bssap_tmsi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offs
}
/* 18.4.24 TMSI status */
static const true_false_string bssap_tmsi_flag = {
"Valid TMSI available",
"No valid TMSI available"
};
static int
dissect_bssap_tmsi_status(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
{
@ -1191,14 +1349,26 @@ dissect_bssap_tmsi_status(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, i
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
/* TMSI flag (octet 3) */
proto_tree_add_item(ie_tree, hf_bssap_tmsi_status, tvb, offset, ie_len, FALSE);
return offset + ie_len;
}
/* 18.4.25 Uplink Tunnel Payload Control and Info */
static const true_false_string bssap_E_flag = {
"SGSN received the payload in ciphered",
"SGSN did not receive the payload in ciphered form"
};
/* 3GPP TS 44.064 B.1.1 TOM Protocol Discriminator */
static const value_string bssap_tom_prot_disc_values[] = {
{ 0x00, "Not specified" },
{ 0x01, "TIA/EIA-136" },
{ 0x02, "RRLP" },
{ 0x03, "Reserved for extension" },
{ 0, NULL }
};
static int
dissect_bssap_ulink_tunnel_paylod_control_and_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
{
@ -1214,9 +1384,23 @@ dissect_bssap_ulink_tunnel_paylod_control_and_info(tvbuff_t *tvb, packet_info *p
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
/* octet 3 bit 8 Spare */
/* octet 3 bit 7 - 4
* TOM Protocol Discriminator: Identifies the protocol using tunnelling of non-GSM signalling.
* For coding, see 3GPP TS 44.064.
*/
proto_tree_add_item(ie_tree, hf_bssap_tom_prot_disc, tvb, offset, 1, FALSE);
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
/* octet 3 bit 3 E: Cipher Request. When set to 1 indicates that the SGSN received the payload in ciphered form,
* when set to 0 indicates that the SGSN did not receive the payload in ciphered form.
*/
proto_tree_add_item(ie_tree, hf_bssap_e_bit, tvb, offset, 1, FALSE);
/* octet 3 bit 2 - 1
* Tunnel Priority: Indicates the priority of the Tunnel Payload. For coding, see Table 20.1: Association
* between Tunnel Priority and LLC SAPs.
*/
proto_tree_add_item(ie_tree, hf_bssap_tunnel_prio, tvb, offset, 1, FALSE);
return offset + ie_len;
@ -1238,7 +1422,13 @@ dissect_bssap_vlr_number(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, in
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
/* The VLR number is coded as a sequence of TBCD digits (as specified in 3GPP TS 29.002),
* compressed two into each octet. The Number is in international E.164 format as indicated by Octet 3
* which coding is specified in 3GPP TS 29.002. This is a variable length information element,
* and includes a length indicator. The value part of the VLR number information element
* (not including IEI, length indicator and Octet 3), shall not exceed 15 digits.
*/
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
return offset + ie_len;
@ -1250,6 +1440,10 @@ dissect_bssap_global_cn_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
{
proto_item *item = NULL;
proto_tree *ie_tree = NULL;
proto_item *plmn_item = NULL;
proto_tree *plmn_tree = NULL;
proto_item *global_cn_id_item = NULL;
proto_tree *global_cn_id_tree = NULL;
guint8 ie_len;
ie_len = tvb_get_guint8(tvb,offset+1);
@ -1260,10 +1454,28 @@ dissect_bssap_global_cn_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_len, tvb, offset, 1, FALSE);
offset++;
proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
/* The Global CN-Id consists of a PLMN-Id and a CN-Id, see 3GPP TS 23.003.
* The PLMN-Id consists of MCC and MNC coded according to Location Area Identification
* in 3GPP TS 24.008. The CN-Id is an integer defined by O&M.
* The least significant bit of the CN-Id field is bit 1 of octet 7 and
* the most significant bit is bit 8 of octet 6. If the CN-Id does not fill the field reserved for it,
* the rest of the bits are set to '0'.
*/
global_cn_id_item = proto_tree_add_item(ie_tree, hf_bssap_global_cn_id, tvb, offset, ie_len, FALSE);
global_cn_id_tree = proto_item_add_subtree(global_cn_id_item, ett_bssap_global_cn_id);
/* Octet 3 - 5 PLMN-Id Coded as octets 2 to 4 of the Location Area Identification IE,
* defined in 3GPP TS 24.008 (not including 3GPP TS 24.008 IEI and LAC).
*/
plmn_item = proto_tree_add_item(global_cn_id_tree, hf_bssap_plmn_id, tvb, offset, 3, FALSE);
plmn_tree = proto_item_add_subtree(plmn_item, ett_bssap_plmn);
dissect_e212_mcc_mnc(tvb, plmn_tree, offset);
offset = offset + 3;
/* Octet 6 - 7 CN-Id (INTEGER 0..4095) */
proto_tree_add_item(global_cn_id_tree, hf_bssap_cn_id, tvb, offset, 2, FALSE);
offset = offset+2;
return offset + ie_len;
return offset;
}
@ -1337,8 +1549,6 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
if (tvb_length_remaining(tvb,offset) == 0)
return;
if (tvb_length_remaining(tvb,offset) == 0)
return;
proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data");
break;
case BSSAP_PAGING_REJECT: /* 17.1.18 */
@ -1780,14 +1990,8 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
default:
break;
}
}
static gboolean
dissect_bssap_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
@ -2006,8 +2210,75 @@ proto_register_bssap(void)
FT_BYTES, BASE_NONE, NULL, 0,
"IE Data", HFILL }},
};
{ &hf_bssap_call_priority,
{ "eMLPP Priority", "bssap.gprs_loc_upd_type",
FT_UINT8, BASE_DEC, VALS(bssap_call_priority_values), 0x07,
"eMLPP Priority", HFILL}},
{ &hf_bssap_gprs_loc_upd_type,
{ "GPRS location update type", "bssap.gprs_loc_upd_type",
FT_UINT8, BASE_DEC, VALS(bssap_plus_GPRS_loc_upd_type_values), 0x0,
"GPRS location update type", HFILL}},
{ &hf_bssap_Gs_cause,
{ "Gs cause", "bssap.gprs_loc_upd_type",
FT_UINT8, BASE_DEC, VALS(bssap_Gs_cause_values), 0x0,
"Gs cause", HFILL}},
{ &hf_bssap_imsi_det_from_gprs_serv_type,
{ "IMSI detach from GPRS service type", "bssap.imsi_det_from_gprs_serv_type",
FT_UINT8, BASE_DEC, VALS(bssap_Gs_cause_values), 0x0,
"IMSI detach from GPRS service type", HFILL}},
{ &hf_bssap_info_req,
{ "Information requested", "bssap.info_req",
FT_UINT8, BASE_DEC, VALS(bssap_info_req_values), 0x0,
"Information requested", HFILL}},
{ &hf_bssap_loc_inf_age,
{ "AgeOfLocationInformation in minutes", "bssap.loc_inf_age",
FT_UINT16, BASE_DEC, NULL, 0x0,
"AgeOfLocationInformation in minutes", HFILL}},
{ &hf_bssap_mobile_station_state,
{ "Mobile station state", "bssap.mobile_station_state",
FT_UINT8, BASE_DEC, VALS(bssap_mobile_station_state_values), 0x0,
"Mobile station state", HFILL}},
{ &hf_bssap_ptmsi,
{ "PTMSI", "bssap.ptmsi",
FT_BYTES, BASE_HEX, NULL, 0x0,
"PTMSI", HFILL}},
{ &hf_bssap_tmsi,
{ "TMSI", "bssap.tmsi",
FT_BYTES, BASE_HEX, NULL, 0x0,
"TMSI", HFILL}},
{ &hf_bssap_tmsi_status,
{ "TMSI status", "bssap.tmsi_status",
FT_BOOLEAN, 8, TFS(&bssap_tmsi_flag), 0x01,
"TMSI status", HFILL }},
{ &hf_bssap_tom_prot_disc,
{ "TOM Protocol Discriminator", "bssap.Tom_prot_disc",
FT_UINT8, BASE_DEC, VALS(bssap_tom_prot_disc_values), 0x78,
"TOM Protocol Discriminator", HFILL}},
{ &hf_bssap_e_bit,
{ "E: Cipher Request", "bssap.tmsi_status",
FT_BOOLEAN, 8, TFS(&bssap_E_flag), 0x04,
"E: Cipher Request", HFILL }},
{ &hf_bssap_tunnel_prio,
{ "Tunnel Priority", "bssap.tunnel_prio",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Tunnel Priority", HFILL}},
{ &hf_bssap_global_cn_id,
{ "Global CN-Id", "bssap.global_cn_id",
FT_BYTES, BASE_HEX, NULL, 0x0,
"Global CN-Id", HFILL}},
{ &hf_bssap_plmn_id,
{ "PLMN-Id", "bssap.plmn_id",
FT_BYTES, BASE_HEX, NULL, 0x0,
"PLMN-Id", HFILL}},
{ &hf_bssap_cn_id,
{ "CN-Id", "bssap.cn_id",
FT_UINT16, BASE_DEC, NULL, 0x0,
"CN-Id", HFILL}},
{ &hf_bssap_cell_global_id,
{ "Cell global identity", "bssap.plmn_id",
FT_BYTES, BASE_HEX, NULL, 0x0,
"Cell global identity", HFILL}},
};
/* Setup protocol subtree array */
static gint *ett[] = {
@ -2031,6 +2302,7 @@ proto_register_bssap(void)
&ett_bassp_imei,
&ett_bassp_imesiv,
&ett_bssap_cell_global_id,
&ett_bssap_cgi,
&ett_bssap_channel_needed,
&ett_bssap_dlink_tnl_pld_cntrl_amd_inf,
&ett_bssap_ulink_tnl_pld_cntrl_amd_inf,
@ -2041,6 +2313,8 @@ proto_register_bssap(void)
&ett_bssap_ptmsi,
&ett_bssap_reject_cause,
&ett_bssap_service_area_id,
&ett_bssap_global_cn_id,
&ett_bssap_plmn,
};
static enum_val_t bssap_or_bsap_options[] = {

View File

@ -2447,11 +2447,7 @@ be_prio(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_s
oct = tvb_get_guint8(tvb, curr_offset);
other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
proto_tree_add_item(tree, hf_gsm_a_b8spare, tvb, curr_offset, 1, FALSE);
other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
proto_tree_add_text(tree,
@ -3051,11 +3047,7 @@ be_speech_ver(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
oct = tvb_get_guint8(tvb, curr_offset);
other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
proto_tree_add_item(tree, hf_gsm_a_b8spare, tvb, curr_offset, 1, FALSE);
switch (oct & 0x7f)
{
@ -3382,10 +3374,10 @@ dtap_elem_idx_t;
#define NUM_GSM_DTAP_ELEM (sizeof(gsm_dtap_elem_strings)/sizeof(value_string))
static gint ett_gsm_dtap_elem[NUM_GSM_DTAP_ELEM];
/*
* [3] 10.5.1.1
/* 3GPP TS 24.008
* [3] 10.5.1.1 Cell Identity
*/
static guint8
guint8
de_cell_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
{
guint32 curr_offset;
@ -3393,7 +3385,7 @@ de_cell_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
curr_offset = offset;
curr_offset +=
/* Is this correct???? - Anders Broman */
/* 0x02 CI */
be_cell_id_aux(tvb, tree, offset, len, add_string, string_len, 0x02);
/* no length check possible */
@ -3636,7 +3628,7 @@ de_mid(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_st
/*
* [3] 10.5.1.5
*/
static guint8
guint8
de_ms_cm_1(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
guint8 oct;
@ -3655,11 +3647,7 @@ de_ms_cm_1(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_MS_CM_1]);
other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
proto_tree_add_item(tree, hf_gsm_a_b8spare, tvb, curr_offset, 1, FALSE);
proto_tree_add_item(subtree, hf_gsm_a_MSC_rev, tvb, curr_offset, 1, FALSE);
@ -3746,6 +3734,7 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
/*
* [3] 10.5.1.9
*/
static guint8
de_d_gb_call_ref(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
@ -3876,6 +3865,7 @@ de_pd_sapi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
/*
* [3] 10.5.1.11
*/
static guint8
de_prio(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
@ -5171,10 +5161,10 @@ de_network_name(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
return(curr_offset - offset);
}
/*
* [3] 10.5.3.6
/* 3GPP TS 24.008
* [3] 10.5.3.6 Reject cause
*/
static guint8
guint8
de_rej_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
guint8 oct;
@ -10389,7 +10379,7 @@ de_gmm_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
}
/*
* [7] 10.5.5.15
* [7] 10.5.5.15 Routing area identification
*/
guint8
de_gmm_rai(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
@ -14925,7 +14915,7 @@ dtap_mm_loc_upd_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
/*
* [4] 9.1.15a
*/
static void
void
dtap_mm_mm_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
{
guint32 curr_offset;
@ -18386,19 +18376,19 @@ proto_register_gsm_a(void)
"SoLSA", HFILL }
},
{ &hf_gsm_a_CMSP,
{ "CMSP: CM Service Prompt ","gsm_a.CMSP",
{ "CMSP: CM Service Prompt","gsm_a.CMSP",
FT_UINT8,BASE_DEC, VALS(CMSP_vals), 0x04,
"CMSP: CM Service Prompt ", HFILL }
"CMSP: CM Service Prompt", HFILL }
},
{ &hf_gsm_a_A5_3_algorithm_sup,
{ "A5/3 algorithm supported ","gsm_a.A5_3_algorithm_sup",
{ "A5/3 algorithm supported","gsm_a.A5_3_algorithm_sup",
FT_UINT8,BASE_DEC, VALS(A5_3_algorithm_sup_vals), 0x02,
"A5/3 algorithm supported ", HFILL }
"A5/3 algorithm supported", HFILL }
},
{ &hf_gsm_a_A5_2_algorithm_sup,
{ "A5/2 algorithm supported ","gsm_a.A5_2_algorithm_sup",
{ "A5/2 algorithm supported","gsm_a.A5_2_algorithm_sup",
FT_UINT8,BASE_DEC, VALS(A5_2_algorithm_sup_vals), 0x01,
"A5/2 algorithm supported ", HFILL }
"A5/2 algorithm supported", HFILL }
},
{ &hf_gsm_a_mobile_identity_type,
{ "Mobile Identity Type","gsm_a.ie.mobileid.type",

View File

@ -60,14 +60,18 @@ typedef struct _gsm_a_tap_rec_t {
void dissect_bssmap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
void dtap_mm_mm_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len);
guint8 de_lai(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len);
guint8 de_mid(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len);
guint8 be_cell_id_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len);
guint8 de_cell_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len);
guint8 de_sm_apn(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len);
guint8 de_ms_cm_1(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_);
guint8 de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len);
guint8 de_sm_apn(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len);
guint8 de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len);
guint8 de_sm_pflow_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len);
@ -84,6 +88,7 @@ guint8 de_rr_cm_enq_mask(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
guint8 de_rr_tlli(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len);
guint8 de_rr_sus_cau(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len);
guint8 de_rej_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_);
void dtap_rr_ho_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len);
/*