aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors
diff options
context:
space:
mode:
authorTomas Kukosa <tomas.kukosa@siemens.com>2010-03-17 15:25:20 +0000
committerTomas Kukosa <tomas.kukosa@siemens.com>2010-03-17 15:25:20 +0000
commitcd719af33aad6a90c93a3a126eb4c545e1551604 (patch)
treee7249e3b56f3b9993dff40b6ce15276bc9427a21 /epan/dissectors
parent533685a9a6597661b7bffda5f48f232b84d95675 (diff)
Add heuristic table for Q.931 User-specific protocol
svn path=/trunk/; revision=32218
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-isup.c16
-rw-r--r--epan/dissectors/packet-q931.c23
-rw-r--r--epan/dissectors/packet-q931.h2
3 files changed, 29 insertions, 12 deletions
diff --git a/epan/dissectors/packet-isup.c b/epan/dissectors/packet-isup.c
index ad6f2b6972..8e267a8c38 100644
--- a/epan/dissectors/packet-isup.c
+++ b/epan/dissectors/packet-isup.c
@@ -2460,11 +2460,11 @@ dissect_isup_event_information_parameter(tvbuff_t *parameter_tvb, proto_tree *pa
Dissector Parameter User-to-user information- no detailed dissection since defined in Rec. Q.931
*/
static void
-dissect_isup_user_to_user_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_isup_user_to_user_information_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item)
{ guint length = tvb_reported_length(parameter_tvb);
proto_tree_add_text(parameter_tree, parameter_tvb, 0, -1,
"User-to-user info (-> Q.931)");
- dissect_q931_user_user_ie(parameter_tvb, 0, length,
+ dissect_q931_user_user_ie(parameter_tvb, pinfo, 0, length,
parameter_tree );
proto_item_set_text(parameter_item, "User-to-user information,(%u byte%s length)",
length , plurality(length, "", "s"));
@@ -5368,7 +5368,7 @@ dissect_isup_optional_parameter(tvbuff_t *optional_parameters_tvb,packet_info *p
dissect_isup_signalling_point_code_parameter(parameter_tvb, parameter_tree, parameter_item);
break;
case PARAM_TYPE_USER_TO_USER_INFO:
- dissect_isup_user_to_user_information_parameter(parameter_tvb, parameter_tree, parameter_item);
+ dissect_isup_user_to_user_information_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item);
break;
case PARAM_TYPE_CONNECTED_NR:
dissect_isup_connected_number_parameter(parameter_tvb, parameter_tree, parameter_item);
@@ -5671,7 +5671,7 @@ dissect_ansi_isup_optional_parameter(tvbuff_t *optional_parameters_tvb,packet_in
dissect_isup_signalling_point_code_parameter(parameter_tvb, parameter_tree, parameter_item);
break;
case PARAM_TYPE_USER_TO_USER_INFO:
- dissect_isup_user_to_user_information_parameter(parameter_tvb, parameter_tree, parameter_item);
+ dissect_isup_user_to_user_information_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item);
break;
case PARAM_TYPE_CONNECTED_NR:
dissect_isup_connected_number_parameter(parameter_tvb, parameter_tree, parameter_item);
@@ -6518,7 +6518,7 @@ dissect_isup_call_progress_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
Dissector Message Type User-to-User information
*/
static gint
-dissect_isup_user_to_user_information_message(tvbuff_t *message_tvb, proto_tree *isup_tree)
+dissect_isup_user_to_user_information_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *isup_tree)
{ proto_item* parameter_item;
proto_tree* parameter_tree;
tvbuff_t *parameter_tvb;
@@ -6541,7 +6541,7 @@ dissect_isup_user_to_user_information_message(tvbuff_t *message_tvb, proto_tree
proto_tree_add_uint_format(parameter_tree, hf_isup_parameter_length, message_tvb, offset + parameter_pointer, PARAMETER_LENGTH_IND_LENGTH, parameter_length, "Parameter length: %u", parameter_length);
actual_length = tvb_ensure_length_remaining(message_tvb, offset);
parameter_tvb = tvb_new_subset(message_tvb, offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length );
- dissect_isup_user_to_user_information_parameter(parameter_tvb, parameter_tree, parameter_item);
+ dissect_isup_user_to_user_information_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item);
offset += PARAMETER_POINTER_LENGTH;
return offset;
@@ -6747,7 +6747,7 @@ dissect_isup_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *isup
opt_part_possible = TRUE;
break;
case MESSAGE_TYPE_USER2USER_INFO:
- offset += dissect_isup_user_to_user_information_message(parameter_tvb, isup_tree);
+ offset += dissect_isup_user_to_user_information_message(parameter_tvb, pinfo, isup_tree);
opt_part_possible = TRUE;
break;
case MESSAGE_TYPE_UNEQUIPPED_CIC:
@@ -6944,7 +6944,7 @@ dissect_isup_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *isup
opt_part_possible = TRUE;
break;
case MESSAGE_TYPE_USER2USER_INFO:
- offset += dissect_isup_user_to_user_information_message(parameter_tvb, isup_tree);
+ offset += dissect_isup_user_to_user_information_message(parameter_tvb, pinfo, isup_tree);
opt_part_possible = TRUE;
break;
case MESSAGE_TYPE_UNEQUIPPED_CIC:
diff --git a/epan/dissectors/packet-q931.c b/epan/dissectors/packet-q931.c
index a42931bd7f..896febe97a 100644
--- a/epan/dissectors/packet-q931.c
+++ b/epan/dissectors/packet-q931.c
@@ -154,9 +154,13 @@ static dissector_table_t ie_dissector_table;
/* desegmentation of Q.931 over TPKT over TCP */
static gboolean q931_desegment = TRUE;
+/* Subdissectors */
static dissector_handle_t h225_handle;
static dissector_handle_t q931_tpkt_handle;
static dissector_handle_t q931_tpkt_pdu_handle;
+static dissector_handle_t data_handle = NULL;
+
+static heur_dissector_list_t q931_user_heur_subdissector_list;
static void
dissect_q931_IEs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *root_tree,
@@ -2438,11 +2442,12 @@ dissect_q931_high_layer_compat_ie(tvbuff_t *tvb, int offset, int len,
/*
* Dissect a User-user information element.
*/
+#define Q931_PROTOCOL_DISCRIMINATOR_USER 0x00
#define Q931_PROTOCOL_DISCRIMINATOR_IA5 0x04
#define Q931_PROTOCOL_DISCRIMINATOR_ASN1 0x05
const value_string q931_protocol_discriminator_vals[] = {
- { 0x00, "User-specific protocol" },
+ { Q931_PROTOCOL_DISCRIMINATOR_USER, "User-specific protocol" },
{ 0x01, "OSI high layer protocols" },
{ 0x02, "X.244" },
{ Q931_PROTOCOL_DISCRIMINATOR_IA5, "IA5 characters" },
@@ -2453,10 +2458,11 @@ const value_string q931_protocol_discriminator_vals[] = {
};
void
-dissect_q931_user_user_ie(tvbuff_t *tvb, int offset, int len,
+dissect_q931_user_user_ie(tvbuff_t *tvb, packet_info *pinfo, int offset, int len,
proto_tree *tree)
{
guint8 octet;
+ tvbuff_t *next_tvb = NULL;
if (len == 0)
return;
@@ -2472,6 +2478,14 @@ dissect_q931_user_user_ie(tvbuff_t *tvb, int offset, int len,
return;
switch (octet) {
+ case Q931_PROTOCOL_DISCRIMINATOR_USER:
+ next_tvb = tvb_new_subset(tvb, offset, len, len);
+ proto_tree_add_text(tree, tvb, offset, len, "User information: %d octets", len);
+ if (!dissector_try_heuristic(q931_user_heur_subdissector_list, next_tvb, pinfo, tree)) {
+ call_dissector_only(data_handle, next_tvb, pinfo, tree);
+ }
+ break;
+
case Q931_PROTOCOL_DISCRIMINATOR_IA5:
proto_tree_add_text(tree, tvb, offset, len, "User information: %s",
tvb_format_text(tvb, offset, len));
@@ -3140,7 +3154,7 @@ dissect_q931_IEs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *root_tree,
case CS0 | Q931_IE_USER_USER:
if (q931_tree != NULL) {
- dissect_q931_user_user_ie(tvb,
+ dissect_q931_user_user_ie(tvb, pinfo,
offset + 2, info_element_len,
ie_tree);
}
@@ -3525,6 +3539,7 @@ proto_register_q931(void)
/* subdissector code */
codeset_dissector_table = register_dissector_table("q931.codeset", "Q.931 Codeset", FT_UINT8, BASE_HEX);
ie_dissector_table = register_dissector_table("q931.ie", "Q.931 IE", FT_UINT16, BASE_HEX);
+ register_heur_dissector_list("q931_user", &q931_user_heur_subdissector_list);
q931_module = prefs_register_protocol(proto_q931, NULL);
prefs_register_bool_preference(q931_module, "desegment_h323_messages",
@@ -3560,6 +3575,8 @@ proto_reg_handoff_q931(void)
*/
h225_handle = find_dissector("h225");
+ data_handle = find_dissector("data");
+
/*
* For H.323.
*/
diff --git a/epan/dissectors/packet-q931.h b/epan/dissectors/packet-q931.h
index 8602053b73..d92fb9ab82 100644
--- a/epan/dissectors/packet-q931.h
+++ b/epan/dissectors/packet-q931.h
@@ -39,7 +39,7 @@ extern void dissect_q931_progress_indicator_ie(tvbuff_t *, int, int,
extern void dissect_q931_high_layer_compat_ie(tvbuff_t *, int, int,
proto_tree *);
-extern void dissect_q931_user_user_ie(tvbuff_t *tvb, int offset, int len,
+extern void dissect_q931_user_user_ie(tvbuff_t *tvb, packet_info *pinfo, int offset, int len,
proto_tree *tree);
extern const value_string q931_cause_location_vals[];