aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-rtp.c
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2015-06-26 10:33:11 -0700
committerAnders Broman <a.broman58@gmail.com>2015-06-26 21:57:45 +0000
commitd6e53793ad3046dcfdc3ab28d08105b6df4ddf45 (patch)
treec509665925d5862b7951584ce1fc11d43e6af4a0 /epan/dissectors/packet-rtp.c
parent5c438e1e056cde9e56a774f21a93f5619222a0af (diff)
RTP: create conversation when using heuristic dissector
This gives a chance to perform RTP reassembly when "Try to decode RTP outside of conversations" option is activated. Bug: 11310 Change-Id: Ic8bd9532a88a072c3cb1f1907cf7117b5072a954 Reviewed-on: https://code.wireshark.org/review/9175 Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-rtp.c')
-rw-r--r--epan/dissectors/packet-rtp.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/epan/dissectors/packet-rtp.c b/epan/dissectors/packet-rtp.c
index 1f8221d9c2..eedd95264b 100644
--- a/epan/dissectors/packet-rtp.c
+++ b/epan/dissectors/packet-rtp.c
@@ -1378,6 +1378,30 @@ dissect_rtp_heur_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
return FALSE;
}
+ /* Create a conversation in case none exists so as to allow reassembly code to work */
+ if (!find_conversation(pinfo->fd->num, &pinfo->net_dst, &pinfo->net_src, pinfo->ptype,
+ pinfo->destport, pinfo->srcport, NO_ADDR2)) {
+ conversation_t *p_conv;
+ struct _rtp_conversation_info *p_conv_data;
+ p_conv = conversation_new(pinfo->fd->num, &pinfo->net_dst, &pinfo->net_src, pinfo->ptype,
+ pinfo->destport, pinfo->srcport, NO_ADDR2);
+ p_conv_data = (struct _rtp_conversation_info *)conversation_get_proto_data(p_conv, proto_rtp);
+ if (! p_conv_data) {
+ /* Create conversation data */
+ p_conv_data = wmem_new(wmem_file_scope(), struct _rtp_conversation_info);
+ p_conv_data->rtp_dyn_payload = NULL;
+ p_conv_data->extended_seqno = 0x10000;
+ p_conv_data->rtp_conv_info = wmem_new(wmem_file_scope(), rtp_private_conv_info);
+ p_conv_data->rtp_conv_info->multisegment_pdus = wmem_tree_new(wmem_file_scope());
+ conversation_add_proto_data(p_conv, proto_rtp, p_conv_data);
+ }
+ g_strlcpy(p_conv_data->method, "HEUR RTP", MAX_RTP_SETUP_METHOD_SIZE+1);
+ p_conv_data->frame_number = pinfo->fd->num;
+ p_conv_data->is_video = FALSE;
+ p_conv_data->srtp_info = NULL;
+ p_conv_data->bta2dp_info = NULL;
+ p_conv_data->btvdp_info = NULL;
+ }
dissect_rtp( tvb, pinfo, tree, data );
return TRUE;
}