aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuis Ontanon <luis.ontanon@gmail.com>2005-03-10 19:32:22 +0000
committerLuis Ontanon <luis.ontanon@gmail.com>2005-03-10 19:32:22 +0000
commit008054453bbf4cc3fc54cae4a602ebcc869b4e92 (patch)
treefbe4ef788b1e4c8a766ae877769c7588528ccfa0
parent8ee0a507c7807e32e7bad409df068e43f0eb1e18 (diff)
From Alejandro Vaquero:
- Automatic dissection of RTP events (RFC2833) set in SDP sessions. - Add RTP events (RFC2833) to the Voip Graph svn path=/trunk/; revision=13697
-rw-r--r--asn1/h245/h245.cnf2
-rw-r--r--epan/dissectors/packet-h245.c4
-rw-r--r--epan/dissectors/packet-rtp-events.c22
-rw-r--r--epan/dissectors/packet-rtp-events.h5
-rw-r--r--epan/dissectors/packet-rtp.c26
-rw-r--r--epan/dissectors/packet-rtp.h5
-rw-r--r--epan/dissectors/packet-rtsp.c2
-rw-r--r--epan/dissectors/packet-sdp.c46
-rw-r--r--epan/dissectors/packet-skinny.c4
-rw-r--r--gtk/voip_calls.c98
-rw-r--r--gtk/voip_calls.h4
-rw-r--r--gtk/voip_calls_dlg.c2
12 files changed, 193 insertions, 27 deletions
diff --git a/asn1/h245/h245.cnf b/asn1/h245/h245.cnf
index 4d0a409a10..96fdd03a3c 100644
--- a/asn1/h245/h245.cnf
+++ b/asn1/h245/h245.cnf
@@ -345,7 +345,7 @@ guint32 tsapIdentifier;
src_addr.len=4;
src_addr.data=(char *)&ipv4_address;
- rtp_add_address(pinfo, &src_addr, ipv4_port, 0, "H245", pinfo->fd->num);
+ rtp_add_address(pinfo, &src_addr, ipv4_port, 0, "H245", pinfo->fd->num, 0);
}
if((!pinfo->fd->flags.visited) && rtcp_ipv4_address!=0 && rtcp_ipv4_port!=0 && rtcp_handle){
address src_addr;
diff --git a/epan/dissectors/packet-h245.c b/epan/dissectors/packet-h245.c
index 1132e5b06d..da923e1878 100644
--- a/epan/dissectors/packet-h245.c
+++ b/epan/dissectors/packet-h245.c
@@ -9866,7 +9866,7 @@ dissect_h245_OLC_rev_multiplexParameters(tvbuff_t *tvb, int offset, packet_info
src_addr.len=4;
src_addr.data=(char *)&ipv4_address;
- rtp_add_address(pinfo, &src_addr, ipv4_port, 0, "H245", pinfo->fd->num);
+ rtp_add_address(pinfo, &src_addr, ipv4_port, 0, "H245", pinfo->fd->num, 0);
}
if((!pinfo->fd->flags.visited) && rtcp_ipv4_address!=0 && rtcp_ipv4_port!=0 && rtcp_handle){
address src_addr;
@@ -12527,7 +12527,7 @@ dissect_h245_T_forwardMultiplexAckParameters(tvbuff_t *tvb, int offset, packet_i
src_addr.len=4;
src_addr.data=(char *)&ipv4_address;
- rtp_add_address(pinfo, &src_addr, ipv4_port, 0, "H245", pinfo->fd->num);
+ rtp_add_address(pinfo, &src_addr, ipv4_port, 0, "H245", pinfo->fd->num, 0);
}
if((!pinfo->fd->flags.visited) && rtcp_ipv4_address!=0 && rtcp_ipv4_port!=0 && rtcp_handle){
address src_addr;
diff --git a/epan/dissectors/packet-rtp-events.c b/epan/dissectors/packet-rtp-events.c
index 2cb137b399..c44f96c264 100644
--- a/epan/dissectors/packet-rtp-events.c
+++ b/epan/dissectors/packet-rtp-events.c
@@ -40,6 +40,9 @@
#include <stdio.h>
#include <string.h>
#include "packet-rtp-events.h"
+#include "packet-rtp.h"
+#include <epan/conversation.h>
+#include <epan/tap.h>
/* rtp_event_payload_type_value is the value used globally
to set the appropriate payload type
@@ -54,6 +57,7 @@ static guint saved_payload_type_value;
/* RTP Event Fields */
static int proto_rtp_events = -1;
+static int rtp_event_tap = -1;
static int hf_rtp_events_event = -1; /* one byte */
static int hf_rtp_events_end = -1; /* one bit */
@@ -69,12 +73,15 @@ static gint ett_rtp_events = -1;
void
proto_reg_handoff_rtp_events(void);
+static struct _rtp_event_info rtp_event_info;
+
static void
dissect_rtp_events( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
{
proto_item *ti = NULL;
proto_tree *rtp_events_tree = NULL;
unsigned int offset = 0;
+ struct _rtp_conversation_info *p_conv_data = NULL;
guint8 rtp_evt;
guint8 octet;
@@ -91,13 +98,21 @@ dissect_rtp_events( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
rtp_evt = tvb_get_guint8(tvb, offset );
+ /* get tap info */
+ rtp_event_info.info_rtp_evt = rtp_evt;
+
+ p_conv_data = p_get_proto_data(pinfo->fd, proto_get_id_by_filter_name("rtp"));
+ if (p_conv_data)
+ rtp_event_info.info_setup_frame_num = p_conv_data->frame_number;
+ else
+ rtp_event_info.info_setup_frame_num = 0;
+
+
if ( check_col( pinfo->cinfo, COL_INFO) )
{
col_add_fstr( pinfo->cinfo, COL_INFO,
"Payload type=RTP Event, %s",
val_to_str( rtp_evt, rtp_event_type_values, "Unknown (%u)" ));
-
-
}
if ( tree )
@@ -121,6 +136,7 @@ dissect_rtp_events( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
}
}
+ tap_queue_packet(rtp_event_tap, pinfo, &rtp_event_info);
}
@@ -214,6 +230,8 @@ proto_register_rtp_events(void)
"This is the value of the Payload Type field"
"that specifies RTP Events", 10,
&rtp_event_payload_type_value);
+ register_dissector("rtpevent", dissect_rtp_events, proto_rtp_events);
+ rtp_event_tap = register_tap("rtpevent");
}
diff --git a/epan/dissectors/packet-rtp-events.h b/epan/dissectors/packet-rtp-events.h
index 76c972f1d1..4a0f5ed9d7 100644
--- a/epan/dissectors/packet-rtp-events.h
+++ b/epan/dissectors/packet-rtp-events.h
@@ -251,3 +251,8 @@ static const value_string rtp_event_type_values[] =
{ RTP_NEWMWATTTN, "New milliwatt tone (1004 Hz)"},
{ 0, NULL },
};
+
+struct _rtp_event_info {
+ guint8 info_rtp_evt;
+ guint32 info_setup_frame_num; /* the frame num of the packet that set this RTP connection */
+}; \ No newline at end of file
diff --git a/epan/dissectors/packet-rtp.c b/epan/dissectors/packet-rtp.c
index adcfe3390e..9e84d03d3f 100644
--- a/epan/dissectors/packet-rtp.c
+++ b/epan/dissectors/packet-rtp.c
@@ -70,6 +70,7 @@
static dissector_handle_t rtp_handle;
static dissector_handle_t stun_handle;
+static dissector_handle_t rtpevent_handle=NULL;
static int rtp_tap = -1;
@@ -238,7 +239,7 @@ const value_string rtp_payload_type_short_vals[] =
void rtp_add_address(packet_info *pinfo,
address *addr, int port,
int other_port,
- gchar *setup_method, guint32 setup_frame_number)
+ gchar *setup_method, guint32 setup_frame_number, int rtp_event_pt)
{
address null_addr;
conversation_t* p_conv;
@@ -296,6 +297,7 @@ void rtp_add_address(packet_info *pinfo,
strncpy(p_conv_data->method, setup_method, MAX_RTP_SETUP_METHOD_SIZE);
p_conv_data->method[MAX_RTP_SETUP_METHOD_SIZE] = '\0';
p_conv_data->frame_number = setup_frame_number;
+ p_conv_data->rtp_event_pt = rtp_event_pt;
}
static void rtp_init( void )
@@ -368,11 +370,25 @@ dissect_rtp_data( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
unsigned int data_reported_len, unsigned int payload_type )
{
tvbuff_t *newtvb;
+ struct _rtp_conversation_info *p_conv_data = NULL;
newtvb = tvb_new_subset( tvb, offset, data_len, data_reported_len );
- if (!dissector_try_port(rtp_pt_dissector_table, payload_type, newtvb,
- pinfo, tree))
- proto_tree_add_item( rtp_tree, hf_rtp_data, newtvb, 0, -1, FALSE );
+
+ /* if this is part of a conv set by a SDP, we know the payload type for dynamic payloads */
+ p_conv_data = p_get_proto_data(pinfo->fd, proto_rtp);
+ if (p_conv_data && (strcmp(p_conv_data->method, "SDP") == 0) ) {
+ if ( (p_conv_data->rtp_event_pt != 0) && (p_conv_data->rtp_event_pt == (guint32)payload_type) )
+ {
+ call_dissector(rtpevent_handle, newtvb, pinfo, tree);
+ } else
+ {
+ proto_tree_add_item( rtp_tree, hf_rtp_data, newtvb, 0, -1, FALSE );
+ }
+ } else {
+ /* is not part of a conv, use the preference saved value do decode the payload type */
+ if (!dissector_try_port(rtp_pt_dissector_table, payload_type, newtvb, pinfo, tree))
+ proto_tree_add_item( rtp_tree, hf_rtp_data, newtvb, 0, -1, FALSE );
+ }
}
static struct _rtp_info rtp_info;
@@ -715,6 +731,7 @@ static void show_setup_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
p_conv_packet_data = g_mem_chunk_alloc(rtp_conversations);
strcpy(p_conv_packet_data->method, p_conv_data->method);
p_conv_packet_data->frame_number = p_conv_data->frame_number;
+ p_conv_packet_data->rtp_event_pt = p_conv_data->rtp_event_pt;
p_add_proto_data(pinfo->fd, proto_rtp, p_conv_packet_data);
}
}
@@ -1031,6 +1048,7 @@ proto_reg_handoff_rtp(void)
{
data_handle = find_dissector("data");
stun_handle = find_dissector("stun");
+ rtpevent_handle = find_dissector("rtpevent");
/*
* Register this dissector as one that can be selected by a
diff --git a/epan/dissectors/packet-rtp.h b/epan/dissectors/packet-rtp.h
index 2f8e852b3b..bbe9d8017b 100644
--- a/epan/dissectors/packet-rtp.h
+++ b/epan/dissectors/packet-rtp.h
@@ -58,10 +58,13 @@ struct _rtp_conversation_info
{
gchar method[MAX_RTP_SETUP_METHOD_SIZE + 1];
guint32 frame_number;
+ guint32 rtp_event_pt; /* this is payload type for dynamic RTP events (RFC2833) */
};
/* Add an RTP conversation with the given details */
void rtp_add_address(packet_info *pinfo,
address *addr, int port,
int other_port,
- gchar *setup_method, guint32 setup_frame_number);
+ gchar *setup_method,
+ guint32 setup_frame_number,
+ int rtp_event_pt);
diff --git a/epan/dissectors/packet-rtsp.c b/epan/dissectors/packet-rtsp.c
index 9104e798bd..f1b8888a83 100644
--- a/epan/dissectors/packet-rtsp.c
+++ b/epan/dissectors/packet-rtsp.c
@@ -462,7 +462,7 @@ rtsp_create_conversation(packet_info *pinfo, const guchar *line_begin,
if (rtp_transport)
{
rtp_add_address(pinfo, &pinfo->dst, c_data_port, s_data_port,
- "RTSP", pinfo->fd->num);
+ "RTSP", pinfo->fd->num, 0);
if (!c_mon_port)
return;
diff --git a/epan/dissectors/packet-sdp.c b/epan/dissectors/packet-sdp.c
index e31e586536..2e0f64323b 100644
--- a/epan/dissectors/packet-sdp.c
+++ b/epan/dissectors/packet-sdp.c
@@ -170,6 +170,7 @@ typedef struct {
char *media_port[SDP_MAX_RTP_CHANNELS];
char *media_proto[SDP_MAX_RTP_CHANNELS];
gint8 media_count;
+ guint32 rtp_event_pt;
} transport_info_t;
/* static functions */
@@ -189,7 +190,7 @@ static void dissect_sdp_encryption_key(tvbuff_t *tvb, proto_item * ti);
static void dissect_sdp_session_attribute(tvbuff_t *tvb, proto_item *ti);
static void dissect_sdp_media(tvbuff_t *tvb, proto_item *ti,
transport_info_t *transport_info);
-static void dissect_sdp_media_attribute(tvbuff_t *tvb, proto_item *ti);
+static void dissect_sdp_media_attribute(tvbuff_t *tvb, proto_item *ti, transport_info_t *transport_info);
static void
dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
@@ -227,6 +228,7 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
/* Initialise RTP channel info */
transport_info.connection_address=NULL;
transport_info.connection_type=NULL;
+ transport_info.rtp_event_pt=0;
for (n=0; n < SDP_MAX_RTP_CHANNELS; n++)
{
transport_info.media_port[n]=NULL;
@@ -415,7 +417,7 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
src_addr.data=(char *)&ipaddr;
if(rtp_handle){
rtp_add_address(pinfo, &src_addr, port, 0,
- "SDP", pinfo->fd->num);
+ "SDP", pinfo->fd->num, transport_info.rtp_event_pt);
set_rtp = TRUE;
}
if(rtcp_handle){
@@ -473,7 +475,7 @@ call_sdp_subdissector(tvbuff_t *tvb, int hf, proto_tree* ti, transport_info_t *t
} else if ( hf == hf_media ) {
dissect_sdp_media(tvb,ti,transport_info);
} else if ( hf == hf_media_attribute ){
- dissect_sdp_media_attribute(tvb,ti);
+ dissect_sdp_media_attribute(tvb,ti,transport_info);
}
}
@@ -921,9 +923,12 @@ dissect_sdp_media(tvbuff_t *tvb, proto_item *ti,
}
-static void dissect_sdp_media_attribute(tvbuff_t *tvb, proto_item * ti){
+static void dissect_sdp_media_attribute(tvbuff_t *tvb, proto_item * ti, transport_info_t *transport_info){
proto_tree *sdp_media_attribute_tree;
gint offset, next_offset, tokenlen;
+ guint8 *field_name;
+ guint8 *payload_type;
+ guint8 *encoding_name;
offset = 0;
next_offset = 0;
@@ -943,11 +948,44 @@ static void dissect_sdp_media_attribute(tvbuff_t *tvb, proto_item * ti){
hf_media_attribute_field,
tvb, offset, tokenlen, FALSE);
+ field_name = tvb_get_string(tvb, offset, tokenlen);
+
offset = next_offset + 1;
proto_tree_add_item(sdp_media_attribute_tree,
hf_media_attribute_value,
tvb, offset, -1, FALSE);
+ /* decode the rtpmap to see if it is DynamicPayload for RTP-Events RFC2833 to dissect them automatic */
+ if (strcmp(field_name, "rtpmap") == 0) {
+ next_offset = tvb_find_guint8(tvb,offset,-1,' ');
+ g_free(field_name);
+
+ if(next_offset == -1)
+ return;
+
+ tokenlen = next_offset - offset;
+
+ payload_type = tvb_get_string(tvb, offset, tokenlen);
+
+ offset = next_offset + 1;
+
+ next_offset = tvb_find_guint8(tvb,offset,-1,'/');
+
+ if(next_offset == -1){
+ g_free(payload_type);
+ return;
+ }
+
+ tokenlen = next_offset - offset;
+
+ encoding_name = tvb_get_string(tvb, offset, tokenlen);
+
+ if (strcmp(encoding_name, "telephone-event") == 0)
+ transport_info->rtp_event_pt = atol(payload_type);
+
+ g_free(payload_type);
+ g_free(encoding_name);
+ } else g_free(field_name);
}
void
diff --git a/epan/dissectors/packet-skinny.c b/epan/dissectors/packet-skinny.c
index 89cdbc7626..b77f98a644 100644
--- a/epan/dissectors/packet-skinny.c
+++ b/epan/dissectors/packet-skinny.c
@@ -1396,7 +1396,7 @@ static void dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
src_addr.len=4;
src_addr.data=(char *)&ipv4_address;
tvb_memcpy(tvb, (char *)&ipv4_address, offset+16, 4);
- rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+20), 0, "Skinny", pinfo->fd->num);
+ rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+20), 0, "Skinny", pinfo->fd->num, 0);
}
break;
@@ -1777,7 +1777,7 @@ static void dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
src_addr.len=4;
src_addr.data=(char *)&ipv4_address;
tvb_memcpy(tvb, (char *)&ipv4_address, offset+20, 4);
- rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+24), 0, "Skinny", pinfo->fd->num);
+ rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+24), 0, "Skinny", pinfo->fd->num, 0);
}
break;
diff --git a/gtk/voip_calls.c b/gtk/voip_calls.c
index d69443fc12..f80ffd9718 100644
--- a/gtk/voip_calls.c
+++ b/gtk/voip_calls.c
@@ -10,7 +10,7 @@
* Copyright 2004, Iskratel, Ltd, Kranj
* By Miha Jemec <m.jemec@iskratel.si>
*
- * H323, RTP, MGCP and Graph Support
+ * H323, RTP, RTP Event, MGCP and Graph Support
* By Alejandro Vaquero, alejandro.vaquero@verso.com
* Copyright 2005, Verso Technologies Inc.
*
@@ -55,6 +55,7 @@
#include <epan/dissectors/packet-sdp.h>
#include <plugins/mgcp/packet-mgcp.h>
#include <epan/dissectors/packet-rtp.h>
+#include <epan/dissectors/packet-rtp-events.h>
#include "rtp_pt.h"
#include "alert_box.h"
@@ -87,7 +88,7 @@ static voip_calls_tapinfo_t the_tapinfo_struct =
/* the one and only global voip_rtp_tapinfo_t structure */
static voip_rtp_tapinfo_t the_tapinfo_rtp_struct =
- {0, NULL, 0};
+ {0, NULL, 0, 0};
/****************************************************************************/
/* when there is a [re]reading of packet's */
@@ -261,6 +262,88 @@ guint change_call_num_graph(voip_calls_tapinfo_t *tapinfo _U_, guint16 call_num,
return items_changed;
}
+/* XXX just copied from gtk/rpc_stat.c */
+void protect_thread_critical_region(void);
+void unprotect_thread_critical_region(void);
+
+/****************************************************************************/
+/* ***************************TAP for RTP Events*****************************/
+/****************************************************************************/
+
+/****************************************************************************/
+/* whenever a rtp event packet is seen by the tap listener */
+static int
+rtp_event_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *rtp_event_info _U_)
+{
+ const struct _rtp_event_info *pi = rtp_event_info;
+ voip_rtp_tapinfo_t *tapinfo = &the_tapinfo_rtp_struct;
+ voip_rtp_stream_info_t *tmp_listinfo;
+ voip_rtp_stream_info_t *strinfo = NULL;
+ GList* list;
+
+ /* do not consider RTP events packets without a setup frame */
+ if (pi->info_setup_frame_num == 0){
+ return 0;
+ }
+
+ /* check wether we already have a RTP stream with this setup frame in the list */
+ list = g_list_first(tapinfo->list);
+ while (list)
+ {
+ tmp_listinfo=list->data;
+ if ( (tmp_listinfo->setup_frame_number == pi->info_setup_frame_num)
+ && (tmp_listinfo->end_stream == FALSE) && (tmp_listinfo->rtp_event == -1)){
+ strinfo = (voip_rtp_stream_info_t*)(list->data);
+ strinfo->rtp_event = pi->info_rtp_evt;
+ break;
+ }
+ list = g_list_next (list);
+ }
+
+
+ return 0;
+}
+
+/****************************************************************************/
+static gboolean have_rtp_event_tap_listener=FALSE;
+
+void
+rtp_event_init_tap(void)
+{
+ GString *error_string;
+
+
+ if(have_rtp_event_tap_listener==FALSE)
+ {
+ error_string = register_tap_listener("rtpevent", &(the_tapinfo_rtp_struct.rtp_event_dummy),
+ NULL,
+ NULL,
+ rtp_event_packet,
+ NULL
+ );
+
+ if (error_string != NULL) {
+ simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
+ error_string->str);
+ g_string_free(error_string, TRUE);
+ exit(1);
+ }
+ have_rtp_event_tap_listener=TRUE;
+ }
+}
+
+/****************************************************************************/
+
+void
+remove_tap_listener_rtp_event(void)
+{
+ protect_thread_critical_region();
+ remove_tap_listener(&(the_tapinfo_rtp_struct.rtp_event_dummy));
+ unprotect_thread_critical_region();
+
+ have_rtp_event_tap_listener=FALSE;
+}
+
/****************************************************************************/
/* ***************************TAP for RTP **********************************/
/****************************************************************************/
@@ -335,6 +418,7 @@ RTP_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const vo
strinfo->start_rel_sec = pinfo->fd->rel_secs;
strinfo->start_rel_usec = pinfo->fd->rel_usecs;
strinfo->setup_frame_number = pi->info_setup_frame_num;
+ strinfo->rtp_event = -1;
tapinfo->list = g_list_append(tapinfo->list, strinfo);
}
@@ -394,7 +478,7 @@ void RTP_packet_draw(void *prs _U_)
new_gai->port_src = rtp_listinfo->src_port;
new_gai->port_dst = rtp_listinfo->dest_port;
duration = (rtp_listinfo->stop_rel_sec*1000000 + rtp_listinfo->stop_rel_usec) - (rtp_listinfo->start_rel_sec*1000000 + rtp_listinfo->start_rel_usec);
- new_gai->frame_label = g_strdup_printf("RTP (%s)", val_to_str(rtp_listinfo->pt, rtp_payload_type_short_vals, "%u"));
+ new_gai->frame_label = g_strdup_printf("RTP (%s) %s", val_to_str(rtp_listinfo->pt, rtp_payload_type_short_vals, "%u"), (rtp_listinfo->rtp_event == -1)?"":val_to_str(rtp_listinfo->rtp_event, rtp_event_type_values, "Uknown RTP Event"));
new_gai->comment = g_strdup_printf("RTP Num packets:%d Duration:%d.%03ds ssrc:%d", rtp_listinfo->npackets, duration/1000000,(duration%1000000)/1000, rtp_listinfo->ssrc);
new_gai->conv_num = conv_num;
new_gai->display=FALSE;
@@ -440,12 +524,6 @@ rtp_init_tap(void)
}
}
-
-
-/* XXX just copied from gtk/rpc_stat.c */
-void protect_thread_critical_region(void);
-void unprotect_thread_critical_region(void);
-
/****************************************************************************/
void
remove_tap_listener_rtp(void)
@@ -677,7 +755,7 @@ isup_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co
isup_message_type = pi->message_type;
isup_cause_value = pi->cause_value;
isup_cic = pinfo->circuit_id;
-
+ isup_frame_num = pinfo->fd->num;
isup_frame_num = pinfo->fd->num;
return 0;
diff --git a/gtk/voip_calls.h b/gtk/voip_calls.h
index 552e6347d6..837f494adc 100644
--- a/gtk/voip_calls.h
+++ b/gtk/voip_calls.h
@@ -180,6 +180,7 @@ typedef struct _voip_rtp_stream_info {
guint32 start_rel_usec; /* start stream rel microseconds */
guint32 stop_rel_sec; /* stop stream rel seconds */
guint32 stop_rel_usec; /* stop stream rel microseconds */
+ gint32 rtp_event;
} voip_rtp_stream_info_t;
/* structure that holds the information about all RTP streams associated with the calls */
@@ -188,6 +189,7 @@ typedef struct _voip_rtp_tapinfo {
int nstreams; /* number of rtp streams */
GList* list; /* list with the rtp streams */
int rtp_dummy;
+ int rtp_event_dummy;
} voip_rtp_tapinfo_t;
/****************************************************************************/
@@ -208,6 +210,7 @@ void h245dg_calls_init_tap(void);
void q931_calls_init_tap(void);
void sdp_calls_init_tap(void);
void rtp_init_tap(void);
+void rtp_init_tap_event(void);
void mgcp_calls_init_tap(void);
@@ -223,6 +226,7 @@ void remove_tap_listener_h245dg_calls(void);
void remove_tap_listener_q931_calls(void);
void remove_tap_listener_sdp_calls(void);
void remove_tap_listener_rtp(void);
+void remove_tap_listener_rtp_event(void);
void remove_tap_listener_mgcp_calls(void);
/*
diff --git a/gtk/voip_calls_dlg.c b/gtk/voip_calls_dlg.c
index ff3ef95234..00e8319b39 100644
--- a/gtk/voip_calls_dlg.c
+++ b/gtk/voip_calls_dlg.c
@@ -179,6 +179,7 @@ void voip_calls_remove_tap_listener(void)
remove_tap_listener_q931_calls();
remove_tap_listener_sdp_calls();
remove_tap_listener_rtp();
+ remove_tap_listener_rtp_event();
if (find_tap_id("mgcp")) {
remove_tap_listener_mgcp_calls();
}
@@ -729,6 +730,7 @@ voip_calls_init_tap(char *dummy _U_)
q931_calls_init_tap();
sdp_calls_init_tap();
rtp_init_tap();
+ rtp_event_init_tap();
/* We don't register this tap, if we don't have the mgcp plugin loaded.*/
if (find_tap_id("mgcp")) {
mgcp_calls_init_tap();