diff options
author | Tomas Kukosa <tomas.kukosa@siemens.com> | 2010-03-17 15:25:20 +0000 |
---|---|---|
committer | Tomas Kukosa <tomas.kukosa@siemens.com> | 2010-03-17 15:25:20 +0000 |
commit | cd719af33aad6a90c93a3a126eb4c545e1551604 (patch) | |
tree | e7249e3b56f3b9993dff40b6ce15276bc9427a21 | |
parent | 533685a9a6597661b7bffda5f48f232b84d95675 (diff) |
Add heuristic table for Q.931 User-specific protocol
svn path=/trunk/; revision=32218
-rw-r--r-- | epan/dissectors/packet-isup.c | 16 | ||||
-rw-r--r-- | epan/dissectors/packet-q931.c | 23 | ||||
-rw-r--r-- | epan/dissectors/packet-q931.h | 2 |
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[]; |