aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2006-11-22 06:39:24 +0000
committerAnders Broman <anders.broman@ericsson.com>2006-11-22 06:39:24 +0000
commitd74d57789d2292c017a22225545dcd391bd9b384 (patch)
treeb305c46903c9c11ae03ba6107293f1299512f8d4 /epan/dissectors
parente1c57b07f720cc84a0a20f76616c576a4ef05fc1 (diff)
From Michael Lum
1) A small change in the number of teleservices recognized 2) Finally finished a lot of the changes for IOS 5 support. The attached files must be used together. Built in Windows XP Pro using Visual Studio C++ with the latest repository. packet-ansi_map.c.gz packet-ansi_a.gz This file contains both packet-ansi_a.c and packet-ansi_a.h changes. libwireshark.def.gz ansi_a_stat.c.gz svn path=/trunk/; revision=19955
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-ansi_637.c107
-rw-r--r--epan/dissectors/packet-ansi_a.c3989
-rw-r--r--epan/dissectors/packet-ansi_a.h33
-rw-r--r--epan/dissectors/packet-ansi_map.c48
4 files changed, 3640 insertions, 537 deletions
diff --git a/epan/dissectors/packet-ansi_637.c b/epan/dissectors/packet-ansi_637.c
index b9ec0cabb9..3beaf459c7 100644
--- a/epan/dissectors/packet-ansi_637.c
+++ b/epan/dissectors/packet-ansi_637.c
@@ -109,6 +109,7 @@ static const value_string ansi_tele_id_strings[] = {
{ 4099, "CDMA Voice Mail Notification" },
{ 4100, "CDMA Wireless Application Protocol (WAP)" },
{ 4101, "CDMA Wireless Enhanced Messaging Teleservice (WEMT)" },
+ { 65535, "(Reserved) Being used for Broadcast" },
{ 0, NULL },
};
@@ -133,6 +134,8 @@ static const value_string ansi_tele_param_strings[] = {
{ 0, NULL },
};
+#define ANSI_TRANS_MSG_TYPE_BROADCAST 1
+
static const value_string ansi_trans_msg_type_strings[] = {
{ 0, "Point-to-Point" },
{ 1, "Broadcast" },
@@ -300,6 +303,26 @@ decode_7_bits(tvbuff_t *tvb, guint32 *offset, guint8 num_fields, guint8 *last_oc
}
static void
+tele_param_msg_id(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset)
+{
+ guint32 octs;
+ const gchar *str = NULL;
+
+ EXACT_DATA_CHECK(len, 3);
+
+ octs = tvb_get_ntoh24(tvb, offset);
+
+ proto_tree_add_uint(tree, hf_ansi_637_tele_msg_type,
+ tvb, offset, 3, octs);
+
+ proto_tree_add_uint(tree, hf_ansi_637_tele_msg_id,
+ tvb, offset, 3, octs);
+
+ proto_tree_add_uint(tree, hf_ansi_637_tele_msg_rsvd,
+ tvb, offset, 3, octs);
+}
+
+static void
tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset)
{
guint8 oct, oct2;
@@ -881,7 +904,7 @@ tele_param_disp_mode(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset)
#define NUM_TELE_PARAM (sizeof(ansi_tele_param_strings)/sizeof(value_string))
static gint ett_ansi_637_tele_param[NUM_TELE_PARAM];
static void (*ansi_637_tele_param_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset) = {
- NULL, /* Message Identifier */
+ tele_param_msg_id, /* Message Identifier */
tele_param_user_data, /* User Data */
tele_param_rsp_code, /* User Response Code */
tele_param_timestamp, /* Message Center Time Stamp */
@@ -1580,63 +1603,10 @@ dissect_ansi_637_tele_param(tvbuff_t *tvb, proto_tree *tree, guint32 *offset)
static void
dissect_ansi_637_tele_message(tvbuff_t *tvb, proto_tree *ansi_637_tree)
{
- guint8 oct;
guint8 len;
- guint32 octs;
guint32 curr_offset;
- /* guint32 msg_id; */
- guint32 msg_type;
- const gchar *str = NULL;
- proto_item *item;
- proto_tree *subtree;
-
-
- oct = tvb_get_guint8(tvb, 0);
- if (oct != 0x00)
- {
- return;
- }
-
- len = tvb_get_guint8(tvb, 1);
- if (len != 3)
- {
- return;
- }
-
- octs = tvb_get_ntoh24(tvb, 2);
- msg_type = (octs >> 20) & 0x0f;
- /* msg_id = (octs >> 4) & 0xffff; */
-
- str = match_strval(msg_type, ansi_tele_msg_type_strings);
-
- /*
- * do not append to COL_INFO
- */
-
- item =
- proto_tree_add_none_format(ansi_637_tree, hf_ansi_637_none,
- tvb, 0, -1, str);
-
- subtree = proto_item_add_subtree(item, ett_params);
-
- proto_tree_add_uint(subtree, hf_ansi_637_tele_subparam_id,
- tvb, 0, 1, oct);
-
- proto_tree_add_uint(subtree, hf_ansi_637_length,
- tvb, 1, 1, len);
- proto_tree_add_uint(subtree, hf_ansi_637_tele_msg_type,
- tvb, 2, 3, octs);
-
- proto_tree_add_uint(subtree, hf_ansi_637_tele_msg_id,
- tvb, 2, 3, octs);
-
- proto_tree_add_uint(subtree, hf_ansi_637_tele_msg_rsvd,
- tvb, 2, 3, octs);
-
- proto_item_set_len(item, 2 + len);
-
- curr_offset = 2 + len;
+ curr_offset = 0;
len = tvb_length(tvb);
while ((len - curr_offset) > 0)
@@ -1720,10 +1690,19 @@ dissect_ansi_637_tele(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
str = "Reserved for assignment by this Standard for TDMA MS-based SMEs";
}
- else if ((value >= 49152) && (value <= 65535))
+ else if ((value >= 49152) && (value < 65535))
{
str = "Reserved for carrier specific teleservices";
}
+ else if (value == 65535)
+ {
+ /*
+ * supposed to be "Reserved for carrier specific teleservices"
+ * but we are using it to key SMS Broadcast dissection were
+ * there is no teleservice ID
+ */
+ str = "(Reserved) Being used for Broadcast";
+ }
else
{
str = "Unrecognized Teleservice ID";
@@ -1844,6 +1823,11 @@ dissect_ansi_637_trans(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
g_tree = tree;
/*
+ * reset the teleservice ID for each dissection
+ */
+ ansi_637_trans_tele_id = 0;
+
+ /*
* create the ansi_637 protocol tree
*/
oct = tvb_get_guint8(tvb, 0);
@@ -1871,6 +1855,17 @@ dissect_ansi_637_trans(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
ansi_637_tree =
proto_item_add_subtree(ansi_637_item, ett_ansi_637_trans_msg[idx]);
+
+ if (oct == ANSI_TRANS_MSG_TYPE_BROADCAST)
+ {
+ /*
+ * there is no teleservice ID for Broadcast but we want the
+ * bearer data to be dissected
+ *
+ * using a reserved value to key dissector port
+ */
+ ansi_637_trans_tele_id = 65535;
+ }
}
curr_offset = 1;
diff --git a/epan/dissectors/packet-ansi_a.c b/epan/dissectors/packet-ansi_a.c
index cbe98a4550..e9e36b6623 100644
--- a/epan/dissectors/packet-ansi_a.c
+++ b/epan/dissectors/packet-ansi_a.c
@@ -48,239 +48,563 @@
#include "packet-bssap.h"
#include "packet-ansi_a.h"
+/*
+ * IOS 4, probably most common
+ */
+gint a_global_variant = A_VARIANT_IOS401;
+
/* PROTOTYPES/FORWARDS */
void proto_reg_handoff_ansi_a(void);
-const value_string ansi_a_ios401_bsmap_strings[] = {
- { 0x69, "Additional Service Notification" },
- { 0x65, "ADDS Page" },
- { 0x66, "ADDS Page Ack" },
- { 0x67, "ADDS Transfer" },
- { 0x68, "ADDS Transfer Ack" },
- { 0x02, "Assignment Complete" },
- { 0x03, "Assignment Failure" },
- { 0x01, "Assignment Request" },
- { 0x45, "Authentication Request" },
- { 0x46, "Authentication Response" },
- { 0x48, "Base Station Challenge" },
- { 0x49, "Base Station Challenge Response" },
- { 0x40, "Block" },
- { 0x41, "Block Acknowledge" },
- { 0x09, "BS Service Request" },
- { 0x0A, "BS Service Response" },
- { 0x20, "Clear Command" },
- { 0x21, "Clear Complete" },
- { 0x22, "Clear Request" },
- { 0x57, "Complete Layer 3 Information" },
- { 0x60, "Feature Notification" },
- { 0x61, "Feature Notification Ack" },
- { 0x13, "Handoff Command" },
- { 0x15, "Handoff Commenced" },
- { 0x14, "Handoff Complete" },
- { 0x16, "Handoff Failure" },
- { 0x17, "Handoff Performed" },
- { 0x10, "Handoff Request" },
- { 0x12, "Handoff Request Acknowledge" },
- { 0x11, "Handoff Required" },
- { 0x1A, "Handoff Required Reject" },
- { 0x6C, "PACA Command" },
- { 0x6D, "PACA Command Ack" },
- { 0x6E, "PACA Update" },
- { 0x6F, "PACA Update Ack" },
- { 0x52, "Paging Request" },
- { 0x53, "Privacy Mode Command" },
- { 0x55, "Privacy Mode Complete" },
- { 0x23, "Radio Measurements for Position Request" },
- { 0x25, "Radio Measurements for Position Response" },
- { 0x56, "Rejection" },
- { 0x05, "Registration Request" },
- { 0x30, "Reset" },
- { 0x31, "Reset Acknowledge" },
- { 0x34, "Reset Circuit" },
- { 0x35, "Reset Circuit Acknowledge" },
- { 0x47, "SSD Update Request" },
- { 0x4A, "SSD Update Response" },
- { 0x6A, "Status Request" },
- { 0x6B, "Status Response" },
- { 0x39, "Transcoder Control Acknowledge" },
- { 0x38, "Transcoder Control Request" },
- { 0x42, "Unblock" },
- { 0x43, "Unblock Acknowledge" },
- { 0x0B, "User Zone Reject" },
- { 0x04, "User Zone Update" },
- { 0, NULL },
+static const gchar *
+my_match_strval_idx(guint32 val, const ext_value_string_t *vs, gint *idx, gint *dec_idx)
+{
+ gint i = 0;
+
+ while (vs[i].strptr)
+ {
+ if (vs[i].value == val)
+ {
+ *idx = i;
+ *dec_idx = vs[i].dec_index;
+ return(vs[i].strptr);
+ }
+
+ i++;
+ }
+
+ *idx = -1;
+ *dec_idx = -1;
+ return(NULL);
+}
+
+const ext_value_string_t ansi_a_ios401_bsmap_strings[] =
+{
+ { 0x69, "Additional Service Notification", 0 },
+ { 0x65, "ADDS Page", 1 },
+ { 0x66, "ADDS Page Ack", 2 },
+ { 0x67, "ADDS Transfer", 3 },
+ { 0x68, "ADDS Transfer Ack", 4 },
+ { 0x02, "Assignment Complete", 5 },
+ { 0x03, "Assignment Failure", 6 },
+ { 0x01, "Assignment Request", 7 },
+ { 0x45, "Authentication Request", 8 },
+ { 0x46, "Authentication Response", 9 },
+ { 0x48, "Base Station Challenge", 10 },
+ { 0x49, "Base Station Challenge Response", 11 },
+ { 0x40, "Block", 12 },
+ { 0x41, "Block Acknowledge", 13 },
+ { 0x09, "BS Service Request", 14 },
+ { 0x0A, "BS Service Response", 15 },
+ { 0x20, "Clear Command", 16 },
+ { 0x21, "Clear Complete", 17 },
+ { 0x22, "Clear Request", 18 },
+ { 0x57, "Complete Layer 3 Information", 19 },
+ { 0x60, "Feature Notification", 20 },
+ { 0x61, "Feature Notification Ack", 21 },
+ { 0x13, "Handoff Command", 22 },
+ { 0x15, "Handoff Commenced", 23 },
+ { 0x14, "Handoff Complete", 24 },
+ { 0x16, "Handoff Failure", 25 },
+ { 0x17, "Handoff Performed", 26 },
+ { 0x10, "Handoff Request", 27 },
+ { 0x12, "Handoff Request Acknowledge", 28 },
+ { 0x11, "Handoff Required", 29 },
+ { 0x1A, "Handoff Required Reject", 30 },
+ { 0x6C, "PACA Command", 31 },
+ { 0x6D, "PACA Command Ack", 32 },
+ { 0x6E, "PACA Update", 33 },
+ { 0x6F, "PACA Update Ack", 34 },
+ { 0x52, "Paging Request", 35 },
+ { 0x53, "Privacy Mode Command", 36 },
+ { 0x55, "Privacy Mode Complete", 37 },
+ { 0x23, "Radio Measurements for Position Request", 38 },
+ { 0x25, "Radio Measurements for Position Response", 39 },
+ { 0x56, "Rejection", 40 },
+ { 0x05, "Registration Request", 41 },
+ { 0x30, "Reset", 42 },
+ { 0x31, "Reset Acknowledge", 43 },
+ { 0x34, "Reset Circuit", 44 },
+ { 0x35, "Reset Circuit Acknowledge", 45 },
+ { 0x47, "SSD Update Request", 46 },
+ { 0x4A, "SSD Update Response", 47 },
+ { 0x6A, "Status Request", 48 },
+ { 0x6B, "Status Response", 49 },
+ { 0x39, "Transcoder Control Acknowledge", 50 },
+ { 0x38, "Transcoder Control Request", 51 },
+ { 0x42, "Unblock", 52 },
+ { 0x43, "Unblock Acknowledge", 53 },
+ { 0x0B, "User Zone Reject", 54 },
+ { 0x04, "User Zone Update", 55 },
+ { 0, NULL, 0 },
};
-const value_string ansi_a_ios401_dtap_strings[] = {
- { 0x62, "Additional Service Request" },
- { 0x53, "ADDS Deliver" },
- { 0x54, "ADDS Deliver Ack" },
- { 0x26, "Alert With Information" },
- { 0x45, "Authentication Request" },
- { 0x46, "Authentication Response" },
- { 0x48, "Base Station Challenge" },
- { 0x49, "Base Station Challenge Response" },
- { 0x24, "CM Service Request" },
- { 0x25, "CM Service Request Continuation" },
- { 0x07, "Connect" },
- { 0x10, "Flash with Information" },
- { 0x50, "Flash with Information Ack" },
- { 0x02, "Location Updating Accept" },
- { 0x04, "Location Updating Reject" },
- { 0x08, "Location Updating Request" },
- { 0x27, "Paging Response" },
- { 0x2B, "Parameter Update Confirm" },
- { 0x2C, "Parameter Update Request" },
- { 0x56, "Rejection" },
- { 0x03, "Progress" },
- { 0x70, "Service Redirection" },
- { 0x2E, "Service Release" },
- { 0x2F, "Service Release Complete" },
- { 0x47, "SSD Update Request" },
- { 0x4A, "SSD Update Response" },
- { 0x6A, "Status Request" },
- { 0x6B, "Status Response" },
- { 0x0B, "User Zone Reject" },
- { 0x0C, "User Zone Update" },
- { 0x0D, "User Zone Update Request" },
- { 0, NULL },
+const ext_value_string_t ansi_a_ios401_dtap_strings[] =
+{
+ { 0x62, "Additional Service Request", 0 },
+ { 0x53, "ADDS Deliver", 1 },
+ { 0x54, "ADDS Deliver Ack", 2 },
+ { 0x26, "Alert With Information", 3 },
+ { 0x45, "Authentication Request", 4 },
+ { 0x46, "Authentication Response", 5 },
+ { 0x48, "Base Station Challenge", 6 },
+ { 0x49, "Base Station Challenge Response", 7 },
+ { 0x24, "CM Service Request", 8 },
+ { 0x25, "CM Service Request Continuation", 9 },
+ { 0x07, "Connect", 10 },
+ { 0x10, "Flash with Information", 11 },
+ { 0x50, "Flash with Information Ack", 12 },
+ { 0x02, "Location Updating Accept", 13 },
+ { 0x04, "Location Updating Reject", 14 },
+ { 0x08, "Location Updating Request", 15 },
+ { 0x27, "Paging Response", 16 },
+ { 0x2B, "Parameter Update Confirm", 17 },
+ { 0x2C, "Parameter Update Request", 18 },
+ { 0x56, "Rejection", 19 },
+ { 0x03, "Progress", 20 },
+ { 0x70, "Service Redirection", 21 },
+ { 0x2E, "Service Release", 22 },
+ { 0x2F, "Service Release Complete", 23 },
+ { 0x47, "SSD Update Request", 24 },
+ { 0x4A, "SSD Update Response", 25 },
+ { 0x6A, "Status Request", 26 },
+ { 0x6B, "Status Response", 27 },
+ { 0x0B, "User Zone Reject", 28 },
+ { 0x0C, "User Zone Update", 29 },
+ { 0x0D, "User Zone Update Request", 30 },
+ { 0, NULL, 0 },
};
-const value_string ansi_a_ios401_elem_1_strings[] = {
- { 0x20, "Access Network Identifiers" },
- { 0x3D, "ADDS User Part" },
- { 0x25, "AMPS Hard Handoff Parameters" },
- { 0x30, "Anchor PDSN Address" },
- { 0x7C, "Anchor P-P Address" },
- { 0x41, "Authentication Challenge Parameter" },
- { 0x28, "Authentication Confirmation Parameter (RANDC)" },
- { 0x59, "Authentication Data" },
- { 0x4A, "Authentication Event" },
- { 0x40, "Authentication Parameter COUNT" },
- { 0x42, "Authentication Response Parameter" },
- { 0x37, "Band Class" },
- { 0x5B, "Called Party ASCII Number" },
- { 0x5E, "Called Party BCD Number" },
- { 0x4B, "Calling Party ASCII Number" },
- { 0x04, "Cause" },
- { 0x08, "Cause Layer 3" },
- { 0x0C, "CDMA Serving One Way Delay" },
- { 0x05, "Cell Identifier" },
- { 0x1A, "Cell Identifier List" },
- { 0x23, "Channel Number" },
- { 0x0B, "Channel Type" },
- { 0x19, "Circuit Group" },
- { 0x01, "Circuit Identity Code" },
- { 0x24, "Circuit Identity Code Extension" },
- { 0x12, "Classmark Information Type 2" },
- { 0x29, "Downlink Radio Environment" },
- { 0x2B, "Downlink Radio Environment List" },
- { 0x0A, "Encryption Information" },
- { 0x10, "Extended Handoff Direction Parameters" },
- { 0x2C, "Geographic Location" },
- { 0x5A, "Special Service Call Indicator" },
- { 0x26, "Handoff Power Level" },
- { 0x16, "Hard Handoff Parameters" },
- { 0x2E, "Information Element Requested" },
- { 0x09, "IS-2000 Channel Identity" },
- { 0x27, "IS-2000 Channel Identity 3X" },
- { 0x11, "IS-2000 Mobile Capabilities" },
- { 0x0F, "IS-2000 Non-Negotiable Service Configuration Record" },
- { 0x0E, "IS-2000 Service Configuration Record" },
- { 0x62, "IS-95/IS-2000 Cause Value" },
- { 0x67, "IS-2000 Redirection Record" },
- { 0x22, "IS-95 Channel Identity" },
- { 0x64, "IS-95 MS Measured Channel Identity" },
- { 0x17, "Layer 3 Information" },
- { 0x13, "Location Area Information" },
- { 0x38, "Message Waiting Indication" },
- { 0x0D, "Mobile Identity" },
- { 0x15, "MS Information Records" },
- { 0xA0, "Origination Continuation Indicator" },
- { 0x5F, "PACA Order" },
- { 0x60, "PACA Reorigination Indicator" },
- { 0x4E, "PACA Timestamp" },
- { 0x70, "Packet Session Parameters" },
- { 0x14, "PDSN IP Address" },
- { 0xA2, "Power Down Indicator" },
- { 0x06, "Priority" },
- { 0x3B, "Protocol Revision" },
- { 0x18, "Protocol Type" },
- { 0x2D, "PSMM Count" },
- { 0x07, "Quality of Service Parameters" },
- { 0x1D, "Radio Environment and Resources" },
- { 0x1F, "Registration Type" },
- { 0x44, "Reject Cause" },
- { 0x1B, "Response Request" },
- { 0x68, "Return Cause" },
- { 0x21, "RF Channel Identity" },
- { 0x03, "Service Option" },
- { 0x1E, "Service Option Connection Identifier (SOCI)" },
- { 0x2A, "Service Option List" },
- { 0x69, "Service Redirection Info" },
- { 0x71, "Session Reference Identifier (SR_ID)" },
- { 0x32, "SID" },
- { 0x34, "Signal" },
- { 0x35, "Slot Cycle Index" },
- { 0x31, "Software Version" },
- { 0x39, "Source RNC to Target RNC Transparent Container" },
- { 0x14, "Source PDSN Address" },
- { 0x33, "Tag" },
- { 0x3A, "Target RNC to Source RNC Transparent Container" },
- { 0x36, "Transcoder Mode" }, /* XXX 0x1C in IOS 4.0.1 */
- { 0x02, "User Zone ID" },
- { 0xA1, "Voice Privacy Request" },
- { 0, NULL },
+const ext_value_string_t ansi_a_ios401_elem_1_strings[] =
+{
+ { 0x20, "Access Network Identifiers", 0 },
+ { 0x3D, "ADDS User Part", 1 },
+ { 0x25, "AMPS Hard Handoff Parameters", 2 },
+ { 0x30, "Anchor PDSN Address", 3 },
+ { 0x7C, "Anchor P-P Address", 4 },
+ { 0x41, "Authentication Challenge Parameter", 5 },
+ { 0x28, "Authentication Confirmation Parameter (RANDC)", 6 },
+ { 0x59, "Authentication Data", 7 },
+ { 0x4A, "Authentication Event", 8 },
+ { 0x40, "Authentication Parameter COUNT", 9 },
+ { 0x42, "Authentication Response Parameter", 10 },
+ { 0x37, "Band Class", 11 },
+ { 0x5B, "Called Party ASCII Number", 12 },
+ { 0x5E, "Called Party BCD Number", 13 },
+ { 0x4B, "Calling Party ASCII Number", 14 },
+ { 0x04, "Cause", 15 },
+ { 0x08, "Cause Layer 3", 16 },
+ { 0x0C, "CDMA Serving One Way Delay", 17 },
+ { 0x05, "Cell Identifier", 18 },
+ { 0x1A, "Cell Identifier List", 19 },
+ { 0x23, "Channel Number", 20 },
+ { 0x0B, "Channel Type", 21 },
+ { 0x19, "Circuit Group", 22 },
+ { 0x01, "Circuit Identity Code", 23 },
+ { 0x24, "Circuit Identity Code Extension", 24 },
+ { 0x12, "Classmark Information Type 2", 25 },
+ { 0x29, "Downlink Radio Environment", 26 },
+ { 0x2B, "Downlink Radio Environment List", 27 },
+ { 0x0A, "Encryption Information", 28 },
+ { 0x10, "Extended Handoff Direction Parameters", 29 },
+ { 0x2C, "Geographic Location", 30 },
+ { 0x5A, "Special Service Call Indicator", 31 },
+ { 0x26, "Handoff Power Level", 32 },
+ { 0x16, "Hard Handoff Parameters", 33 },
+ { 0x2E, "Information Element Requested", 34 },
+ { 0x09, "IS-2000 Channel Identity", 35 },
+ { 0x27, "IS-2000 Channel Identity 3X", 36 },
+ { 0x11, "IS-2000 Mobile Capabilities", 37 },
+ { 0x0F, "IS-2000 Non-Negotiable Service Configuration Record", 38 },
+ { 0x0E, "IS-2000 Service Configuration Record", 39 },
+ { 0x62, "IS-95/IS-2000 Cause Value", 40 },
+ { 0x67, "IS-2000 Redirection Record", 41 },
+ { 0x22, "IS-95 Channel Identity", 42 },
+ { 0x64, "IS-95 MS Measured Channel Identity", 43 },
+ { 0x17, "Layer 3 Information", 44 },
+ { 0x13, "Location Area Information", 45 },
+ { 0x38, "Message Waiting Indication", 46 },
+ { 0x0D, "Mobile Identity", 47 },
+ { 0x15, "MS Information Records (Forward)", 48 },
+ { 0xA0, "Origination Continuation Indicator", 49 },
+ { 0x5F, "PACA Order", 50 },
+ { 0x60, "PACA Reorigination Indicator", 51 },
+ { 0x4E, "PACA Timestamp", 52 },
+ { 0x70, "Packet Session Parameters", 53 },
+ { 0x14, "PDSN IP Address", 54 },
+ { 0xA2, "Power Down Indicator", 55 },
+ { 0x06, "Priority", 56 },
+ { 0x3B, "Protocol Revision", 57 },
+ { 0x18, "Protocol Type", 58 },
+ { 0x2D, "PSMM Count", 59 },
+ { 0x07, "Quality of Service Parameters", 60 },
+ { 0x1D, "Radio Environment and Resources", 61 },
+ { 0x1F, "Registration Type", 62 },
+ { 0x44, "Reject Cause", 63 },
+ { 0x1B, "Response Request", 64 },
+ { 0x68, "Return Cause", 65 },
+ { 0x21, "RF Channel Identity", 66 },
+ { 0x03, "Service Option", 67 },
+ { 0x1E, "Service Option Connection Identifier (SOCI)", 68 },
+ { 0x2A, "Service Option List", 69 },
+ { 0x69, "Service Redirection Info", 70 },
+ { 0x71, "Service Reference Identifier (SR_ID)", 71 },
+ { 0x32, "SID", 72 },
+ { 0x34, "Signal", 73 },
+ { 0x35, "Slot Cycle Index", 74 },
+ { 0x31, "Software Version", 75 },
+ { 0x39, "Source RNC to Target RNC Transparent Container", 76 },
+ { 0x14, "Source PDSN Address", 77 },
+ { 0x33, "Tag", 78 },
+ { 0x3A, "Target RNC to Source RNC Transparent Container", 79 },
+ { 0x36, "Transcoder Mode", 80 }, /* XXX 0x1C in IOS 4.0.1 */
+ { 0x02, "User Zone ID", 81 },
+ { 0xA1, "Voice Privacy Request", 82 },
+ { 0x15, "MS Information Records (Reverse)", 88 },
+ { 0, NULL, 0 },
+};
+
+const ext_value_string_t ansi_a_ios501_bsmap_strings[] =
+{
+ { 0x69, "Additional Service Notification", 0 },
+ { 0x65, "ADDS Page", 1 },
+ { 0x66, "ADDS Page Ack", 2 },
+ { 0x67, "ADDS Transfer", 3 },
+ { 0x68, "ADDS Transfer Ack", 4 },
+ { 0x02, "Assignment Complete", 5 },
+ { 0x03, "Assignment Failure", 6 },
+ { 0x01, "Assignment Request", 7 },
+ { 0x45, "Authentication Request", 8 },
+ { 0x46, "Authentication Response", 9 },
+ { 0x48, "Base Station Challenge", 10 },
+ { 0x49, "Base Station Challenge Response", 11 },
+ { 0x40, "Block", 12 },
+ { 0x41, "Block Acknowledge", 13 },
+ { 0x09, "BS Service Request", 14 },
+ { 0x0A, "BS Service Response", 15 },
+ { 0x20, "Clear Command", 16 },
+ { 0x21, "Clear Complete", 17 },
+ { 0x22, "Clear Request", 18 },
+ { 0x57, "Complete Layer 3 Information", 19 },
+ { 0x60, "Feature Notification", 20 },
+ { 0x61, "Feature Notification Ack", 21 },
+ { 0x13, "Handoff Command", 22 },
+ { 0x15, "Handoff Commenced", 23 },
+ { 0x14, "Handoff Complete", 24 },
+ { 0x16, "Handoff Failure", 25 },
+ { 0x17, "Handoff Performed", 26 },
+ { 0x10, "Handoff Request", 27 },
+ { 0x12, "Handoff Request Acknowledge", 28 },
+ { 0x11, "Handoff Required", 29 },
+ { 0x1A, "Handoff Required Reject", 30 },
+ { 0x6C, "PACA Command", 31 },
+ { 0x6D, "PACA Command Ack", 32 },
+ { 0x6E, "PACA Update", 33 },
+ { 0x6F, "PACA Update Ack", 34 },
+ { 0x52, "Paging Request", 35 },
+ { 0x53, "Privacy Mode Command", 36 },
+ { 0x55, "Privacy Mode Complete", 37 },
+ { 0x23, "Radio Measurements for Position Request", 38 },
+ { 0x25, "Radio Measurements for Position Response", 39 },
+ { 0x56, "Rejection", 40 },
+ { 0x05, "Registration Request", 41 },
+ { 0x30, "Reset", 42 },
+ { 0x31, "Reset Acknowledge", 43 },
+ { 0x34, "Reset Circuit", 44 },
+ { 0x35, "Reset Circuit Acknowledge", 45 },
+ { 0x47, "SSD Update Request", 46 },
+ { 0x4A, "SSD Update Response", 47 },
+ { 0x6A, "Status Request", 48 },
+ { 0x6B, "Status Response", 49 },
+ { 0x39, "Transcoder Control Acknowledge", 50 },
+ { 0x38, "Transcoder Control Request", 51 },
+ { 0x42, "Unblock", 52 },
+ { 0x43, "Unblock Acknowledge", 53 },
+ { 0x0B, "User Zone Reject", 54 },
+ { 0x04, "User Zone Update", 55 },
+ { 0x58, "Bearer Update Request", 56 },
+ { 0x59, "Bearer Update Response", 58 },
+ { 0x5A, "Bearer Update Required", 57 },
+ { 0x71, "Mobile Station Registered Notification", 59 },
+ { 0x07, "BS Authentication Request", 60 },
+ { 0x08, "BS Authentication Request Ack", 61 },
+ { 0, NULL, 0 },
+};
+
+const ext_value_string_t ansi_a_ios501_dtap_strings[] =
+{
+ { 0x62, "Additional Service Request", 0 },
+ { 0x53, "ADDS Deliver", 1 },
+ { 0x54, "ADDS Deliver Ack", 2 },
+ { 0x26, "Alert With Information", 3 },
+ { 0x45, "Authentication Request", 4 },
+ { 0x46, "Authentication Response", 5 },
+ { 0x48, "Base Station Challenge", 6 },
+ { 0x49, "Base Station Challenge Response", 7 },
+ { 0x24, "CM Service Request", 8 },
+ { 0x25, "CM Service Request Continuation", 9 },
+ { 0x07, "Connect", 10 },
+ { 0x10, "Flash with Information", 11 },
+ { 0x50, "Flash with Information Ack", 12 },
+ { 0x02, "Location Updating Accept", 13 },
+ { 0x04, "Location Updating Reject", 14 },
+ { 0x08, "Location Updating Request", 15 },
+ { 0x27, "Paging Response", 16 },
+ { 0x2B, "Parameter Update Confirm", 17 },
+ { 0x2C, "Parameter Update Request", 18 },
+ { 0x56, "Rejection", 19 },
+ { 0x03, "Progress", 20 },
+ { 0x70, "Service Redirection", 21 },
+ { 0x2E, "Service Release", 22 },
+ { 0x2F, "Service Release Complete", 23 },
+ { 0x47, "SSD Update Request", 24 },
+ { 0x4A, "SSD Update Response", 25 },
+ { 0x6A, "Status Request", 26 },
+ { 0x6B, "Status Response", 27 },
+ { 0x0B, "User Zone Reject", 28 },
+ { 0x0C, "User Zone Update", 29 },
+ { 0x0D, "User Zone Update Request", 30 },
+ { 0, NULL, 0 },
};
-#define ANSI_MS_INFO_REC_DISPLAY 0x01
-#define ANSI_MS_INFO_REC_CLD_PN 0x02
-#define ANSI_MS_INFO_REC_CLG_PN 0x03
-#define ANSI_MS_INFO_REC_CONN_N 0x04
-#define ANSI_MS_INFO_REC_SIGNAL 0x05
-#define ANSI_MS_INFO_REC_MW 0x06
-#define ANSI_MS_INFO_REC_SC 0x07
-#define ANSI_MS_INFO_REC_CLD_PSA 0x08
-#define ANSI_MS_INFO_REC_CLG_PSA 0x09
-#define ANSI_MS_INFO_REC_CONN_SA 0x0a
-#define ANSI_MS_INFO_REC_RED_N 0x0b
-#define ANSI_MS_INFO_REC_RED_SA 0x0c
-#define ANSI_MS_INFO_REC_MP 0x0d
-#define ANSI_MS_INFO_REC_PA 0x0e
-#define ANSI_MS_INFO_REC_LC 0x0f
-#define ANSI_MS_INFO_REC_EDISPLAY 0x10
-#define ANSI_MS_INFO_REC_NNSC 0x13
-#define ANSI_MS_INFO_REC_MC_EDISPLAY 0x14
-#define ANSI_MS_INFO_REC_CWI 0x15
-#define ANSI_MS_INFO_REC_ERTI 0xfe
-
-static const value_string ansi_ms_info_rec_str[] = {
- { ANSI_MS_INFO_REC_DISPLAY, "Display" },
- { ANSI_MS_INFO_REC_CLD_PN, "Called Party Number" },
- { ANSI_MS_INFO_REC_CLG_PN, "Calling Party Number" },
- { ANSI_MS_INFO_REC_CONN_N, "Connected Number" },
- { ANSI_MS_INFO_REC_SIGNAL, "Signal" },
- { ANSI_MS_INFO_REC_MW, "Message Waiting" },
- { ANSI_MS_INFO_REC_SC, "Service Configuration" },
- { ANSI_MS_INFO_REC_CLD_PSA, "Called Party Subaddress" },
- { ANSI_MS_INFO_REC_CLG_PSA, "Calling Party Subaddress" },
- { ANSI_MS_INFO_REC_CONN_SA, "Connected Subaddress" },
- { ANSI_MS_INFO_REC_RED_N, "Redirecting Number" },
- { ANSI_MS_INFO_REC_RED_SA, "Redirecting Subaddress" },
- { ANSI_MS_INFO_REC_MP, "Meter Pulses" },
- { ANSI_MS_INFO_REC_PA, "Parametric Alerting" },
- { ANSI_MS_INFO_REC_LC, "Line Control" },
- { ANSI_MS_INFO_REC_EDISPLAY, "Extended Display" },
- { ANSI_MS_INFO_REC_NNSC, "Non-Negotiable Service Configuration" },
- { ANSI_MS_INFO_REC_MC_EDISPLAY, "Multiple Character Extended Display" },
- { ANSI_MS_INFO_REC_CWI, "Call Waiting Indicator" },
- { ANSI_MS_INFO_REC_ERTI, "Extended Record Type International" },
+/*
+ * ORDER MUST MATCH
+ * ansi_a_ios401_elem_1_strings when the same element
+ * is being described.
+ */
+const ext_value_string_t ansi_a_ios501_elem_1_strings[] =
+{
+ { 0x20, "Access Network Identifiers", 0 },
+ { 0x3D, "ADDS User Part", 1 },
+ { 0x25, "AMPS Hard Handoff Parameters", 2 },
+ { 0x30, "Anchor PDSN Address", 3 },
+ { 0x7C, "Anchor P-P Address", 4 },
+ { 0x41, "Authentication Challenge Parameter", 5 },
+ { 0x28, "Authentication Confirmation Parameter (RANDC)", 6 },
+ { 0x59, "Authentication Data", 7 },
+ { 0x4A, "Authentication Event", 8 },
+ { 0x40, "Authentication Parameter COUNT", 9 },
+ { 0x42, "Authentication Response Parameter", 10 },
+ { 0x37, "Band Class", 11 },
+ { 0x5B, "Called Party ASCII Number", 12 },
+ { 0x5E, "Called Party BCD Number", 13 },
+ { 0x4B, "Calling Party ASCII Number", 14 },
+ { 0x04, "Cause", 15 },
+ { 0x08, "Cause Layer 3", 16 },
+ { 0x0C, "CDMA Serving One Way Delay", 17 },
+ { 0x05, "Cell Identifier", 18 },
+ { 0x1A, "Cell Identifier List", 19 },
+ { 0x23, "Channel Number", 20 },
+ { 0x0B, "Channel Type", 21 },
+ { 0x19, "Circuit Group", 22 },
+ { 0x01, "Circuit Identity Code", 23 },
+ { 0x24, "Circuit Identity Code Extension", 24 },
+ { 0x12, "Classmark Information Type 2", 25 },
+ { 0x29, "Downlink Radio Environment", 26 },
+ { 0x2B, "Downlink Radio Environment List", 27 },
+ { 0x0A, "Encryption Information", 28 },
+ { 0x10, "Extended Handoff Direction Parameters", 29 },
+ { 0x2C, "Geographic Location", 30 },
+ { 0x5A, "Special Service Call Indicator", 31 },
+ { 0x26, "Handoff Power Level", 32 },
+ { 0x16, "Hard Handoff Parameters", 33 },
+ { 0x2E, "Information Element Requested", 34 },
+ { 0x09, "IS-2000 Channel Identity", 35 },
+ { 0x27, "IS-2000 Channel Identity 3X", 36 },
+ { 0x11, "IS-2000 Mobile Capabilities", 37 },
+ { 0x0F, "IS-2000 Non-Negotiable Service Configuration Record", 38 },
+ { 0x0E, "IS-2000 Service Configuration Record", 39 },
+ { 0x62, "IS-95/IS-2000 Cause Value", 40 },
+ { 0x67, "IS-2000 Redirection Record", 41 },
+ { 0x22, "IS-95 Channel Identity", 42 },
+ { 0x64, "IS-95 MS Measured Channel Identity", 43 },
+ { 0x17, "Layer 3 Information", 44 },
+ { 0x13, "Location Area Information", 45 },
+ { 0x38, "Message Waiting Indication", 46 },
+ { 0x0D, "Mobile Identity", 47 },
+ { 0x15, "MS Information Records (Forward)", 48 },
+ { 0xA0, "Origination Continuation Indicator", 49 },
+ { 0x5F, "PACA Order", 50 },
+ { 0x60, "PACA Reorigination Indicator", 51 },
+ { 0x4E, "PACA Timestamp", 52 },
+ { 0x70, "Packet Session Parameters", 53 },
+ { 0x14, "PDSN IP Address", 54 },
+ { 0xA2, "Power Down Indicator", 55 },
+ { 0x06, "Priority", 56 },
+ { 0x3B, "Protocol Revision", 57 },
+ { 0x18, "Protocol Type", 58 },
+ { 0x2D, "PSMM Count", 59 },
+ { 0x07, "Quality of Service Parameters", 60 },
+ { 0x1D, "Radio Environment and Resources", 61 },
+ { 0x1F, "Registration Type", 62 },
+ { 0x44, "Reject Cause", 63 },
+ { 0x1B, "Response Request", 64 },
+ { 0x68, "Return Cause", 65 },
+ { 0x21, "RF Channel Identity", 66 },
+ { 0x03, "Service Option", 67 },
+ { 0x1E, "Service Option Connection Identifier (SOCI)", 68 },
+ { 0x2A, "Service Option List", 69 },
+ { 0x69, "Service Redirection Info", 70 },
+ { 0x71, "Service Reference Identifier (SR_ID)", 71 },
+ { 0x32, "SID", 72 },
+ { 0x34, "Signal", 73 },
+ { 0x35, "Slot Cycle Index", 74 },
+ { 0x31, "Software Version", 75 },
+ { 0x39, "Source RNC to Target RNC Transparent Container", 76 },
+ { 0x14, "Source PDSN Address", 77 },
+ { 0x33, "Tag", 78 },
+ { 0x3A, "Target RNC to Source RNC Transparent Container", 79 },
+ { 0x36, "Transcoder Mode", 80 }, /* XXX 0x1C in IOS 4.0.1 */
+ { 0x02, "User Zone ID", 81 },
+ { 0xA1, "Voice Privacy Request", 82 },
+ { 0x45, "A2p Bearer Session-Level Parameters", 83 },
+ { 0x46, "A2p Bearer Format-Specific Parameters", 84 },
+ { 0x73, "MS Designated Frequency", 85 },
+ { 0x7D, "Mobile Subscription Information", 86 },
+ { 0x72, "Public Long Code Mask Identification", 87 },
+ { 0x15, "MS Information Records (Reverse)", 88 },
+ { 0, NULL, 0 },
+};
+
+/*
+ * From Table 3.7.5-1 C.S0005-D v1.0 L3
+ */
+#define ANSI_FWD_MS_INFO_REC_DISPLAY 0x01
+#define ANSI_FWD_MS_INFO_REC_CLD_PN 0x02
+#define ANSI_FWD_MS_INFO_REC_CLG_PN 0x03
+#define ANSI_FWD_MS_INFO_REC_CONN_N 0x04
+#define ANSI_FWD_MS_INFO_REC_SIGNAL 0x05
+#define ANSI_FWD_MS_INFO_REC_MW 0x06
+#define ANSI_FWD_MS_INFO_REC_SC 0x07
+#define ANSI_FWD_MS_INFO_REC_CLD_PSA 0x08
+#define ANSI_FWD_MS_INFO_REC_CLG_PSA 0x09
+#define ANSI_FWD_MS_INFO_REC_CONN_SA 0x0a
+#define ANSI_FWD_MS_INFO_REC_RED_N 0x0b
+#define ANSI_FWD_MS_INFO_REC_RED_SA 0x0c
+#define ANSI_FWD_MS_INFO_REC_MP 0x0d
+#define ANSI_FWD_MS_INFO_REC_PA 0x0e
+#define ANSI_FWD_MS_INFO_REC_LC 0x0f
+#define ANSI_FWD_MS_INFO_REC_EDISPLAY 0x10
+#define ANSI_FWD_MS_INFO_REC_NNSC 0x13
+#define ANSI_FWD_MS_INFO_REC_MC_EDISPLAY 0x14
+#define ANSI_FWD_MS_INFO_REC_CWI 0x15
+#define ANSI_FWD_MS_INFO_REC_EMC_EDISPLAY 0x16
+#define ANSI_FWD_MS_INFO_REC_ERTI 0xfe
+
+static const value_string ansi_fwd_ms_info_rec_str[] = {
+ { ANSI_FWD_MS_INFO_REC_DISPLAY, "Display" },
+ { ANSI_FWD_MS_INFO_REC_CLD_PN, "Called Party Number" },
+ { ANSI_FWD_MS_INFO_REC_CLG_PN, "Calling Party Number" },
+ { ANSI_FWD_MS_INFO_REC_CONN_N, "Connected Number" },
+ { ANSI_FWD_MS_INFO_REC_SIGNAL, "Signal" },
+ { ANSI_FWD_MS_INFO_REC_MW, "Message Waiting" },
+ { ANSI_FWD_MS_INFO_REC_SC, "Service Configuration" },
+ { ANSI_FWD_MS_INFO_REC_CLD_PSA, "Called Party Subaddress" },
+ { ANSI_FWD_MS_INFO_REC_CLG_PSA, "Calling Party Subaddress" },
+ { ANSI_FWD_MS_INFO_REC_CONN_SA, "Connected Subaddress" },
+ { ANSI_FWD_MS_INFO_REC_RED_N, "Redirecting Number" },
+ { ANSI_FWD_MS_INFO_REC_RED_SA, "Redirecting Subaddress" },
+ { ANSI_FWD_MS_INFO_REC_MP, "Meter Pulses" },
+ { ANSI_FWD_MS_INFO_REC_PA, "Parametric Alerting" },
+ { ANSI_FWD_MS_INFO_REC_LC, "Line Control" },
+ { ANSI_FWD_MS_INFO_REC_EDISPLAY, "Extended Display" },
+ { ANSI_FWD_MS_INFO_REC_NNSC, "Non-Negotiable Service Configuration" },
+ { ANSI_FWD_MS_INFO_REC_MC_EDISPLAY, "Multiple Character Extended Display" },
+ { ANSI_FWD_MS_INFO_REC_CWI, "Call Waiting Indicator" },
+ { ANSI_FWD_MS_INFO_REC_EMC_EDISPLAY, "Enhanced Multiple Character Extended Display" },
+ { ANSI_FWD_MS_INFO_REC_ERTI, "Extended Record Type International" },
{ 0, NULL },
};
-#define NUM_MS_INFO_REC (sizeof(ansi_ms_info_rec_str)/sizeof(value_string))
-static gint ett_ansi_ms_info_rec[NUM_MS_INFO_REC];
+#define NUM_FWD_MS_INFO_REC (sizeof(ansi_fwd_ms_info_rec_str)/sizeof(value_string))
+static gint ett_ansi_fwd_ms_info_rec[NUM_FWD_MS_INFO_REC];
+
+/*
+ * From Table 2.7.4-1 C.S0005-D v1.0 L3
+ */
+#define ANSI_REV_MS_INFO_REC_KEYPAD_FAC 0x03
+#define ANSI_REV_MS_INFO_REC_CLD_PN 0x04
+#define ANSI_REV_MS_INFO_REC_CLG_PN 0x05
+#define ANSI_REV_MS_INFO_REC_CALL_MODE 0x07
+#define ANSI_REV_MS_INFO_REC_TERM_INFO 0x08
+#define ANSI_REV_MS_INFO_REC_ROAM_INFO 0x09
+#define ANSI_REV_MS_INFO_REC_SECUR_STS 0x0a
+#define ANSI_REV_MS_INFO_REC_CONN_N 0x0b
+#define ANSI_REV_MS_INFO_REC_IMSI 0x0c
+#define ANSI_REV_MS_INFO_REC_ESN 0x0d
+#define ANSI_REV_MS_INFO_REC_BAND_INFO 0x0e
+#define ANSI_REV_MS_INFO_REC_POWER_INFO 0x0f
+#define ANSI_REV_MS_INFO_REC_OP_MODE_INFO 0x10
+#define ANSI_REV_MS_INFO_REC_SO_INFO 0x11
+#define ANSI_REV_MS_INFO_REC_MO_INFO 0x12
+#define ANSI_REV_MS_INFO_REC_SC_INFO 0x13
+#define ANSI_REV_MS_INFO_REC_CLD_PSA 0x14
+#define ANSI_REV_MS_INFO_REC_CLG_PSA 0x15
+#define ANSI_REV_MS_INFO_REC_CONN_SA 0x16
+#define ANSI_REV_MS_INFO_REC_PCI 0x17
+#define ANSI_REV_MS_INFO_REC_IMSI_M 0x18
+#define ANSI_REV_MS_INFO_REC_IMSI_T 0x19
+#define ANSI_REV_MS_INFO_REC_CAP_INFO 0x1a
+#define ANSI_REV_MS_INFO_REC_CCC_INFO 0x1b
+#define ANSI_REV_MS_INFO_REC_EMO_INFO 0x1c
+#define ANSI_REV_MS_INFO_REC_GEO_CAP 0x1e
+#define ANSI_REV_MS_INFO_REC_BAND_SUB 0x1f
+#define ANSI_REV_MS_INFO_REC_GECO 0x20
+#define ANSI_REV_MS_INFO_REC_HOOK 0x21
+#define ANSI_REV_MS_INFO_REC_QOS_PARAM 0x22
+#define ANSI_REV_MS_INFO_REC_ENCRYPT_CAP 0x23
+#define ANSI_REV_MS_INFO_REC_SMI_CAP 0x24
+#define ANSI_REV_MS_INFO_REC_UIM_ID 0x25
+#define ANSI_REV_MS_INFO_REC_ESN_ME 0x26
+#define ANSI_REV_MS_INFO_REC_MEID 0x27
+#define ANSI_REV_MS_INFO_REC_EKEYPAD_FAC 0x28
+#define ANSI_REV_MS_INFO_REC_SYNC_ID 0x29
+#define ANSI_REV_MS_INFO_REC_ERTI 0xfe
+
+static const value_string ansi_rev_ms_info_rec_str[] = {
+ { ANSI_REV_MS_INFO_REC_KEYPAD_FAC, "Keypad Facility" },
+ { ANSI_REV_MS_INFO_REC_CLD_PN, "Called Party Number" },
+ { ANSI_REV_MS_INFO_REC_CLG_PN, "Calling Party Number" },
+ { ANSI_REV_MS_INFO_REC_CALL_MODE, "Call Mode" },
+ { ANSI_REV_MS_INFO_REC_TERM_INFO, "Terminal Information" },
+ { ANSI_REV_MS_INFO_REC_ROAM_INFO, "Roaming Information" },
+ { ANSI_REV_MS_INFO_REC_SECUR_STS, "Security Status" },
+ { ANSI_REV_MS_INFO_REC_CONN_N, "Connected Number" },
+ { ANSI_REV_MS_INFO_REC_IMSI, "IMSI" },
+ { ANSI_REV_MS_INFO_REC_ESN, "ESN" },
+ { ANSI_REV_MS_INFO_REC_BAND_INFO, "Band Class Information" },
+ { ANSI_REV_MS_INFO_REC_POWER_INFO, "Power Class Information" },
+ { ANSI_REV_MS_INFO_REC_OP_MODE_INFO, "Operating Mode Information" },
+ { ANSI_REV_MS_INFO_REC_SO_INFO, "Service Option Information" },
+ { ANSI_REV_MS_INFO_REC_MO_INFO, "Multiplex Option Information" },
+ { ANSI_REV_MS_INFO_REC_SC_INFO, "Service Configuration Information" },
+ { ANSI_REV_MS_INFO_REC_CLD_PSA, "Called Party Subaddress" },
+ { ANSI_REV_MS_INFO_REC_CLG_PSA, "Calling Party Subaddress" },
+ { ANSI_REV_MS_INFO_REC_CONN_SA, "Connected Subaddress" },
+ { ANSI_REV_MS_INFO_REC_PCI, "Power Control Information" },
+ { ANSI_REV_MS_INFO_REC_IMSI_M, "IMSI_M" },
+ { ANSI_REV_MS_INFO_REC_IMSI_T, "IMSI_T" },
+ { ANSI_REV_MS_INFO_REC_CAP_INFO, "Capability Information" },
+ { ANSI_REV_MS_INFO_REC_CCC_INFO, "Channel Configuration Capability Information" },
+ { ANSI_REV_MS_INFO_REC_EMO_INFO, "Extended Multiplex Option Information" },
+ { ANSI_REV_MS_INFO_REC_GEO_CAP, "Geo-Location Capability" },
+ { ANSI_REV_MS_INFO_REC_BAND_SUB, "Band Subclass Information" },
+ { ANSI_REV_MS_INFO_REC_GECO, "Global Emergency Call" },
+ { ANSI_REV_MS_INFO_REC_HOOK, "Hook Status" },
+ { ANSI_REV_MS_INFO_REC_QOS_PARAM, "QoS Parameters" },
+ { ANSI_REV_MS_INFO_REC_ENCRYPT_CAP, "Encryption Capability" },
+ { ANSI_REV_MS_INFO_REC_SMI_CAP, "Signaling Message Integrity Capability" },
+ { ANSI_REV_MS_INFO_REC_UIM_ID, "UIM_ID" },
+ { ANSI_REV_MS_INFO_REC_ESN_ME, "ESN_ME" },
+ { ANSI_REV_MS_INFO_REC_MEID, "MEID" },
+ { ANSI_REV_MS_INFO_REC_EKEYPAD_FAC, "Extended Keypad Facility" },
+ { ANSI_REV_MS_INFO_REC_SYNC_ID, "SYNC_ID" },
+ { ANSI_REV_MS_INFO_REC_ERTI, "Extended Record Type International" },
+ { 0, NULL },
+};
+#define NUM_REV_MS_INFO_REC (sizeof(ansi_rev_ms_info_rec_str)/sizeof(value_string))
+static gint ett_ansi_rev_ms_info_rec[NUM_REV_MS_INFO_REC];
static const gchar *band_class_str[] = {
"800 MHz Cellular System",
@@ -316,6 +640,10 @@ static const gchar *cell_disc_str[] = {
static int proto_a_bsmap = -1;
static int proto_a_dtap = -1;
+const ext_value_string_t *ansi_a_bsmap_strings = NULL;
+const ext_value_string_t *ansi_a_dtap_strings = NULL;
+const ext_value_string_t *ansi_a_elem_1_strings = NULL;
+
static int ansi_a_tap = -1;
static int hf_ansi_a_none = -1;
@@ -326,6 +654,7 @@ static int hf_ansi_a_elem_id = -1;
static int hf_ansi_a_esn = -1;
static int hf_ansi_a_imsi = -1;
static int hf_ansi_a_min = -1;
+static int hf_ansi_a_meid = -1;
static int hf_ansi_a_cld_party_bcd_num = -1;
static int hf_ansi_a_clg_party_bcd_num = -1;
static int hf_ansi_a_cld_party_ascii_num = -1;
@@ -334,6 +663,12 @@ static int hf_ansi_a_cell_ci = -1;
static int hf_ansi_a_cell_lac = -1;
static int hf_ansi_a_cell_mscid = -1;
static int hf_ansi_a_pdsn_ip_addr = -1;
+static int hf_ansi_a_s_pdsn_ip_addr = -1;
+static int hf_ansi_a_anchor_ip_addr = -1;
+static int hf_ansi_a_anchor_pp_ip_addr = -1;
+static int hf_ansi_a_a2p_bearer_ipv4_addr = -1;
+static int hf_ansi_a_a2p_bearer_ipv6_addr = -1;
+static int hf_ansi_a_a2p_bearer_udp_port = -1;
/* Initialize the subtree pointers */
@@ -345,19 +680,12 @@ static gint ett_dtap_oct_1 = -1;
static gint ett_cm_srvc_type = -1;
static gint ett_ansi_ms_info_rec_reserved = -1;
static gint ett_ansi_enc_info = -1;
+static gint ett_scm = -1;
static gint ett_cell_list = -1;
-
-#define A_VARIANT_IS634 4
-#define A_VARIANT_TSB80 5
-#define A_VARIANT_IS634A 6
-#define A_VARIANT_IOS2 7
-#define A_VARIANT_IOS3 8
-#define A_VARIANT_IOS401 9
-
-/*
- * IOS 4, probably most common
- */
-static gint a_global_variant = A_VARIANT_IOS401;
+static gint ett_bearer_list = -1;
+static gint ett_re_list = -1;
+static gint ett_so_list = -1;
+static gint ett_adds_user_part = -1;
/*
* Variables to allow for proper deletion of dissector registration when
@@ -489,14 +817,40 @@ elem_chan_num(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
value = tvb_get_ntohs(tvb, curr_offset);
- proto_tree_add_text(tree,
- tvb, curr_offset, 2,
- "Channel Number: %u",
- value);
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS401:
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 2,
+ "Channel Number: %u",
+ value);
- curr_offset += 2;
+ g_snprintf(add_string, string_len, " - (%u)", value);
+ break;
- g_snprintf(add_string, string_len, " - (%u)", value);
+ case A_VARIANT_IOS501:
+ other_decode_bitfield_value(a_bigbuf, value >> 8, 0xf8, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, value >> 8, 0x07, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : ARFCN (MSB): %u",
+ a_bigbuf,
+ value & 0x07ff);
+
+ other_decode_bitfield_value(a_bigbuf, value & 0x00ff, 0xff, 8);
+ proto_tree_add_text(tree, tvb, curr_offset + 1, 1,
+ "%s : ARFCN (LSB)",
+ a_bigbuf);
+
+ g_snprintf(add_string, string_len, " - (ARFCN: %u)", value & 0x07ff);
+ break;
+ }
+
+ curr_offset += 2;
/* no length check possible */
@@ -617,6 +971,51 @@ elem_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
}
/*
+ * IOS 5 4.2.83
+ */
+static guint8
+elem_return_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint8 oct;
+ const gchar *str;
+ guint32 curr_offset;
+
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+
+ switch (oct & 0x0f)
+ {
+ case 0: str = "Normal access"; break;
+ case 1: str = "Service redirection failed as a result of system not found"; break;
+ case 2: str = "Service redirection failed as a result of protocol mismatch"; break;
+ case 3: str = "Service redirection failed as a result of registration rejection"; break;
+ case 4: str = "Service redirection failed as a result of wrong SID"; break;
+ case 5: str = "Service redirection failed as a result of wrong NID"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Return Cause: %s",
+ a_bigbuf,
+ str);
+
+ curr_offset++;
+
+ /* no length check possible */
+
+ return(curr_offset - offset);
+}
+
+/*
* IOS 6.2.2.8
*/
static guint8
@@ -695,6 +1094,41 @@ elem_rf_chan_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
}
/*
+ * IOS 5 4.2.86
+ */
+static guint8
+elem_sr_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint8 oct;
+ guint32 curr_offset;
+
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf8, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : SR_ID: %u",
+ a_bigbuf,
+ oct & 0x07);
+
+ g_snprintf(add_string, string_len, " - (%u)", oct);
+
+ curr_offset++;
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
* IOS 6.2.2.9
*/
static guint8
@@ -969,6 +1403,8 @@ elem_cm_info_type_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len,
guint8 num_bands;
guint32 curr_offset;
gint temp_int;
+ proto_tree *subtree;
+ proto_item *item;
const gchar *str;
curr_offset = offset;
@@ -1106,9 +1542,66 @@ elem_cm_info_type_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len,
oct = tvb_get_guint8(tvb, curr_offset);
- proto_tree_add_text(tree, tvb, curr_offset, 1,
- "Station Class Mark: %u",
- oct);
+ item =
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "Station Class Mark: %u",
+ oct);
+
+ /*
+ * following SCM decode is from:
+ * 3GPP2 C.S0005-0 section 2.3.3
+ * 3GPP2 C.S0072-0 section 2.1.2
+ */
+ subtree = proto_item_add_subtree(item, ett_scm);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : Extended SCM Indicator: %s",
+ a_bigbuf,
+ (oct & 0x80) ? "Band Classes 1,4" : "Other bands");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : %s",
+ a_bigbuf,
+ (oct & 0x40) ? "Dual Mode" : "CDMA Only");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x20, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : %s",
+ a_bigbuf,
+ (oct & 0x20) ? "Slotted" : "Non-Slotted");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : MEID %sconfigured",
+ a_bigbuf,
+ (oct & 0x10) ? "" : "not ");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : 25 MHz Bandwidth",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : %s Transmission",
+ a_bigbuf,
+ (oct & 0x04) ? "Discontinuous" : "Continuous");
+
+ switch (oct & 0x03)
+ {
+ case 0x00: str = "Class I"; break;
+ case 0x01: str = "Class II"; break;
+ case 0x02: str = "Class III"; break;
+ case 0x03: str = "Reserved"; break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : Power Class for Band Class 0 Analog Operation: %s",
+ a_bigbuf,
+ str);
curr_offset++;
@@ -1207,10 +1700,11 @@ elem_cm_info_type_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len,
static guint8
elem_mid(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
{
- guint8 oct;
+ guint8 oct, nib;
guint8 *poctets;
guint32 value;
guint32 curr_offset;
+ gint i;
const gchar *str;
curr_offset = offset;
@@ -1219,6 +1713,80 @@ elem_mid(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_
switch (oct & 0x07)
{
+ case 1:
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : MEID Hex Digit 1: %hhX",
+ a_bigbuf,
+ (oct & 0xf0) >> 4);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Odd/Even Indicator: %s",
+ a_bigbuf,
+ (oct & 0x08) ? "ODD" : "EVEN");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Type of Identity: MEID",
+ a_bigbuf);
+
+ curr_offset++;
+
+ i = 0;
+ nib = (oct & 0xf0) >> 4;
+ if (nib < 10)
+ {
+ a_bigbuf[i++] = nib + 0x30; /* + '0' */
+ }
+ else
+ {
+ a_bigbuf[i++] = nib + 0x41; /* + 'A' */
+ }
+
+ while ((len - (curr_offset - offset)) > 0)
+ {
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ nib = oct & 0x0f;
+ if (nib < 10)
+ {
+ a_bigbuf[i++] = nib + 0x30; /* + '0' */
+ }
+ else
+ {
+ a_bigbuf[i++] = nib + 0x41; /* + 'A' */
+ }
+
+ nib = (oct & 0xf0) >> 4;
+ if (nib < 10)
+ {
+ a_bigbuf[i++] = nib + 0x30; /* + '0' */
+ }
+ else
+ {
+ a_bigbuf[i++] = nib + 0x41; /* + 'A' */
+ }
+
+ curr_offset++;
+ }
+ a_bigbuf[i] = '\0';
+
+ proto_tree_add_string_format(tree,
+ hf_ansi_a_meid,
+ tvb, offset + 1, len - 1,
+ a_bigbuf,
+ "MEID: %s",
+ a_bigbuf);
+
+ g_snprintf(add_string, string_len, " - %s (%s)",
+ "MEID",
+ a_bigbuf);
+ break;
+
case 2:
other_decode_bitfield_value(a_bigbuf, oct, 0xf8, 8);
proto_tree_add_text(tree,
@@ -1321,7 +1889,7 @@ elem_mid(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_
value,
str);
- curr_offset++;
+ curr_offset += 2;
oct = tvb_get_guint8(tvb, curr_offset);
@@ -1382,12 +1950,6 @@ elem_mid(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_
curr_offset += len - 1;
break;
- case 1:
- /*
- * IS-634 value
- */
- /* FALLTHRU */
-
case 6:
other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
@@ -1632,6 +2194,31 @@ elem_prio(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
}
/*
+ * IOS 5 4.2.79
+ */
+static guint8
+elem_p_rev(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint8 oct;
+ guint32 curr_offset;
+
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "MOB_P_REV");
+
+ g_snprintf(add_string, string_len, " - (%u)", oct);
+
+ curr_offset++;
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
* IOS 6.2.2.19
*/
static guint8
@@ -1738,31 +2325,68 @@ elem_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
case 0x0F: str = "Interference"; break;
case 0x10: str = "Packet call going dormant"; break;
case 0x11: str = "Service option not available"; break;
+
case 0x12: str = "Invalid Call"; break;
case 0x13: str = "Successful operation"; break;
case 0x14: str = "Normal call release"; break;
+
+ /* IOS 5 */
+ case 0x15: str = "Short data burst authentication failure"; break;
+ case 0x17: str = "Time critical relocation/handoff"; break;
+ case 0x18: str = "Network optimization"; break;
+ case 0x19: str = "Power down from dormant state"; break;
+ case 0x1A: str = "Authentication failure"; break;
+
case 0x1B: str = "Inter-BS Soft Handoff Drop Target"; break;
case 0x1D: str = "Intra-BS Soft Handoff Drop Target"; break;
+
+ /* IOS 5 */
+ case 0x1E: str = "Autonomous Registration by the Network"; break;
+
case 0x20: str = "Equipment failure"; break;
case 0x21: str = "No radio resource available"; break;
case 0x22: str = "Requested terrestrial resource unavailable"; break;
+
+ /* IOS 5 */
+ case 0x23: str = "A2p RTP Payload Type not available"; break;
+ case 0x24: str = "A2p Bearer Format Address Type not available"; break;
+
case 0x25: str = "BS not equipped"; break;
case 0x26: str = "MS not equipped (or incapable)"; break;
+
+ /* IOS 5 */
+ case 0x27: str = "2G only sector"; break;
+ case 0x28: str = "3G only sector"; break;
+
case 0x29: str = "PACA Call Queued"; break;
+
+ /* IOS 5 */
+ case 0x2A: str = "PCF resources are not available"; break;
+
case 0x2B: str = "Alternate signaling type reject"; break;
+
+ /* IOS 5 */
+ case 0x2C: str = "A2p Resource not available"; break;
+
case 0x2D: str = "PACA Queue Overflow"; break;
case 0x2E: str = "PACA Cancel Request Rejected"; break;
case 0x30: str = "Requested transcoding/rate adaptation unavailable"; break;
case 0x31: str = "Lower priority radio resources not available"; break;
- case 0x32: str = "PCF resources not available"; break;
+ case 0x32: str = "PCF resources not available"; break; /* IOS 4 */
case 0x33: str = "TFO Control request Failed"; break;
+
+ /* IOS 5 */
+ case 0x34: str = "MS rejected order"; break;
+
case 0x40: str = "Ciphering algorithm not supported"; break;
case 0x41: str = "Private Long Code not available or not supported."; break;
case 0x42: str = "Requested MUX option or rates not available."; break;
case 0x43: str = "Requested Privacy Configuration unavailable"; break;
- case 0x4F: str = "Terrestrial circuit already allocated.a"; break;
+
+ /* IOS 5 */
+ case 0x45: str = "PDS-related capability not available or not supported"; break;
+
case 0x50: str = "Terrestrial circuit already allocated"; break;
- case 0x5F: str = "Protocol Error between BS and MSC.a"; break;
case 0x60: str = "Protocol Error between BS and MSC"; break;
case 0x71: str = "ADDS message too long for delivery on the paging channel"; break;
case 0x72: str = "MS-to-IWF TCP connection failure"; break;
@@ -1772,8 +2396,12 @@ elem_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
case 0x76: str = "PPP protocol failure"; break;
case 0x77: str = "PPP session closed by the MS"; break;
case 0x78: str = "Do not notify MS"; break;
- case 0x79: str = "PDSN resources are not available"; break;
+ case 0x79: str = "PCF (or PDSN) resources are not available"; break;
case 0x7A: str = "Data ready to send"; break;
+
+ /* IOS 5 */
+ case 0x7B: str = "Concurrent authentication"; break;
+
case 0x7F: str = "Handoff procedure time-out"; break;
default:
str = "Reserved for future use";
@@ -2088,6 +2716,45 @@ elem_cic_ext(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
}
/*
+ * IOS 5 4.2.21
+ */
+static guint8
+elem_ssci(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint8 oct;
+ guint32 curr_offset;
+
+ len = len;
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xfc, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Mobile Originated Position Determination",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Global Emergency Call Indication",
+ a_bigbuf);
+
+ curr_offset++;
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
* IOS 6.2.2.24
* UNUSED
*/
@@ -2096,14 +2763,16 @@ elem_cic_ext(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
/*
* IOS 6.2.2.25
+ * Formats everything no length check
*/
static guint8
-elem_downlink_re(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+elem_downlink_re_aux(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
{
guint8 oct;
guint8 disc;
guint8 consumed;
guint8 num_cells;
+ guint8 curr_cell;
guint32 value;
guint32 curr_offset;
proto_item *item = NULL;
@@ -2112,11 +2781,11 @@ elem_downlink_re(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
curr_offset = offset;
- oct = tvb_get_guint8(tvb, curr_offset);
+ num_cells = tvb_get_guint8(tvb, curr_offset);
proto_tree_add_text(tree, tvb, curr_offset, 1,
"Number of Cells: %u",
- oct);
+ num_cells);
curr_offset++;
@@ -2145,15 +2814,17 @@ elem_downlink_re(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
SHORT_DATA_CHECK(len - (curr_offset - offset), (guint32) 3 + ANSI_A_CELL_ID_LEN(disc));
- num_cells =0;
+ curr_cell = 0;
do
{
+ curr_cell++;
+
item =
proto_tree_add_text(tree,
tvb, curr_offset, -1,
"Cell %u",
- num_cells + 1);
+ curr_cell);
subtree = proto_item_add_subtree(item, ett_cell_list);
@@ -2194,14 +2865,91 @@ elem_downlink_re(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
value);
curr_offset += 2;
-
- num_cells++;
}
- while ((len - (curr_offset - offset)) >= (guint32) (3 + ANSI_A_CELL_ID_LEN(disc)));
+ while (curr_cell < num_cells);
g_snprintf(add_string, string_len, " - %u cell%s",
num_cells, plurality(num_cells, "", "s"));
+ return(curr_offset - offset);
+}
+
+/*
+ * IOS 6.2.2.25
+ */
+static guint8
+elem_downlink_re(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint32 curr_offset;
+
+ curr_offset = offset;
+
+ curr_offset +=
+ elem_downlink_re_aux(tvb, tree, offset, len, add_string, string_len);
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
+ * IOS 6.2.2.140
+ */
+static guint8
+elem_downlink_re_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint8 consumed;
+ guint8 num_envs;
+ guint8 oct_len;
+ guint32 curr_offset;
+ proto_item *item = NULL;
+ proto_tree *subtree = NULL;
+
+ curr_offset = offset;
+
+ num_envs = 0;
+
+ while ((len - (curr_offset - offset)) > 0)
+ {
+ num_envs++;
+
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, -1,
+ "Environment %u",
+ num_envs);
+
+ subtree = proto_item_add_subtree(item, ett_re_list);
+
+ oct_len = tvb_get_guint8(tvb, curr_offset);
+
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "Environment Length: %u",
+ oct_len);
+
+ curr_offset++;
+
+ add_string[0] = '\0';
+ consumed =
+ elem_downlink_re_aux(tvb, subtree, curr_offset, len - (curr_offset - offset), add_string, string_len);
+
+ if (add_string[0] != '\0')
+ {
+ proto_item_append_text(item, "%s", add_string);
+ }
+
+ /*
+ * +1 is for environment length
+ */
+ proto_item_set_len(item, consumed + 1);
+
+ curr_offset += consumed;
+ }
+
+ g_snprintf(add_string, string_len, " - %u environment%s",
+ num_envs, plurality(num_envs, "", "s"));
+
EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
return(curr_offset - offset);
@@ -2239,10 +2987,24 @@ elem_pdsn_ip_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
proto_tree_add_item(tree, hf_ansi_a_pdsn_ip_addr, tvb, curr_offset, len, FALSE);
+ curr_offset += len;
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
/*
- proto_tree_add_text(tree, tvb, curr_offset, len,
- "IPv4 Address");
-*/
+ * IOS 5 4.2.24
+ */
+static guint8
+elem_s_pdsn_ip_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+ guint32 curr_offset;
+
+ curr_offset = offset;
+
+ proto_tree_add_item(tree, hf_ansi_a_s_pdsn_ip_addr, tvb, curr_offset, len, FALSE);
curr_offset += len;
@@ -2402,6 +3164,58 @@ elem_uz_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
*/
/*
+ * IOS 5 4.2.77
+ */
+static guint8
+elem_info_rec_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint8 rec_type;
+ guint8 num_recs;
+ guint32 curr_offset;
+ const gchar *str;
+ gint ett_elem_idx, idx;
+
+ curr_offset = offset;
+
+ num_recs = 0;
+
+ while ((len - (curr_offset - offset)) > 0)
+ {
+ num_recs++;
+
+ rec_type = tvb_get_guint8(tvb, curr_offset);
+
+ str = match_strval_idx((guint32) rec_type, ansi_rev_ms_info_rec_str, &idx);
+
+ if (str == NULL)
+ {
+ str = "Reserved";
+ ett_elem_idx = ett_ansi_ms_info_rec_reserved;
+ }
+ else
+ {
+ ett_elem_idx = ett_ansi_rev_ms_info_rec[idx];
+ }
+
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "Information Record Type - %u: (%u) %s",
+ num_recs,
+ rec_type,
+ str);
+
+ curr_offset++;
+ }
+
+ g_snprintf(add_string, string_len, " - %u request%s",
+ num_recs, plurality(num_recs, "", "s"));
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
* IOS 6.2.2.34
*/
static guint8
@@ -2467,10 +3281,22 @@ elem_is2000_chan_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len,
oct = tvb_get_guint8(tvb, curr_offset);
- other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
- proto_tree_add_text(tree, tvb, curr_offset, 1,
- "%s : Reserved",
- a_bigbuf);
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS401:
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+ break;
+
+ case A_VARIANT_IOS501:
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Rev_FCH_Gating",
+ a_bigbuf);
+ break;
+ }
switch ((oct & 0x60) >> 5)
{
@@ -2529,10 +3355,27 @@ elem_is2000_chan_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len,
a_bigbuf,
value);
- other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
- proto_tree_add_text(tree, tvb, curr_offset, 1,
- "%s : Reserved",
- a_bigbuf);
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS401:
+ other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+ break;
+
+ case A_VARIANT_IOS501:
+ other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Power Combined",
+ a_bigbuf);
+ break;
+ }
other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(tree, tvb, curr_offset, 1,
@@ -2919,6 +3762,44 @@ elem_rej_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
}
/*
+ * IOS 5 4.2.78
+ */
+static guint8
+elem_anchor_pdsn_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint32 curr_offset;
+
+ curr_offset = offset;
+
+ proto_tree_add_item(tree, hf_ansi_a_anchor_ip_addr, tvb, curr_offset, len, FALSE);
+
+ curr_offset += len;
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
+ * IOS 5 4.2.80
+ */
+static guint8
+elem_anchor_pp_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint32 curr_offset;
+
+ curr_offset = offset;
+
+ proto_tree_add_item(tree, hf_ansi_a_anchor_pp_ip_addr, tvb, curr_offset, len, FALSE);
+
+ curr_offset += len;
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
* IOS 6.2.2.45
*/
static guint8
@@ -3495,7 +4376,7 @@ elem_cause_l3(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
case 7: str = "International network"; break;
case 10: str = "Network beyond interworking point"; break;
default:
- str = "All other values Reserved"; break;
+ str = "Reserved"; break;
break;
}
@@ -3685,6 +4566,8 @@ elem_reg_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
case 0x04: str = "Parameter-change"; break;
case 0x05: str = "Ordered"; break;
case 0x06: str = "Distance-based"; break;
+ case 0x07: str = "User Zone-based"; break;
+ case 0x09: str = "BCMC Registration"; break;
default:
str = "Reserved";
break;
@@ -3825,11 +4708,29 @@ elem_hho_params(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
oct = tvb_get_guint8(tvb, curr_offset);
- other_decode_bitfield_value(a_bigbuf, oct, 0xe0, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Reserved",
- a_bigbuf);
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS401:
+ other_decode_bitfield_value(a_bigbuf, oct, 0xe0, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+ break;
+
+ case A_VARIANT_IOS501:
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Rev_Pwr_Cntl_Delay_Incl",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Rev_Pwr_Cntl_Delay",
+ a_bigbuf);
+ break;
+ }
other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
proto_tree_add_text(tree,
@@ -3954,6 +4855,7 @@ elem_sw_ver(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *a
return(curr_offset - offset);
}
+
/*
* IOS 6.2.2.66
*/
@@ -3991,7 +4893,7 @@ elem_so(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_s
{
case 1: str = "Basic Variable Rate Voice Service (8 kbps)"; break;
case 2: str = "Mobile Station Loopback (8 kbps)"; break;
- case 3: str = "Enhanced Variable Rate Voice Service (8 kbps)"; break;
+ case 3: str = "(EVRC) Enhanced Variable Rate Voice Service (8 kbps)"; break;
case 4: str = "Asynchronous Data Service (9.6 kbps)"; break;
case 5: str = "Group 3 Facsimile (9.6 kbps)"; break;
case 6: str = "Short Message Services (Rate Set 1)"; break;
@@ -4028,8 +4930,8 @@ elem_so(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_s
case 32: str = "Test Data Service Option (TDSO)"; break;
case 33: str = "cdma2000 High Speed Packet Data Service, Internet or ISO Protocol Stack"; break;
case 34: str = "cdma2000 High Speed Packet Data Service, CDPD Protocol Stack"; break;
- case 35: str = "Location Services, Rate Set 1 (9.6 kbps)"; break;
- case 36: str = "Location Services, Rate Set 2 (14.4 kbps)"; break;
+ case 35: str = "Location Services (PDS), Rate Set 1 (9.6 kbps)"; break;
+ case 36: str = "Location Services (PDS), Rate Set 2 (14.4 kbps)"; break;
case 37: str = "ISDN Interworking Service (64 kbps)"; break;
case 38: str = "GSM Voice"; break;
case 39: str = "GSM Circuit Data"; break;
@@ -4045,6 +4947,8 @@ elem_so(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_s
case 60: str = "Link Layer Assisted Robust Header Compression (LLA ROHC) - Header Removal"; break;
case 61: str = "Link Layer Assisted Robust Header Compression (LLA ROHC) - Header Compression"; break;
case 62: str = "- 4099 None Reserved for standard service options"; break;
+ case 68: str = "(EVRC-B NB) Enhanced Variable Rate Voice Service"; break;
+ case 70: str = "(EVRC-B WB) Enhanced Variable Rate Voice Service"; break;
case 4100: str = "Asynchronous Data Service, Revision 1 (9.6 or 14.4 kbps)"; break;
case 4101: str = "Group 3 Facsimile, Revision 1 (9.6 or 14.4 kbps)"; break;
case 4102: str = "Reserved for standard service option"; break;
@@ -4094,9 +4998,209 @@ elem_so(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_s
return(curr_offset - offset);
}
-#define ADDS_APP_SMS 0x03
-#define ADDS_APP_OTA 0x04
-#define ADDS_APP_PLD 0x05
+/*
+ * IOS 5 4.2.73
+ */
+static guint8
+elem_soci(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint8 oct;
+ guint32 curr_offset;
+
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf8, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : SOCI: %u",
+ a_bigbuf,
+ oct & 0x07);
+
+ g_snprintf(add_string, string_len, " - (%u)", oct);
+
+ curr_offset++;
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
+ * IOS 5 4.2.74
+ */
+static guint8
+elem_so_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint8 oct;
+ guint8 num_so;
+ guint8 inst;
+ guint32 curr_offset;
+ proto_item *item;
+ proto_tree *subtree;
+
+ curr_offset = offset;
+
+ num_so = tvb_get_guint8(tvb, curr_offset);
+
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "Number of Service Option instances: %u",
+ num_so);
+
+ /*
+ * this is in case we leave the function before the
+ * loop through the instances
+ */
+ g_snprintf(add_string, string_len, " - %u service options", num_so);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ SHORT_DATA_CHECK(len - (curr_offset - offset), 3);
+
+ inst = 1;
+
+ do
+ {
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "Service Option Instance - %u",
+ inst);
+
+ subtree = proto_item_add_subtree(item, ett_so_list);
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xc0, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x38, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : SR_ID: %u",
+ a_bigbuf,
+ (oct & 0x38) >> 3);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : SOCI: %u",
+ a_bigbuf,
+ oct & 0x07);
+
+ curr_offset++;
+
+ curr_offset += elem_so(tvb, subtree, curr_offset, len, add_string, string_len);
+ add_string[0] = '\0';
+
+ inst++;
+ }
+ while ((len - (curr_offset - offset)) >= 3);
+
+ /*
+ * this is because 'add_string' was used by 'elem_so()'
+ */
+ g_snprintf(add_string, string_len, " - %u service options", num_so);
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
+ * IOS 5 4.2.70
+ */
+static guint8
+elem_acc_net_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint32 value;
+ guint32 sid, nid, pzid;
+ guint32 curr_offset;
+
+ curr_offset = offset;
+
+ value = tvb_get_ntohs(tvb, curr_offset);
+ sid = value & 0x7fff;
+
+ other_decode_bitfield_value(a_bigbuf, value >> 8, 0x80, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, value >> 8, 0x7f, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : SID (MSB), %u",
+ a_bigbuf,
+ sid);
+
+ other_decode_bitfield_value(a_bigbuf, value & 0x00ff, 0xff, 8);
+ proto_tree_add_text(tree, tvb, curr_offset + 1, 1,
+ "%s : SID (LSB)",
+ a_bigbuf);
+
+ curr_offset += 2;
+
+ nid = tvb_get_ntohs(tvb, curr_offset);
+
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 2,
+ "NID: %u",
+ nid);
+
+ curr_offset += 2;
+
+ pzid = tvb_get_ntohs(tvb, curr_offset);
+
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 2,
+ "PZID: %u",
+ pzid);
+
+ curr_offset += 2;
+
+ g_snprintf(add_string, string_len, " - (SID/NID/PZID: %u/%u/%u)", sid, nid, pzid);
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+
+#define ADDS_APP_UNKNOWN 0x00
+#define ADDS_APP_ADS 0x01
+#define ADDS_APP_FAX 0x02
+#define ADDS_APP_SMS 0x03
+#define ADDS_APP_OTA 0x04
+#define ADDS_APP_PDS 0x05 /* aka PLD */
+#define ADDS_APP_SDB 0x06
+#define ADDS_APP_HRPD 0x07
+#define ADDS_APP_EXT_INTL 0x3E
+#define ADDS_APP_EXT 0x3F
+
+static const value_string ansi_a_adds_strings[] = {
+ { ADDS_APP_UNKNOWN, "UNKNOWN" },
+ { ADDS_APP_ADS, "ADS" },
+ { ADDS_APP_FAX, "FAX" },
+ { ADDS_APP_SMS, "SMS" },
+ { ADDS_APP_OTA, "OTA" },
+ { ADDS_APP_PDS, "PDS" },
+ { ADDS_APP_SDB, "SDB" },
+ { ADDS_APP_HRPD, "HRPD" },
+ { ADDS_APP_EXT_INTL, "EXT_INTL" },
+ { ADDS_APP_EXT, "EXT" }
+};
/*
* IOS 6.2.2.67
@@ -4105,10 +5209,14 @@ static guint8
elem_adds_user_part(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
{
guint8 oct;
+ guint32 value;
guint8 adds_app;
guint32 curr_offset;
const gchar *str;
tvbuff_t *adds_tvb;
+ gint idx;
+ proto_tree *subtree;
+ proto_item *item;
curr_offset = offset;
adds_app = 0;
@@ -4123,55 +5231,136 @@ elem_adds_user_part(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len,
adds_app = oct & 0x3f;
+ str = match_strval_idx((guint32) adds_app, ansi_a_adds_strings, &idx);
+ if (str == NULL)
+ {
+ str = "Reserved";
+ }
+ g_snprintf(add_string, string_len, " - (%s)", str);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x3f, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Data Burst Type: %s",
+ a_bigbuf,
+ str);
+
+ curr_offset++;
+
+ item =
+ proto_tree_add_text(tree, tvb, curr_offset, len - 1,
+ "Application Data Message");
+
+ subtree = proto_item_add_subtree(item, ett_adds_user_part);
+
switch (adds_app)
{
case ADDS_APP_SMS:
- str = "SMS";
-
- adds_tvb = tvb_new_subset(tvb, curr_offset + 1, len - 1, len - 1);
+ adds_tvb = tvb_new_subset(tvb, curr_offset, len - 1, len - 1);
dissector_try_port(is637_dissector_table,
0, adds_tvb, g_pinfo, g_tree);
+
+ curr_offset += (len - 1);
break;
case ADDS_APP_OTA:
- str = "OTA";
-
- adds_tvb = tvb_new_subset(tvb, curr_offset + 1, len - 1, len - 1);
+ adds_tvb = tvb_new_subset(tvb, curr_offset, len - 1, len - 1);
dissector_try_port(is683_dissector_table,
(g_pinfo->p2p_dir == P2P_DIR_RECV), adds_tvb, g_pinfo, g_tree);
- break;
- case ADDS_APP_PLD:
- str = "PLD";
+ curr_offset += (len - 1);
+ break;
- adds_tvb = tvb_new_subset(tvb, curr_offset + 1, len - 1, len - 1);
+ case ADDS_APP_PDS:
+ adds_tvb = tvb_new_subset(tvb, curr_offset, len - 1, len - 1);
dissector_try_port(is801_dissector_table,
(g_pinfo->p2p_dir == P2P_DIR_RECV), adds_tvb, g_pinfo, g_tree);
+
+ curr_offset += (len - 1);
+ break;
+
+ case ADDS_APP_SDB:
+ /*
+ * no SDB dissector, push to GRE/A11 dissector ?
+ */
+ curr_offset += (len - 1);
+ break;
+
+ case ADDS_APP_EXT_INTL:
+ /*
+ * no generic External International dissector
+ */
+ value = tvb_get_ntohs(tvb, curr_offset);
+
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 2,
+ "Extended Burst Type - International: 0x%04x", value);
+
+ curr_offset += 2;
+
+ proto_tree_add_text(tree, tvb, curr_offset, len - (curr_offset - offset),
+ "Data");
+
+ curr_offset += len - (curr_offset - offset);
+ break;
+
+ case ADDS_APP_EXT:
+ value = tvb_get_ntohs(tvb, curr_offset);
+
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 2,
+ "Extended Burst Type: 0x%04x", value);
+
+ curr_offset += 2;
+
+ proto_tree_add_text(subtree, tvb, curr_offset, len - (curr_offset - offset),
+ "Data");
+
+ curr_offset += len - (curr_offset - offset);
break;
default:
- str = "Unknown";
+ /*
+ * no sub-dissectors
+ */
+ curr_offset += (len - 1);
break;
}
- other_decode_bitfield_value(a_bigbuf, oct, 0x3f, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Data Burst Type: %s",
- a_bigbuf,
- str);
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
- curr_offset++;
+ return(curr_offset - offset);
+}
- proto_tree_add_text(tree, tvb, curr_offset, len - 1,
- "Application Data Message");
+/*
+ * IOS 5 4.2.75
+ */
+static guint8
+elem_amps_hho_param(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+ guint8 oct;
+ guint32 curr_offset;
- g_snprintf(add_string, string_len, " - (%s)", str);
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xfc, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
- curr_offset += (len - 1);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Encryption Mode: (%u) %s",
+ a_bigbuf,
+ oct & 0x03,
+ (oct & 0x03) ? "enabled" : "disabled");
+
+ curr_offset++;
EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
@@ -4281,22 +5470,53 @@ elem_is2000_mob_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len,
guint8 oct;
guint8 oct_len;
guint32 curr_offset;
+ gboolean rev_pdch_supported;
+ gboolean for_pdch_supported;
+ gboolean dcch_supported;
const gchar *str;
curr_offset = offset;
oct = tvb_get_guint8(tvb, curr_offset);
- other_decode_bitfield_value(a_bigbuf, oct, 0xe0, 8);
- proto_tree_add_text(tree, tvb, curr_offset, 1,
- "%s : Reserved",
- a_bigbuf);
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS401:
+ other_decode_bitfield_value(a_bigbuf, oct, 0xe0, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+ break;
+ case A_VARIANT_IOS501:
+ rev_pdch_supported = (oct & 0x80) ? TRUE : FALSE;
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : REV_PDCH Supported: IS-2000 R-PDCH %ssupported",
+ a_bigbuf,
+ rev_pdch_supported ? "" : "not ");
+
+ for_pdch_supported = (oct & 0x40) ? TRUE : FALSE;
+ other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : FOR_PDCH Supported: IS-2000 F-PDCH %ssupported",
+ a_bigbuf,
+ for_pdch_supported ? "" : "not ");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x20, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : ERAM Supported: Enhanced Rate Adaptation Mode %ssupported",
+ a_bigbuf,
+ (oct & 0x20) ? "" : "not ");
+ break;
+ }
+
+ dcch_supported = (oct & 0x10) ? TRUE : FALSE;
other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
proto_tree_add_text(tree, tvb, curr_offset, 1,
"%s : DCCH Supported: IS-2000 DCCH %ssupported",
a_bigbuf,
- (oct & 0x10) ? "" : "not ");
+ dcch_supported ? "" : "not ");
other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(tree, tvb, curr_offset, 1,
@@ -4351,7 +5571,7 @@ elem_is2000_mob_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len,
case 2: str = "IS801 capable (Advanced Forward Link Triangulation and Global Positioning Systems"; break;
case 3: str = "Global Positioning Systems Only"; break;
default:
- str = "All Other values reserved";
+ str = "Reserved";
break;
}
@@ -4388,42 +5608,133 @@ elem_is2000_mob_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len,
NO_MORE_DATA_CHECK(len);
}
- oct_len = tvb_get_guint8(tvb, curr_offset);
+ if (dcch_supported)
+ {
+ oct_len = tvb_get_guint8(tvb, curr_offset);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "DCCH Information: Bit-Exact Length Octet Count: %u",
- oct_len);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "DCCH Information: Bit-Exact Length Octet Count: %u",
+ oct_len);
- curr_offset++;
+ curr_offset++;
- NO_MORE_DATA_CHECK(len);
+ NO_MORE_DATA_CHECK(len);
- oct = tvb_get_guint8(tvb, curr_offset);
+ oct = tvb_get_guint8(tvb, curr_offset);
- other_decode_bitfield_value(a_bigbuf, oct, 0xf8, 8);
- proto_tree_add_text(tree, tvb, curr_offset, 1,
- "%s : Reserved",
- a_bigbuf);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf8, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
- other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
- proto_tree_add_text(tree, tvb, curr_offset, 1,
- "%s : DCCH Information: Bit-Exact Length Fill Bits: %u",
- a_bigbuf,
- oct & 0x07);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : DCCH Information: Bit-Exact Length Fill Bits: %u",
+ a_bigbuf,
+ oct & 0x07);
- curr_offset++;
+ curr_offset++;
- NO_MORE_DATA_CHECK(len);
+ NO_MORE_DATA_CHECK(len);
- if (oct_len > 0)
+ if (oct_len > 0)
+ {
+ SHORT_DATA_CHECK(len - (curr_offset - offset), oct_len);
+
+ proto_tree_add_text(tree, tvb, curr_offset, oct_len,
+ "DCCH Information Content");
+
+ curr_offset += oct_len;
+
+ NO_MORE_DATA_CHECK(len);
+ }
+ }
+
+ if (for_pdch_supported)
{
- SHORT_DATA_CHECK(len - (curr_offset - offset), oct_len);
+ oct_len = tvb_get_guint8(tvb, curr_offset);
- proto_tree_add_text(tree, tvb, curr_offset, oct_len,
- "DCCH Information Content");
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "FOR_PDCH Information: Bit-Exact Length Octet Count: %u",
+ oct_len);
- curr_offset += oct_len;
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf8, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : FOR_PDCH Information: Bit-Exact Length Fill Bits: %u",
+ a_bigbuf,
+ oct & 0x07);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ if (oct_len > 0)
+ {
+ SHORT_DATA_CHECK(len - (curr_offset - offset), oct_len);
+
+ proto_tree_add_text(tree, tvb, curr_offset, oct_len,
+ "FOR_PDCH Information Content");
+
+ curr_offset += oct_len;
+
+ NO_MORE_DATA_CHECK(len);
+ }
+ }
+
+ if (rev_pdch_supported)
+ {
+ oct_len = tvb_get_guint8(tvb, curr_offset);
+
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "REV_PDCH Information: Bit-Exact Length Octet Count: %u",
+ oct_len);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf8, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : REV_PDCH Information: Bit-Exact Length Fill Bits: %u",
+ a_bigbuf,
+ oct & 0x07);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ if (oct_len > 0)
+ {
+ SHORT_DATA_CHECK(len - (curr_offset - offset), oct_len);
+
+ proto_tree_add_text(tree, tvb, curr_offset, oct_len,
+ "REV_PDCH Information Content");
+
+ curr_offset += oct_len;
+
+ NO_MORE_DATA_CHECK(len);
+ }
}
EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
@@ -4473,7 +5784,7 @@ elem_ptype(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
* IOS 6.2.2.72
*/
static guint8
-elem_ms_info_recs(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+elem_fwd_ms_info_recs(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
{
guint8 oct;
guint8 oct_len;
@@ -4496,7 +5807,7 @@ elem_ms_info_recs(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
rec_type = tvb_get_guint8(tvb, curr_offset);
- str = match_strval_idx((guint32) rec_type, ansi_ms_info_rec_str, &idx);
+ str = match_strval_idx((guint32) rec_type, ansi_fwd_ms_info_rec_str, &idx);
if (str == NULL)
{
@@ -4505,7 +5816,7 @@ elem_ms_info_recs(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
}
else
{
- ett_elem_idx = ett_ansi_ms_info_rec[idx];
+ ett_elem_idx = ett_ansi_fwd_ms_info_rec[idx];
}
item =
@@ -4533,7 +5844,7 @@ elem_ms_info_recs(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
switch (rec_type)
{
- case ANSI_MS_INFO_REC_CLD_PN:
+ case ANSI_FWD_MS_INFO_REC_CLD_PN:
oct = tvb_get_guint8(tvb, curr_offset);
switch ((oct & 0xe0) >> 5)
@@ -4609,7 +5920,7 @@ elem_ms_info_recs(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
curr_offset++;
break;
- case ANSI_MS_INFO_REC_CLG_PN:
+ case ANSI_FWD_MS_INFO_REC_CLG_PN:
value = tvb_get_ntohs(tvb, curr_offset);
oct = (value & 0xff00) >> 8;
@@ -4730,7 +6041,7 @@ elem_ms_info_recs(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
}
break;
- case ANSI_MS_INFO_REC_MW:
+ case ANSI_FWD_MS_INFO_REC_MW:
oct = tvb_get_guint8(tvb, curr_offset);
proto_tree_add_text(subtree, tvb, curr_offset, 1,
@@ -4760,6 +6071,286 @@ elem_ms_info_recs(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
}
/*
+ * IOS 6.2.2.72
+ */
+static guint8
+elem_rev_ms_info_recs(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint8 oct;
+ guint8 oct_len;
+ guint8 rec_type;
+ guint8 num_recs;
+ guint32 value;
+ guint32 curr_offset;
+ const gchar *str;
+ gint ett_elem_idx, idx, i;
+ proto_tree *subtree;
+ proto_item *item;
+
+ curr_offset = offset;
+
+ num_recs = 0;
+
+ while ((len - (curr_offset - offset)) >= 2)
+ {
+ num_recs++;
+
+ rec_type = tvb_get_guint8(tvb, curr_offset);
+
+ str = match_strval_idx((guint32) rec_type, ansi_rev_ms_info_rec_str, &idx);
+
+ if (str == NULL)
+ {
+ str = "Reserved";
+ ett_elem_idx = ett_ansi_ms_info_rec_reserved;
+ }
+ else
+ {
+ ett_elem_idx = ett_ansi_rev_ms_info_rec[idx];
+ }
+
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "Information Record Type - %u: (%u) %s",
+ num_recs,
+ rec_type,
+ str);
+
+ subtree = proto_item_add_subtree(item, ett_elem_idx);
+
+ curr_offset++;
+
+ oct_len = tvb_get_guint8(tvb, curr_offset);
+
+ proto_tree_add_uint(subtree, hf_ansi_a_length, tvb,
+ curr_offset, 1, oct_len);
+
+ curr_offset++;
+
+ if (oct_len > 0)
+ {
+ SHORT_DATA_CHECK(len - (curr_offset - offset), oct_len);
+
+ switch (rec_type)
+ {
+ case ANSI_REV_MS_INFO_REC_CLD_PN:
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ switch ((oct & 0xe0) >> 5)
+ {
+ case 0: str = "Unknown"; break;
+ case 1: str = "International number"; break;
+ case 2: str = "National number"; break;
+ case 3: str = "Network-specific number"; break;
+ case 4: str = "Subscriber number"; break;
+ case 5: str = "Reserved"; break;
+ case 6: str = "Abbreviated number"; break;
+ default:
+ str = "Reserved for extension";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xe0, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : Number Type: %s",
+ a_bigbuf,
+ str);
+
+ switch ((oct & 0x1e) >> 1)
+ {
+ case 0x00: str = "Unknown"; break;
+ case 0x01: str = "ISDN/Telephony Numbering"; break;
+ case 0x03: str = "Data Numbering (ITU-T Rec. X.121)"; break;
+ case 0x04: str = "Telex Numbering (ITU-T Rec. F.69)"; break;
+ case 0x09: str = "Private Numbering"; break;
+ case 0x0f: str = "Reserved for extension"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x1e, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : Number Plan: %s",
+ a_bigbuf,
+ str);
+
+ if (oct_len > 1)
+ {
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : MSB of first digit",
+ a_bigbuf);
+
+ curr_offset++;
+
+ for (i=0; i < (oct_len - 1); i++)
+ {
+ a_bigbuf[i] = (oct & 0x01) << 7;
+
+ oct = tvb_get_guint8(tvb, curr_offset + i);
+
+ a_bigbuf[i] |= (oct & 0xfe) >> 1;
+ }
+ a_bigbuf[i] = '\0';
+
+ proto_tree_add_text(subtree, tvb, curr_offset, oct_len - 1,
+ "Digits: %s",
+ a_bigbuf);
+
+ curr_offset += (oct_len - 2);
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+
+ curr_offset++;
+ break;
+
+ case ANSI_REV_MS_INFO_REC_CLG_PN:
+ value = tvb_get_ntohs(tvb, curr_offset);
+
+ oct = (value & 0xff00) >> 8;
+
+ switch ((oct & 0xe0) >> 5)
+ {
+ case 0: str = "Unknown"; break;
+ case 1: str = "International number"; break;
+ case 2: str = "National number"; break;
+ case 3: str = "Network-specific number"; break;
+ case 4: str = "Subscriber number"; break;
+ case 5: str = "Reserved"; break;
+ case 6: str = "Abbreviated number"; break;
+ default:
+ str = "Reserved for extension";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, value, 0xe000, 16);
+ proto_tree_add_text(subtree, tvb, curr_offset, 2,
+ "%s : Number Type: %s",
+ a_bigbuf,
+ str);
+
+ switch ((oct & 0x1e) >> 1)
+ {
+ case 0x00: str = "Unknown"; break;
+ case 0x01: str = "ISDN/Telephony Numbering"; break;
+ case 0x03: str = "Data Numbering (ITU-T Rec. X.121)"; break;
+ case 0x04: str = "Telex Numbering (ITU-T Rec. F.69)"; break;
+ case 0x09: str = "Private Numbering"; break;
+ case 0x0f: str = "Reserved for extension"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, value, 0x1e00, 16);
+ proto_tree_add_text(subtree, tvb, curr_offset, 2,
+ "%s : Number Plan: %s",
+ a_bigbuf,
+ str);
+
+ switch ((value & 0x0180) >> 7)
+ {
+ case 0: str = "Presentation allowed"; break;
+ case 1: str = "Presentation restricted"; break;
+ case 2: str = "Number not available"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, value, 0x0180, 16);
+ proto_tree_add_text(subtree, tvb, curr_offset, 2,
+ "%s : Presentation Indicator (PI): %s",
+ a_bigbuf,
+ str);
+
+ switch ((value & 0x0060) >> 5)
+ {
+ case 0: str = "User-provided, not screened"; break;
+ case 1: str = "User-provided, verified and passed"; break;
+ case 2: str = "User-provided, verified and failed"; break;
+ default:
+ str = "Network-provided";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, value, 0x0060, 16);
+ proto_tree_add_text(subtree, tvb, curr_offset, 2,
+ "%s : Screening Indicator (SI): %s",
+ a_bigbuf,
+ str);
+
+ if (oct_len > 2)
+ {
+ oct = (value & 0x00ff);
+
+ other_decode_bitfield_value(a_bigbuf, value, 0x001f, 16);
+ proto_tree_add_text(subtree, tvb, curr_offset, 2,
+ "%s : MSB of first digit",
+ a_bigbuf);
+
+ curr_offset += 2;
+
+ for (i=0; i < (oct_len - 2); i++)
+ {
+ a_bigbuf[i] = (oct & 0x1f) << 3;
+
+ oct = tvb_get_guint8(tvb, curr_offset + i);
+
+ a_bigbuf[i] |= (oct & 0xe0) >> 5;
+ }
+ a_bigbuf[i] = '\0';
+
+ proto_tree_add_text(subtree, tvb, curr_offset, oct_len - 2,
+ "Digits: %s",
+ a_bigbuf);
+
+ curr_offset += (oct_len - 3);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x1f, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+
+ curr_offset++;
+ }
+ else
+ {
+ other_decode_bitfield_value(a_bigbuf, value, 0x001f, 16);
+ proto_tree_add_text(subtree, tvb, curr_offset, 2,
+ "%s : Reserved",
+ a_bigbuf);
+
+ curr_offset += 2;
+ }
+ break;
+
+ default:
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, oct_len,
+ "Record Content");
+
+ curr_offset += oct_len;
+ break;
+ }
+ }
+ }
+
+ g_snprintf(add_string, string_len, " - %u record%s",
+ num_recs, plurality(num_recs, "", "s"));
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
* IOS 6.2.2.73
*/
static guint8
@@ -4768,6 +6359,7 @@ elem_ext_ho_dir_params(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint le
guint8 oct;
guint32 value;
guint32 curr_offset;
+ const gchar *str;
curr_offset = offset;
@@ -4850,10 +6442,38 @@ elem_ext_ho_dir_params(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint le
a_bigbuf,
(oct & 0xf0) >> 4);
- other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
- proto_tree_add_text(tree, tvb, curr_offset, 1,
- "%s : Reserved",
- a_bigbuf);
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS401:
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+ break;
+
+ case A_VARIANT_IOS501:
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0c, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+
+ switch (oct & 0x03)
+ {
+ case 0: str = "Only Search Window A Size is valid"; break;
+ case 1: str = "Subset is valid"; break;
+ case 2: str = "All fields valid"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : Target BS Values Included: %s",
+ a_bigbuf,
+ str);
+ break;
+ }
curr_offset++;
@@ -4998,6 +6618,15 @@ elem_cdma_sowd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
curr_offset++;
+ if ((len - (curr_offset - offset)) > 1)
+ {
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 2,
+ "Timestamp");
+
+ curr_offset += 2;
+ }
+
EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
return(curr_offset - offset);
@@ -5403,6 +7032,8 @@ elem_auth_event(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
{
case 0x01: str = "Event: Authentication parameters were NOT received from mobile"; break;
case 0x02: str = "Event: RANDC mis-match"; break;
+ case 0x03: str = "Event: Recently requested"; break;
+ case 0x04: str = "Event: Direct channel assignment"; break;
default:
str = "Event";
break;
@@ -5540,13 +7171,55 @@ elem_auth_event(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
/*
* IOS 6.2.2.138
- * UNUSED
*/
+static guint8
+elem_psmm_count(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint8 oct;
+ guint32 curr_offset;
+
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : PSMM Count: %u",
+ a_bigbuf,
+ oct & 0x0f);
+
+ curr_offset++;
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
/*
* IOS 6.2.2.139
- * UNUSED
*/
+static guint8
+elem_geo_loc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint32 curr_offset;
+
+ curr_offset = offset;
+
+ proto_tree_add_text(tree, tvb, curr_offset, len, "Calling Geodetic Location");
+
+ curr_offset += len;
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
/*
* IOS 6.2.2.140
@@ -5715,7 +7388,7 @@ elem_paca_order(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
case 4: str = "MS Requested PACA Cancel"; break;
case 5: str = "BS Requested PACA Cancel"; break;
default:
- str = "All other values Reserved";
+ str = "Reserved";
break;
}
@@ -5770,6 +7443,399 @@ elem_paca_reoi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
}
/*
+ * IOS 5 4.2.89
+ */
+static guint8
+elem_a2p_bearer_session(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint8 oct;
+ guint32 curr_offset;
+
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xc0, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x38, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Max Frames: %u",
+ a_bigbuf,
+ (oct & 0x38) >> 3);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x06, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Session IP Address Type: Internet Protocol IPv%s",
+ a_bigbuf,
+ ((oct & 0x06) >> 1) ? "6" : "4");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Session Address Flag",
+ a_bigbuf);
+
+ curr_offset++;
+
+ if (oct & 0x01)
+ {
+ /* session address included */
+
+ if ((oct & 0x06) >> 1)
+ {
+ SHORT_DATA_CHECK(len - (curr_offset - offset), 18);
+
+ proto_tree_add_item(tree, hf_ansi_a_a2p_bearer_ipv6_addr,
+ tvb, curr_offset, 16, FALSE);
+
+ curr_offset += 16;
+ }
+ else
+ {
+ SHORT_DATA_CHECK(len - (curr_offset - offset), 6);
+
+ proto_tree_add_item(tree, hf_ansi_a_a2p_bearer_ipv4_addr,
+ tvb, curr_offset, 4, FALSE);
+
+ curr_offset += 4;
+ }
+
+ proto_tree_add_item(tree, hf_ansi_a_a2p_bearer_udp_port,
+ tvb, curr_offset, 2, FALSE);
+
+ curr_offset += 2;
+ }
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
+ * IOS 5 4.2.90
+ */
+static guint8
+elem_a2p_bearer_format(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint8 oct;
+ proto_item *item;
+ proto_tree *subtree;
+ guint8 num_bearers;
+ guint32 curr_offset, orig_offset;
+ guint8 ip_addr_type;
+ gboolean ext;
+ guint8 ext_len;
+ const gchar *str;
+
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xfc, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Number of Bearer Formats: %u",
+ a_bigbuf,
+ (oct & 0xfc) >> 2);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Session IP Address Type: Internet Protocol IPv%s",
+ a_bigbuf,
+ (oct & 0x03) ? "6" : "4");
+
+ ip_addr_type = (oct & 0x03);
+
+ curr_offset++;
+
+ num_bearers = 0;
+
+ while ((len - (curr_offset - offset)) > 0)
+ {
+ orig_offset = curr_offset;
+
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, -1,
+ "Bearer Format %u",
+ num_bearers + 1);
+
+ subtree = proto_item_add_subtree(item, ett_bearer_list);
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "Bearer Format Length: %u",
+ oct);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : Extension",
+ a_bigbuf);
+
+ ext = (oct & 0x80) ? TRUE : FALSE;
+
+ switch ((oct & 0x70) >> 4)
+ {
+ case 0: str = "Unknown"; break;
+ case 1: str = "In-band signaling"; break;
+ case 2: str = "Assigned"; break;
+ case 3: str = "Unassigned"; break;
+ case 4: str = "Transcoded"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : Bearer Format Tag Type: %s",
+ a_bigbuf,
+ str);
+
+ switch (oct & 0x0f)
+ {
+ case 0: str = "PCMU"; break;
+ case 1: str = "PCMA"; break;
+ case 2: str = "13K Vocoder"; break;
+ case 3: str = "EVRC"; break;
+ case 4: str = "EVRC0"; break;
+ case 5: str = "SMV"; break;
+ case 6: str = "SMV0"; break;
+ case 7: str = "telephone-event"; break;
+ case 8: str = "EVRCB"; break;
+ case 9: str = "EVRCB0"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : Bearer Format ID: %s",
+ a_bigbuf,
+ str);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xfe, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : RTP Payload Type: %u",
+ a_bigbuf,
+ (oct & 0xfe) >> 1);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : Bearer Address Flag",
+ a_bigbuf);
+
+ curr_offset++;
+
+ if (oct & 0x01)
+ {
+ /* bearer address included */
+
+ if (ip_addr_type != 0)
+ {
+ SHORT_DATA_CHECK(len - (curr_offset - offset), 18);
+
+ proto_tree_add_item(subtree, hf_ansi_a_a2p_bearer_ipv6_addr,
+ tvb, curr_offset, 16, FALSE);
+
+ curr_offset += 16;
+ }
+ else
+ {
+ SHORT_DATA_CHECK(len - (curr_offset - offset), 6);
+
+ proto_tree_add_item(subtree, hf_ansi_a_a2p_bearer_ipv4_addr,
+ tvb, curr_offset, 4, FALSE);
+
+ curr_offset += 4;
+ }
+
+ proto_tree_add_item(subtree, hf_ansi_a_a2p_bearer_udp_port,
+ tvb, curr_offset, 2, FALSE);
+
+ curr_offset += 2;
+ }
+
+ if (ext)
+ {
+ SHORT_DATA_CHECK(len - (curr_offset - offset), 1);
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ ext_len = (oct & 0xf0) >> 4;
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : Extension Length: %u",
+ a_bigbuf,
+ ext_len);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ proto_tree_add_text(subtree, tvb, curr_offset, 1,
+ "%s : Extension ID: %u",
+ a_bigbuf,
+ (oct & 0x0f));
+
+ curr_offset++;
+
+ if (ext_len > 0)
+ {
+ SHORT_DATA_CHECK(len - (curr_offset - offset), ext_len);
+
+ proto_tree_add_text(subtree, tvb, curr_offset, ext_len,
+ "Extension Parameter value");
+
+ curr_offset += ext_len;
+ }
+ }
+
+ proto_item_set_len(item, curr_offset - orig_offset);
+
+ num_bearers++;
+ }
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
+ * IOS 5 4.2.88
+ */
+static guint8
+elem_ms_des_freq(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint8 oct;
+ guint32 value;
+ gint temp_int;
+ guint32 curr_offset;
+ const gchar *str;
+
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ temp_int = (oct & 0xf8) >> 3;
+ if ((temp_int < 0) || (temp_int >= (gint) NUM_BAND_CLASS_STR))
+ {
+ str = "Reserved";
+ }
+ else
+ {
+ str = band_class_str[temp_int];
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf8, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Band Class: %s",
+ a_bigbuf,
+ str);
+
+ value = tvb_get_guint8(tvb, curr_offset + 1) | ((oct & 0x07) << 8);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : CDMA Channel (MSB): %u",
+ a_bigbuf,
+ value);
+
+ curr_offset++;
+
+ other_decode_bitfield_value(a_bigbuf, value & 0x00ff, 0xff, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : CDMA Channel (LSB)",
+ a_bigbuf);
+
+ g_snprintf(add_string, string_len, " - (CDMA Channel: %u)", value);
+
+ curr_offset++;
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
+ * IOS 5 4.2.87
+ */
+static guint8
+elem_plcm_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len)
+{
+ guint8 oct;
+ guint32 curr_offset;
+ const gchar *str;
+
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ /*
+ * from C.S0005-D v1.0 L3 Table 3.7.2.3.2.21-5
+ */
+ switch ((oct & 0xf0) >> 4)
+ {
+ case 0x00: str = "PLCM derived from ESN or MEID"; break;
+ case 0x01: str = "PLCM specified by the base station"; break;
+ case 0x02: str = "PLCM derived from IMSI_O_S when IMSI_O is derived from IMSI_M"; break;
+ case 0x03: str = "PLCM derived from IMSI_O_S when IMSI_O is derived from IMSI_T"; break;
+ break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : PLCM_TYPE: %s",
+ a_bigbuf,
+ str);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0c, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Reserved",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
+ proto_tree_add_text(tree, tvb, curr_offset, 1,
+ "%s : PLCM_42 (MSB)",
+ a_bigbuf);
+
+ curr_offset++;
+
+ proto_tree_add_text(tree, tvb, curr_offset, 5, "PLCM_42");
+
+ curr_offset += 5;
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
* IOS 6.2.2.152
* A3/A7
*/
@@ -5779,6 +7845,13 @@ elem_paca_reoi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
* A3/A7
*/
+/*
+ * ORDER MUST BE MAINTAINED
+ *
+ * The value of this enum is used as an index into
+ * elem_1_fcn[]
+ *
+ */
typedef enum
{
ANSI_A_E_ACC_NET_ID, /* Access Network Identifiers */
@@ -5829,7 +7902,7 @@ typedef enum
ANSI_A_E_LAI, /* Location Area Information */
ANSI_A_E_MWI, /* Message Waiting Indication */
ANSI_A_E_MID, /* Mobile Identity */
- ANSI_A_E_MS_INFO_RECS, /* MS Information Records */
+ ANSI_A_E_FWD_MS_INFO_RECS, /* (Forward) MS Information Records */
ANSI_A_E_ORIG_CI, /* Origination Continuation Indicator */
ANSI_A_E_PACA_ORDER, /* PACA Order */
ANSI_A_E_PACA_REOI, /* PACA Reorigination Indicator */
@@ -5838,7 +7911,7 @@ typedef enum
ANSI_A_E_PDSN_IP_ADDR, /* PDSN IP Address */
ANSI_A_E_PDI, /* Power Down Indicator */
ANSI_A_E_PRIO, /* Priority */
- ANSI_A_E_PREV, /* Protocol Revision */
+ ANSI_A_E_P_REV, /* Protocol Revision */
ANSI_A_E_PTYPE, /* Protocol Type */
ANSI_A_E_PSMM_COUNT, /* PSMM Count */
ANSI_A_E_QOS_PARAMS, /* Quality of Service Parameters */
@@ -5846,13 +7919,13 @@ typedef enum
ANSI_A_E_REG_TYPE, /* Registration Type */
ANSI_A_E_REJ_CAUSE, /* Reject Cause */
ANSI_A_E_RESP_REQ, /* Response Request */
- ANSI_A_E_RET_CAUSE, /* Return Cause */
+ ANSI_A_E_RETURN_CAUSE, /* Return Cause */
ANSI_A_E_RF_CHAN_ID, /* RF Channel Identity */
ANSI_A_E_SO, /* Service Option */
ANSI_A_E_SOCI, /* Service Option Connection Identifier (SOCI) */
ANSI_A_E_SO_LIST, /* Service Option List */
ANSI_A_E_S_RED_INFO, /* Service Redirection Info */
- ANSI_A_E_SR_ID, /* Session Reference Identifier (SR_ID) */
+ ANSI_A_E_SR_ID, /* Service Reference Identifier (SR_ID) */
ANSI_A_E_SID, /* SID */
ANSI_A_E_SIGNAL, /* Signal */
ANSI_A_E_SCI, /* Slot Cycle Index */
@@ -5864,18 +7937,26 @@ typedef enum
ANSI_A_E_XMODE, /* Transcoder Mode */
ANSI_A_E_UZ_ID, /* User Zone ID */
ANSI_A_E_VP_REQ, /* Voice Privacy Request */
+ ANSI_A_E_A2P_BEARER_SESSION, /* A2p Bearer Session-Level Parameters */
+ ANSI_A_E_A2P_BEARER_FORMAT, /* A2p Bearer Format-Specific Parameters */
+ ANSI_A_E_MS_DES_FREQ, /* MS Designated Frequency */
+ ANSI_A_E_MOB_SUB_INFO, /* Mobile Subscription Information */
+ ANSI_A_E_PLCM_ID, /* Public Long Code Mask Identifier */
+ ANSI_A_E_REV_MS_INFO_RECS, /* (Reverse) MS Information Records */
ANSI_A_E_NONE /* NONE */
}
elem_idx_t;
-#define NUM_ELEM_1 (sizeof(ansi_a_ios401_elem_1_strings)/sizeof(value_string))
-static gint ett_ansi_elem_1[NUM_ELEM_1];
-static guint8 (*elem_1_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len) = {
- NULL, /* Access Network Identifiers */
+#define MAX_IOS401_NUM_ELEM_1 (sizeof(ansi_a_ios401_elem_1_strings)/sizeof(ext_value_string_t))
+#define MAX_IOS501_NUM_ELEM_1 (sizeof(ansi_a_ios501_elem_1_strings)/sizeof(ext_value_string_t))
+static gint ett_ansi_elem_1[MAX(MAX_IOS401_NUM_ELEM_1, MAX_IOS501_NUM_ELEM_1)];
+static guint8 (*elem_1_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len) =
+{
+ elem_acc_net_id, /* Access Network Identifiers */
elem_adds_user_part, /* ADDS User Part */
- NULL, /* AMPS Hard Handoff Parameters */
- NULL, /* Anchor PDSN Address */
- NULL, /* Anchor P-P Address */
+ elem_amps_hho_param, /* AMPS Hard Handoff Parameters */
+ elem_anchor_pdsn_addr, /* Anchor PDSN Address */
+ elem_anchor_pp_addr, /* Anchor P-P Address */
elem_auth_chlg_param, /* Authentication Challenge Parameter */
NULL /* no decode required */, /* Authentication Confirmation Parameter (RANDC) */
NULL /* no decode required */, /* Authentication Data */
@@ -5898,14 +7979,14 @@ static guint8 (*elem_1_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, g
elem_cic_ext, /* Circuit Identity Code Extension */
elem_cm_info_type_2, /* Classmark Information Type 2 */
elem_downlink_re, /* Downlink Radio Environment */
- NULL, /* Downlink Radio Environment List */
+ elem_downlink_re_list, /* Downlink Radio Environment List */
elem_enc_info, /* Encryption Information */
elem_ext_ho_dir_params, /* Extended Handoff Direction Parameters */
- NULL, /* Geographic Location */
- NULL, /* Special Service Call Indicator */
+ elem_geo_loc, /* Geographic Location */
+ elem_ssci, /* Special Service Call Indicator */
elem_ho_pow_lev, /* Handoff Power Level */
elem_hho_params, /* Hard Handoff Parameters */
- NULL, /* Information Element Requested */
+ elem_info_rec_req, /* Information Element Requested */
elem_is2000_chan_id, /* IS-2000 Channel Identity */
NULL, /* IS-2000 Channel Identity 3X */
elem_is2000_mob_cap, /* IS-2000 Mobile Capabilities */
@@ -5919,8 +8000,8 @@ static guint8 (*elem_1_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, g
elem_lai, /* Location Area Information */
elem_mwi, /* Message Waiting Indication */
elem_mid, /* Mobile Identity */
- elem_ms_info_recs, /* MS Information Records */
- NULL, /* Origination Continuation Indicator */
+ elem_fwd_ms_info_recs, /* (Forward) MS Information Records */
+ NULL /* no associated data */, /* Origination Continuation Indicator */
elem_paca_order, /* PACA Order */
elem_paca_reoi, /* PACA Reorigination Indicator */
elem_paca_ts, /* PACA Timestamp */
@@ -5928,32 +8009,38 @@ static guint8 (*elem_1_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, g
elem_pdsn_ip_addr, /* PDSN IP Address */
NULL /* no associated data */, /* Power Down Indicator */
elem_prio, /* Priority */
- NULL, /* Protocol Revision */
+ elem_p_rev, /* Protocol Revision */
elem_ptype, /* Protocol Type */
- NULL, /* PSMM Count */
+ elem_psmm_count, /* PSMM Count */
elem_qos_params, /* Quality of Service Parameters */
elem_re_res, /* Radio Environment and Resources */
elem_reg_type, /* Registration Type */
elem_rej_cause, /* Reject Cause */
NULL /* no associated data */, /* Response Request */
- NULL, /* Return Cause */
+ elem_return_cause, /* Return Cause */
elem_rf_chan_id, /* RF Channel Identity */
elem_so, /* Service Option */
- NULL, /* Service Option Connection Identifier (SOCI) */
- NULL, /* Service Option List */
+ elem_soci, /* Service Option Connection Identifier (SOCI) */
+ elem_so_list, /* Service Option List */
NULL, /* Service Redirection Info */
- NULL, /* Session Reference Identifier (SR_ID) */
+ elem_sr_id, /* Service Reference Identifier (SR_ID) */
elem_sid, /* SID */
elem_signal, /* Signal */
elem_sci, /* Slot Cycle Index */
elem_sw_ver, /* Software Version */
- NULL, /* Source RNC to Target RNC Transparent Container */
- NULL, /* Source PDSN Address */
+ NULL /* transparent */, /* Source RNC to Target RNC Transparent Container */
+ elem_s_pdsn_ip_addr, /* Source PDSN Address */
elem_tag, /* Tag */
- NULL, /* Target RNC to Source RNC Transparent Container */
+ NULL /* transparent */, /* Target RNC to Source RNC Transparent Container */
elem_xmode, /* Transcoder Mode */
elem_uz_id, /* User Zone ID */
NULL /* no associated data */, /* Voice Privacy Request */
+ elem_a2p_bearer_session, /* A2p Bearer Session-Level Parameters */
+ elem_a2p_bearer_format, /* A2p Bearer Format-Specific Parameters */
+ elem_ms_des_freq, /* MS Designated Frequency */
+ NULL, /* Mobile Subscription Information */
+ elem_plcm_id, /* Public Long Code Mask Identification */
+ elem_rev_ms_info_recs, /* (Reverse) MS Information Records */
NULL, /* NONE */
};
@@ -5970,6 +8057,7 @@ elem_tlv(tvbuff_t *tvb, proto_tree *tree, elem_idx_t idx, guint32 offset, guint
guint32 curr_offset;
proto_tree *subtree;
proto_item *item;
+ gint dec_idx;
len = len;
curr_offset = offset;
@@ -5977,28 +8065,31 @@ elem_tlv(tvbuff_t *tvb, proto_tree *tree, elem_idx_t idx, guint32 offset, guint
oct = tvb_get_guint8(tvb, curr_offset);
- if (oct == (guint8) ansi_a_ios401_elem_1_strings[idx].value)
+ if (oct == (guint8) ansi_a_elem_1_strings[idx].value)
{
+ dec_idx = ansi_a_elem_1_strings[idx].dec_index;
+
parm_len = tvb_get_guint8(tvb, curr_offset + 1);
item =
proto_tree_add_text(tree,
tvb, curr_offset, parm_len + 2,
"%s%s",
- ansi_a_ios401_elem_1_strings[idx].strptr,
+ ansi_a_elem_1_strings[idx].strptr,
(name_add == NULL) || (name_add[0] == '\0') ? "" : name_add);
subtree = proto_item_add_subtree(item, ett_ansi_elem_1[idx]);
- proto_tree_add_uint(subtree, hf_ansi_a_elem_id, tvb,
- curr_offset, 1, oct);
+ proto_tree_add_uint_format(subtree, hf_ansi_a_elem_id, tvb,
+ curr_offset, 1, oct,
+ "Element ID");
proto_tree_add_uint(subtree, hf_ansi_a_length, tvb,
curr_offset + 1, 1, parm_len);
if (parm_len > 0)
{
- if (elem_1_fcn[idx] == NULL)
+ if (elem_1_fcn[dec_idx] == NULL)
{
proto_tree_add_text(subtree,
tvb, curr_offset + 2, parm_len,
@@ -6013,7 +8104,7 @@ elem_tlv(tvbuff_t *tvb, proto_tree *tree, elem_idx_t idx, guint32 offset, guint
a_add_string=ep_alloc(1024);
a_add_string[0] = '\0';
consumed =
- (*elem_1_fcn[idx])(tvb, subtree, curr_offset + 2,
+ (*elem_1_fcn[dec_idx])(tvb, subtree, curr_offset + 2,
parm_len, a_add_string, 1024);
if (a_add_string[0] != '\0')
@@ -6043,26 +8134,32 @@ elem_tv(tvbuff_t *tvb, proto_tree *tree, elem_idx_t idx, guint32 offset, const g
guint32 curr_offset;
proto_tree *subtree;
proto_item *item;
+ gint dec_idx;
+
curr_offset = offset;
consumed = 0;
oct = tvb_get_guint8(tvb, curr_offset);
- if (oct == (guint8) ansi_a_ios401_elem_1_strings[idx].value)
+ if (oct == (guint8) ansi_a_elem_1_strings[idx].value)
{
+ dec_idx = ansi_a_elem_1_strings[idx].dec_index;
+
item =
proto_tree_add_text(tree,
tvb, curr_offset, -1,
"%s%s",
- ansi_a_ios401_elem_1_strings[idx].strptr,
+ ansi_a_elem_1_strings[idx].strptr,
(name_add == NULL) || (name_add[0] == '\0') ? "" : name_add);
subtree = proto_item_add_subtree(item, ett_ansi_elem_1[idx]);
- proto_tree_add_uint(subtree, hf_ansi_a_elem_id, tvb, curr_offset, 1, oct);
+ proto_tree_add_uint_format(subtree, hf_ansi_a_elem_id, tvb,
+ curr_offset, 1, oct,
+ "Element ID");
- if (elem_1_fcn[idx] == NULL)
+ if (elem_1_fcn[dec_idx] == NULL)
{
/* BAD THING, CANNOT DETERMINE LENGTH */
@@ -6078,7 +8175,7 @@ elem_tv(tvbuff_t *tvb, proto_tree *tree, elem_idx_t idx, guint32 offset, const g
a_add_string=ep_alloc(1024);
a_add_string[0] = '\0';
- consumed = (*elem_1_fcn[idx])(tvb, subtree, curr_offset + 1, -1, a_add_string, 1024);
+ consumed = (*elem_1_fcn[dec_idx])(tvb, subtree, curr_offset + 1, -1, a_add_string, 1024);
if (a_add_string[0] != '\0')
{
@@ -6107,16 +8204,17 @@ elem_t(tvbuff_t *tvb, proto_tree *tree, elem_idx_t idx, guint32 offset, const gc
guint32 curr_offset;
guint8 consumed;
+
curr_offset = offset;
consumed = 0;
oct = tvb_get_guint8(tvb, curr_offset);
- if (oct == (guint8) ansi_a_ios401_elem_1_strings[idx].value)
+ if (oct == (guint8) ansi_a_elem_1_strings[idx].value)
{
proto_tree_add_uint_format(tree, hf_ansi_a_elem_id, tvb, curr_offset, 1, oct,
"%s%s",
- ansi_a_ios401_elem_1_strings[idx].strptr,
+ ansi_a_elem_1_strings[idx].strptr,
(name_add == NULL) || (name_add[0] == '\0') ? "" : name_add);
consumed = 1;
@@ -6136,17 +8234,21 @@ elem_lv(tvbuff_t *tvb, proto_tree *tree, elem_idx_t idx, guint32 offset, guint l
guint32 curr_offset;
proto_tree *subtree;
proto_item *item;
+ gint dec_idx;
+
curr_offset = offset;
consumed = 0;
+ dec_idx = ansi_a_elem_1_strings[idx].dec_index;
+
parm_len = tvb_get_guint8(tvb, curr_offset);
item =
proto_tree_add_text(tree,
tvb, curr_offset, parm_len + 1,
"%s%s",
- ansi_a_ios401_elem_1_strings[idx].strptr,
+ ansi_a_elem_1_strings[idx].strptr,
(name_add == NULL) || (name_add[0] == '\0') ? "" : name_add);
subtree = proto_item_add_subtree(item, ett_ansi_elem_1[idx]);
@@ -6156,7 +8258,7 @@ elem_lv(tvbuff_t *tvb, proto_tree *tree, elem_idx_t idx, guint32 offset, guint l
if (parm_len > 0)
{
- if (elem_1_fcn[idx] == NULL)
+ if (elem_1_fcn[dec_idx] == NULL)
{
proto_tree_add_text(subtree,
tvb, curr_offset + 1, parm_len,
@@ -6171,7 +8273,7 @@ elem_lv(tvbuff_t *tvb, proto_tree *tree, elem_idx_t idx, guint32 offset, guint l
a_add_string=ep_alloc(1024);
a_add_string[0] = '\0';
consumed =
- (*elem_1_fcn[idx])(tvb, subtree, curr_offset + 1,
+ (*elem_1_fcn[dec_idx])(tvb, subtree, curr_offset + 1,
parm_len, a_add_string, 1024);
if (a_add_string[0] != '\0')
@@ -6195,11 +8297,14 @@ elem_v(tvbuff_t *tvb, proto_tree *tree, elem_idx_t idx, guint32 offset)
{
guint8 consumed;
guint32 curr_offset;
+ gint dec_idx;
curr_offset = offset;
consumed = 0;
- if (elem_1_fcn[idx] == NULL)
+ dec_idx = ansi_a_elem_1_strings[idx].dec_index;
+
+ if (elem_1_fcn[dec_idx] == NULL)
{
/* BAD THING, CANNOT DETERMINE LENGTH */
@@ -6215,7 +8320,7 @@ elem_v(tvbuff_t *tvb, proto_tree *tree, elem_idx_t idx, guint32 offset)
a_add_string=ep_alloc(1024);
a_add_string[0] = '\0';
- consumed = (*elem_1_fcn[idx])(tvb, tree, curr_offset, -1, a_add_string, 1024);
+ consumed = (*elem_1_fcn[dec_idx])(tvb, tree, curr_offset, -1, a_add_string, 1024);
}
return(consumed);
@@ -6234,8 +8339,8 @@ elem_v(tvbuff_t *tvb, proto_tree *tree, elem_idx_t idx, guint32 offset)
proto_tree_add_text(tree, \
tvb, curr_offset, 0, \
"Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect", \
- ansi_a_ios401_elem_1_strings[elem_idx].value, \
- ansi_a_ios401_elem_1_strings[elem_idx].strptr, \
+ ansi_a_elem_1_strings[elem_idx].value, \
+ ansi_a_elem_1_strings[elem_idx].strptr, \
(elem_name_addition == NULL) || (elem_name_addition[0] == '\0') ? "" : elem_name_addition \
); \
} \
@@ -6264,8 +8369,8 @@ elem_v(tvbuff_t *tvb, proto_tree *tree, elem_idx_t idx, guint32 offset)
proto_tree_add_text(tree, \
tvb, curr_offset, 0, \
"Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect", \
- ansi_a_ios401_elem_1_strings[elem_idx].value, \
- ansi_a_ios401_elem_1_strings[elem_idx].strptr, \
+ ansi_a_elem_1_strings[elem_idx].value, \
+ ansi_a_elem_1_strings[elem_idx].strptr, \
(elem_name_addition == NULL) || (elem_name_addition[0] == '\0') ? "" : elem_name_addition \
); \
} \
@@ -6436,6 +8541,49 @@ dtap_cm_srvc_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_CDMA_SOWD, "");
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS501:
+ ELEM_OPT_TLV(ANSI_A_E_SSCI, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_SOCI, "");
+
+ ELEM_OPT_T(ANSI_A_E_ORIG_CI, "");
+
+ ELEM_OPT_TV(ANSI_A_E_RETURN_CAUSE, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_SESSION, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_FORMAT, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MOB_SUB_INFO, "");
+ break;
+ }
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.1.3
+ */
+static void
+dtap_cm_srvc_req_cont(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_OPT_TLV(ANSI_A_E_CLD_PARTY_BCD_NUM, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_CLD_PARTY_ASCII_NUM, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_REV_MS_INFO_RECS, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -6464,6 +8612,21 @@ bsmap_page_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_IS2000_MOB_CAP, "");
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS501:
+ ELEM_OPT_TLV(ANSI_A_E_P_REV, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MS_DES_FREQ, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_FORMAT, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MOB_SUB_INFO, "");
+ break;
+ }
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -6514,6 +8677,19 @@ dtap_page_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_CDMA_SOWD, "");
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS501:
+ ELEM_OPT_TLV(ANSI_A_E_SOCI, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_SESSION, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_FORMAT, "");
+ break;
+ }
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -6532,7 +8708,77 @@ dtap_progress(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TV(ANSI_A_E_SIGNAL, "");
- ELEM_OPT_TLV(ANSI_A_E_MS_INFO_RECS, "");
+ ELEM_OPT_TLV(ANSI_A_E_FWD_MS_INFO_RECS, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_SOCI, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.8.1
+ */
+static void
+dtap_srvc_redirection(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_TLV(ANSI_A_E_IS2000_RED_RECORD, "");
+
+ ELEM_MAND_TLV(ANSI_A_E_S_RED_INFO, "");
+
+ ELEM_MAND_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_P_REV, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.1.11
+ */
+static void
+dtap_srvc_release(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_TLV(ANSI_A_E_SOCI, "");
+
+ ELEM_MAND_TLV(ANSI_A_E_CAUSE, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_CAUSE_L3, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.1.12
+ */
+static void
+dtap_srvc_release_complete(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_TLV(ANSI_A_E_SOCI, "");
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -6562,7 +8808,7 @@ bsmap_ass_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_CLG_PARTY_ASCII_NUM, "");
- ELEM_OPT_TLV(ANSI_A_E_MS_INFO_RECS, "");
+ ELEM_OPT_TLV(ANSI_A_E_FWD_MS_INFO_RECS, "");
ELEM_OPT_TLV(ANSI_A_E_PRIO, "");
@@ -6570,6 +8816,23 @@ bsmap_ass_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_QOS_PARAMS, "");
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS501:
+ ELEM_OPT_TLV(ANSI_A_E_SOCI, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_SR_ID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_SESSION, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_FORMAT, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MOB_SUB_INFO, "");
+ break;
+ }
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -6592,6 +8855,19 @@ bsmap_ass_complete(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TV(ANSI_A_E_SO, "");
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS501:
+ ELEM_OPT_TLV(ANSI_A_E_SOCI, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_SESSION, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_FORMAT, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+ break;
+ }
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -6610,6 +8886,8 @@ bsmap_ass_failure(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_MAND_TLV(ANSI_A_E_CAUSE, "");
+ ELEM_OPT_TLV(ANSI_A_E_SOCI, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -6668,6 +8946,8 @@ bsmap_clr_complete(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_T(ANSI_A_E_PDI, "");
+ ELEM_OPT_TLV(ANSI_A_E_MOB_SUB_INFO, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -6684,7 +8964,9 @@ dtap_alert_with_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
curr_offset = offset;
curr_len = len;
- ELEM_OPT_TLV(ANSI_A_E_MS_INFO_RECS, "");
+ ELEM_OPT_TLV(ANSI_A_E_FWD_MS_INFO_RECS, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_SOCI, "");
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -6710,6 +8992,12 @@ bsmap_bs_srvc_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TV(ANSI_A_E_TAG, "");
+ ELEM_OPT_TLV(ANSI_A_E_ADDS_USER_PART, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_SR_ID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -6734,6 +9022,82 @@ bsmap_bs_srvc_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_CAUSE, "");
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.1.19
+ */
+static void
+bsmap_add_srvc_noti(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_TLV(ANSI_A_E_MID, "");
+
+ ELEM_MAND_TV(ANSI_A_E_SO, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_SESSION, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.1.20
+ */
+static void
+dtap_add_srvc_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_TLV(ANSI_A_E_SOCI, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_CLD_PARTY_BCD_NUM, "");
+
+ ELEM_MAND_TV(ANSI_A_E_SO, "");
+
+ ELEM_OPT_T(ANSI_A_E_VP_REQ, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_CLD_PARTY_ASCII_NUM, "");
+
+ ELEM_OPT_TV(ANSI_A_E_CIC, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_SSCI, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_SESSION, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_FORMAT, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.1.10
+ */
+static void
+dtap_connect(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_OPT_TLV(ANSI_A_E_SOCI, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -6760,7 +9124,11 @@ dtap_flash_with_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TV(ANSI_A_E_TAG, "");
- ELEM_OPT_TLV(ANSI_A_E_MS_INFO_RECS, "");
+ ELEM_OPT_TLV(ANSI_A_E_FWD_MS_INFO_RECS, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_SSCI, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_SOCI, "");
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -6780,6 +9148,8 @@ dtap_flash_with_info_ack(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
ELEM_OPT_TV(ANSI_A_E_TAG, "");
+ ELEM_OPT_TLV(ANSI_A_E_SOCI, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -6810,10 +9180,16 @@ bsmap_feat_noti(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_CLG_PARTY_ASCII_NUM, "");
- ELEM_OPT_TLV(ANSI_A_E_MS_INFO_RECS, "");
+ ELEM_OPT_TLV(ANSI_A_E_FWD_MS_INFO_RECS, "");
ELEM_OPT_TLV(ANSI_A_E_IS2000_MOB_CAP, "");
+ ELEM_OPT_TLV(ANSI_A_E_P_REV, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MS_DES_FREQ, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MOB_SUB_INFO, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -6906,6 +9282,10 @@ bsmap_paca_update(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_AUTH_EVENT, "");
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MS_DES_FREQ, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -6932,6 +9312,48 @@ bsmap_paca_update_ack(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
}
/*
+ * IOS 5 3.2.9
+ */
+static void
+bsmap_rm_pos_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_TLV(ANSI_A_E_PSMM_COUNT, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.2.10
+ */
+static void
+bsmap_rm_pos_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_OPT_TLV(ANSI_A_E_CDMA_SOWD, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_CAUSE, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_DOWNLINK_RE_LIST, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_GEO_LOC, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
* IOS 6.1.4.1
*/
static void
@@ -6954,6 +9376,14 @@ bsmap_auth_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TV(ANSI_A_E_SCI, "");
+ ELEM_OPT_TLV(ANSI_A_E_IS2000_MOB_CAP, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_P_REV, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MS_DES_FREQ, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MOB_SUB_INFO, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -6989,12 +9419,81 @@ bsmap_auth_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_MAND_TLV(ANSI_A_E_AUTH_RESP_PARAM, "");
- ELEM_OPT_TLV(ANSI_A_E_MID, "");
+ ELEM_MAND_TLV(ANSI_A_E_MID, "");
- ELEM_OPT_TV(ANSI_A_E_TAG, "");
+ ELEM_MAND_TV(ANSI_A_E_TAG, "");
ELEM_OPT_TLV(ANSI_A_E_MID, "");
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5
+ * Section 3.1.21
+ */
+static void
+bsmap_bearer_upd_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_SESSION, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_FORMAT, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5
+ * Section 3.1.22
+ */
+static void
+bsmap_bearer_upd_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_OPT_TLV(ANSI_A_E_CAUSE, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_SESSION, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_FORMAT, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5
+ * Section 3.1.23
+ */
+static void
+bsmap_bearer_upd_reqd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_OPT_TLV(ANSI_A_E_CAUSE, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_SESSION, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_FORMAT, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -7032,6 +9531,176 @@ bsmap_user_zone_update(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint le
}
/*
+ * IOS 5 3.3.16
+ */
+static void
+dtap_user_zone_update_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_TLV(ANSI_A_E_UZ_ID, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.3.17
+ */
+static void
+dtap_user_zone_update(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_TLV(ANSI_A_E_UZ_ID, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.3.18
+ */
+static void
+bsmap_user_zone_reject(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_OPT_TLV(ANSI_A_E_UZ_ID, "");
+
+ ELEM_MAND_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_CELL_ID_LIST, "");
+
+ ELEM_OPT_TV(ANSI_A_E_SCI, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_IS2000_MOB_CAP, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_P_REV, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MS_DES_FREQ, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MOB_SUB_INFO, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.3.18
+ */
+static void
+dtap_user_zone_reject(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_OPT_TLV(ANSI_A_E_UZ_ID, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.3.19
+ */
+static void
+bsmap_reg_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_CELL_ID_LIST, "");
+
+ ELEM_OPT_TV(ANSI_A_E_SCI, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_P_REV, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_IS2000_MOB_CAP, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MS_DES_FREQ, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MOB_SUB_INFO, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.3.20
+ */
+static void
+bsmap_ms_reg_noti(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_TLV(ANSI_A_E_CAUSE, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.3.21
+ */
+static void
+bsmap_bs_auth_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_TLV(ANSI_A_E_MID, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.3.22
+ */
+static void
+bsmap_bs_auth_req_ack(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_TLV(ANSI_A_E_MID, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
* IOS 6.1.4.4
*/
static void
@@ -7142,6 +9811,14 @@ dtap_lu_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_IS2000_MOB_CAP, "");
+ ELEM_OPT_TV(ANSI_A_E_RETURN_CAUSE, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MS_DES_FREQ, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MOB_SUB_INFO, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -7158,7 +9835,20 @@ dtap_lu_accept(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
curr_offset = offset;
curr_len = len;
- ELEM_OPT_TV(ANSI_A_E_LAI, "");
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS401:
+ ELEM_OPT_TV(ANSI_A_E_LAI, "");
+ break;
+
+ case A_VARIANT_IOS501:
+ ELEM_OPT_TLV(ANSI_A_E_CAUSE, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_P_REV, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MS_DES_FREQ, "");
+ break;
+ }
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -7178,6 +9868,15 @@ dtap_lu_reject(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_MAND_V(ANSI_A_E_REJ_CAUSE);
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS501:
+ ELEM_OPT_TLV(ANSI_A_E_P_REV, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MS_DES_FREQ, "");
+ break;
+ }
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -7220,6 +9919,107 @@ bsmap_priv_mode_complete(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
}
/*
+ * IOS 5 3.3.14
+ */
+static void
+bsmap_status_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_TLV(ANSI_A_E_IE_REQD, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TV(ANSI_A_E_SCI, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_CELL_ID_LIST, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_IS2000_MOB_CAP, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_P_REV, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MS_DES_FREQ, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TV(ANSI_A_E_TAG, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MOB_SUB_INFO, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.3.14
+ */
+static void
+dtap_status_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_LV(ANSI_A_E_IE_REQD, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+
+/*
+ * IOS 5 3.3.15
+ */
+static void
+bsmap_status_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_TLV(ANSI_A_E_REV_MS_INFO_RECS, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TV(ANSI_A_E_TAG, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.3.15
+ */
+static void
+dtap_status_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_LV(ANSI_A_E_REV_MS_INFO_RECS, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
* IOS 6.1.5.4
*/
static void
@@ -7262,10 +10062,43 @@ bsmap_ho_reqd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_IS2000_SCR, "");
- ELEM_OPT_TLV(ANSI_A_E_PDSN_IP_ADDR, "");
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS401:
+ ELEM_OPT_TLV(ANSI_A_E_PDSN_IP_ADDR, "");
+ break;
+
+ case A_VARIANT_IOS501:
+ ELEM_OPT_TLV(ANSI_A_E_S_PDSN_ADDR, "");
+ break;
+ }
ELEM_OPT_TLV(ANSI_A_E_PTYPE, "");
+ ELEM_OPT_TLV(ANSI_A_E_SRNC_TRNC_TC, "");
+
+ ELEM_OPT_TV(ANSI_A_E_SCI, "");
+
+ ELEM_OPT_TV(ANSI_A_E_ACC_NET_ID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_SO_LIST, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_IS2000_CHAN_ID_3X, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_IS2000_NN_SCR, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_ANCH_PDSN_ADDR, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_ANCH_PP_ADDR, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_PSP, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_PLCM_ID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MOB_SUB_INFO, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -7314,10 +10147,52 @@ bsmap_ho_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_IS2000_SCR, "");
- ELEM_OPT_TLV(ANSI_A_E_PDSN_IP_ADDR, "");
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS401:
+ ELEM_OPT_TLV(ANSI_A_E_PDSN_IP_ADDR, "");
+ break;
+
+ case A_VARIANT_IOS501:
+ ELEM_OPT_TLV(ANSI_A_E_S_PDSN_ADDR, "");
+ break;
+ }
ELEM_OPT_TLV(ANSI_A_E_PTYPE, "");
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS501:
+ ELEM_OPT_TLV(ANSI_A_E_SRNC_TRNC_TC, "");
+
+ ELEM_OPT_TV(ANSI_A_E_SCI, "");
+
+ ELEM_OPT_TV(ANSI_A_E_ACC_NET_ID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_SO_LIST, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_IS2000_CHAN_ID_3X, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_IS2000_NN_SCR, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_ANCH_PDSN_ADDR, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_ANCH_PP_ADDR, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_PSP, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_PLCM_ID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_SESSION, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_FORMAT, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MOB_SUB_INFO, "");
+ break;
+ }
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -7348,6 +10223,25 @@ bsmap_ho_req_ack(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_IS2000_NN_SCR, "");
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS501:
+ ELEM_OPT_TLV(ANSI_A_E_TRNC_SRNC_TC, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_SO_LIST, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_CAUSE, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_IS2000_CHAN_ID_3X, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_PLCM_ID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_SESSION, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_A2P_BEARER_FORMAT, "");
+ break;
+ }
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -7402,6 +10296,41 @@ bsmap_ho_command(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_IS2000_NN_SCR, "");
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS501:
+ ELEM_OPT_TLV(ANSI_A_E_TRNC_SRNC_TC, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_SO_LIST, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_CAUSE, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_AMPS_HHO_PARAM, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_IS2000_CHAN_ID_3X, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_PLCM_ID, "");
+ break;
+ }
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.4.6
+ */
+static void
+bsmap_ho_complete(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_OPT_TV(ANSI_A_E_SO, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -7440,6 +10369,12 @@ bsmap_ho_performed(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_CELL_ID_LIST, "");
+ ELEM_OPT_TV(ANSI_A_E_CHAN_NUM, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_BAND_CLASS, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MOB_SUB_INFO, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -7660,6 +10595,12 @@ bsmap_adds_page(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_IS2000_MOB_CAP, "");
+ ELEM_OPT_TLV(ANSI_A_E_P_REV, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MS_DES_FREQ, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MOB_SUB_INFO, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -7696,6 +10637,46 @@ bsmap_adds_transfer(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_CDMA_SOWD, "");
+ ELEM_OPT_TLV(ANSI_A_E_AUTH_DATA, "");
+
+ ELEM_OPT_TV(ANSI_A_E_TAG, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_CM_INFO_TYPE_2, "");
+
+ ELEM_OPT_TV(ANSI_A_E_SCI, "");
+
+ ELEM_OPT_TV(ANSI_A_E_SO, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_UZ_ID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_IS2000_MOB_CAP, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MOB_SUB_INFO, "");
+
+ EXTRANEOUS_DATA_CHECK(curr_len, 0);
+}
+
+/*
+ * IOS 5 3.6.4
+ */
+static void
+bsmap_adds_transfer_ack(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+{
+ guint32 curr_offset;
+ guint32 consumed;
+ guint curr_len;
+
+ curr_offset = offset;
+ curr_len = len;
+
+ ELEM_MAND_TLV(ANSI_A_E_MID, "");
+
+ ELEM_OPT_TV(ANSI_A_E_TAG, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_CAUSE, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -7744,6 +10725,8 @@ bsmap_adds_page_ack(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_CELL_ID, "");
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -7786,6 +10769,8 @@ bsmap_rejection(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
ELEM_OPT_TLV(ANSI_A_E_IS2000_CAUSE, "");
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
@@ -7799,26 +10784,34 @@ dtap_rejection(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
curr_offset = offset;
curr_len = len;
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
ELEM_OPT_TLV(ANSI_A_E_IS2000_CAUSE, "");
+ ELEM_OPT_TLV(ANSI_A_E_SOCI, "");
+
+ ELEM_OPT_TLV(ANSI_A_E_MID, "");
+
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
-#define ANSI_A_IOS401_BSMAP_NUM_MSG (sizeof(ansi_a_ios401_bsmap_strings)/sizeof(value_string))
-static gint ett_bsmap_msg[ANSI_A_IOS401_BSMAP_NUM_MSG];
-static void (*bsmap_msg_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
- NULL, /* Additional Service Notification */
+#define ANSI_A_IOS401_BSMAP_NUM_MSG (sizeof(ansi_a_ios401_bsmap_strings)/sizeof(ext_value_string_t))
+#define ANSI_A_IOS501_BSMAP_NUM_MSG (sizeof(ansi_a_ios501_bsmap_strings)/sizeof(ext_value_string_t))
+static gint ett_bsmap_msg[MAX(ANSI_A_IOS401_BSMAP_NUM_MSG, ANSI_A_IOS501_BSMAP_NUM_MSG)];
+static void (*bsmap_msg_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) =
+{
+ bsmap_add_srvc_noti, /* Additional Service Notification */
bsmap_adds_page, /* ADDS Page */
bsmap_adds_page_ack, /* ADDS Page Ack */
bsmap_adds_transfer, /* ADDS Transfer */
- NULL, /* ADDS Transfer Ack */
+ bsmap_adds_transfer_ack, /* ADDS Transfer Ack */
bsmap_ass_complete, /* Assignment Complete */
bsmap_ass_failure, /* Assignment Failure */
bsmap_ass_req, /* Assignment Request */
bsmap_auth_req, /* Authentication Request */
bsmap_auth_resp, /* Authentication Response */
- NULL, /* Base Station Challenge */
- NULL, /* Base Station Challenge Response */
+ NULL /* no BSMAP definition */, /* Base Station Challenge */
+ NULL /* no BSMAP definition */, /* Base Station Challenge Response */
bsmap_block, /* Block */
bsmap_block_ack, /* Block Acknowledge */
bsmap_bs_srvc_req, /* BS Service Request */
@@ -7831,7 +10824,7 @@ static void (*bsmap_msg_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset,
bsmap_feat_noti_ack, /* Feature Notification Ack */
bsmap_ho_command, /* Handoff Command */
NULL /* no associated data */, /* Handoff Commenced */
- NULL /* no associated data */, /* Handoff Complete */
+ bsmap_ho_complete, /* Handoff Complete */
bsmap_ho_failure, /* Handoff Failure */
bsmap_ho_performed, /* Handoff Performed */
bsmap_ho_req, /* Handoff Request */
@@ -7845,31 +10838,39 @@ static void (*bsmap_msg_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset,
bsmap_page_req, /* Paging Request */
bsmap_priv_mode_command, /* Privacy Mode Command */
bsmap_priv_mode_complete, /* Privacy Mode Complete */
- NULL, /* Radio Measurements for Position Request */
- NULL, /* Radio Measurements for Position Response */
+ bsmap_rm_pos_req, /* Radio Measurements for Position Request */
+ bsmap_rm_pos_resp, /* Radio Measurements for Position Response */
bsmap_rejection, /* Rejection */
- NULL, /* Registration Request */
+ bsmap_reg_req, /* Registration Request */
bsmap_reset, /* Reset */
bsmap_reset_ack, /* Reset Acknowledge */
bsmap_reset_cct, /* Reset Circuit */
bsmap_reset_cct_ack, /* Reset Circuit Acknowledge */
- NULL, /* SSD Update Request */
- NULL, /* SSD Update Response */
- NULL, /* Status Request */
- NULL, /* Status Response */
+ NULL /* no BSMAP definition */, /* SSD Update Request */
+ NULL /* no BSMAP definition */, /* SSD Update Response */
+ bsmap_status_req, /* Status Request */
+ bsmap_status_resp, /* Status Response */
bsmap_xmode_ack, /* Transcoder Control Acknowledge */
bsmap_xmode_req, /* Transcoder Control Request */
bsmap_unblock, /* Unblock */
bsmap_unblock_ack, /* Unblock Acknowledge */
- NULL, /* User Zone Reject */
+ bsmap_user_zone_reject, /* User Zone Reject */
bsmap_user_zone_update, /* User Zone Update */
+ bsmap_bearer_upd_req, /* Bearer Update Request *//* IOS 5.0.1 */
+ bsmap_bearer_upd_resp, /* Bearer Update Response *//* IOS 5.0.1 */
+ bsmap_bearer_upd_reqd, /* Bearer Update Required *//* IOS 5.0.1 */
+ bsmap_ms_reg_noti, /* Mobile Station Registered Notification *//* IOS 5.0.1 */
+ bsmap_bs_auth_req, /* BS Authentication Request *//* IOS 5.0.1 */
+ bsmap_bs_auth_req_ack, /* BS Authentication Request Ack *//* IOS 5.0.1 */
NULL, /* NONE */
};
-#define ANSI_A_IOS401_DTAP_NUM_MSG (sizeof(ansi_a_ios401_dtap_strings)/sizeof(value_string))
-static gint ett_dtap_msg[ANSI_A_IOS401_DTAP_NUM_MSG];
-static void (*dtap_msg_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
- NULL, /* Additional Service Request */
+#define ANSI_A_IOS401_DTAP_NUM_MSG (sizeof(ansi_a_ios401_dtap_strings)/sizeof(ext_value_string_t))
+#define ANSI_A_IOS501_DTAP_NUM_MSG (sizeof(ansi_a_ios501_dtap_strings)/sizeof(ext_value_string_t))
+static gint ett_dtap_msg[MAX(ANSI_A_IOS401_DTAP_NUM_MSG, ANSI_A_IOS501_DTAP_NUM_MSG)];
+static void (*dtap_msg_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) =
+{
+ dtap_add_srvc_req, /* Additional Service Request */
dtap_adds_deliver, /* ADDS Deliver */
dtap_adds_deliver_ack, /* ADDS Deliver Ack */
dtap_alert_with_info, /* Alert With Information */
@@ -7878,8 +10879,8 @@ static void (*dtap_msg_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, g
dtap_bs_challenge, /* Base Station Challenge */
dtap_bs_challenge_resp, /* Base Station Challenge Response */
dtap_cm_srvc_req, /* CM Service Request */
- NULL, /* CM Service Request Continuation */
- NULL /* no associated data */, /* Connect */
+ dtap_cm_srvc_req_cont, /* CM Service Request Continuation */
+ dtap_connect, /* Connect */
dtap_flash_with_info, /* Flash with Information */
dtap_flash_with_info_ack, /* Flash with Information Ack */
dtap_lu_accept, /* Location Updating Accept */
@@ -7890,16 +10891,16 @@ static void (*dtap_msg_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, g
NULL /* no associated data */, /* Parameter Update Request */
dtap_rejection, /* Rejection */
dtap_progress, /* Progress */
- NULL, /* Service Redirection */
- NULL, /* Service Release */
- NULL, /* Service Release Complete */
+ dtap_srvc_redirection, /* Service Redirection */
+ dtap_srvc_release, /* Service Release */
+ dtap_srvc_release_complete, /* Service Release Complete */
dtap_ssd_update_req, /* SSD Update Request */
dtap_ssd_update_resp, /* SSD Update Response */
- NULL, /* Status Request */
- NULL, /* Status Response */
- NULL, /* User Zone Reject */
- NULL, /* User Zone Update */
- NULL, /* User Zone Update Request */
+ dtap_status_req, /* Status Request */
+ dtap_status_resp, /* Status Response */
+ dtap_user_zone_reject, /* User Zone Reject */
+ dtap_user_zone_update, /* User Zone Update */
+ dtap_user_zone_update_req, /* User Zone Update Request */
NULL, /* NONE */
};
@@ -7914,7 +10915,7 @@ dissect_bsmap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
guint8 oct;
guint32 offset, saved_offset;
guint32 len;
- gint idx;
+ gint idx, dec_idx;
proto_item *bsmap_item = NULL;
proto_tree *bsmap_tree = NULL;
const gchar *msg_str;
@@ -7949,7 +10950,7 @@ dissect_bsmap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
*/
oct = tvb_get_guint8(tvb, offset++);
- msg_str = match_strval_idx((guint32) oct, ansi_a_ios401_bsmap_strings, &idx);
+ msg_str = my_match_strval_idx((guint32) oct, ansi_a_bsmap_strings, &idx, &dec_idx);
/*
* create the a protocol tree
@@ -7970,7 +10971,7 @@ dissect_bsmap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
"ANSI A-I/F BSMAP - %s",
msg_str);
- bsmap_tree = proto_item_add_subtree(bsmap_item, ett_bsmap_msg[idx]);
+ bsmap_tree = proto_item_add_subtree(bsmap_item, ett_bsmap_msg[dec_idx]);
if (check_col(pinfo->cinfo, COL_INFO))
{
@@ -7996,7 +10997,7 @@ dissect_bsmap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
/*
* decode elements
*/
- if (bsmap_msg_fcn[idx] == NULL)
+ if (bsmap_msg_fcn[dec_idx] == NULL)
{
proto_tree_add_text(bsmap_tree,
tvb, offset, len - offset,
@@ -8004,7 +11005,7 @@ dissect_bsmap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
else
{
- (*bsmap_msg_fcn[idx])(tvb, bsmap_tree, offset, len - offset);
+ (*bsmap_msg_fcn[dec_idx])(tvb, bsmap_tree, offset, len - offset);
}
}
@@ -8018,7 +11019,7 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
guint32 offset, saved_offset;
guint32 len;
guint32 oct_1, oct_2;
- gint idx;
+ gint idx, dec_idx;
proto_item *dtap_item = NULL;
proto_tree *dtap_tree = NULL;
proto_item *oct_1_item = NULL;
@@ -8072,7 +11073,7 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
saved_offset = offset;
oct = tvb_get_guint8(tvb, offset++);
- msg_str = match_strval_idx((guint32) oct, ansi_a_ios401_dtap_strings, &idx);
+ msg_str = my_match_strval_idx((guint32) oct, ansi_a_dtap_strings, &idx, &dec_idx);
/*
* create the a protocol tree
@@ -8093,7 +11094,7 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
"ANSI A-I/F DTAP - %s",
msg_str);
- dtap_tree = proto_item_add_subtree(dtap_item, ett_dtap_msg[idx]);
+ dtap_tree = proto_item_add_subtree(dtap_item, ett_dtap_msg[dec_idx]);
if (check_col(pinfo->cinfo, COL_INFO))
{
@@ -8191,7 +11192,7 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
/*
* decode elements
*/
- if (dtap_msg_fcn[idx] == NULL)
+ if (dtap_msg_fcn[dec_idx] == NULL)
{
proto_tree_add_text(dtap_tree,
tvb, offset, len - offset,
@@ -8199,7 +11200,7 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
else
{
- (*dtap_msg_fcn[idx])(tvb, dtap_tree, offset, len - offset);
+ (*dtap_msg_fcn[dec_idx])(tvb, dtap_tree, offset, len - offset);
}
}
@@ -8218,17 +11219,17 @@ proto_register_ansi_a(void)
{
{ &hf_ansi_a_bsmap_msgtype,
{ "BSMAP Message Type", "ansi_a.bsmap_msgtype",
- FT_UINT8, BASE_HEX, VALS(ansi_a_ios401_bsmap_strings), 0x0,
+ FT_UINT8, BASE_HEX, NULL, 0x0,
"", HFILL }
},
{ &hf_ansi_a_dtap_msgtype,
{ "DTAP Message Type", "ansi_a.dtap_msgtype",
- FT_UINT8, BASE_HEX, VALS(ansi_a_ios401_dtap_strings), 0x0,
+ FT_UINT8, BASE_HEX, NULL, 0x0,
"", HFILL }
},
{ &hf_ansi_a_elem_id,
{ "Element ID", "ansi_a.elem_id",
- FT_UINT8, BASE_DEC, VALS(ansi_a_ios401_elem_1_strings), 0,
+ FT_UINT8, BASE_DEC, NULL, 0,
"", HFILL }
},
{ &hf_ansi_a_length,
@@ -8256,6 +11257,11 @@ proto_register_ansi_a(void)
FT_STRING, BASE_DEC, 0, 0,
"", HFILL }
},
+ { &hf_ansi_a_meid,
+ { "MEID", "ansi_a.meid",
+ FT_STRING, BASE_HEX, 0, 0,
+ "", HFILL }
+ },
{ &hf_ansi_a_cld_party_bcd_num,
{ "Called Party BCD Number", "ansi_a.cld_party_bcd_num",
FT_STRING, BASE_DEC, 0, 0,
@@ -8294,7 +11300,38 @@ proto_register_ansi_a(void)
{ &hf_ansi_a_pdsn_ip_addr,
{ "PDSN IP Address", "ansi_a.pdsn_ip_addr",
FT_IPv4, BASE_NONE, NULL, 0,
- "IP Address", HFILL}},
+ "IP Address", HFILL }
+ },
+ { &hf_ansi_a_s_pdsn_ip_addr,
+ { "Source PDSN Address", "ansi_a.s_pdsn_ip_addr",
+ FT_IPv4, BASE_NONE, NULL, 0,
+ "IP Address", HFILL }
+ },
+ { &hf_ansi_a_anchor_ip_addr,
+ { "Anchor PDSN Address", "ansi_a.anchor_pdsn_ip_addr",
+ FT_IPv4, BASE_NONE, NULL, 0,
+ "IP Address", HFILL }
+ },
+ { &hf_ansi_a_anchor_pp_ip_addr,
+ { "Anchor P-P Address", "ansi_a.anchor_pp_ip_addr",
+ FT_IPv4, BASE_NONE, NULL, 0,
+ "IP Address", HFILL }
+ },
+ { &hf_ansi_a_a2p_bearer_ipv4_addr,
+ { "A2p Bearer IP Address", "ansi_a.a2p_bearer_ipv4_addr",
+ FT_IPv4, BASE_NONE, NULL, 0,
+ "", HFILL }
+ },
+ { &hf_ansi_a_a2p_bearer_ipv6_addr,
+ { "A2p Bearer IP Address", "ansi_a.a2p_bearer_ipv6_addr",
+ FT_IPv6, BASE_NONE, NULL, 0,
+ "", HFILL }
+ },
+ { &hf_ansi_a_a2p_bearer_udp_port,
+ { "A2p Bearer UDP Port", "ansi_a.a2p_bearer_udp_port",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ "", HFILL }
+ },
};
static enum_val_t a_variant_options[] = {
@@ -8304,16 +11341,18 @@ proto_register_ansi_a(void)
{ "ios-2.x", "IOS 2.x", A_VARIANT_IOS2 },
{ "ios-3.x", "IOS 3.x", A_VARIANT_IOS3 },
{ "ios-4.0.1", "IOS 4.0.1", A_VARIANT_IOS401 },
+ { "ios-5.0.1", "IOS 5.0.1", A_VARIANT_IOS501 },
{ NULL, NULL, 0 }
};
/* Setup protocol subtree array */
-#define MAX_NUM_DTAP_MSG MAX(ANSI_A_IOS401_DTAP_NUM_MSG, 0)
-#define MAX_NUM_BSMAP_MSG MAX(ANSI_A_IOS401_BSMAP_NUM_MSG, 0)
-#define NUM_INDIVIDUAL_ELEMS 9
+#define MAX_NUM_DTAP_MSG MAX(ANSI_A_IOS401_DTAP_NUM_MSG, ANSI_A_IOS501_DTAP_NUM_MSG)
+#define MAX_NUM_BSMAP_MSG MAX(ANSI_A_IOS401_BSMAP_NUM_MSG, ANSI_A_IOS501_BSMAP_NUM_MSG)
+#define MAX_NUM_ELEM_1 MAX(MAX_IOS401_NUM_ELEM_1, MAX_IOS501_NUM_ELEM_1)
+#define NUM_INDIVIDUAL_ELEMS 14
gint **ett;
- gint ett_len = (NUM_INDIVIDUAL_ELEMS+MAX_NUM_DTAP_MSG+MAX_NUM_BSMAP_MSG+NUM_ELEM_1+NUM_MS_INFO_REC) * sizeof(gint *);
+ gint ett_len = (NUM_INDIVIDUAL_ELEMS+MAX_NUM_DTAP_MSG+MAX_NUM_BSMAP_MSG+MAX_NUM_ELEM_1+NUM_FWD_MS_INFO_REC+NUM_REV_MS_INFO_REC) * sizeof(gint *);
/*
* XXX - at least one version of the HP C compiler apparently doesn't
@@ -8324,10 +11363,11 @@ proto_register_ansi_a(void)
*/
ett = g_malloc(ett_len);
- memset((void *) ett_dtap_msg, -1, sizeof(gint) * MAX_NUM_DTAP_MSG);
- memset((void *) ett_bsmap_msg, -1, sizeof(gint) * MAX_NUM_BSMAP_MSG);
- memset((void *) ett_ansi_elem_1, -1, sizeof(gint) * NUM_ELEM_1);
- memset((void *) ett_ansi_ms_info_rec, -1, sizeof(gint) * NUM_MS_INFO_REC);
+ memset((void *) ett_dtap_msg, -1, sizeof(ett_dtap_msg));
+ memset((void *) ett_bsmap_msg, -1, sizeof(ett_bsmap_msg));
+ memset((void *) ett_ansi_elem_1, -1, sizeof(ett_ansi_elem_1));
+ memset((void *) ett_ansi_fwd_ms_info_rec, -1, sizeof(gint) * NUM_FWD_MS_INFO_REC);
+ memset((void *) ett_ansi_rev_ms_info_rec, -1, sizeof(gint) * NUM_REV_MS_INFO_REC);
ett[0] = &ett_bsmap;
ett[1] = &ett_dtap;
@@ -8338,6 +11378,11 @@ proto_register_ansi_a(void)
ett[6] = &ett_ansi_ms_info_rec_reserved;
ett[7] = &ett_ansi_enc_info;
ett[8] = &ett_cell_list;
+ ett[9] = &ett_bearer_list;
+ ett[10] = &ett_re_list;
+ ett[11] = &ett_so_list;
+ ett[12] = &ett_scm;
+ ett[13] = &ett_adds_user_part;
last_offset = NUM_INDIVIDUAL_ELEMS;
@@ -8351,14 +11396,19 @@ proto_register_ansi_a(void)
ett[last_offset] = &ett_bsmap_msg[i];
}
- for (i=0; i < NUM_ELEM_1; i++, last_offset++)
+ for (i=0; i < MAX_NUM_ELEM_1; i++, last_offset++)
{
ett[last_offset] = &ett_ansi_elem_1[i];
}
- for (i=0; i < NUM_MS_INFO_REC; i++, last_offset++)
+ for (i=0; i < NUM_FWD_MS_INFO_REC; i++, last_offset++)
+ {
+ ett[last_offset] = &ett_ansi_fwd_ms_info_rec[i];
+ }
+
+ for (i=0; i < NUM_REV_MS_INFO_REC; i++, last_offset++)
{
- ett[last_offset] = &ett_ansi_ms_info_rec[i];
+ ett[last_offset] = &ett_ansi_rev_ms_info_rec[i];
}
/* Register the protocol name and description */
@@ -8428,6 +11478,21 @@ proto_reg_handoff_ansi_a(void)
a_variant = a_global_variant;
}
+ switch (a_variant)
+ {
+ case A_VARIANT_IOS501:
+ ansi_a_bsmap_strings = ansi_a_ios501_bsmap_strings;
+ ansi_a_dtap_strings = ansi_a_ios501_dtap_strings;
+ ansi_a_elem_1_strings = ansi_a_ios501_elem_1_strings;
+ break;
+
+ default:
+ ansi_a_bsmap_strings = ansi_a_ios401_bsmap_strings;
+ ansi_a_dtap_strings = ansi_a_ios401_dtap_strings;
+ ansi_a_elem_1_strings = ansi_a_ios401_elem_1_strings;
+ break;
+ }
+
dissector_add("bsap.pdu_type", BSSAP_PDU_TYPE_BSMAP, bsmap_handle);
dissector_add("bsap.pdu_type", BSSAP_PDU_TYPE_DTAP, dtap_handle);
diff --git a/epan/dissectors/packet-ansi_a.h b/epan/dissectors/packet-ansi_a.h
index 78c2cfd757..ae18cc9b55 100644
--- a/epan/dissectors/packet-ansi_a.h
+++ b/epan/dissectors/packet-ansi_a.h
@@ -32,26 +32,49 @@ typedef struct _ansi_a_tap_rec_t {
guint8 message_type;
} ansi_a_tap_rec_t;
+typedef struct ext_value_string_t
+{
+ guint32 value;
+ const gchar *strptr;
+ gint dec_index;
+}
+ext_value_string_t;
+
/*
* the following allows TAP code access to the messages
* without having to duplicate it. With MSVC and a
* libwireshark.dll, we need a special declaration.
*/
-WS_VAR_IMPORT const value_string ansi_a_ios401_bsmap_strings[];
-WS_VAR_IMPORT const value_string ansi_a_ios401_dtap_strings[];
+WS_VAR_IMPORT const ext_value_string_t *ansi_a_bsmap_strings;
+WS_VAR_IMPORT const ext_value_string_t *ansi_a_dtap_strings;
+WS_VAR_IMPORT const ext_value_string_t ansi_a_ios501_bsmap_strings[];
+WS_VAR_IMPORT const ext_value_string_t ansi_a_ios501_dtap_strings[];
+WS_VAR_IMPORT const ext_value_string_t ansi_a_ios401_bsmap_strings[];
+WS_VAR_IMPORT const ext_value_string_t ansi_a_ios401_dtap_strings[];
+
+#define A_VARIANT_IS634 4
+#define A_VARIANT_TSB80 5
+#define A_VARIANT_IS634A 6
+#define A_VARIANT_IOS2 7
+#define A_VARIANT_IOS3 8
+#define A_VARIANT_IOS401 9
+#define A_VARIANT_IOS501 10
+
+WS_VAR_IMPORT gint a_global_variant;
/*
* allows ANSI MAP to use this for IS-880 enhancements
+ * based on the 'ansi_a_ios401_elem_1_strings/ansi_a_ios501_elem_1_strings'
*/
-extern const value_string ansi_a_ios401_elem_1_strings[];
+WS_VAR_IMPORT const ext_value_string_t *ansi_a_elem_1_strings;
/*
* maximum number of strings that are allowed
* 255 because IEI are 1 octet in length
*
* this define is required by dissectors that need to
- * size based on the 'ansi_a_ios401_elem_1_strings'
+ * size based on the 'ansi_a_elem_1_strings'
* array
*/
-#define ANSI_A_MAX_NUM_IOS401_ELEM_1_STRINGS 255
+#define ANSI_A_MAX_NUM_IOS_ELEM_1_STRINGS 255
diff --git a/epan/dissectors/packet-ansi_map.c b/epan/dissectors/packet-ansi_map.c
index 77137ac206..67a1da6a98 100644
--- a/epan/dissectors/packet-ansi_map.c
+++ b/epan/dissectors/packet-ansi_map.c
@@ -132,6 +132,26 @@ dissector_handle_t ansi_map_handle;
static gboolean dissect_ansi_param(ASN1_SCK *asn1, proto_tree *tree);
+static const gchar *
+my_match_strval_idx(guint32 val, const ext_value_string_t *vs, gint *idx)
+{
+ gint i = 0;
+
+ while (vs[i].strptr)
+ {
+ if (vs[i].value == val)
+ {
+ *idx = i;
+ return(vs[i].strptr);
+ }
+
+ i++;
+ }
+
+ *idx = -1;
+ return(NULL);
+}
+
/* ANSI PARAM STRINGS */
static const value_string ansi_param_1_strings[] = {
{ 0x81, "Billing ID" },
@@ -657,10 +677,10 @@ static const gchar *qos_pri_str[] = {
/*
* would prefer to have had the define set to the exact number of
* elements in the array but that is not without it's own problems
- * (sizeof(ansi_a_ios401_elem_1_strings)/sizeof(value_string))
+ * (sizeof(ansi_a_elem_1_strings)/sizeof(value_string))
*/
-#define NUM_IOS401_ELEM ANSI_A_MAX_NUM_IOS401_ELEM_1_STRINGS
-static gint ett_ansi_map_ios401_elem[NUM_IOS401_ELEM];
+#define NUM_IOS_ELEM ANSI_A_MAX_NUM_IOS_ELEM_1_STRINGS
+static gint ett_ansi_map_ios_elem[NUM_IOS_ELEM];
/* Initialize the protocol and registered fields */
@@ -673,7 +693,7 @@ static int hf_ansi_map_length = -1;
static int hf_ansi_map_id = -1;
static int hf_ansi_map_opr_code = -1;
static int hf_ansi_map_param_id = -1;
-static int hf_ansi_map_ios401_elem_id = -1;
+static int hf_ansi_map_ios_elem_id = -1;
static int hf_ansi_map_min = -1;
static int hf_ansi_map_number = -1;
@@ -6616,7 +6636,7 @@ dissect_cdma2000_ios_data(ASN1_SCK *asn1, proto_tree *tree, guint len, gchar *ad
num_elems++;
asn1_int32_value_decode(asn1, 1, &value);
- str = match_strval_idx((guint32) value, ansi_a_ios401_elem_1_strings, &idx);
+ str = my_match_strval_idx((guint32) value, ansi_a_elem_1_strings, &idx);
asn1_octet_decode(asn1, &elem_len);
@@ -6626,9 +6646,9 @@ dissect_cdma2000_ios_data(ASN1_SCK *asn1, proto_tree *tree, guint len, gchar *ad
"IOS - %s",
str);
- subtree = proto_item_add_subtree(item, ett_ansi_map_ios401_elem[idx]);
+ subtree = proto_item_add_subtree(item, ett_ansi_map_ios_elem[idx]);
- proto_tree_add_none_format(subtree, hf_ansi_map_ios401_elem_id, asn1->tvb,
+ proto_tree_add_none_format(subtree, hf_ansi_map_ios_elem_id, asn1->tvb,
saved_offset, 1, "Element ID");
proto_tree_add_uint(subtree, hf_ansi_map_length, asn1->tvb,
@@ -12703,7 +12723,7 @@ dissect_ansi_param(ASN1_SCK *asn1, proto_tree *tree)
if (ansi_map_add_string[0] != '\0')
{
- proto_item_append_text(item, "%s", ansi_map_add_string);
+ proto_item_append_text(item, ansi_map_add_string);
}
}
}
@@ -12766,7 +12786,7 @@ dissect_ansi_params(ASN1_SCK *asn1, proto_tree *tree)
if (ansi_map_add_string[0] != '\0')
{
- proto_item_append_text(item, "%s", ansi_map_add_string);
+ proto_item_append_text(item, ansi_map_add_string);
}
}
@@ -13109,8 +13129,8 @@ proto_register_ansi_map(void)
FT_INT32, BASE_DEC, NULL, 0,
"", HFILL }
},
- { &hf_ansi_map_ios401_elem_id,
- { "IOS 4.0.1 Element ID", "ansi_map.ios401_elem_id",
+ { &hf_ansi_map_ios_elem_id,
+ { "IOS 4.0.1 Element ID", "ansi_map.ios_elem_id",
FT_NONE, 0, NULL, 0,
"", HFILL }
},
@@ -13128,7 +13148,7 @@ proto_register_ansi_map(void)
/* Setup protocol subtree array */
#define NUM_INDIVIDUAL_PARAMS 15
- gint *ett[NUM_INDIVIDUAL_PARAMS+NUM_PARAM_1+NUM_PARAM_2+NUM_PARAM_3+NUM_IOS401_ELEM];
+ gint *ett[NUM_INDIVIDUAL_PARAMS+NUM_PARAM_1+NUM_PARAM_2+NUM_PARAM_3+NUM_IOS_ELEM];
memset((void *) ett, -1, sizeof(ett));
@@ -13165,9 +13185,9 @@ proto_register_ansi_map(void)
ett[last_offset] = &ett_ansi_param_3[i];
}
- for (i=0; i < NUM_IOS401_ELEM; i++, last_offset++)
+ for (i=0; i < NUM_IOS_ELEM; i++, last_offset++)
{
- ett[last_offset] = &ett_ansi_map_ios401_elem[i];
+ ett[last_offset] = &ett_ansi_map_ios_elem[i];
}
/* Register the protocol name and description */