diff options
author | Mikhail Koreshkov <drkor@hotbox.ru> | 2015-02-24 11:38:47 +0300 |
---|---|---|
committer | Pascal Quantin <pascal.quantin@gmail.com> | 2015-03-03 11:32:08 +0000 |
commit | 1864deb0fabbca55bfe8a1f63a29ec05485ee770 (patch) | |
tree | e99fc0a4c5bd4ea4c1569231fa563e7c90c3e01f /epan/dissectors/packet-gsm_a_dtap.c | |
parent | 499d95964d0d19bbec7f78d6fe4461eb26c552ca (diff) |
GSM_A-GCC: dissector for GCC Protocol
Added dissector for GSM-A GCC (Group Call Control) Protocol (GSM 04.68)
Change-Id: I46fafc3fd3eba674202f2c34932edf83a6d1d096
Reviewed-on: https://code.wireshark.org/review/7338
Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-gsm_a_dtap.c')
-rw-r--r-- | epan/dissectors/packet-gsm_a_dtap.c | 526 |
1 files changed, 526 insertions, 0 deletions
diff --git a/epan/dissectors/packet-gsm_a_dtap.c b/epan/dissectors/packet-gsm_a_dtap.c index 75e6a18dcd..0f80731f42 100644 --- a/epan/dissectors/packet-gsm_a_dtap.c +++ b/epan/dissectors/packet-gsm_a_dtap.c @@ -22,6 +22,9 @@ * Copyright 2009, Gerasimos Dimitriadis <dimeg [AT] intracom.gr> * In association with Intracom Telecom SA * + * Added Dissection of Group Call Control (GCC) protocol. + * Copyright 2015, Michail Koreshkov <michail.koreshkov [at] zte.com.cn + * * Title 3GPP Other * * Reference [3] @@ -78,6 +81,11 @@ * Stage 3 * (3GPP TS 24.008 version 11.6.0 Release 11) * + * Reference [12] + * Digital cellular telecommunications system (Phase 2+); + * Group Call Control (GCC) protocol + * (GSM 04.68 version 8.1.0 Release 1999) + * * Wireshark - Network traffic analyzer * By Gerald Combs <gerald@wireshark.org> * Copyright 1998 Gerald Combs @@ -116,6 +124,19 @@ void proto_reg_handoff_gsm_a_dtap(void); /* PROTOTYPES/FORWARDS */ +const value_string gsm_a_dtap_msg_gcc_strings[] = { + { 0x31, "Immediate Setup" }, + { 0x32, "Setup" }, + { 0x33, "Connect" }, + { 0x34, "Termination" }, + { 0x35, "Termination Request" }, + { 0x36, "Termination Reject" }, + { 0x38, "Status" }, + { 0x39, "Get Status" }, + { 0x3A, "Set Parameter" }, + { 0, NULL } +}; + const value_string gsm_a_dtap_msg_mm_strings[] = { { 0x01, "IMSI Detach Indication" }, { 0x02, "Location Updating Accept" }, @@ -325,6 +346,12 @@ static const value_string gsm_dtap_elem_strings[] = { { DE_TP_EPC_ELLIPSOID_POINT_WITH_ALT, "Ellipsoid Point With Altitude"}, { DE_TP_EPC_HORIZONTAL_VELOCITY, "Horizontal Velocity"}, { DE_TP_EPC_GNSS_TOD_MSEC, "GNSS-TOD-msec"}, + /* Group Call Control Service Information Elements ETSI TS 100 948 V8.1.0 (GSM 04.68 version 8.1.0 Release 1999) */ + { DE_GCC_CALL_REF, "Call Reference"}, + { DE_GCC_CALL_STATE, "Call state"}, + { DE_GCC_CAUSE, "Cause"}, + { DE_GCC_ORIG_IND, "Originator indication"}, + { DE_GCC_STATE_ATTR, "State attributes"}, { 0, NULL } }; value_string_ext gsm_dtap_elem_strings_ext = VALUE_STRING_EXT_INIT(gsm_dtap_elem_strings); @@ -398,6 +425,7 @@ static const true_false_string tfs_acceptable_not_acceptable = { "Acceptable", " #define DTAP_TIE_MASK 0x7f #define DTAP_MM_IEI_MASK 0x3f +#define DTAP_GCC_IEI_MASK 0x3f #define DTAP_CC_IEI_MASK 0x3f #define DTAP_SMS_IEI_MASK 0xff #define DTAP_SS_IEI_MASK 0x3f @@ -406,6 +434,7 @@ static const true_false_string tfs_acceptable_not_acceptable = { "Acceptable", " /* Initialize the protocol and registered fields */ static int proto_a_dtap = -1; +static int hf_gsm_a_dtap_msg_gcc_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; @@ -603,6 +632,23 @@ static int hf_gsm_a_dtap_acceptable_channel_codings_spare20 = -1; static int hf_gsm_a_dtap_establishment = -1; static int hf_gsm_a_dtap_duplex_mode = -1; +static int hf_gsm_a_dtap_gcc_call_ref = -1; +static int hf_gsm_a_dtap_gcc_call_ref_has_priority = -1; +static int hf_gsm_a_dtap_gcc_call_priority = -1; +static int hf_gsm_a_dtap_gcc_call_state = -1; +static int hf_gsm_a_dtap_gcc_cause = -1; +static int hf_gsm_a_dtap_gcc_cause_structure = -1; +static int hf_gsm_a_dtap_gcc_orig_ind = -1; +static int hf_gsm_a_dtap_gcc_state_attr = -1; +static int hf_gsm_a_dtap_gcc_state_attr_da = -1; +static int hf_gsm_a_dtap_gcc_state_attr_ua = -1; +static int hf_gsm_a_dtap_gcc_state_attr_comm = -1; +static int hf_gsm_a_dtap_gcc_state_attr_oi = -1; + +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; + /* Initialize the subtree pointers */ static gint ett_dtap_msg = -1; static gint ett_dtap_oct_1 = -1; @@ -3830,6 +3876,186 @@ de_tp_epc_gnss_tod_msec(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, return (curr_offset - offset); } +static const value_string gcc_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_gcc_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_gcc_call_ref, tvb, curr_offset, 4, ENC_BIG_ENDIAN); + + if (value & 0x10){ + proto_tree_add_item(tree, hf_gsm_a_dtap_gcc_call_ref_has_priority, tvb, curr_offset, 4, ENC_NA); + proto_tree_add_item(tree, hf_gsm_a_dtap_gcc_call_priority, tvb, curr_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_dtap_gcc_spare_1, tvb, curr_offset, 4, ENC_NA); + } + else{ + proto_tree_add_item(tree, hf_gsm_a_dtap_gcc_call_ref_has_priority, tvb, curr_offset, 4, ENC_NA); + proto_tree_add_item(tree, hf_gsm_a_dtap_gcc_spare_4, tvb, curr_offset, 4, ENC_NA); + } + + curr_offset += 4; + + return(curr_offset - offset); +} + +static const value_string gcc_call_state_vals[] = { + { 0, "U0"}, + { 1, "U1"}, + { 2, "U2sl"}, + { 3, "U3"}, + { 4, "U4"}, + { 5, "U5"}, + { 6, "U0.p"}, + { 7, "U2wr"}, + { 8, "U2r"}, + { 9, "U2ws"}, + { 10, "U2sr"}, + { 11, "U2nc"}, + { 0, NULL } + /* All other values are reserved. */ +}; + +static guint16 +de_gcc_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_gcc_call_state, tvb, offset, 2, ENC_BIG_ENDIAN); + + return 2; +} + +static const range_string gcc_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 gcc_cause_structure_val = { + "cause_part [diagnostics]", + "cause_part <cause>" +}; + +static guint16 +de_gcc_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_gcc_cause_structure, tvb, curr_offset, 1, ENC_NA); + proto_tree_add_item(tree, hf_gsm_a_dtap_gcc_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 gcc_orig_ind_vals = { + "The MS is the originator of the call", + "The MS is not the originator of the call" +}; +static guint16 +de_gcc_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_gcc_spare_3, tvb, curr_offset, 1, ENC_NA); + proto_tree_add_item(tree, hf_gsm_a_dtap_gcc_orig_ind, tvb, curr_offset, 1, ENC_NA); + + curr_offset++; + + return(curr_offset - offset); +} + +static const true_false_string gcc_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 gcc_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 gcc_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 gcc_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_gcc_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_gcc_state_attr, tvb, offset, 1, ENC_NA); + proto_tree_add_item(tree, hf_gsm_a_dtap_gcc_state_attr_da, tvb, offset, 1, ENC_NA); + proto_tree_add_item(tree, hf_gsm_a_dtap_gcc_state_attr_ua, tvb, offset, 1, ENC_NA); + proto_tree_add_item(tree, hf_gsm_a_dtap_gcc_state_attr_comm, tvb, offset, 1, ENC_NA); + proto_tree_add_item(tree, hf_gsm_a_dtap_gcc_state_attr_oi, tvb, offset, 1, ENC_NA); + + return 1; +} + 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 */ @@ -3916,12 +4142,206 @@ guint16 (*dtap_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _ de_tp_epc_ellipsoid_point_with_alt, /* ellipsoidPointWithAltitude */ de_tp_epc_horizontal_velocity, /* horizontalVelocity */ de_tp_epc_gnss_tod_msec, /* gnss-TOD-msec */ + /* GCC Elements */ + de_gcc_call_ref, /* Call Reference */ + de_gcc_call_state, /* Call state */ + de_gcc_cause, /* Cause */ + de_gcc_orig_ind, /* Originator indication */ + de_gcc_state_attr, /* State attributes */ NULL, /* NONE */ }; /* MESSAGE FUNCTIONS */ /* + * [12] 8.3 IMMEDIATE SETUP + */ +static void +dtap_gcc_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_GCC_CALL_REF, NULL); + ELEM_OPT_TLV(0x7e, GSM_A_PDU_TYPE_DTAP, DE_USER_USER, NULL); +} + +/* + * [12] 8.5 SETUP + */ +static void +dtap_gcc_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_GCC_CALL_REF, NULL); + ELEM_OPT_TLV(0x7e, GSM_A_PDU_TYPE_DTAP, DE_USER_USER, NULL); +} + +/* + * [12] 8.1 CONNECT + */ +static void +dtap_gcc_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_GCC_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_GCC_ORIG_IND, NULL); +} + +/* + * [12] 8.7 TERMINATION + */ +static void +dtap_gcc_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_GCC_CAUSE, NULL); +} + +/* + * [12] 8.9 TERMINATION REQUEST + */ +static void +dtap_gcc_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_GCC_CALL_REF, NULL); +} + +/* + * [12] 8.8 TERMINATION REJECT + */ +static void +dtap_gcc_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_GCC_CAUSE, "(Reject Cause)"); +} + +/* + * [12] 8.6 STATUS + */ +static void +dtap_gcc_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_GCC_CAUSE, NULL); + ELEM_OPT_TV_SHORT(0xa0, GSM_A_PDU_TYPE_DTAP, DE_GCC_CALL_STATE, NULL); + ELEM_OPT_TV_SHORT(0xb0, GSM_A_PDU_TYPE_DTAP, DE_GCC_STATE_ATTR, NULL); +} + +/* + * [12] 8.2 GET STATUS + */ +static void +dtap_gcc_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); +} + +/* + * [12] 8.4 SET PARAMETER + */ +static void +dtap_gcc_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_GCC_STATE_ATTR, NULL); + +} + +/* * [4] 9.2.2 Authentication request */ static void @@ -5664,6 +6084,21 @@ dtap_tp_epc_update_ue_location_information(tvbuff_t *tvb, proto_tree *tree, pack EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_dtap_extraneous_data); } +#define NUM_GSM_DTAP_MSG_GCC (sizeof(gsm_a_dtap_msg_gcc_strings)/sizeof(value_string)) +static gint ett_gsm_dtap_msg_gcc[NUM_GSM_DTAP_MSG_GCC]; +static void (*dtap_msg_gcc[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) = { + dtap_gcc_imm_setup, /* IMMEDIATE SETUP */ + dtap_gcc_setup, /* SETUP */ + dtap_gcc_connect, /* CONNECT */ + dtap_gcc_term, /* TERMINATION */ + dtap_gcc_term_req, /* TERMINATION REQUEST */ + dtap_gcc_term_rej, /* TERMINATION REJECT */ + dtap_gcc_status, /* STATUS */ + dtap_gcc_get_status, /* GET STATUS */ + dtap_gcc_set_param, /* SET PARAMETER */ + 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) = { @@ -5885,6 +6320,17 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) ett_tree and dtap_msg_fcn will not be used if msg_str == NULL. */ switch (pd) { + case 0: + msg_str = try_val_to_str_idx((guint32) (oct & DTAP_GCC_IEI_MASK), gsm_a_dtap_msg_gcc_strings, &idx); + if (msg_str != NULL) + { + ett_tree = ett_gsm_dtap_msg_gcc[idx]; + dtap_msg_fcn = dtap_msg_gcc[idx]; + } + hf_idx = hf_gsm_a_dtap_msg_gcc_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) @@ -6105,6 +6551,11 @@ proto_register_gsm_a_dtap(void) FT_UINT8, BASE_DEC, NULL, 0xc0, NULL, HFILL } }, + { &hf_gsm_a_dtap_msg_gcc_type, + { "DTAP Group Call Control Message Type", "gsm_a.dtap.msg_gcc_type", + FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_gcc_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, @@ -6580,6 +7031,81 @@ proto_register_gsm_a_dtap(void) FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_gsm_a_dtap_gcc_call_ref, + { "Call Reference", "gsm_a.dtap.gcc.call_ref", + FT_UINT32, BASE_DEC, NULL, 0xffffffe0, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_gcc_call_ref_has_priority, + { "Call Reference includes priority", "gsm_a.dtap.gcc.call_ref_has_priority", + FT_BOOLEAN, 32, NULL, 0x00000010, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_gcc_call_priority, + { "Call Priority", "gsm_a.dtap.gcc.call_priority", + FT_UINT32, BASE_DEC, VALS(gcc_call_ref_priority), 0x0000000e, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_gcc_call_state, + { "Call state", "gsm_a.dtap.gcc.call_state", + FT_UINT24, BASE_DEC, VALS(gcc_call_state_vals), 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_gcc_cause_structure, + { "Cause structure", "gsm_a.dtap.gcc.cause_structure", + FT_BOOLEAN, 8, TFS(&gcc_cause_structure_val), 0x80, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_gcc_cause, + { "Cause", "gsm_a.dtap.gcc.cause", + FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gcc_cause_vals), 0x7f, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_gcc_orig_ind, + { "Originator indication", "gsm_a.dtap.gcc.orig_ind", + FT_BOOLEAN, 8, TFS(&gcc_orig_ind_vals), 0x01, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_gcc_state_attr, + { "State attributes", "gsm_a.dtap.gcc.state_attr", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_gcc_state_attr_da, + { "DA", "gsm_a.dtap.gcc.state_attr_da", + FT_BOOLEAN, 8, TFS(&gcc_state_attr_da), 0x08, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_gcc_state_attr_ua, + { "UA", "gsm_a.dtap.gcc.state_attr_ua", + FT_BOOLEAN, 8, TFS(&gcc_state_attr_ua), 0x04, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_gcc_state_attr_comm, + { "COMM", "gsm_a.dtap.gcc.state_attr_comm", + FT_BOOLEAN, 8, TFS(&gcc_state_attr_comm), 0x02, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_gcc_state_attr_oi, + { "OI", "gsm_a.dtap.gcc.state_attr_oi", + FT_BOOLEAN, 8, TFS(&gcc_state_attr_oi), 0x01, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_gcc_spare_1, + { "Spare_1 (This field shall be ignored)", "gsm_a.dtap.gcc.spare_1", + FT_UINT32, BASE_DEC, NULL, 0x00000001, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_gcc_spare_3, + { "Spare_3 (This field shall be ignored)", "gsm_a.dtap.gcc.spare_3", + FT_UINT8, BASE_DEC, NULL, 0x0e, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_gcc_spare_4, + { "Spare_4 (This field shall be ignored)", "gsm_a.dtap.gcc.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", |