/* packet-gsm_a_common.h
- *
- * $Id$
*
* Reference [3]
* Mobile radio interface Layer 3 specification;
* (3GPP TS 24.008 version 6.7.0 Release 6)
* (3GPP TS 24.008 version 6.8.0 Release 6)
*
+ * 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
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
#ifndef __PACKET_GSM_A_COMMON_H__
#define __PACKET_GSM_A_COMMON_H__
+#include <epan/proto.h>
+
#include "packet-sccp.h"
+#include "ws_symbol_export.h"
/* PROTOTYPES/FORWARDS */
typedef guint16 (*elem_fcn)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
typedef void (*msg_fcn)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len);
-#if 0
-/* XXX moved to tvbuff.h, clean up later */
-typedef struct dgt_set_t
-{
- unsigned char out[15];
-}
-dgt_set_t;
-#endif
int my_dgt_tbcd_unpack(
char *out, /* ASCII pattern out */
guchar *in, /* packed pattern in */
extern guint16 de_cld_party_bcd_num(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
/* Needed to share the packet-gsm_a_common.c functions */
-extern const value_string gsm_bssmap_elem_strings[];
+extern value_string_ext gsm_bssmap_elem_strings_ext;
extern gint ett_gsm_bssmap_elem[];
extern elem_fcn bssmap_elem_fcn[];
extern int hf_gsm_a_bssmap_elem_id;
-extern const value_string gsm_dtap_elem_strings[];
+extern value_string_ext gsm_dtap_elem_strings_ext;
extern gint ett_gsm_dtap_elem[];
extern elem_fcn dtap_elem_fcn[];
extern int hf_gsm_a_dtap_elem_id;
-extern const value_string gsm_rp_elem_strings[];
+extern value_string_ext gsm_rp_elem_strings_ext;
extern gint ett_gsm_rp_elem[];
extern elem_fcn rp_elem_fcn[];
extern int hf_gsm_a_rp_elem_id;
-extern const value_string gsm_rr_elem_strings[];
+extern value_string_ext gsm_rr_elem_strings_ext;
extern gint ett_gsm_rr_elem[];
extern elem_fcn rr_elem_fcn[];
extern int hf_gsm_a_rr_elem_id;
extern void get_rr_msg_params(guint8 oct, const gchar **msg_str, int *ett_tree, int *hf_idx, msg_fcn *msg_fcn);
-extern const value_string gsm_common_elem_strings[];
+extern value_string_ext gsm_common_elem_strings_ext;
extern gint ett_gsm_common_elem[];
extern elem_fcn common_elem_fcn[];
extern int hf_gsm_a_common_elem_id;
-extern const value_string gsm_gm_elem_strings[];
+extern value_string_ext gsm_gm_elem_strings_ext;
extern gint ett_gsm_gm_elem[];
extern elem_fcn gm_elem_fcn[];
extern int hf_gsm_a_gm_elem_id;
extern void get_gmm_msg_params(guint8 oct, const gchar **msg_str, int *ett_tree, int *hf_idx, msg_fcn *msg_fcn);
extern void get_sm_msg_params(guint8 oct, const gchar **msg_str, int *ett_tree, int *hf_idx, msg_fcn *msg_fcn);
-extern const value_string gsm_bsslap_elem_strings[];
+extern value_string_ext gsm_bsslap_elem_strings_ext;
extern gint ett_gsm_bsslap_elem[];
extern elem_fcn bsslap_elem_fcn[];
extern int hf_gsm_a_bsslap_elem_id;
-extern const value_string gsm_bssmap_le_elem_strings[];
+extern value_string_ext gsm_bssmap_le_elem_strings_ext;
extern gint ett_gsm_bssmap_le_elem[];
extern elem_fcn bssmap_le_elem_fcn[];
extern int hf_gsm_bssmap_le_elem_id;
-extern const value_string nas_eps_common_elem_strings[];
+extern value_string_ext nas_eps_common_elem_strings_ext;
extern gint ett_nas_eps_common_elem[];
extern elem_fcn nas_eps_common_elem_fcn[];
extern int hf_nas_eps_common_elem_id;
-extern const value_string nas_emm_elem_strings[];
+extern value_string_ext nas_emm_elem_strings_ext;
extern gint ett_nas_eps_emm_elem[];
extern elem_fcn emm_elem_fcn[];
extern int hf_nas_eps_emm_elem_id;
-extern const value_string nas_esm_elem_strings[];
+extern value_string_ext nas_esm_elem_strings_ext;
extern gint ett_nas_eps_esm_elem[];
extern elem_fcn esm_elem_fcn[];
extern int hf_nas_eps_esm_elem_id;
-extern const value_string sgsap_elem_strings[];
+extern value_string_ext sgsap_elem_strings_ext;
extern gint ett_sgsap_elem[];
extern elem_fcn sgsap_elem_fcn[];
extern int hf_sgsap_elem_id;
-extern const value_string bssgp_elem_strings[];
+extern value_string_ext bssgp_elem_strings_ext;
extern gint ett_bssgp_elem[];
extern elem_fcn bssgp_elem_fcn[];
extern int hf_bssgp_elem_id;
-extern const value_string gmr1_ie_common_strings[];
+extern value_string_ext gmr1_ie_common_strings_ext;
extern elem_fcn gmr1_ie_common_func[];
extern gint ett_gmr1_ie_common[];
-extern int hf_gmr1_elem_id;
-extern const value_string gmr1_ie_rr_strings[];
+extern value_string_ext gmr1_ie_rr_strings_ext;
extern elem_fcn gmr1_ie_rr_func[];
extern gint ett_gmr1_ie_rr[];
-extern sccp_msg_info_t* sccp_msg;
extern sccp_assoc_info_t* sccp_assoc;
extern int gsm_a_tap;
extern int hf_gsm_a_spare_bits;
extern int hf_gsm_a_lac;
-/* for the nasty hack below */
-#define GSM_BSSMAP_APDU_IE 0x49
-
/* flags for the packet-gsm_a_common routines */
#define GSM_A_PDU_TYPE_BSSMAP 0 /* BSSAP_PDU_TYPE_BSSMAP i.e. 0 - until split complete at least! */
#define GSM_A_PDU_TYPE_DTAP 1 /* BSSAP_PDU_TYPE_DTAP i.e. 1 - until split complete at least! */
#define IS_UPLINK_UNKNOWN 2
/* Defines for handling half octet mandatory V IEs
- * Named LEFT and RIGHT (as displayed) because the GSM definitions and our internal representation
+ * Named LEFT and RIGHT (as displayed) because the GSM definitions and our internal representation
* have the bits numbered in opposite senses
*/
#define LEFT_NIBBLE (2)
/* FUNCTIONS */
/* ELEMENT FUNCTIONS */
-
-#define EXTRANEOUS_DATA_CHECK(edc_len, edc_max_len) \
+#define EXTRANEOUS_DATA_CHECK(edc_len, edc_max_len, pinfo, ei) \
if ((edc_len) > (edc_max_len)) \
{ \
- proto_tree_add_text(tree, tvb, \
- curr_offset, (edc_len) - (edc_max_len), "Extraneous Data"); \
+ proto_tree_add_expert(tree, pinfo, ei, tvb, curr_offset, (edc_len) - (edc_max_len)); \
curr_offset += ((edc_len) - (edc_max_len)); \
}
-#define EXTRANEOUS_DATA_CHECK_EXPERT(edc_len, edc_max_len, pinfo) \
- if ((edc_len) > (edc_max_len)) \
- { \
- proto_item *expert_item; \
- expert_item = proto_tree_add_text(tree, tvb, \
- curr_offset, (edc_len) - (edc_max_len), "Extraneous Data, dissector bug or later version spec(report to wireshark.org)"); \
- expert_add_info_format(pinfo, expert_item, PI_PROTOCOL, PI_NOTE, "Extraneous Data, dissector bug or later version spec(report to wireshark.org)"); \
- PROTO_ITEM_SET_GENERATED(expert_item); \
- curr_offset += ((edc_len) - (edc_max_len)); \
- }
-
-#define SHORT_DATA_CHECK(sdc_len, sdc_min_len) \
- if ((sdc_len) < (sdc_min_len)) \
- { \
- proto_tree_add_text(tree, tvb, \
- curr_offset, (sdc_len), "Short Data (?)"); \
- curr_offset += (sdc_len); \
- return(curr_offset - offset); \
- }
-
-#define EXACT_DATA_CHECK(edc_len, edc_eq_len) \
- if ((edc_len) != (edc_eq_len)) \
- { \
- proto_tree_add_text(tree, tvb, \
- curr_offset, (edc_len), "Unexpected Data Length"); \
- curr_offset += (edc_len); \
- return(curr_offset - offset); \
- }
-
#define NO_MORE_DATA_CHECK(nmdc_len) \
- if ((nmdc_len) == (curr_offset - offset)) return(nmdc_len);
+ if ((nmdc_len) <= (curr_offset - offset)) return(nmdc_len);
-#define SET_ELEM_VARS(SEV_pdu_type, SEV_elem_names, SEV_elem_ett, SEV_elem_funcs) \
+#define SET_ELEM_VARS(SEV_pdu_type, SEV_elem_names_ext, SEV_elem_ett, SEV_elem_funcs, ei_unknown) \
switch (SEV_pdu_type) \
{ \
case GSM_A_PDU_TYPE_BSSMAP: \
- SEV_elem_names = gsm_bssmap_elem_strings; \
+ SEV_elem_names_ext = gsm_bssmap_elem_strings_ext; \
SEV_elem_ett = ett_gsm_bssmap_elem; \
SEV_elem_funcs = bssmap_elem_fcn; \
break; \
case GSM_A_PDU_TYPE_DTAP: \
- SEV_elem_names = gsm_dtap_elem_strings; \
+ SEV_elem_names_ext = gsm_dtap_elem_strings_ext; \
SEV_elem_ett = ett_gsm_dtap_elem; \
SEV_elem_funcs = dtap_elem_fcn; \
break; \
case GSM_A_PDU_TYPE_RP: \
- SEV_elem_names = gsm_rp_elem_strings; \
+ SEV_elem_names_ext = gsm_rp_elem_strings_ext; \
SEV_elem_ett = ett_gsm_rp_elem; \
SEV_elem_funcs = rp_elem_fcn; \
break; \
case GSM_A_PDU_TYPE_RR: \
- SEV_elem_names = gsm_rr_elem_strings; \
+ SEV_elem_names_ext = gsm_rr_elem_strings_ext; \
SEV_elem_ett = ett_gsm_rr_elem; \
SEV_elem_funcs = rr_elem_fcn; \
break; \
case GSM_A_PDU_TYPE_COMMON: \
- SEV_elem_names = gsm_common_elem_strings; \
+ SEV_elem_names_ext = gsm_common_elem_strings_ext; \
SEV_elem_ett = ett_gsm_common_elem; \
SEV_elem_funcs = common_elem_fcn; \
break; \
case GSM_A_PDU_TYPE_GM: \
- SEV_elem_names = gsm_gm_elem_strings; \
+ SEV_elem_names_ext = gsm_gm_elem_strings_ext; \
SEV_elem_ett = ett_gsm_gm_elem; \
SEV_elem_funcs = gm_elem_fcn; \
break; \
case GSM_A_PDU_TYPE_BSSLAP: \
- SEV_elem_names = gsm_bsslap_elem_strings; \
+ SEV_elem_names_ext = gsm_bsslap_elem_strings_ext; \
SEV_elem_ett = ett_gsm_bsslap_elem; \
SEV_elem_funcs = bsslap_elem_fcn; \
break; \
case GSM_PDU_TYPE_BSSMAP_LE: \
- SEV_elem_names = gsm_bssmap_le_elem_strings; \
+ SEV_elem_names_ext = gsm_bssmap_le_elem_strings_ext; \
SEV_elem_ett = ett_gsm_bssmap_le_elem; \
SEV_elem_funcs = bssmap_le_elem_fcn; \
break; \
case NAS_PDU_TYPE_COMMON: \
- SEV_elem_names = nas_eps_common_elem_strings; \
+ SEV_elem_names_ext = nas_eps_common_elem_strings_ext; \
SEV_elem_ett = ett_nas_eps_common_elem; \
SEV_elem_funcs = nas_eps_common_elem_fcn; \
break; \
case NAS_PDU_TYPE_EMM: \
- SEV_elem_names = nas_emm_elem_strings; \
+ SEV_elem_names_ext = nas_emm_elem_strings_ext; \
SEV_elem_ett = ett_nas_eps_emm_elem; \
SEV_elem_funcs = emm_elem_fcn; \
break; \
case NAS_PDU_TYPE_ESM: \
- SEV_elem_names = nas_esm_elem_strings; \
+ SEV_elem_names_ext = nas_esm_elem_strings_ext; \
SEV_elem_ett = ett_nas_eps_esm_elem; \
SEV_elem_funcs = esm_elem_fcn; \
break; \
case SGSAP_PDU_TYPE: \
- SEV_elem_names = sgsap_elem_strings; \
+ SEV_elem_names_ext = sgsap_elem_strings_ext; \
SEV_elem_ett = ett_sgsap_elem; \
SEV_elem_funcs = sgsap_elem_fcn; \
break; \
case BSSGP_PDU_TYPE: \
- SEV_elem_names = bssgp_elem_strings; \
+ SEV_elem_names_ext = bssgp_elem_strings_ext; \
SEV_elem_ett = ett_bssgp_elem; \
SEV_elem_funcs = bssgp_elem_fcn; \
break; \
case GMR1_IE_COMMON: \
- SEV_elem_names = gmr1_ie_common_strings; \
+ SEV_elem_names_ext = gmr1_ie_common_strings_ext; \
SEV_elem_ett = ett_gmr1_ie_common; \
SEV_elem_funcs = gmr1_ie_common_func; \
break; \
case GMR1_IE_RR: \
- SEV_elem_names = gmr1_ie_rr_strings; \
+ SEV_elem_names_ext = gmr1_ie_rr_strings_ext; \
SEV_elem_ett = ett_gmr1_ie_rr; \
SEV_elem_funcs = gmr1_ie_rr_func; \
break; \
default: \
- proto_tree_add_text(tree, \
+ proto_tree_add_expert_format(tree, pinfo, ei_unknown, \
tvb, curr_offset, -1, \
"Unknown PDU type (%u) gsm_a_common", SEV_pdu_type); \
return(consumed); \
/*
* Type Length Value (TLV) element dissector
*/
-extern guint16 elem_tlv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, guint len, const gchar *name_add);
+WS_DLL_PUBLIC guint16 elem_tlv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, guint len, const gchar *name_add);
/*
* Type Extendable Length Value (TLVE) element dissector
*/
-extern guint16 elem_telv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, guint len, const gchar *name_add);
+guint16 elem_telv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, guint len, const gchar *name_add);
/*
* Type Length Value (TLV-E) element dissector
*/
-extern guint16 elem_tlv_e(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, guint len, const gchar *name_add);
+guint16 elem_tlv_e(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, guint len, const gchar *name_add);
/*
* Type Value (TV) element dissector
* Length cannot be used in these functions, big problem if a element dissector
* is not defined for these.
*/
-extern guint16 elem_tv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, const gchar *name_add);
+WS_DLL_PUBLIC guint16 elem_tv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, const gchar *name_add);
/*
* Type Value (TV) element dissector
* Length cannot be used in these functions, big problem if a element dissector
* is not defined for these.
*/
-extern guint16 elem_tv_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, const gchar *name_add);
+WS_DLL_PUBLIC guint16 elem_tv_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, const gchar *name_add);
/*
* Type (T) element dissector
*/
-extern guint16 elem_t(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, const gchar *name_add);
+WS_DLL_PUBLIC guint16 elem_t(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, const gchar *name_add);
/*
* Length Value (LV) element dissector
*/
-extern guint16 elem_lv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int idx, guint32 offset, guint len, const gchar *name_add);
+WS_DLL_PUBLIC guint16 elem_lv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int idx, guint32 offset, guint len, const gchar *name_add);
/*
* Length Value (LV-E) element dissector
*/
-extern guint16 elem_lv_e(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int idx, guint32 offset, guint len, const gchar *name_add);
+guint16 elem_lv_e(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int idx, guint32 offset, guint len, const gchar *name_add);
/*
* Value (V) element dissector
* Length cannot be used in these functions, big problem if a element dissector
* is not defined for these.
*/
-extern guint16 elem_v(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int idx, guint32 offset, const gchar *name_add);
+WS_DLL_PUBLIC guint16 elem_v(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int idx, guint32 offset, const gchar *name_add);
/*
* Short Value (V_SHORT) element dissector
*
- * nibble used in this functions to indicate left or right nibble of the octet
+ * nibble used in this functions to indicate left or right nibble of the octet
* This is expected to be used right nibble first, as the tables of 24.008.
*/
-extern guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int idx, guint32 offset, guint32 nibble);
+WS_DLL_PUBLIC guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int idx, guint32 offset, guint32 nibble);
/* XXX: Most (if not all) the functions which make use of the following macros have the variables 'consumed',
* Is there a better approach ?
*/
-#define ELEM_MAND_TLV(EMT_iei, EMT_pdu_type, EMT_elem_idx, EMT_elem_name_addition) \
+#define ELEM_MAND_TLV(EMT_iei, EMT_pdu_type, EMT_elem_idx, EMT_elem_name_addition, ei_mandatory) \
{\
if ((consumed = elem_tlv(tvb, tree, pinfo, (guint8) EMT_iei, EMT_pdu_type, EMT_elem_idx, curr_offset, curr_len, EMT_elem_name_addition)) > 0) \
{ \
} \
else \
{ \
- proto_tree_add_text(tree, \
+ proto_tree_add_expert_format(tree, pinfo, &ei_mandatory, \
tvb, curr_offset, 0, \
"Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect", \
EMT_iei, \
* octet 2 0/1 ext length
* octet 2a length
*/
-#define ELEM_MAND_TELV(EMT_iei, EMT_pdu_type, EMT_elem_idx, EMT_elem_name_addition) \
+#define ELEM_MAND_TELV(EMT_iei, EMT_pdu_type, EMT_elem_idx, EMT_elem_name_addition, ei_mandatory) \
{\
if ((consumed = elem_telv(tvb, tree, pinfo, (guint8) EMT_iei, EMT_pdu_type, EMT_elem_idx, curr_offset, curr_len, EMT_elem_name_addition)) > 0) \
{ \
} \
else \
{ \
- proto_tree_add_text(tree, \
+ proto_tree_add_expert_format(tree, pinfo, &ei_mandatory, \
tvb, curr_offset, 0, \
"Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect", \
EMT_iei, \
if ((signed)curr_len <= 0) return; \
}
-#define ELEM_MAND_TLV_E(EMT_iei, EMT_pdu_type, EMT_elem_idx, EMT_elem_name_addition) \
+#define ELEM_MAND_TLV_E(EMT_iei, EMT_pdu_type, EMT_elem_idx, EMT_elem_name_addition, ei_mandatory) \
{\
if ((consumed = elem_tlv_e(tvb, tree, pinfo, (guint8) EMT_iei, EMT_pdu_type, EMT_elem_idx, curr_offset, curr_len, EMT_elem_name_addition)) > 0) \
{ \
} \
else \
{ \
- proto_tree_add_text(tree, \
+ proto_tree_add_expert_format(tree, pinfo, &ei_mandatory, \
tvb, curr_offset, 0, \
"Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect", \
EMT_iei, \
if ((signed)curr_len <= 0) return; \
}
-#define ELEM_MAND_TV(EMT_iei, EMT_pdu_type, EMT_elem_idx, EMT_elem_name_addition) \
+#define ELEM_MAND_TV(EMT_iei, EMT_pdu_type, EMT_elem_idx, EMT_elem_name_addition, ei_mandatory) \
{\
if ((consumed = elem_tv(tvb, tree, pinfo, (guint8) EMT_iei, EMT_pdu_type, EMT_elem_idx, curr_offset, EMT_elem_name_addition)) > 0) \
{ \
} \
else \
{ \
- proto_tree_add_text(tree, \
+ proto_tree_add_expert_format(tree, pinfo, &ei_mandatory,\
tvb, curr_offset, 0, \
"Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect", \
EMT_iei, \
gsm_a_pd_str_e protocol_disc;
} gsm_a_tap_rec_t;
-void dissect_bssmap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
-
-void dissect_bssmap_le(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
-
void bssmap_old_bss_to_new_bss_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo);
void bssmap_new_bss_to_old_bss_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo);
guint16 be_chan_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
guint16 be_prio(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_lai(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_mid(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_cell_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
guint16 de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
guint16 de_bearer_cap_uplink(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
guint16 de_cs_domain_spec_sys_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
guint16 de_ps_domain_spec_sys_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
guint16 de_plmn_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_ms_cm_1(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_ms_cm_3(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
guint16 de_serv_cat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_sm_apn(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
guint16 de_sm_pco(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_sm_qos(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_sm_pflow_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
guint16 de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
guint16 de_time_zone(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_gmm_drx_param(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_gmm_rai(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
guint16 de_gmm_voice_domain_pref(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
guint16 de_sup_codec_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
-
+
+WS_DLL_PUBLIC
guint16 de_rr_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_rr_cell_dsc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_rr_ch_dsc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_rr_ch_mode(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_rr_chnl_needed(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_rr_cip_mode_set(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_rr_cm_enq_mask(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
guint16 de_rr_meas_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_rr_multirate_conf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_rr_sus_cau(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_rr_tlli(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_rej_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
+WS_DLL_PUBLIC
guint16 de_d_gb_call_ref(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len);
guint16 de_spare_nibble(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_);
guint16 de_emm_sec_par_from_eutra(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_);
guint16 de_emm_sec_par_to_eutra(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_);
guint16 de_esm_qos(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_);
+void nas_esm_pdn_con_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len);
void dtap_rr_ho_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len);
void dtap_rr_cip_mode_cpte(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len);
* without having to duplicate it. With MSVC and a
* libwireshark.dll, we need a special declaration.
*/
-WS_VAR_IMPORT const value_string gsm_a_bssmap_msg_strings[];
-WS_VAR_IMPORT const value_string gsm_a_dtap_msg_mm_strings[];
-WS_VAR_IMPORT const value_string gsm_a_dtap_msg_rr_strings[];
-WS_VAR_IMPORT const value_string gsm_a_dtap_msg_cc_strings[];
-WS_VAR_IMPORT const value_string gsm_a_dtap_msg_gmm_strings[];
-WS_VAR_IMPORT const value_string gsm_a_dtap_msg_sms_strings[];
-WS_VAR_IMPORT const value_string gsm_a_dtap_msg_sm_strings[];
-WS_VAR_IMPORT const value_string gsm_a_dtap_msg_ss_strings[];
-WS_VAR_IMPORT const value_string gsm_a_dtap_msg_tp_strings[];
-WS_VAR_IMPORT const value_string gsm_a_rr_short_pd_msg_strings[];
-WS_VAR_IMPORT const gchar *gsm_a_pd_str[];
+WS_DLL_PUBLIC const value_string gsm_a_bssmap_msg_strings[];
+WS_DLL_PUBLIC const value_string gsm_a_dtap_msg_mm_strings[];
+WS_DLL_PUBLIC const value_string gsm_a_dtap_msg_rr_strings[];
+WS_DLL_PUBLIC const value_string gsm_a_dtap_msg_cc_strings[];
+WS_DLL_PUBLIC const value_string gsm_a_dtap_msg_gmm_strings[];
+WS_DLL_PUBLIC const value_string gsm_a_dtap_msg_sms_strings[];
+WS_DLL_PUBLIC const value_string gsm_a_dtap_msg_sm_strings[];
+WS_DLL_PUBLIC const value_string gsm_a_dtap_msg_ss_strings[];
+WS_DLL_PUBLIC const value_string gsm_a_dtap_msg_tp_strings[];
+WS_DLL_PUBLIC const value_string gsm_a_rr_short_pd_msg_strings[];
+WS_DLL_PUBLIC const gchar *gsm_a_pd_str[];
extern const value_string gsm_a_sm_qos_del_of_err_sdu_vals[];
extern const value_string gsm_a_sm_qos_traffic_cls_vals[];
extern value_string_ext gsm_a_rr_rxlev_vals_ext;
extern const value_string gsm_a_gm_type_of_ciph_alg_vals[];
+extern value_string_ext nas_eps_emm_cause_values_ext;
+
typedef enum
{
/* Common Information Elements [3] 10.5.1 */
typedef enum
{
+ BE_UDEF_0, /* Undefined */
BE_CIC, /* Circuit Identity Code */
BE_RSVD_1, /* Reserved */
BE_RES_AVAIL, /* Resource Available */
BE_RES_SIT, /* Resource Situation */
BE_CURR_CHAN_1, /* Current Channel Type 1 */
BE_QUE_IND, /* Queueing Indicator */
- BE_SPEECH_VER, /* Speech Version */
BE_ASS_REQ, /* Assignment Requirement */
+ BE_UDEF_52, /* Undefined */
BE_TALKER_FLAG, /* Talker Flag */
BE_CONN_REL_REQ, /* Connection Release Requested */
BE_GROUP_CALL_REF, /* Group Call Reference */
BE_LSA_INFO, /* LSA Information */
BE_LCS_QOS, /* LCS QoS */
BE_LSA_ACC_CTRL, /* LSA access control suppression */
+ BE_SPEECH_VER, /* Speech Version */
+ BE_UDEF_65, /* Undefined */
+ BE_UDEF_66, /* Undefined */
BE_LCS_PRIO, /* LCS Priority */
BE_LOC_TYPE, /* Location Type */
BE_LOC_EST, /* Location Estimate */
BE_SRC_RNC_TO_TAR_RNC_CDMA, /* Source RNC to target RNC transparent information (cdma2000) */
BE_GERAN_CLS_M, /* GERAN Classmark */
BE_GERAN_BSC_CONT, /* GERAN BSC Container */
+ BE_VEL_EST, /* Velocity Estimate */
+ BE_UDEF_86, /* Undefined */
+ BE_UDEF_87, /* Undefined */
+ BE_UDEF_88, /* Undefined */
+ BE_UDEF_89, /* Undefined */
+ BE_UDEF_90, /* Undefined */
+ BE_UDEF_91, /* Undefined */
+ BE_UDEF_92, /* Undefined */
+ BE_UDEF_93, /* Undefined */
+ BE_UDEF_94, /* Undefined */
+ BE_UDEF_95, /* Undefined */
+ BE_UDEF_96, /* Undefined */
BE_NEW_BSS_TO_OLD_BSS_INF, /* New BSS to Old BSS Information */
+ BE_UDEF_98, /* Undefined */
BE_INTER_SYS_INF, /* Inter-System Information */
BE_SNA_ACC_INF, /* SNA Access Information */
BE_VSTK_RAND_INF, /* VSTK_RAND Information */
BE_VSTK_INF, /* VSTK Information */
BE_PAGING_INF, /* Paging Information */
BE_IMEI, /* IMEI */
- BE_VEL_EST, /* Velocity Estimate */
BE_VGCS_FEAT_FLG, /* VGCS Feature Flags */
BE_TALKER_PRI, /* Talker Priority */
BE_EMRG_SET_IND, /* Emergency Set Indication */
BE_CALL_ID, /* Call Identifier */
BE_CALL_ID_LST, /* Call Identifier List */
BE_A_ITF_SEL_FOR_RESET, /* A-Interface Selector for RESET */
+ BE_UDEF_130, /* Undefined */
BE_KC128, /* Kc128 */
BE_CSG_ID, /* CSG Identifier */
- BE_NONE /* NONE */
+ BE_REDIR_ATT_FLG, /* Redirect Attempt Flag 3.2.2.111 */
+ BE_REROUTE_REJ_CAUSE, /* Reroute Reject Cause 3.2.2.112 */
+ BE_SEND_SEQN, /* Send Sequence Number 3.2.2.113 */
+ BE_REROUTE_OUTCOME, /* Reroute complete outcome 3.2.2.114 */
+ BE_GLOBAL_CALL_REF, /* Global Call Reference 3.2.2.115 */
+ BE_LCLS_CONF, /* LCLS-Configuration 3.2.2.116 */
+ BE_LCLS_CON_STATUS_CONTROL, /* LCLS-Connection-Status-Control 3.2.2.117 */
+ BE_LCLS_CORR_NOT_NEEDED, /* LCLS-Correlation-Not-Needed 3.2.2.118 */
+ BE_LCLS_BSS_STATUS, /* LCLS-BSS-Status 3.2.2.119 */
+ BE_LCLS_BREAK_REQ, /* LCLS-Break-Request 3.2.2.120 */
+ BE_CSFB_IND, /* CSFB Indication 3.2.2.121 */
+#if 0
+ BE_CS_TO_PS_SRVCC, /* CS to PS SRVCC 3.2.2.122 */
+ BE_SRC_ENB_2_TGT_ENB_TRANSP_INF, /* Source eNB to target eNB transparent information (E-UTRAN)" 3.2.2.123 */
+ BE_CS_TO_PS_SRVCC_IND, /* CS to PS SRVCC Indication 3.2.2.124 */
+ BE_CN_TO_MS_TRANSP, /* CN to MS transparent information 3.2.2.125 */
+#endif
+ BE_SELECTED_PLMN_ID, /* Selected PLMN ID 3.2.2.126 */
+ BE_NONE /* NONE */
}
bssmap_elem_idx_t;
DE_TP_EPC_ELLIPSOID_POINT_WITH_ALT, /* ellipsoidPointWithAltitude */
DE_TP_EPC_HORIZONTAL_VELOCITY, /* horizontalVelocity */
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 */
+ /* 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;
DE_PRO_CONF_OPT, /* Protocol Configuration Options */
DE_PD_PRO_ADDR, /* Packet Data Protocol Address */
DE_QOS, /* Quality Of Service */
+ DE_RE_ATTEMPT_IND, /* Re-attempt indicator */
DE_SM_CAUSE, /* SM Cause */
DE_SM_CAUSE_2, /* SM Cause 2 */
DE_LINKED_TI, /* Linked TI */
DE_REQ_TYPE, /* Request type */
DE_SM_NOTIF_IND, /* Notification indicator */
DE_SM_CONNECTIVITY_TYPE, /* Connectivity type */
+ DE_SM_WLAN_OFFLOAD_ACCEPT, /* WLAN offload acceptability */
/* GPRS Common Information Elements [8] 10.5.7 */
DE_PDP_CONTEXT_STAT, /* [8] 10.5.7.1 PDP Context Status */
DE_RAD_PRIO, /* [8] 10.5.7.2 Radio Priority */
DE_RR_CM_ENQ_MASK, /* [3] 10.5.2.7c Classmark Enquiry Mask */
/* [3] 10.5.2.7d GERAN Iu Mode Classmark information element */
DE_RR_CHNL_NEEDED, /* [3] 10.5.2.8 Channel Needed
- * [3] 10.5.2.8a (void)
- * [3] 10.5.2.8b Channel Request Description 2 */
+ * [3] 10.5.2.8a (void) */
+ DE_RR_CHNL_REQ_DESC2, /* [3] 10.5.2.8b Channel Request Description 2 */
DE_RR_CIP_MODE_SET, /* [3] 10.5.2.9 Cipher Mode Setting */
DE_RR_CIP_MODE_RESP, /* [3] 10.5.2.10 Cipher Response */
DE_RR_CTRL_CH_DESC, /* [3] 10.5.2.11 Control Channel Description */
-/* [3] 10.5.2.11a DTM Information Details */
+ DE_RR_DTM_INFO_DETAILS, /* [3] 10.5.2.11a DTM Information Details */
DE_RR_DYN_ARFCN_MAP, /* [3] 10.5.2.11b Dynamic ARFCN Mapping */
DE_RR_FREQ_CH_SEQ, /* [3] 10.5.2.12 Frequency Channel Sequence */
DE_RR_FREQ_LIST, /* [3] 10.5.2.13 Frequency List */
DE_RR_P3_REST_OCT, /* [3] 10.5.2.25 P3 Rest Octets */
DE_RR_PACKET_CH_DESC, /* [3] 10.5.2.25a Packet Channel Description */
DE_RR_DED_MOD_OR_TBF, /* [3] 10.5.2.25b Dedicated mode or TBF */
-/* [3] 10.5.2.25c RR Packet Uplink Assignment
- * [3] 10.5.2.25d RR Packet Downlink Assignment */
+ DE_RR_PKT_UL_ASS, /* [3] 10.5.2.25c RR Packet Uplink Assignment */
+ DE_RR_PKT_DL_ASS, /* [3] 10.5.2.25d RR Packet Downlink Assignment */
+ DE_RR_PKT_DL_ASS_TYPE2, /* [3] 10.5.2.25d RR Packet Downlink Assignment Type 2 */
DE_RR_PAGE_MODE, /* [3] 10.5.2.26 Page Mode */
-/* [3] 10.5.2.26a (void)
- * [3] 10.5.2.26b (void)
- * [3] 10.5.2.26c (void)
- * [3] 10.5.2.26d (void)
- */
DE_RR_NCC_PERM, /* [3] 10.5.2.27 NCC Permitted */
DE_RR_POW_CMD, /* 10.5.2.28 Power Command */
DE_RR_POW_CMD_AND_ACC_TYPE, /* 10.5.2.28a Power Command and access type */
DE_EMM_NONCE, /* 9.9.3.25 Nonce */
DE_EMM_PAGING_ID, /* 9.9.3.25A Paging identity */
DE_EMM_P_TMSI_SIGN, /* 9.9.3.26 P-TMSI signature, See subclause 10.5.5.8 in 3GPP TS 24.008 [6]. */
+ DE_EMM_EXT_CAUSE, /* 9.9.3.26A Extended EMM cause */
DE_EMM_SERV_TYPE, /* 9.9.3.27 Service type */
DE_EMM_SHORT_MAC, /* 9.9.3.28 Short MAC */
DE_EMM_TZ, /* 9.9.3.29 Time zone, See subclause 10.5.3.8 in 3GPP TS 24.008 [6]. */
DE_SGSAP_EPS_LOC_UPD_TYPE, /* 9.4.2 EPS location update type*/
DE_SGSAP_GLOBAL_CN_ID, /* 9.4.4 Global CN-Id*/
+ DE_SGSAP_UDEF_11, /* Undefined */
DE_SGSAP_UDEF_12, /* Undefined */
- DE_SGSAP_UDEF_13, /* Undefined */
DE_SGSAP_MID, /* 9.4.14 Mobile identity*/
DE_SGSAP_REJ_CAUSE, /* 9.4.16 Reject cause */
DE_SGSAP_NAS_MSG_CONTAINER, /* 9.4.15 NAS message container*/
DE_SGSAP_MM_INFO, /* 9.4.12 MM information*/
- DE_SGSAP_UDEF_24, /* Undefined */
- DE_SGSAP_UDEF_25, /* Undefined */
- DE_SGSAP_UDEF_26, /* Undefined */
+ DE_SGSAP_UDEF_20, /* Undefined */
+ DE_SGSAP_UDEF_21, /* Undefined */
+ DE_SGSAP_UDEF_22, /* Undefined */
DE_SGSAP_ERR_MSG, /* 9.4.3 Erroneous message*/
DE_SGSAP_CLI, /* 9.4.1 CLI */
DE_SGSAP_TAID, /* 9.4.21a Tracking Area Identity */
DE_SGSAP_ECGI, /* 9.4.3a E-UTRAN Cell Global Identity */
DE_SGSAP_UE_EMM_MODE, /* 9.4.21c UE EMM mode*/
+ DE_SGSAP_ADD_PAGING_IND, /* 9.4.25 Additional paging indicators */
+ DE_SGSAP_TMSI_BASED_NRI_CONT, /* 9.4.26 TMSI based NRI container */
+ DE_SGSAP_SELECTED_CS_DMN_OP, /* 9.4.27 Selected CS domain operator */
DE_SGAP_NONE /* NONE */
}
sgsap_elem_idx_t;
#endif /* __PACKET_GSM_A_COMMON_H__ */
+
+/*
+ * Editor modelines - http://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */