aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2013-02-08 17:52:12 +0000
committerMichael Mann <mmann78@netscape.net>2013-02-08 17:52:12 +0000
commitc7525936983ae67912df1baffbddf60a2e69242b (patch)
treebf1ea5ce65d98f023f2b0861e25a5e235063a533
parent8c8533e0dd4223ce423896dfb3c089c037d83686 (diff)
Handle SIP "resends" within SDP. This is to handle "duplicate" OFFERs so they don't end up being handled by setup_sdp_transport() because the current frame couldn't match a request (due to duplication).
setup_sdp_transport_resend() should be unnecessary once all higher layers use setup_sdp_transport() and the "registration" code within dissect_sdp() is removed. svn path=/trunk/; revision=47572
-rw-r--r--epan/dissectors/packet-sdp.c12
-rw-r--r--epan/dissectors/packet-sdp.h4
-rw-r--r--epan/dissectors/packet-sip.c2
3 files changed, 18 insertions, 0 deletions
diff --git a/epan/dissectors/packet-sdp.c b/epan/dissectors/packet-sdp.c
index d563f199e4..7af9ab2514 100644
--- a/epan/dissectors/packet-sdp.c
+++ b/epan/dissectors/packet-sdp.c
@@ -1922,6 +1922,18 @@ setup_sdp_transport(tvbuff_t *tvb, packet_info *pinfo, enum sdp_exchange_type ex
}
}
+void setup_sdp_transport_resend(int current_frame, int request_frame)
+{
+ transport_info_t* transport_info = NULL;
+
+ if (request_frame != 0) {
+ transport_info = (transport_info_t*)se_tree_lookup32( sdp_transport_reqs, request_frame );
+ if (transport_info != NULL) {
+ se_tree_insert32(sdp_transport_reqs, current_frame, (void *)transport_info);
+ }
+ }
+}
+
static void
dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
diff --git a/epan/dissectors/packet-sdp.h b/epan/dissectors/packet-sdp.h
index c11e0edb42..21179619fe 100644
--- a/epan/dissectors/packet-sdp.h
+++ b/epan/dissectors/packet-sdp.h
@@ -38,3 +38,7 @@ enum sdp_exchange_type
};
extern void setup_sdp_transport(tvbuff_t *tvb, packet_info *pinfo, enum sdp_exchange_type type, int request_frame);
+/* Handles duplicate OFFER packets so they don't end up processed by dissect_sdp(). This can probably
+ * be removed when all higher layer dissectors properly handle SDP themselves with setup_sdp_transport()
+ */
+extern void setup_sdp_transport_resend(int current_frame, int request_frame);
diff --git a/epan/dissectors/packet-sip.c b/epan/dissectors/packet-sip.c
index 190791b38c..352642d077 100644
--- a/epan/dissectors/packet-sip.c
+++ b/epan/dissectors/packet-sip.c
@@ -3146,6 +3146,8 @@ dissect_sip_common(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tr
(stat_info->response_code == 200) ? SDP_EXCHANGE_ANSWER_ACCEPT : SDP_EXCHANGE_ANSWER_REJECT,
request_for_response);
}
+ } else {
+ setup_sdp_transport_resend(pinfo->fd->num, resend_for_packet);
}
}