From Anders Broman:

use the packet-e164.c stuff to analyze E.164 numbers;

	add some more filterable fields.

svn path=/trunk/; revision=10330
This commit is contained in:
Guy Harris 2004-03-06 10:11:54 +00:00
parent 35e1b1f55b
commit 45ec7cb5ff
1 changed files with 50 additions and 22 deletions

View File

@ -2,7 +2,7 @@
* Routines for Q.931 frame disassembly
* Guy Harris <guy@alum.mit.edu>
*
* $Id: packet-q931.c,v 1.72 2004/02/21 04:19:12 guy Exp $
* $Id: packet-q931.c,v 1.73 2004/03/06 10:11:54 guy Exp $
*
* Modified by Andreas Sikkema for possible use with H.323
*
@ -36,6 +36,7 @@
#include <epan/strutil.h>
#include "nlpid.h"
#include "packet-q931.h"
#include "packet-e164.h"
#include "prefs.h"
#include "reassemble.h"
@ -66,6 +67,7 @@ static int hf_q931_call_ref_flag = -1;
static int hf_q931_call_ref = -1;
static int hf_q931_message_type = -1;
static int hf_q931_segment_type = -1;
static int hf_q931_cause_location = -1;
static int hf_q931_cause_value = -1;
static int hf_q931_number_type = -1;
static int hf_q931_numbering_plan = -1;
@ -74,6 +76,8 @@ static int hf_q931_calling_party_number = -1;
static int hf_q931_called_party_number = -1;
static int hf_q931_connected_number = -1;
static int hf_q931_redirecting_number = -1;
static int hf_q931_screening_ind = -1;
static int hf_q931_presentation_ind = -1;
static int hf_q931_segments = -1;
static int hf_q931_segment = -1;
@ -1169,21 +1173,19 @@ dissect_q931_cause_ie(tvbuff_t *tvb, int offset, int len,
return;
octet = tvb_get_guint8(tvb, offset);
coding_standard = octet & 0x60;
proto_tree_add_uint(tree, hf_q931_coding_standard, tvb, offset, 1, octet);
if (coding_standard != Q931_ITU_STANDARDIZED_CODING) {
/*
* We don't know how the cause is encoded,
* so just dump it as data and be done with it.
*/
proto_tree_add_uint(tree, hf_q931_coding_standard, tvb, offset, 1, octet);
proto_tree_add_text(tree, tvb, offset,
len, "Data: %s",
tvb_bytes_to_str(tvb, offset, len));
return;
}
proto_tree_add_text(tree, tvb, offset, 1,
"Location: %s",
val_to_str(octet & 0x0F, q931_cause_location_vals,
"Unknown (0x%X)"));
proto_tree_add_uint(tree, hf_q931_cause_location, tvb, offset, 1, octet);
proto_tree_add_uint(tree, hf_q931_coding_standard, tvb, offset, 1, octet);
proto_tree_add_boolean(tree, hf_q931_extension_ind, tvb, offset, 1, octet);
offset += 1;
len -= 1;
@ -1196,6 +1198,7 @@ dissect_q931_cause_ie(tvbuff_t *tvb, int offset, int len,
"Recommendation: %s",
val_to_str(octet & 0x7F, q931_cause_recommendation_vals,
"Unknown (0x%02X)"));
proto_tree_add_boolean(tree, hf_q931_extension_ind, tvb, offset, 1, octet);
offset += 1;
len -= 1;
}
@ -1205,6 +1208,7 @@ dissect_q931_cause_ie(tvbuff_t *tvb, int offset, int len,
octet = tvb_get_guint8(tvb, offset);
cause_value = octet & 0x7F;
proto_tree_add_uint(tree, hf_cause_value, tvb, offset, 1, cause_value);
proto_tree_add_boolean(tree, hf_q931_extension_ind, tvb, offset, 1, octet);
offset += 1;
len -= 1;
@ -2020,8 +2024,8 @@ static const value_string q931_numbering_plan_vals[] = {
static const value_string q931_presentation_indicator_vals[] = {
{ 0x00, "Presentation allowed" },
{ 0x20, "Presentation restricted" },
{ 0x40, "Number not available due to interworking" },
{ 0x01, "Presentation restricted" },
{ 0x02, "Number not available due to interworking" },
{ 0, NULL }
};
@ -2046,13 +2050,16 @@ static const value_string q931_redirection_reason_vals[] = {
static void
dissect_q931_number_ie(tvbuff_t *tvb, int offset, int len,
proto_tree *tree, int hfindex)
proto_tree *tree, int hfindex, e164_info_t e164_info)
{
guint8 octet;
gint number_plan;
if (len == 0)
return;
octet = tvb_get_guint8(tvb, offset);
number_plan = octet & 0x0f;
e164_info.nature_of_address = ( octet & 0x70 ) >> 4;
proto_tree_add_uint(tree, hf_q931_numbering_plan, tvb, offset, 1, octet);
proto_tree_add_uint(tree, hf_q931_number_type, tvb, offset, 1, octet);
proto_tree_add_boolean(tree, hf_q931_extension_ind, tvb, offset, 1, octet);
@ -2064,14 +2071,9 @@ dissect_q931_number_ie(tvbuff_t *tvb, int offset, int len,
if (len == 0)
return;
octet = tvb_get_guint8(tvb, offset);
proto_tree_add_text(tree, tvb, offset, 1,
"Presentation indicator: %s",
val_to_str(octet & 0x60, q931_presentation_indicator_vals,
"Unknown (0x%X)"));
proto_tree_add_text(tree, tvb, offset, 1,
"Screening indicator: %s",
val_to_str(octet & 0x03, q931_screening_indicator_vals,
"Unknown (0x%X)"));
proto_tree_add_uint(tree, hf_q931_screening_ind, tvb, offset, 1, octet);
proto_tree_add_uint(tree, hf_q931_presentation_ind, tvb, offset, 1, octet);
proto_tree_add_boolean(tree, hf_q931_extension_ind, tvb, offset, 1, octet);
offset += 1;
len -= 1;
}
@ -2094,6 +2096,16 @@ dissect_q931_number_ie(tvbuff_t *tvb, int offset, int len,
if (len == 0)
return;
proto_tree_add_item(tree, hfindex, tvb, offset, len, FALSE);
if ( number_plan == 1 ) {
if ( e164_info.e164_number_type != NONE ){
e164_info.E164_number_str = tvb_get_string(tvb, offset, len);
e164_info.E164_number_length = len;
dissect_e164_number(tvb, tree, offset, len, e164_info);
}
}
}
/*
@ -2453,6 +2465,8 @@ dissect_q931_IEs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
int codeset, locked_codeset;
gboolean non_locking_shift, first_segment;
tvbuff_t *h225_tvb, *next_tvb;
e164_info_t e164_info;
e164_info.e164_number_type = NONE;
codeset = locked_codeset = 0; /* start out in codeset 0 */
non_locking_shift = TRUE;
@ -2789,31 +2803,33 @@ dissect_q931_IEs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
break;
case CS0 | Q931_IE_CALLING_PARTY_NUMBER:
e164_info.e164_number_type = CALLING_PARTY_NUMBER;
dissect_q931_number_ie(tvb,
offset + 2, info_element_len,
ie_tree,
hf_q931_calling_party_number);
hf_q931_calling_party_number, e164_info);
break;
case CS0 | Q931_IE_CONNECTED_NUMBER_DEFAULT:
dissect_q931_number_ie(tvb,
offset + 2, info_element_len,
ie_tree,
hf_q931_connected_number);
hf_q931_connected_number, e164_info);
break;
case CS0 | Q931_IE_CALLED_PARTY_NUMBER:
e164_info.e164_number_type = CALLED_PARTY_NUMBER;
dissect_q931_number_ie(tvb,
offset + 2, info_element_len,
ie_tree,
hf_q931_called_party_number);
hf_q931_called_party_number, e164_info);
break;
case CS0 | Q931_IE_REDIRECTING_NUMBER:
dissect_q931_number_ie(tvb,
offset + 2, info_element_len,
ie_tree,
hf_q931_redirecting_number);
hf_q931_redirecting_number, e164_info);
break;
case CS0 | Q931_IE_CALLING_PARTY_SUBADDR:
@ -2998,8 +3014,12 @@ proto_register_q931(void)
{ "User information layer 1 protocol", "q931.uil1", FT_UINT8, BASE_HEX,
VALS(q931_uil1_vals), 0x1f,"", HFILL }},
{ &hf_q931_cause_location,
{ "Cause location", "q931.cause_location", FT_UINT8, BASE_DEC, VALS(q931_cause_location_vals), 0x0f,
"", HFILL }},
{ &hf_q931_cause_value,
{ "Cause value", "q931.cause_value", FT_UINT8, BASE_DEC, VALS(q931_cause_code_vals), 0x0,
{ "Cause value", "q931.cause_value", FT_UINT8, BASE_DEC, VALS(q931_cause_code_vals), 0x7f,
"", HFILL }},
{ &hf_q931_number_type,
@ -3010,6 +3030,14 @@ proto_register_q931(void)
{ "Numbering plan", "q931.numbering_plan", FT_UINT8, BASE_HEX, VALS(q931_numbering_plan_vals), 0x0f,
"", HFILL }},
{ &hf_q931_screening_ind,
{ "Screening indicator", "q931.screening_ind", FT_UINT8, BASE_HEX, VALS(q931_screening_indicator_vals), 0x03,
"", HFILL }},
{ &hf_q931_presentation_ind,
{ "Presentation indicator", "q931.presentation_ind", FT_UINT8, BASE_HEX, VALS(q931_presentation_indicator_vals), 0x60,
"", HFILL }},
{ &hf_q931_extension_ind,
{ "Extension indicator", "q931.extension_ind",
FT_BOOLEAN, 8, TFS(&q931_extension_ind_value), 0x80,