Add heuristic table for Q.931 User-specific protocol

svn path=/trunk/; revision=32218
This commit is contained in:
Tomas Kukosa 2010-03-17 15:25:20 +00:00
parent 533685a9a6
commit cd719af33a
3 changed files with 29 additions and 12 deletions

View File

@ -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:

View File

@ -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.
*/

View File

@ -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[];