From 3c4e7428d7f3d91ccdd973941436844cbe93b175 Mon Sep 17 00:00:00 2001 From: Ivan Nardi Date: Wed, 28 Jun 2017 20:47:27 +0200 Subject: sccp: build the "association tree" earlier Remove a double lookup in RLSD message dissection, too Ping-Bug:13861 Change-Id: Ie971c0779baad76fb22f8a59d045e38c072e8f06 Reviewed-on: https://code.wireshark.org/review/22448 Petri-Dish: Anders Broman Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman --- epan/dissectors/packet-sccp.c | 73 ++++++++++++++++++++++++++++--------------- 1 file changed, 48 insertions(+), 25 deletions(-) diff --git a/epan/dissectors/packet-sccp.c b/epan/dissectors/packet-sccp.c index c6a06771ab..2f04b28363 100644 --- a/epan/dissectors/packet-sccp.c +++ b/epan/dissectors/packet-sccp.c @@ -2705,6 +2705,34 @@ new_ud_msg(packet_info *pinfo, guint32 msg_type _U_) return m; } +static void build_assoc_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, + sccp_decode_context_t *sccp_info, guint msg_offset) +{ + if (trace_sccp && sccp_info->assoc && (sccp_info->assoc != &no_assoc)) { + proto_item *pi = proto_tree_add_uint(sccp_tree, hf_sccp_assoc_id, tvb, 0, 0, sccp_info->assoc->id); + proto_tree *pt = proto_item_add_subtree(pi, ett_sccp_assoc); + PROTO_ITEM_SET_GENERATED(pi); + if (sccp_info->assoc->msgs) { + sccp_msg_info_t *m; + for(m = sccp_info->assoc->msgs; m ; m = m->data.co.next) { + pi = proto_tree_add_uint(pt, hf_sccp_assoc_msg, tvb, 0, 0, m->framenum); + + if (sccp_info->assoc->payload != SCCP_PLOAD_NONE) + proto_item_append_text(pi," %s", val_to_str(sccp_info->assoc->payload, assoc_protos, "Unknown: %d")); + + if (m->data.co.label) + proto_item_append_text(pi," %s", m->data.co.label); + + if ((m->framenum == pinfo->num) && (m->offset == msg_offset) ) { + tap_queue_packet(sccp_tap, pinfo, m); + proto_item_append_text(pi," (current)"); + } + PROTO_ITEM_SET_GENERATED(pi); + } + } + } +} + static int dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, proto_tree *tree) @@ -2796,6 +2824,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, PARAMETER_CLASS, offset, PROTOCOL_CLASS_LENGTH, &sccp_info); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); VARIABLE_POINTER(variable_pointer1, hf_sccp_variable_pointer1, POINTER_LENGTH); OPTIONAL_POINTER(POINTER_LENGTH); @@ -2821,6 +2850,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, offset, SOURCE_LOCAL_REFERENCE_LENGTH, &sccp_info); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); offset += dissect_sccp_parameter(tvb, pinfo, sccp_tree, tree, PARAMETER_CLASS, offset, @@ -2835,6 +2865,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, DESTINATION_LOCAL_REFERENCE_LENGTH, &sccp_info); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); offset += dissect_sccp_parameter(tvb, pinfo, sccp_tree, tree, PARAMETER_REFUSAL_CAUSE, offset, @@ -2852,13 +2883,13 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, offset, SOURCE_LOCAL_REFERENCE_LENGTH, &sccp_info); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); offset += dissect_sccp_parameter(tvb, pinfo, sccp_tree, tree, PARAMETER_RELEASE_CAUSE, offset, RELEASE_CAUSE_LENGTH, &sccp_info); OPTIONAL_POINTER(POINTER_LENGTH); - sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); break; case SCCP_MSG_TYPE_RLC: @@ -2871,6 +2902,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, offset, SOURCE_LOCAL_REFERENCE_LENGTH, &sccp_info); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); break; case SCCP_MSG_TYPE_DT1: @@ -2881,6 +2913,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, DESTINATION_LOCAL_REFERENCE_LENGTH, &sccp_info); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); more = tvb_get_guint8(tvb, offset) & SEGMENTING_REASSEMBLING_MASK; @@ -2934,6 +2967,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, DESTINATION_LOCAL_REFERENCE_LENGTH, &sccp_info); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); offset += dissect_sccp_parameter(tvb, pinfo, sccp_tree, tree, PARAMETER_SEQUENCING_SEGMENTING, offset, @@ -2947,6 +2981,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, DESTINATION_LOCAL_REFERENCE_LENGTH, &sccp_info); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); offset += dissect_sccp_parameter(tvb, pinfo, sccp_tree, tree, PARAMETER_RECEIVE_SEQUENCE_NUMBER, @@ -2966,6 +3001,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, VARIABLE_POINTER(variable_pointer3, hf_sccp_variable_pointer3, POINTER_LENGTH); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); dissect_sccp_variable_parameter(tvb, pinfo, sccp_tree, tree, PARAMETER_CALLED_PARTY_ADDRESS, @@ -2994,6 +3030,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, VARIABLE_POINTER(variable_pointer3, hf_sccp_variable_pointer3, POINTER_LENGTH); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); dissect_sccp_variable_parameter(tvb, pinfo, sccp_tree, tree, PARAMETER_CALLED_PARTY_ADDRESS, @@ -3016,6 +3053,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, DESTINATION_LOCAL_REFERENCE_LENGTH, &sccp_info); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); VARIABLE_POINTER(variable_pointer1, hf_sccp_variable_pointer1, POINTER_LENGTH); @@ -3029,6 +3067,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, offset, DESTINATION_LOCAL_REFERENCE_LENGTH, &sccp_info); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); break; case SCCP_MSG_TYPE_RSR: @@ -3043,6 +3082,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, PARAMETER_RESET_CAUSE, offset, RESET_CAUSE_LENGTH, &sccp_info); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); break; case SCCP_MSG_TYPE_RSC: @@ -3054,6 +3094,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, PARAMETER_SOURCE_LOCAL_REFERENCE, offset, SOURCE_LOCAL_REFERENCE_LENGTH, &sccp_info); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); break; case SCCP_MSG_TYPE_ERR: @@ -3065,6 +3106,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, PARAMETER_ERROR_CAUSE, offset, ERROR_CAUSE_LENGTH, &sccp_info); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); break; case SCCP_MSG_TYPE_IT: @@ -3076,6 +3118,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, PARAMETER_SOURCE_LOCAL_REFERENCE, offset, SOURCE_LOCAL_REFERENCE_LENGTH, &sccp_info); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); offset += dissect_sccp_parameter(tvb, pinfo, sccp_tree, tree, PARAMETER_CLASS, offset, PROTOCOL_CLASS_LENGTH, &sccp_info); @@ -3106,6 +3149,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, */ sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); dissect_sccp_variable_parameter(tvb, pinfo, sccp_tree, tree, PARAMETER_CALLED_PARTY_ADDRESS, @@ -3193,6 +3237,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, OPTIONAL_POINTER(POINTER_LENGTH); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); dissect_sccp_variable_parameter(tvb, pinfo, sccp_tree, tree, PARAMETER_CALLED_PARTY_ADDRESS, @@ -3280,6 +3325,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, OPTIONAL_POINTER(POINTER_LENGTH_LONG); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); dissect_sccp_variable_parameter(tvb, pinfo, sccp_tree, tree, PARAMETER_CALLED_PARTY_ADDRESS, @@ -3306,6 +3352,7 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, OPTIONAL_POINTER(POINTER_LENGTH_LONG); sccp_info.assoc = get_sccp_assoc(pinfo, msg_offset, &sccp_info); + build_assoc_tree(tvb, pinfo, sccp_tree, &sccp_info, msg_offset); dissect_sccp_variable_parameter(tvb, pinfo, sccp_tree, tree, PARAMETER_CALLED_PARTY_ADDRESS, @@ -3325,30 +3372,6 @@ dissect_sccp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *sccp_tree, dissect_sccp_optional_parameters(tvb, pinfo, sccp_tree, tree, optional_pointer, &sccp_info); - if (trace_sccp && sccp_info.assoc && (sccp_info.assoc != &no_assoc)) { - proto_item *pi = proto_tree_add_uint(sccp_tree, hf_sccp_assoc_id, tvb, 0, 0, sccp_info.assoc->id); - proto_tree *pt = proto_item_add_subtree(pi, ett_sccp_assoc); - PROTO_ITEM_SET_GENERATED(pi); - if (sccp_info.assoc->msgs) { - sccp_msg_info_t *m; - for(m = sccp_info.assoc->msgs; m ; m = m->data.co.next) { - pi = proto_tree_add_uint(pt, hf_sccp_assoc_msg, tvb, 0, 0, m->framenum); - - if (sccp_info.assoc->payload != SCCP_PLOAD_NONE) - proto_item_append_text(pi," %s", val_to_str(sccp_info.assoc->payload, assoc_protos, "Unknown: %d")); - - if (m->data.co.label) - proto_item_append_text(pi," %s", m->data.co.label); - - if ((m->framenum == pinfo->num) && (m->offset == msg_offset) ) { - tap_queue_packet(sccp_tap, pinfo, m); - proto_item_append_text(pi," (current)"); - } - PROTO_ITEM_SET_GENERATED(pi); - } - } - } - return offset; } -- cgit v1.2.1