From Michael Lum:

Minor improvements.

	Added IEI level decoding of cdma2000 Handoff * IOS data
	parameters.

svn path=/trunk/; revision=8935
This commit is contained in:
Guy Harris 2003-11-11 05:54:06 +00:00
parent f9383ddd0e
commit 22557bd2f5
1 changed files with 197 additions and 29 deletions

View File

@ -79,7 +79,7 @@
* UIM
* 3GPP2 N.S0003
*
* $Id: packet-ansi_map.c,v 1.8 2003/11/09 22:49:08 guy Exp $
* $Id: packet-ansi_map.c,v 1.9 2003/11/11 05:54:06 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -620,6 +620,103 @@ static gchar *qos_pri_str[] = {
"Reserved, treat as Priority Level 15"
};
/*
* ANSI A Interface
* IOS 4.0.1 element IDs
* Used for cdma2000 Handoff Invoke/Response IOS Data
*
* COPIED FROM packet-ansi_a.c
*/
static const value_string ansi_map_ios401_elem_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 },
};
#define NUM_IOS401_ELEM (sizeof(ansi_map_ios401_elem_strings)/sizeof(value_string))
static gint ett_ansi_map_ios401_elem[NUM_IOS401_ELEM];
/* Initialize the protocol and registered fields */
static int proto_ansi_map = -1;
static int hf_ansi_map_tag = -1;
@ -627,6 +724,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;
/* Initialize the subtree pointers */
@ -6684,30 +6782,76 @@ param_calling_party_cat(ASN1_SCK *asn1, proto_tree *tree, guint len, gchar *add_
"Calling Party's Category, Refer to ITU-T Q.763 (Signalling System No. 7 ISDN user part formats and codes) for encoding of this parameter");
}
/*
* Dissect IOS data parameters expected to be in TLV format
*/
static void
dissect_cdma2000_ios_data(ASN1_SCK *asn1, proto_tree *tree, guint len, gchar *add_string)
{
gint32 value;
guint num_elems;
guchar elem_len;
guint32 orig_offset, saved_offset;
proto_tree *subtree;
proto_item *item;
gchar *str;
gint idx;
num_elems = 0;
orig_offset = saved_offset = asn1->offset;
while ((saved_offset - orig_offset + 2) <= len)
{
num_elems++;
asn1_int32_value_decode(asn1, 1, &value);
str = my_match_strval((guint32) value, ansi_map_ios401_elem_strings, &idx);
asn1_octet_decode(asn1, &elem_len);
item =
proto_tree_add_text(tree,
asn1->tvb, saved_offset, elem_len + 2,
"IOS - %s",
str);
subtree = proto_item_add_subtree(item, ett_ansi_map_ios401_elem[idx]);
proto_tree_add_none_format(subtree, hf_ansi_map_ios401_elem_id, asn1->tvb,
saved_offset, 1, "Element ID");
proto_tree_add_uint(subtree, hf_ansi_map_length, asn1->tvb,
saved_offset + 1, 1, elem_len);
if (elem_len > 0)
{
proto_tree_add_text(subtree,
asn1->tvb, saved_offset + 2, elem_len,
"Element Value");
asn1->offset += elem_len;
}
saved_offset += elem_len + 2;
}
sprintf(add_string, " - (%u)", num_elems);
EXTRANEOUS_DATA_CHECK((len - (saved_offset - orig_offset)), 0);
}
static void
param_cdma2000_ho_ivk_ios(ASN1_SCK *asn1, proto_tree *tree, guint len, gchar *add_string)
{
add_string = add_string;
proto_tree_add_text(tree, asn1->tvb,
asn1->offset, len,
"IOS A1 Element Handoff Invoke Information");
asn1->offset += len;
dissect_cdma2000_ios_data(asn1, tree, len, add_string);
}
static void
param_cdma2000_ho_rsp_ios(ASN1_SCK *asn1, proto_tree *tree, guint len, gchar *add_string)
{
add_string = add_string;
proto_tree_add_text(tree, asn1->tvb,
asn1->offset, len,
"IOS A1 Element Handoff Response Information");
asn1->offset += len;
dissect_cdma2000_ios_data(asn1, tree, len, add_string);
}
static void
@ -11918,12 +12062,16 @@ static void
param_list(ASN1_SCK *asn1, proto_tree *tree, guint len, gchar *add_string)
{
guint saved_offset;
guint num_parms;
add_string = add_string;
num_parms = 0;
saved_offset = asn1->offset;
while (len > (asn1->offset - saved_offset))
{
num_parms++;
if (!dissect_ansi_param(asn1, tree))
{
proto_tree_add_text(tree,
@ -11934,6 +12082,8 @@ param_list(ASN1_SCK *asn1, proto_tree *tree, guint len, gchar *add_string)
break;
}
}
sprintf(add_string, " - (%u)", num_parms);
}
@ -12748,8 +12898,8 @@ dissect_ansi_param(ASN1_SCK *asn1, proto_tree *tree)
subtree = proto_item_add_subtree(item, ett_param_idx);
proto_tree_add_none_format(subtree, hf_ansi_map_param_id, asn1->tvb,
saved_offset, asn1->offset - saved_offset, "Parameter ID");
proto_tree_add_uint_format(subtree, hf_ansi_map_param_id, asn1->tvb,
saved_offset, asn1->offset - saved_offset, val, "Parameter ID");
dissect_ansi_map_len(asn1, subtree, &def_len, &len);
@ -12823,7 +12973,15 @@ dissect_ansi_params(ASN1_SCK *asn1, proto_tree *tree)
dissect_ansi_map_len(asn1, subtree, &def_len, &len);
proto_item_set_len(item, (asn1->offset - saved_offset) + len);
ansi_map_add_string[0] = '\0';
param_list(asn1, subtree, len, ansi_map_add_string);
if (ansi_map_add_string[0] != '\0')
{
proto_item_append_text(item, ansi_map_add_string);
ansi_map_add_string[0] = '\0';
}
}
static void
@ -13061,6 +13219,7 @@ void
proto_register_ansi_map(void)
{
guint i;
gint last_offset;
/* Setup list of header fields */
static hf_register_info hf[] =
@ -13087,16 +13246,21 @@ proto_register_ansi_map(void)
},
{ &hf_ansi_map_param_id,
{ "Param ID", "ansi_map.param_id",
FT_NONE, 0, 0, 0,
FT_UINT32, BASE_HEX, NULL, 0,
"", HFILL }
},
{ &hf_ansi_map_ios401_elem_id,
{ "IOS 4.0.1 Element ID", "ansi_map.ios401_elem_id",
FT_NONE, 0, NULL, 0,
"", HFILL }
},
};
/* Setup protocol subtree array */
#define NUM_INDIVIDUAL_PARAMS 15
static gint *ett[NUM_INDIVIDUAL_PARAMS+NUM_PARAM_1+NUM_PARAM_2+NUM_PARAM_3];
gint *ett[NUM_INDIVIDUAL_PARAMS+NUM_PARAM_1+NUM_PARAM_2+NUM_PARAM_3+NUM_IOS401_ELEM];
memset((void *) ett, 0, sizeof(ett));
memset((void *) ett, -1, sizeof(ett));
ett[0] = &ett_ansi_map;
ett[1] = &ett_opr_code;
@ -13114,22 +13278,26 @@ proto_register_ansi_map(void)
ett[13] = &ett_ent_dig_mask;
ett[14] = &ett_all_dig_mask;
for (i=0; i < NUM_PARAM_1; i++)
last_offset = NUM_INDIVIDUAL_PARAMS;
for (i=0; i < NUM_PARAM_1; i++, last_offset++)
{
ett_ansi_param_1[i] = -1;
ett[NUM_INDIVIDUAL_PARAMS+i] = &ett_ansi_param_1[i];
ett[last_offset] = &ett_ansi_param_1[i];
}
for (i=0; i < NUM_PARAM_2; i++)
for (i=0; i < NUM_PARAM_2; i++, last_offset++)
{
ett_ansi_param_2[i] = -1;
ett[NUM_INDIVIDUAL_PARAMS+NUM_PARAM_1+i] = &ett_ansi_param_2[i];
ett[last_offset] = &ett_ansi_param_2[i];
}
for (i=0; i < NUM_PARAM_3; i++)
for (i=0; i < NUM_PARAM_3; i++, last_offset++)
{
ett_ansi_param_3[i] = -1;
ett[NUM_INDIVIDUAL_PARAMS+NUM_PARAM_1+NUM_PARAM_2+i] = &ett_ansi_param_3[i];
ett[last_offset] = &ett_ansi_param_3[i];
}
for (i=0; i < NUM_IOS401_ELEM; i++, last_offset++)
{
ett[last_offset] = &ett_ansi_map_ios401_elem[i];
}
/* Register the protocol name and description */