aboutsummaryrefslogtreecommitdiffstats
path: root/packet-q931.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2004-03-06 10:11:54 +0000
committerGuy Harris <guy@alum.mit.edu>2004-03-06 10:11:54 +0000
commit45ec7cb5fff4f7a4c647dcf76e88b94e7bdf2c09 (patch)
treedcade1485a026a6e917659d7c8c089de96bd7879 /packet-q931.c
parent35e1b1f55b3336732b175ad1c27a33b030c2db42 (diff)
From Anders Broman:
use the packet-e164.c stuff to analyze E.164 numbers; add some more filterable fields. svn path=/trunk/; revision=10330
Diffstat (limited to 'packet-q931.c')
-rw-r--r--packet-q931.c72
1 files changed, 50 insertions, 22 deletions
diff --git a/packet-q931.c b/packet-q931.c
index f50a0c63d7..22be473ed7 100644
--- a/packet-q931.c
+++ b/packet-q931.c
@@ -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,