summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Nardi <nardi.ivan@gmail.com>2017-06-28 20:47:27 +0200
committerAnders Broman <a.broman58@gmail.com>2017-06-29 11:05:58 +0000
commit3c4e7428d7f3d91ccdd973941436844cbe93b175 (patch)
treec38610e5bef686e4a46f0a67bf4091f735499121
parent245bddee6b486bf017c478b2295d5161b3f7f2a9 (diff)
downloadwireshark-3c4e7428d7f3d91ccdd973941436844cbe93b175.tar.gz
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 <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r--epan/dissectors/packet-sccp.c73
1 files 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;
}