diff options
author | Mikhail Koreshkov <drkor@hotbox.ru> | 2015-03-06 22:57:17 +0300 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2015-03-12 16:36:14 +0000 |
commit | df164dfc62ae3377057a865a1e4a66119e8a3b2c (patch) | |
tree | b3a59dd106088e47a9767a6c7b148e3f6b78ca04 /epan | |
parent | 283336508efad6c58ad0a62508b7e6ca5db34ece (diff) |
GSM_A-BCC: dissector for BCC Protocol
Added dissector for Broadcast call control protocol
(3GPP TS 44.069 version 11.0.0 Release 11)
Change-Id: I179801d30fc2d32d8c4187a92dd0b1c9709711c7
Reviewed-on: https://code.wireshark.org/review/7627
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-gsm_a_common.h | 15 | ||||
-rw-r--r-- | epan/dissectors/packet-gsm_a_dtap.c | 589 |
2 files changed, 603 insertions, 1 deletions
diff --git a/epan/dissectors/packet-gsm_a_common.h b/epan/dissectors/packet-gsm_a_common.h index 3c00660b8b..10e297c5e4 100644 --- a/epan/dissectors/packet-gsm_a_common.h +++ b/epan/dissectors/packet-gsm_a_common.h @@ -25,15 +25,21 @@ * (3GPP TS 24.008 version 6.7.0 Release 6) * (3GPP TS 24.008 version 6.8.0 Release 6) * - * Reference [12] + * Reference [9] * Digital cellular telecommunications system (Phase 2+); * Group Call Control (GCC) protocol * (GSM 04.68 version 8.1.0 Release 1999) * + * Reference [10] + * Digital cellular telecommunications system (Phase 2+); + * Broadcast Call Control (BCC) protocol + * (3GPP TS 44.069 version 11.0.0 Release 11) + * * Copyright 2003, Michael Lum <mlum [AT] telostech.com>, * In association with Telos Technology Inc. * * Added Dissection of Group Call Control (GCC) protocol. + * Added Dissection of Broadcast Call Control (BCC) protocol. * Copyright 2015, Michail Koreshkov <michail.koreshkov [at] zte.com.cn * * Wireshark - Network traffic analyzer @@ -1097,6 +1103,13 @@ typedef enum DE_GCC_CAUSE, /* Cause */ DE_GCC_ORIG_IND, /* Originator indication */ DE_GCC_STATE_ATTR, /* State attributes */ + /* Broadcast Call Control Information Elements ETSI TS 144 069 V10.0.0 (3GPP TS 44.069 version 10.0.0 Release 10) */ + DE_BCC_CALL_REF, /* Call Reference */ + DE_BCC_CALL_STATE, /* Call state */ + DE_BCC_CAUSE, /* Cause */ + DE_BCC_ORIG_IND, /* Originator indication */ + DE_BCC_STATE_ATTR, /* State attributes */ + DE_BCC_COMPR_OTDI, /* Compressed otdi */ DE_NONE /* NONE */ } dtap_elem_idx_t; diff --git a/epan/dissectors/packet-gsm_a_dtap.c b/epan/dissectors/packet-gsm_a_dtap.c index 0f80731f42..c4eb82aa3b 100644 --- a/epan/dissectors/packet-gsm_a_dtap.c +++ b/epan/dissectors/packet-gsm_a_dtap.c @@ -23,6 +23,7 @@ * In association with Intracom Telecom SA * * Added Dissection of Group Call Control (GCC) protocol. + * Added Dissection of Broadcast Call Control (BCC) protocol. * Copyright 2015, Michail Koreshkov <michail.koreshkov [at] zte.com.cn * * Title 3GPP Other @@ -86,6 +87,11 @@ * Group Call Control (GCC) protocol * (GSM 04.68 version 8.1.0 Release 1999) * + * Reference [13] + * Digital cellular telecommunications system (Phase 2+); + * Broadcast Call Control (BCC) protocol + * (3GPP TS 44.069 version 11.0.0 Release 11) + * * Wireshark - Network traffic analyzer * By Gerald Combs <gerald@wireshark.org> * Copyright 1998 Gerald Combs @@ -137,6 +143,20 @@ const value_string gsm_a_dtap_msg_gcc_strings[] = { { 0, NULL } }; +const value_string gsm_a_dtap_msg_bcc_strings[] = { + { 0x31, "Immediate Setup" }, + { 0x32, "Setup" }, + { 0x33, "Connect" }, + { 0x34, "Termination" }, + { 0x35, "Termination Request" }, + { 0x36, "Termination Reject" }, + { 0x38, "Status" }, + { 0x39, "Get Status" }, + { 0x3A, "Set Parameter" }, + { 0x3B, "Immediate Setup 2" }, + { 0, NULL } +}; + const value_string gsm_a_dtap_msg_mm_strings[] = { { 0x01, "IMSI Detach Indication" }, { 0x02, "Location Updating Accept" }, @@ -352,6 +372,13 @@ static const value_string gsm_dtap_elem_strings[] = { { DE_GCC_CAUSE, "Cause"}, { DE_GCC_ORIG_IND, "Originator indication"}, { DE_GCC_STATE_ATTR, "State attributes"}, + /* Broadcast Call Control Information Elements ETSI TS 144 069 V10.0.0 (3GPP TS 44.069 version 10.0.0 Release 10) */ + {DE_BCC_CALL_REF, "Call Reference"}, + {DE_BCC_CALL_STATE, "Call state"}, + {DE_BCC_CAUSE, "Cause"}, + {DE_BCC_ORIG_IND, "Originator indication"}, + {DE_BCC_STATE_ATTR, "State attributes"}, + {DE_BCC_COMPR_OTDI, "Compressed otdi"}, { 0, NULL } }; value_string_ext gsm_dtap_elem_strings_ext = VALUE_STRING_EXT_INIT(gsm_dtap_elem_strings); @@ -426,6 +453,7 @@ static const true_false_string tfs_acceptable_not_acceptable = { "Acceptable", " #define DTAP_MM_IEI_MASK 0x3f #define DTAP_GCC_IEI_MASK 0x3f +#define DTAP_BCC_IEI_MASK 0x3f #define DTAP_CC_IEI_MASK 0x3f #define DTAP_SMS_IEI_MASK 0xff #define DTAP_SS_IEI_MASK 0x3f @@ -435,6 +463,7 @@ static const true_false_string tfs_acceptable_not_acceptable = { "Acceptable", " static int proto_a_dtap = -1; static int hf_gsm_a_dtap_msg_gcc_type = -1; +static int hf_gsm_a_dtap_msg_bcc_type = -1; static int hf_gsm_a_dtap_msg_mm_type = -1; static int hf_gsm_a_dtap_msg_cc_type = -1; static int hf_gsm_a_seq_no = -1; @@ -649,6 +678,26 @@ static int hf_gsm_a_dtap_gcc_spare_1 = -1; static int hf_gsm_a_dtap_gcc_spare_3 = -1; static int hf_gsm_a_dtap_gcc_spare_4 = -1; +static int hf_gsm_a_dtap_bcc_call_ref = -1; +static int hf_gsm_a_dtap_bcc_call_ref_has_priority = -1; +static int hf_gsm_a_dtap_bcc_call_priority = -1; +static int hf_gsm_a_dtap_bcc_call_state = -1; +static int hf_gsm_a_dtap_bcc_cause = -1; +static int hf_gsm_a_dtap_bcc_cause_structure = -1; +static int hf_gsm_a_dtap_bcc_orig_ind = -1; +static int hf_gsm_a_dtap_bcc_state_attr = -1; +static int hf_gsm_a_dtap_bcc_state_attr_da = -1; +static int hf_gsm_a_dtap_bcc_state_attr_ua = -1; +static int hf_gsm_a_dtap_bcc_state_attr_comm = -1; +static int hf_gsm_a_dtap_bcc_state_attr_oi = -1; +static int hf_gsm_a_dtap_bcc_compr_otdi = -1; + +static int hf_gsm_a_dtap_bcc_spare_1 = -1; +static int hf_gsm_a_dtap_bcc_spare_3 = -1; +static int hf_gsm_a_dtap_bcc_spare_4 = -1; + + + /* Initialize the subtree pointers */ static gint ett_dtap_msg = -1; static gint ett_dtap_oct_1 = -1; @@ -4056,6 +4105,190 @@ de_gcc_state_attr(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint return 1; } +static const value_string bcc_call_ref_priority[] = { + { 0, "reserved"}, + { 1, "level 4"}, + { 2, "level 3"}, + { 3, "level 2"}, + { 4, "level 1"}, + { 5, "level 0"}, + { 6, "level B"}, + { 7, "level A"}, + { 0, NULL } +}; +static guint16 +de_bcc_call_ref(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +{ + guint32 curr_offset; + guint32 value; + + curr_offset = offset; + + value = tvb_get_ntohl(tvb, curr_offset); + + proto_tree_add_item(tree, hf_gsm_a_dtap_bcc_call_ref, tvb, curr_offset, 4, ENC_BIG_ENDIAN); + + if (value & 0x10){ + proto_tree_add_item(tree, hf_gsm_a_dtap_bcc_call_ref_has_priority, tvb, curr_offset, 4, ENC_NA); + proto_tree_add_item(tree, hf_gsm_a_dtap_bcc_call_priority, tvb, curr_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_dtap_bcc_spare_1, tvb, curr_offset, 4, ENC_NA); + } + else{ + proto_tree_add_item(tree, hf_gsm_a_dtap_bcc_call_ref_has_priority, tvb, curr_offset, 4, ENC_NA); + proto_tree_add_item(tree, hf_gsm_a_dtap_bcc_spare_4, tvb, curr_offset, 4, ENC_NA); + } + + curr_offset += 4; + + return(curr_offset - offset); +} + +static const range_string bcc_call_state_vals[] = { + {0, 0, "U0"}, + {1, 1, "U1"}, + {2, 2, "U2"}, + {3, 3, "U3"}, + {4, 4, "U4"}, + {5, 5, "U5"}, + {6, 6, "U0.p"}, + {7, 7, "U6"}, + {8, 15, "Reserved"}, + {0, 0, NULL } +}; + +static guint16 +de_bcc_call_state(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +{ + proto_tree_add_item(tree, hf_gsm_a_dtap_bcc_call_state, tvb, offset, 2, ENC_NA); + + return 1; +} + +static const range_string bcc_cause_vals[] = { + {0, 2, "Unspecified"}, + {3, 3, "Illegal MS"}, + {4, 4, "Unspecified"}, + {5, 5, "IMEI not accepted"}, + {6, 6, "Illegal ME"}, + {7, 7, "Unspecified"}, + {8, 8, "Service not authorized"}, + {9, 9, "Application not supported on the protocol"}, + {10, 10, "RR connection aborted"}, + {11, 15, "Unspecified"}, + {16, 16, "Normal call clearing"}, + {17, 17, "Network failure"}, + {18, 19, "Unspecified"}, + {20, 20, "Busy"}, + {21, 21, "Unspecified"}, + {22, 22, "Congestion"}, + {23, 23, "User not originator of call"}, + {24, 24, "Network wants to maintain call"}, + {25, 29, "Unspecified"}, + {30, 30, "Response to GET STATUS"}, + {31, 31, "Unspecified"}, + {32, 32, "Service option not supported"}, + {33, 33, "Requested service option not subscribed"}, + {34, 34, "Service option temporarily out of order"}, + {35, 37, "Unspecified"}, + {38, 38, "Call cannot be identified"}, + {39, 47, "Unspecified"}, + {48, 63, "Retry upon entry into a new cell"}, + {64, 80, "Unspecified"}, + {81, 81, "Invalid transaction identifier value"}, + {82, 94, "Unspecified"}, + {95, 95, "Semantically incorrect message"}, + {96, 96, "Invalid mandatory information"}, + {97, 97, "Message type non-existent or not implemented"}, + {98, 98, "Message type not compatible with the protocol state"}, + {99, 99, "Information element non-existent or not implemented"}, + {100, 100, "Message type not compatible with the protocol state"}, + {101, 111, "Unspecified"}, + {112, 112, "Protocol error, unspecified"}, + {113, 127, "Unspecified"}, + {0, 0, NULL } +}; + +static const true_false_string bcc_cause_structure_val = { + "cause_part [diagnostics]", + "cause_part <cause>" +}; + +static guint16 +de_bcc_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) +{ + guint32 curr_offset; + + int curr_len; + curr_len = len; + + curr_offset = offset; + + proto_tree_add_item(tree, hf_gsm_a_dtap_bcc_cause_structure, tvb, curr_offset, 1, ENC_NA); + proto_tree_add_item(tree, hf_gsm_a_dtap_bcc_cause, tvb, curr_offset, 1, ENC_NA); + + curr_offset++; + curr_len--; + + EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_dtap_extraneous_data); + + return(curr_offset - offset); +} + +static const true_false_string bcc_orig_ind_vals = { + "The MS is the originator of the call", + "The MS is not the originator of the call" +}; +static guint16 +de_bcc_orig_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, 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_gsm_a_dtap_bcc_spare_3, tvb, curr_offset, 1, ENC_NA); + proto_tree_add_item(tree, hf_gsm_a_dtap_bcc_orig_ind, tvb, curr_offset, 1, ENC_NA); + + curr_offset++; + + return(curr_offset - offset); +} + +static const true_false_string bcc_state_attr_da = { + "User connection in the downlink attached (D-ATT = T)", + "User connection in the downlink not attached (D-ATT = F)" +}; +static const true_false_string bcc_state_attr_ua = { + "User connection in the uplink attached (U-ATT = T)", + "User connection in the uplink not attached (U-ATT = F)" +}; +static const true_false_string bcc_state_attr_comm = { + "Communication with its peer entity is enabled in both directions (COMM = T)", + "Communication with its peer entity is not enabled in both directions (COMM = F)" +}; +static const true_false_string bcc_state_attr_oi = { + "The MS is the originator of the call (ORIG = T)", + "The MS is not the originator of the call (ORIG = F)" +}; +static guint16 +de_bcc_state_attr(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +{ + proto_tree_add_item(tree, hf_gsm_a_dtap_bcc_state_attr, tvb, offset, 1, ENC_NA); + proto_tree_add_item(tree, hf_gsm_a_dtap_bcc_state_attr_da, tvb, offset, 1, ENC_NA); + proto_tree_add_item(tree, hf_gsm_a_dtap_bcc_state_attr_ua, tvb, offset, 1, ENC_NA); + proto_tree_add_item(tree, hf_gsm_a_dtap_bcc_state_attr_comm, tvb, offset, 1, ENC_NA); + proto_tree_add_item(tree, hf_gsm_a_dtap_bcc_state_attr_oi, tvb, offset, 1, ENC_NA); + + return 1; +} + +static guint16 +de_bcc_compr_otdi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +{ + proto_tree_add_item(tree, hf_gsm_a_dtap_bcc_compr_otdi, tvb, offset, len, ENC_NA); + + return len; +} + guint16 (*dtap_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string, int string_len) = { /* Mobility Management Information Elements 10.5.3 */ de_auth_param_rand, /* Authentication Parameter RAND */ @@ -4148,6 +4381,13 @@ guint16 (*dtap_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _ de_gcc_cause, /* Cause */ de_gcc_orig_ind, /* Originator indication */ de_gcc_state_attr, /* State attributes */ + /* BCC Elements */ + de_bcc_call_ref, /* Call Reference */ + de_bcc_call_state, /* Call state */ + de_bcc_cause, /* Cause */ + de_bcc_orig_ind, /* Originator indication */ + de_bcc_state_attr, /* State attributes */ + de_bcc_compr_otdi, /* Compressed otdi */ NULL, /* NONE */ }; @@ -4342,6 +4582,243 @@ dtap_gcc_set_param(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guin } /* + * [13] 8.1 CONNECT + */ +static void +dtap_bcc_connect(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) +{ + guint32 curr_offset; + guint32 consumed; + guint curr_len; + + curr_offset = offset; + curr_len = len; + + ELEM_MAND_V(GSM_A_PDU_TYPE_DTAP, DE_BCC_CALL_REF, NULL); + + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset<<3, 4, ENC_NA); + + ELEM_MAND_V(GSM_A_PDU_TYPE_DTAP, DE_BCC_ORIG_IND, "(Broadcast call reference)"); +} + +/* + * [13] 8.2 GET STATUS + */ +static void +dtap_bcc_get_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) +{ + guint32 curr_offset; + guint32 consumed; + guint curr_len; + + curr_offset = offset; + curr_len = len; + + ELEM_OPT_TLV(0x17, GSM_A_PDU_TYPE_COMMON, DE_MID, NULL); + EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_dtap_extraneous_data); +} + +/* + * [13] 8.3 IMMEDIATE SETUP + */ +static void +dtap_bcc_imm_setup(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) +{ + guint32 curr_offset; + guint32 consumed; + guint curr_len; + guint8 oct; + proto_tree *subtree; + + curr_offset = offset; + curr_len = len; + + /* + * special dissection for Cipher Key Sequence Number + */ + oct = tvb_get_guint8(tvb, curr_offset); + + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN); + + subtree = + proto_tree_add_subtree(tree, + tvb, curr_offset, 1, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM], NULL, + val_to_str_ext_const(DE_CIPH_KEY_SEQ_NUM, &gsm_common_elem_strings_ext, "")); + + proto_tree_add_bits_item(subtree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 1, ENC_BIG_ENDIAN); + + switch (oct & 0x07) + { + case 0x07: + proto_tree_add_uint_format_value(subtree, hf_gsm_a_dtap_ciphering_key_sequence_number, tvb, curr_offset, 1, + oct, "No key is available"); + break; + + default: + proto_tree_add_item(subtree, hf_gsm_a_dtap_ciphering_key_sequence_number, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + break; + } + + curr_offset++; + curr_len--; + + ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MS_CM_2, NULL); + ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MID, NULL); + ELEM_MAND_V(GSM_A_PDU_TYPE_DTAP, DE_BCC_CALL_REF, "(Broadcast identity)"); +} + +/* + * [13] 8.3a IMMEDIATE SETUP 2 + */ +static void +dtap_bcc_imm_setup2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) +{ + guint32 curr_offset; + guint32 consumed; + guint curr_len; + guint8 oct; + proto_tree *subtree; + + curr_offset = offset; + curr_len = len; + + /* + * special dissection for Cipher Key Sequence Number + */ + oct = tvb_get_guint8(tvb, curr_offset); + + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN); + + subtree = + proto_tree_add_subtree(tree, + tvb, curr_offset, 1, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM], NULL, + val_to_str_ext_const(DE_CIPH_KEY_SEQ_NUM, &gsm_common_elem_strings_ext, "")); + + proto_tree_add_bits_item(subtree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 1, ENC_BIG_ENDIAN); + + switch (oct & 0x07) + { + case 0x07: + proto_tree_add_uint_format_value(subtree, hf_gsm_a_dtap_ciphering_key_sequence_number, tvb, curr_offset, 1, + oct, "No key is available"); + break; + + default: + proto_tree_add_item(subtree, hf_gsm_a_dtap_ciphering_key_sequence_number, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + break; + } + + curr_offset++; + curr_len--; + + ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MS_CM_2, NULL); + ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_TMSI_STAT, NULL) + ELEM_MAND_V(GSM_A_PDU_TYPE_DTAP, DE_BCC_CALL_REF, "(Group identity)"); + ELEM_MAND_V(GSM_A_PDU_TYPE_DTAP, DE_BCC_COMPR_OTDI, NULL); +} + +/* + * [13] 8.4 SET PARAMETER + */ +static void +dtap_bcc_set_param(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) +{ + guint32 curr_offset; + guint32 consumed; + guint curr_len; + + curr_offset = offset; + curr_len = len; + + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset<<3, 4, ENC_NA); + ELEM_MAND_V(GSM_A_PDU_TYPE_DTAP, DE_BCC_STATE_ATTR, NULL); + +} + +/* + * [13] 8.5 SETUP + */ +static void +dtap_bcc_setup(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) +{ + guint32 curr_offset; + guint32 consumed; + guint curr_len; + + curr_offset = offset; + curr_len = len; + + ELEM_MAND_V(GSM_A_PDU_TYPE_DTAP, DE_BCC_CALL_REF, "(Broadcast identity)"); + ELEM_OPT_TLV(0x7e, GSM_A_PDU_TYPE_DTAP, DE_USER_USER, "(Originator-to-dispatcher information)"); +} + +/* + * [13] 8.6 STATUS + */ +static void +dtap_bcc_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) +{ + guint32 curr_offset; + guint32 consumed; + guint curr_len; + + curr_offset = offset; + curr_len = len; + + ELEM_MAND_LV(GSM_A_PDU_TYPE_DTAP, DE_BCC_CAUSE, NULL); + ELEM_OPT_TV_SHORT(0xa0, GSM_A_PDU_TYPE_DTAP, DE_BCC_CALL_STATE, NULL); + ELEM_OPT_TV_SHORT(0xb0, GSM_A_PDU_TYPE_DTAP, DE_BCC_STATE_ATTR, NULL); +} + +/* + * [13] 8.7 TERMINATION + */ +static void +dtap_bcc_term(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) +{ + guint32 curr_offset; + guint32 consumed; + guint curr_len; + + curr_offset = offset; + curr_len = len; + + ELEM_MAND_LV(GSM_A_PDU_TYPE_DTAP, DE_BCC_CAUSE, NULL); +} + +/* + * [13] 8.8 TERMINATION REJECT + */ +static void +dtap_bcc_term_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) +{ + guint32 curr_offset; + guint32 consumed; + guint curr_len; + + curr_offset = offset; + curr_len = len; + + ELEM_MAND_LV(GSM_A_PDU_TYPE_DTAP, DE_BCC_CAUSE, "(Reject Cause)"); +} + +/* + * [13] 8.9 TERMINATION REQUEST + */ +static void +dtap_bcc_term_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) +{ + guint32 curr_offset; + guint32 consumed; + guint curr_len; + + curr_offset = offset; + curr_len = len; + + ELEM_MAND_V(GSM_A_PDU_TYPE_DTAP, DE_BCC_CALL_REF, "(Broadcast call reference)"); +} + +/* * [4] 9.2.2 Authentication request */ static void @@ -6099,6 +6576,22 @@ static void (*dtap_msg_gcc[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinf NULL, /* NONE */ }; +#define NUM_GSM_DTAP_MSG_BCC (sizeof(gsm_a_dtap_msg_bcc_strings)/sizeof(value_string)) +static gint ett_gsm_dtap_msg_bcc[NUM_GSM_DTAP_MSG_BCC]; +static void (*dtap_msg_bcc[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) = { + dtap_bcc_imm_setup, /* IMMEDIATE SETUP */ + dtap_bcc_setup, /* SETUP */ + dtap_bcc_connect, /* CONNECT */ + dtap_bcc_term, /* TERMINATION */ + dtap_bcc_term_req, /* TERMINATION REQUEST */ + dtap_bcc_term_rej, /* TERMINATION REJECT */ + dtap_bcc_status, /* STATUS */ + dtap_bcc_get_status, /* GET STATUS */ + dtap_bcc_set_param, /* SET PARAMETER */ + dtap_bcc_imm_setup2, /* IMMEDIATE SETUP 2 */ + NULL, /* NONE */ +}; + #define NUM_GSM_DTAP_MSG_MM (sizeof(gsm_a_dtap_msg_mm_strings)/sizeof(value_string)) static gint ett_gsm_dtap_msg_mm[NUM_GSM_DTAP_MSG_MM]; static void (*dtap_msg_mm_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) = { @@ -6331,6 +6824,17 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) ti = (oct_1 & DTAP_TI_MASK) >> 4; nsd = TRUE; break; + case 1: + msg_str = try_val_to_str_idx((guint32) (oct & DTAP_BCC_IEI_MASK), gsm_a_dtap_msg_bcc_strings, &idx); + if (msg_str != NULL) + { + ett_tree = ett_gsm_dtap_msg_bcc[idx]; + dtap_msg_fcn = dtap_msg_bcc[idx]; + } + hf_idx = hf_gsm_a_dtap_msg_bcc_type; + ti = (oct_1 & DTAP_TI_MASK) >> 4; + nsd = TRUE; + break; case 3: msg_str = try_val_to_str_idx((guint32) (oct & DTAP_CC_IEI_MASK), gsm_a_dtap_msg_cc_strings, &idx); if (msg_str != NULL) @@ -6556,6 +7060,11 @@ proto_register_gsm_a_dtap(void) FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_gcc_strings), 0x3f, NULL, HFILL } }, + { &hf_gsm_a_dtap_msg_bcc_type, + { "DTAP Broadcast Call Control Message Type", "gsm_a.dtap.msg_bcc_type", + FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_bcc_strings), 0x3f, + NULL, HFILL } + }, { &hf_gsm_a_dtap_msg_mm_type, { "DTAP Mobility Management Message Type", "gsm_a.dtap.msg_mm_type", FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_mm_strings), 0x3f, @@ -7106,6 +7615,86 @@ proto_register_gsm_a_dtap(void) FT_UINT32, BASE_DEC, NULL, 0x00000010, NULL, HFILL } }, + { &hf_gsm_a_dtap_bcc_call_ref, + { "Call Reference", "gsm_a.dtap.bcc.call_ref", + FT_UINT32, BASE_DEC, NULL, 0xffffffe0, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_bcc_call_ref_has_priority, + { "Call Reference includes priority", "gsm_a.dtap.bcc.call_ref_has_priority", + FT_BOOLEAN, 32, NULL, 0x00000010, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_bcc_call_priority, + { "Call Priority", "gsm_a.dtap.bcc.call_priority", + FT_UINT32, BASE_DEC, VALS(bcc_call_ref_priority), 0x0000000e, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_bcc_call_state, + { "Call state", "gsm_a.dtap.bcc.call_state", + FT_UINT24, BASE_DEC|BASE_RANGE_STRING, RVALS(bcc_call_state_vals), 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_bcc_cause_structure, + { "Cause structure", "gsm_a.dtap.bcc.cause_structure", + FT_BOOLEAN, 8, TFS(&bcc_cause_structure_val), 0x80, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_bcc_cause, + { "Cause", "gsm_a.dtap.bcc.cause", + FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(bcc_cause_vals), 0x7f, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_bcc_orig_ind, + { "Originator indication", "gsm_a.dtap.bcc.orig_ind", + FT_BOOLEAN, 8, TFS(&bcc_orig_ind_vals), 0x01, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_bcc_state_attr, + { "State attributes", "gsm_a.dtap.bcc.state_attr", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_bcc_state_attr_da, + { "DA", "gsm_a.dtap.bcc.state_attr_da", + FT_BOOLEAN, 8, TFS(&bcc_state_attr_da), 0x08, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_bcc_state_attr_ua, + { "UA", "gsm_a.dtap.bcc.state_attr_ua", + FT_BOOLEAN, 8, TFS(&bcc_state_attr_ua), 0x04, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_bcc_state_attr_comm, + { "COMM", "gsm_a.dtap.bcc.state_attr_comm", + FT_BOOLEAN, 8, TFS(&bcc_state_attr_comm), 0x02, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_bcc_state_attr_oi, + { "OI", "gsm_a.dtap.bcc.state_attr_oi", + FT_BOOLEAN, 8, TFS(&bcc_state_attr_oi), 0x01, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_bcc_compr_otdi, + { "Compressed otdi", "gsm_a.dtap.bcc.compr_otdi", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_bcc_spare_1, + { "Spare_1 (This field shall be ignored)", "gsm_a.dtap.bcc.spare_1", + FT_UINT32, BASE_DEC, NULL, 0x00000001, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_bcc_spare_3, + { "Spare_3 (This field shall be ignored)", "gsm_a.dtap.bcc.spare_3", + FT_UINT8, BASE_DEC, NULL, 0x0e, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_bcc_spare_4, + { "Spare_4 (This field shall be ignored)", "gsm_a.dtap.bcc.spare_4", + FT_UINT32, BASE_DEC, NULL, 0x00000010, + NULL, HFILL } + }, /* Generated from convert_proto_tree_add_text.pl */ { &hf_gsm_a_dtap_coding_scheme, { "Coding Scheme", "gsm_a.dtap.coding_scheme", |