diff options
author | Michael Mann <mmann78@netscape.net> | 2013-02-08 17:52:12 +0000 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2013-02-08 17:52:12 +0000 |
commit | c7525936983ae67912df1baffbddf60a2e69242b (patch) | |
tree | bf1ea5ce65d98f023f2b0861e25a5e235063a533 | |
parent | 8c8533e0dd4223ce423896dfb3c089c037d83686 (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.c | 12 | ||||
-rw-r--r-- | epan/dissectors/packet-sdp.h | 4 | ||||
-rw-r--r-- | epan/dissectors/packet-sip.c | 2 |
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); } } |