Replace tabs in files with editor modeline "expandtab"
[metze/wireshark/wip.git] / epan / dissectors / packet-gsm_a_common.h
index 9314b0c002f9b9d092d5dc6b2185282afdd5bc04..1cdea3e3514bf4e1c7e92096e7de73029311dd53 100644 (file)
@@ -1,6 +1,4 @@
 /* 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 */
@@ -82,84 +89,82 @@ extern const value_string gsm_a_pd_short_str_vals[];
 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;
@@ -183,9 +188,6 @@ extern int hf_gsm_a_gm_rac;
 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! */
@@ -214,7 +216,7 @@ extern const char* get_gsm_a_msg_string(int pdu_type, int idx);
 #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)
@@ -223,127 +225,96 @@ extern const char* get_gsm_a_msg_string(int pdu_type, int idx);
 /* 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); \
@@ -352,17 +323,17 @@ extern const char* get_gsm_a_msg_string(int pdu_type, int idx);
 /*
  * 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
@@ -370,7 +341,7 @@ extern guint16 elem_tlv_e(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, g
  * 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
@@ -379,22 +350,22 @@ extern guint16 elem_tv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guin
  * 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
@@ -402,15 +373,15 @@ extern guint16 elem_lv_e(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gi
  * 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',
@@ -421,7 +392,7 @@ extern guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
  *      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) \
     { \
@@ -430,7 +401,7 @@ extern guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
     } \
     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, \
@@ -446,7 +417,7 @@ extern guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
  * 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) \
     { \
@@ -455,7 +426,7 @@ extern guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
     } \
     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, \
@@ -466,7 +437,7 @@ extern guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
     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) \
     { \
@@ -475,7 +446,7 @@ extern guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
     } \
     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, \
@@ -515,7 +486,7 @@ extern guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
     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) \
     { \
@@ -524,7 +495,7 @@ extern guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
     } \
     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, \
@@ -650,10 +621,6 @@ typedef struct _gsm_a_tap_rec_t {
     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);
 
@@ -664,8 +631,11 @@ guint16 be_cell_id_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gui
 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);
@@ -677,38 +647,60 @@ guint16 de_cn_common_gsm_map_nas_sys_info(tvbuff_t *tvb, proto_tree *tree, packe
 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_);
 
@@ -717,6 +709,7 @@ guint16 de_emm_trac_area_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
 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);
@@ -732,17 +725,17 @@ void rp_data_n_ms(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 o
  * 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[];
@@ -757,6 +750,8 @@ extern const value_string tighter_cap_level_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 */
@@ -785,6 +780,7 @@ common_elem_idx_t;
 
 typedef enum
 {
+    BE_UDEF_0,                          /* Undefined */
     BE_CIC,                             /* Circuit Identity Code */
     BE_RSVD_1,                          /* Reserved */
     BE_RES_AVAIL,                       /* Resource Available */
@@ -835,8 +831,8 @@ typedef enum
     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 */
@@ -848,6 +844,9 @@ typedef enum
     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 */
@@ -866,14 +865,26 @@ typedef enum
     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 */
@@ -899,9 +910,28 @@ typedef enum
     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;
 
@@ -1067,6 +1097,19 @@ typedef enum
     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;
@@ -1116,6 +1159,7 @@ typedef enum
     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 */
@@ -1130,6 +1174,7 @@ typedef enum
     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 */
@@ -1169,12 +1214,12 @@ typedef enum
     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              */
@@ -1210,14 +1255,10 @@ typedef enum
     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     */
@@ -1324,6 +1365,7 @@ typedef enum
     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]. */
@@ -1363,8 +1405,8 @@ typedef enum
     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 */
@@ -1375,9 +1417,9 @@ typedef enum
     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 */
@@ -1390,9 +1432,25 @@ typedef enum
     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:
+ */