Ethereal-dev: [Ethereal-dev] RTP Dynamic Payload in SDP sessions
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Alejandro Vaquero <alejandrovaquero@xxxxxxxxx>
Date: Sat, 26 Mar 2005 16:42:03 -0700
Hi All, Find attached a patch for SDP sessions to: - Dissect Dynamic payload types in RTP packets - Add the dynamic payload type description in RTP packets- Add RTP dynamic payload types description in the Voip Calls Graph, in the RTP and SDP.
Regards Alejandro
Index: asn1/h245/h245.cnf
===================================================================
--- asn1/h245/h245.cnf (revision 13743)
+++ asn1/h245/h245.cnf (working copy)
@@ -375,7 +375,7 @@
src_addr.len=4;
src_addr.data=(char *)&ipv4_address;
- rtp_add_address(pinfo, &src_addr, ipv4_port, 0, "H245", pinfo->fd->num, 0);
+ rtp_add_address(pinfo, &src_addr, ipv4_port, 0, "H245", pinfo->fd->num, NULL);
}
if((!pinfo->fd->flags.visited) && rtcp_ipv4_address!=0 && rtcp_ipv4_port!=0 && rtcp_handle){
address src_addr;
@@ -405,7 +405,7 @@
src_addr.len=4;
src_addr.data=(char *)&ipv4_address;
- rtp_add_address(pinfo, &src_addr, ipv4_port, 0, "H245", pinfo->fd->num, 0);
+ rtp_add_address(pinfo, &src_addr, ipv4_port, 0, "H245", pinfo->fd->num, NULL);
}
if((!pinfo->fd->flags.visited) && rtcp_ipv4_address!=0 && rtcp_ipv4_port!=0 && rtcp_handle){
address src_addr;
Index: gtk/voip_calls.c
===================================================================
--- gtk/voip_calls.c (revision 13743)
+++ gtk/voip_calls.c (working copy)
@@ -56,6 +56,7 @@
#include <plugins/mgcp/packet-mgcp.h>
#include <epan/dissectors/packet-rtp.h>
#include <epan/dissectors/packet-rtp-events.h>
+#include <epan/conversation.h>
#include "rtp_pt.h"
#include "alert_box.h"
@@ -376,6 +377,7 @@
voip_rtp_stream_info_t *tmp_listinfo;
voip_rtp_stream_info_t *strinfo = NULL;
GList* list;
+ struct _rtp_conversation_info *p_conv_data = NULL;
const struct _rtp_info *pi = RTPinfo;
@@ -413,6 +415,15 @@
strinfo->ssrc = pi->info_sync_src;
strinfo->end_stream = FALSE;
strinfo->pt = pi->info_payload_type;
+ strinfo->pt_str = NULL;
+ /* if it is dynamic payload, let use the conv data to see if it is defined */
+ if ( (strinfo->pt>95) && (strinfo->pt<128) ) {
+ /* Use existing packet info if available */
+ p_conv_data = p_get_proto_data(pinfo->fd, proto_get_id_by_filter_name("rtp"));
+ if (p_conv_data)
+ strinfo->pt_str = g_strdup(g_hash_table_lookup(p_conv_data->rtp_dyn_payload, &strinfo->pt));
+ }
+ if (!strinfo->pt_str) strinfo->pt_str = g_strdup(val_to_str(strinfo->pt, rtp_payload_type_short_vals, "%u"));
strinfo->npackets = 0;
strinfo->first_frame_num = pinfo->fd->num;
strinfo->start_rel_sec = pinfo->fd->rel_secs;
@@ -478,7 +489,8 @@
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) %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->frame_label = g_strdup_printf("RTP (%s) %s", rtp_listinfo->pt_str, (rtp_listinfo->rtp_event == -1)?"":val_to_str(rtp_listinfo->rtp_event, rtp_event_type_values, "Uknown RTP Event"));
+ g_free(rtp_listinfo->pt_str);
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;
Index: gtk/voip_calls.h
===================================================================
--- gtk/voip_calls.h (revision 13743)
+++ gtk/voip_calls.h (working copy)
@@ -169,7 +169,8 @@
address dest_addr;
guint16 dest_port;
guint32 ssrc;
- guint8 pt;
+ guint32 pt;
+ gchar *pt_str;
guint32 npackets;
gboolean end_stream;
@@ -211,7 +212,6 @@
void sdp_calls_init_tap(void);
void rtp_init_tap(void);
void rtp_event_init_tap(void);
-void rtp_init_tap_event(void);
void mgcp_calls_init_tap(void);
Index: plugins/plugin_api_list.c
===================================================================
--- plugins/plugin_api_list.c (revision 13743)
+++ plugins/plugin_api_list.c (working copy)
@@ -498,7 +498,7 @@
proto_item *proto_tree_add_debug_text(proto_tree *tree, const char *format, ...);
-void rtp_add_address(packet_info *pinfo, address *addr, int port, int other_port, gchar *setup_method, guint32 setup_frame_number, int rtp_event_pt);
+void rtp_add_address(packet_info *pinfo, address *addr, int port, int other_port, gchar *setup_method, guint32 setup_frame_number, GHashTable *rtp_dyn_payload);
void rtcp_add_address(packet_info *pinfo, address *addr, int port, int other_port, gchar *setup_method, guint32 setup_frame_number);
GString *register_tap_listener(char *, void *, char *, tap_reset_cb, tap_packet_cb, tap_draw_cb);
Index: plugins/Xplugin_table.h
===================================================================
--- plugins/Xplugin_table.h (revision 13743)
+++ plugins/Xplugin_table.h (working copy)
@@ -302,7 +302,7 @@
typedef gfloat (*addr_tvb_get_letohieee_float) (tvbuff_t *, gint);
typedef gdouble (*addr_tvb_get_letohieee_double) (tvbuff_t *, gint);
typedef proto_item *(*addr_proto_tree_add_debug_text) (proto_tree *, const char *, ...);
-typedef void (*addr_rtp_add_address) (packet_info *, address *, int, int, gchar *, guint32);
+typedef void (*addr_rtp_add_address) (packet_info *, address *, int, int, gchar *, guint32, GHashTable *);
typedef void (*addr_rtcp_add_address) (packet_info *, address *, int, int, gchar *, guint32);
typedef GString *(*addr_register_tap_listener) (char *, void *, char *, tap_reset_cb, tap_packet_cb, tap_draw_cb);
typedef const char *(*addr_get_datafile_dir) (void);
Index: epan/libethereal.def
===================================================================
--- epan/libethereal.def (revision 13743)
+++ epan/libethereal.def (working copy)
@@ -490,6 +490,7 @@
rpc_roundup
rtcp_add_address
rtp_add_address
+rtp_free_hash_dyn_payload
rtp_payload_type_vals DATA
rtp_payload_type_short_vals DATA
set_actual_length
Index: epan/dissectors/packet-rtsp.c
===================================================================
--- epan/dissectors/packet-rtsp.c (revision 13743)
+++ epan/dissectors/packet-rtsp.c (working copy)
@@ -462,7 +462,7 @@
if (rtp_transport)
{
rtp_add_address(pinfo, &pinfo->dst, c_data_port, s_data_port,
- "RTSP", pinfo->fd->num, 0);
+ "RTSP", pinfo->fd->num, NULL);
if (!c_mon_port)
return;
Index: epan/dissectors/packet-sdp.c
===================================================================
--- epan/dissectors/packet-sdp.c (revision 13743)
+++ epan/dissectors/packet-sdp.c (working copy)
@@ -163,14 +163,17 @@
#define SDP_MAX_RTP_CHANNELS 4
+#define SDP_MAX_RTP_PAYLOAD_TYPES 10
typedef struct {
char *connection_address;
char *connection_type;
char *media_port[SDP_MAX_RTP_CHANNELS];
char *media_proto[SDP_MAX_RTP_CHANNELS];
+ gint32 media_pt[SDP_MAX_RTP_PAYLOAD_TYPES];
gint8 media_count;
- guint32 rtp_event_pt;
+ gint8 media_pt_count;
+ GHashTable *rtp_dyn_payload;
} transport_info_t;
/* static functions */
@@ -228,14 +231,19 @@
/* 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;
transport_info.media_proto[n]=NULL;
}
+ for (n=0; n < SDP_MAX_RTP_PAYLOAD_TYPES; n++)
+ {
+ transport_info.media_pt[n]=-1;
+ }
transport_info.media_count = 0;
+ transport_info.media_pt_count = 0;
+ transport_info.rtp_dyn_payload = g_hash_table_new( g_int_hash, g_int_equal);
/*
* As RFC 2327 says, "SDP is purely a format for session
@@ -417,7 +425,7 @@
src_addr.data=(char *)&ipaddr;
if(rtp_handle){
rtp_add_address(pinfo, &src_addr, port, 0,
- "SDP", pinfo->fd->num, transport_info.rtp_event_pt);
+ "SDP", pinfo->fd->num, transport_info.rtp_dyn_payload);
set_rtp = TRUE;
}
if(rtcp_handle){
@@ -425,7 +433,7 @@
rtcp_add_address(pinfo, &src_addr, port, 0,
"SDP", pinfo->fd->num);
}
- }
+ }
/* Add t38 conversation, if available and only if no rtp */
if((!pinfo->fd->flags.visited) && port!=0 && !set_rtp && is_t38 && is_ipv4_addr){
@@ -450,6 +458,25 @@
proto_tree_add_text(sdp_tree, tvb, offset, datalen,
"Data (%d bytes)", datalen);
}
+
+ /* Create the summary str for the Voip Call analysis */
+ for (n = 0; n < transport_info.media_pt_count; n++)
+ {
+ /* if the payload type is dynamic (96 to 127), check the hash table */
+ if ( (transport_info.media_pt[n] >=96) && (transport_info.media_pt[n] <=127) ) {
+ gchar *str_dyn_pt = g_hash_table_lookup(transport_info.rtp_dyn_payload, &transport_info.media_pt[n]);
+ if (str_dyn_pt)
+ g_snprintf(sdp_pi->summary_str, 50, "%s %s", sdp_pi->summary_str, str_dyn_pt);
+ else
+ g_snprintf(sdp_pi->summary_str, 50, "%s %d", sdp_pi->summary_str, transport_info.media_pt[n]);
+ } else
+ g_snprintf(sdp_pi->summary_str, 50, "%s %s", sdp_pi->summary_str, val_to_str(transport_info.media_pt[n], rtp_payload_type_short_vals, "%u"));
+ }
+
+ /* Free the hash table if we don't use it */
+ if (set_rtp == FALSE)
+ rtp_free_hash_dyn_payload(transport_info.rtp_dyn_payload);
+
/* Report this packet to the tap */
tap_queue_packet(sdp_tap, pinfo, sdp_pi);
}
@@ -900,7 +927,9 @@
media_format = tvb_get_string(tvb, offset, tokenlen);
proto_tree_add_string(sdp_media_tree, hf_media_format, tvb, offset,
tokenlen, val_to_str(atol(media_format), rtp_payload_type_vals, "%u"));
- g_snprintf(sdp_pi->summary_str, 50, "%s %s", sdp_pi->summary_str, val_to_str(atol(media_format), rtp_payload_type_short_vals, "%u"));
+ transport_info->media_pt[transport_info->media_pt_count] = atol(media_format);
+ if (transport_info->media_pt_count < SDP_MAX_RTP_PAYLOAD_TYPES)
+ transport_info->media_pt_count++;
g_free(media_format);
} else {
proto_tree_add_item(sdp_media_tree, hf_media_format, tvb,
@@ -955,8 +984,10 @@
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 */
+ /* decode the rtpmap to see if it is DynamicPayload to dissect them automatic */
if (strcmp(field_name, "rtpmap") == 0) {
+ gint *key;
+
next_offset = tvb_find_guint8(tvb,offset,-1,' ');
g_free(field_name);
@@ -980,11 +1011,11 @@
encoding_name = tvb_get_string(tvb, offset, tokenlen);
- if (strcmp(encoding_name, "telephone-event") == 0)
- transport_info->rtp_event_pt = atol(payload_type);
+ key=g_malloc( sizeof(gint) );
+ *key=atol(payload_type);
+ g_hash_table_insert(transport_info->rtp_dyn_payload, key, encoding_name);
g_free(payload_type);
- g_free(encoding_name);
} else g_free(field_name);
}
Index: epan/dissectors/packet-h245.c
===================================================================
--- epan/dissectors/packet-h245.c (revision 13743)
+++ epan/dissectors/packet-h245.c (working copy)
@@ -9866,7 +9866,7 @@
src_addr.len=4;
src_addr.data=(char *)&ipv4_address;
- rtp_add_address(pinfo, &src_addr, ipv4_port, 0, "H245", pinfo->fd->num, 0);
+ rtp_add_address(pinfo, &src_addr, ipv4_port, 0, "H245", pinfo->fd->num, NULL);
}
if((!pinfo->fd->flags.visited) && rtcp_ipv4_address!=0 && rtcp_ipv4_port!=0 && rtcp_handle){
address src_addr;
@@ -12539,7 +12539,7 @@
src_addr.len=4;
src_addr.data=(char *)&ipv4_address;
- rtp_add_address(pinfo, &src_addr, ipv4_port, 0, "H245", pinfo->fd->num, 0);
+ rtp_add_address(pinfo, &src_addr, ipv4_port, 0, "H245", pinfo->fd->num, NULL);
}
if((!pinfo->fd->flags.visited) && rtcp_ipv4_address!=0 && rtcp_ipv4_port!=0 && rtcp_handle){
address src_addr;
Index: epan/dissectors/packet-rtp-events.c
===================================================================
--- epan/dissectors/packet-rtp-events.c (revision 13743)
+++ epan/dissectors/packet-rtp-events.c (working copy)
@@ -253,6 +253,6 @@
saved_payload_type_value = rtp_event_payload_type_value;
/* rtp_event_payload_type_value is set from preferences */
- dissector_add("rtp.pt", saved_payload_type_value, rtp_events_handle);
-
+ dissector_add("rtp.pt", saved_payload_type_value, rtp_events_handle);
+ dissector_add_string("rtp_dyn_payload_type", "telephone-event", rtp_events_handle);
}
Index: epan/dissectors/packet-skinny.c
===================================================================
--- epan/dissectors/packet-skinny.c (revision 13743)
+++ epan/dissectors/packet-skinny.c (working copy)
@@ -1396,7 +1396,7 @@
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, 0);
+ rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+20), 0, "Skinny", pinfo->fd->num, NULL);
}
break;
@@ -1777,7 +1777,7 @@
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, 0);
+ rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+24), 0, "Skinny", pinfo->fd->num, 0, NULL);
}
break;
Index: epan/dissectors/packet-rtp.c
===================================================================
--- epan/dissectors/packet-rtp.c (revision 13743)
+++ epan/dissectors/packet-rtp.c (working copy)
@@ -70,11 +70,11 @@
static dissector_handle_t rtp_handle;
static dissector_handle_t stun_handle;
-static dissector_handle_t rtpevent_handle=NULL;
static int rtp_tap = -1;
static dissector_table_t rtp_pt_dissector_table;
+static dissector_table_t rtp_dyn_pt_dissector_table;
/* RTP header fields */
static int proto_rtp = -1;
@@ -126,6 +126,7 @@
static void dissect_rtp( tvbuff_t *tvb, packet_info *pinfo,
proto_tree *tree );
static void show_setup_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+static void get_conv_info(tvbuff_t *tvb, packet_info *pinfo);
/* Preferences bool to control whether or not setup info should be shown */
static gboolean global_rtp_show_setup_info = TRUE;
@@ -235,11 +236,27 @@
{ 0, NULL },
};
+static void
+free_hash_item( gpointer key _U_ , gpointer value, gpointer user_data _U_ )
+{
+ g_free(value);
+ g_free(key);
+}
+
+void
+rtp_free_hash_dyn_payload(GHashTable *rtp_dyn_payload)
+{
+ if (rtp_dyn_payload == NULL) return;
+ g_hash_table_foreach(rtp_dyn_payload, (GHFunc)free_hash_item, NULL);
+ g_hash_table_destroy(rtp_dyn_payload);
+ rtp_dyn_payload = NULL;
+}
+
/* Set up an RTP conversation */
void rtp_add_address(packet_info *pinfo,
address *addr, int port,
int other_port,
- gchar *setup_method, guint32 setup_frame_number, int rtp_event_pt)
+ gchar *setup_method, guint32 setup_frame_number, GHashTable *rtp_dyn_payload)
{
address null_addr;
conversation_t* p_conv;
@@ -287,6 +304,7 @@
if ( ! p_conv_data ) {
/* Create conversation data */
p_conv_data = g_mem_chunk_alloc(rtp_conversations);
+ p_conv_data->rtp_dyn_payload = NULL;
conversation_add_proto_data(p_conv, proto_rtp, p_conv_data);
}
@@ -294,10 +312,13 @@
/*
* Update the conversation data.
*/
+ /* Free the hash if already exists */
+ rtp_free_hash_dyn_payload(p_conv_data->rtp_dyn_payload);
+
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;
+ p_conv_data->rtp_dyn_payload = rtp_dyn_payload;
}
static void rtp_init( void )
@@ -370,25 +391,26 @@
unsigned int data_reported_len, unsigned int payload_type )
{
tvbuff_t *newtvb;
+ gboolean found_match = FALSE;
struct _rtp_conversation_info *p_conv_data = NULL;
newtvb = tvb_new_subset( tvb, offset, data_len, data_reported_len );
- /* 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 );
+ /* if the payload type is dynamic (96 to 127), we check if the conv is set and we look for the pt definition */
+ if ( (payload_type >=96) && (payload_type <=127) ) {
+ p_conv_data = p_get_proto_data(pinfo->fd, proto_rtp);
+ if (p_conv_data && p_conv_data->rtp_dyn_payload) {
+ gchar *payload_type_str = NULL;
+ payload_type_str = g_hash_table_lookup(p_conv_data->rtp_dyn_payload, &payload_type);
+ if (payload_type_str)
+ found_match = dissector_try_string(rtp_dyn_pt_dissector_table,
+ payload_type_str, newtvb, pinfo, tree);
}
- } else {
- /* is not part of a conv, use the preference saved value do decode the payload type */
+ }
+ /* if we don't found, it is static OR could be set static from the preferences */
+ if (found_match == FALSE)
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;
@@ -406,6 +428,7 @@
unsigned int csrc_count;
gboolean marker_set;
unsigned int payload_type;
+ gchar *payload_type_str = NULL;
unsigned int i = 0;
unsigned int hdr_extension= 0;
unsigned int padding_count;
@@ -416,7 +439,9 @@
guint32 timestamp;
guint32 sync_src;
guint32 csrc_item;
+ struct _rtp_conversation_info *p_conv_data = NULL;
+
/* Get the fields in the first octet */
octet1 = tvb_get_guint8( tvb, offset );
version = RTP_VERSION( octet1 );
@@ -515,21 +540,34 @@
rtp_info.info_data = NULL;
}
+ /* Look for conv and add to the frame if found */
+ get_conv_info(tvb, pinfo);
+
if ( check_col( pinfo->cinfo, COL_PROTOCOL ) ) {
col_set_str( pinfo->cinfo, COL_PROTOCOL, "RTP" );
}
+ /* if it is dynamic payload, let use the conv data to see if it is defined */
+ if ( (payload_type>95) && (payload_type<128) ) {
+ /* Use existing packet info if available */
+ p_conv_data = p_get_proto_data(pinfo->fd, proto_rtp);
+ if (p_conv_data)
+ payload_type_str = g_hash_table_lookup(p_conv_data->rtp_dyn_payload, &payload_type);
+ }
+
if ( check_col( pinfo->cinfo, COL_INFO) ) {
col_add_fstr( pinfo->cinfo, COL_INFO,
"Payload type=%s, SSRC=%u, Seq=%u, Time=%u%s",
- val_to_str( payload_type, rtp_payload_type_vals,
- "Unknown (%u)" ),
+ payload_type_str ? payload_type_str : val_to_str( payload_type, rtp_payload_type_vals,"Unknown (%u)" ),
sync_src,
seq_num,
timestamp,
marker_set ? ", Mark" : "");
}
+
+
if ( tree ) {
+ proto_tree *item;
/* Create RTP protocol tree */
ti = proto_tree_add_item(tree, proto_rtp, tvb, offset, -1, FALSE );
rtp_tree = proto_item_add_subtree(ti, ett_rtp );
@@ -552,8 +590,12 @@
proto_tree_add_boolean( rtp_tree, hf_rtp_marker, tvb, offset,
1, octet2 );
- proto_tree_add_uint( rtp_tree, hf_rtp_payload_type, tvb,
- offset, 1, octet2 );
+
+ item = proto_tree_add_uint_format( rtp_tree, hf_rtp_payload_type, tvb,
+ offset, 1, octet2, "Payload type: %s (%u)",
+ payload_type_str ? payload_type_str : val_to_str( payload_type, rtp_payload_type_vals,"Unknown"),
+ payload_type);
+
offset++;
/* Sequence number 16 bits (2 octets) */
@@ -568,7 +610,6 @@
proto_tree_add_uint( rtp_tree, hf_rtp_ssrc, tvb, offset, 4, sync_src );
offset += 4;
} else {
- show_setup_info(tvb, pinfo, NULL);
offset += 12;
}
/* CSRC list*/
@@ -703,9 +744,8 @@
tap_queue_packet(rtp_tap, pinfo, &rtp_info);
}
-
-/* Look for conversation info and display any setup info found */
-static void show_setup_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+/* Look for conversation info */
+static void get_conv_info(tvbuff_t *tvb, packet_info *pinfo)
{
/* Conversation and current data */
conversation_t *p_conv = NULL;
@@ -731,34 +771,45 @@
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_conv_packet_data->rtp_dyn_payload = p_conv_data->rtp_dyn_payload;
p_add_proto_data(pinfo->fd, proto_rtp, p_conv_packet_data);
}
}
}
+ if (p_conv_data) rtp_info.info_setup_frame_num = p_conv_data->frame_number;
+}
+
+/* Display setup info */
+static void show_setup_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ /* Conversation and current data */
+ struct _rtp_conversation_info *p_conv_data = NULL;
+ proto_tree *rtp_setup_tree;
+ proto_item *ti;
+
+ /* Use existing packet info if available */
+ p_conv_data = p_get_proto_data(pinfo->fd, proto_rtp);
+
+ if (!p_conv_data) return;
+
/* Create setup info subtree with summary info. */
- if (p_conv_data)
- {
- proto_tree *rtp_setup_tree;
- proto_item *ti = proto_tree_add_string_format(tree, hf_rtp_setup, tvb, 0, 0,
+ ti = proto_tree_add_string_format(tree, hf_rtp_setup, tvb, 0, 0,
"",
"Stream setup by %s (frame %d)",
p_conv_data->method,
p_conv_data->frame_number);
- PROTO_ITEM_SET_GENERATED(ti);
- rtp_setup_tree = proto_item_add_subtree(ti, ett_rtp_setup);
- if (rtp_setup_tree)
- {
- /* Add details into subtree */
- proto_item* item = proto_tree_add_uint(rtp_setup_tree, hf_rtp_setup_frame,
- tvb, 0, 0, p_conv_data->frame_number);
- PROTO_ITEM_SET_GENERATED(item);
- item = proto_tree_add_string(rtp_setup_tree, hf_rtp_setup_method,
- tvb, 0, 0, p_conv_data->method);
- PROTO_ITEM_SET_GENERATED(item);
- }
- rtp_info.info_setup_frame_num = p_conv_data->frame_number;
+ PROTO_ITEM_SET_GENERATED(ti);
+ rtp_setup_tree = proto_item_add_subtree(ti, ett_rtp_setup);
+ if (rtp_setup_tree)
+ {
+ /* Add details into subtree */
+ proto_item* item = proto_tree_add_uint(rtp_setup_tree, hf_rtp_setup_frame,
+ tvb, 0, 0, p_conv_data->frame_number);
+ PROTO_ITEM_SET_GENERATED(item);
+ item = proto_tree_add_string(rtp_setup_tree, hf_rtp_setup_method,
+ tvb, 0, 0, p_conv_data->method);
+ PROTO_ITEM_SET_GENERATED(item);
}
}
@@ -835,7 +886,7 @@
"rtp.p_type",
FT_UINT8,
BASE_DEC,
- VALS(rtp_payload_type_vals),
+ "",
0x7F,
"", HFILL
}
@@ -1016,11 +1067,15 @@
proto_register_subtree_array(ett, array_length(ett));
register_dissector("rtp", dissect_rtp, proto_rtp);
+
rtp_tap = register_tap("rtp");
rtp_pt_dissector_table = register_dissector_table("rtp.pt",
"RTP payload type", FT_UINT8, BASE_DEC);
+ rtp_dyn_pt_dissector_table = register_dissector_table("rtp_dyn_payload_type",
+ "Dynamic RTP payload type", FT_STRING, BASE_NONE);
+
rtp_module = prefs_register_protocol(proto_rtp, NULL);
prefs_register_bool_preference(rtp_module, "show_setup_info",
@@ -1048,7 +1103,6 @@
{
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
Index: epan/dissectors/packet-rtp.h
===================================================================
--- epan/dissectors/packet-rtp.h (revision 13743)
+++ epan/dissectors/packet-rtp.h (working copy)
@@ -58,7 +58,7 @@
{
gchar method[MAX_RTP_SETUP_METHOD_SIZE + 1];
guint32 frame_number;
- guint32 rtp_event_pt; /* this is payload type for dynamic RTP events (RFC2833) */
+ GHashTable *rtp_dyn_payload; /* a hash table with the dynamic RTP payload */
};
/* Add an RTP conversation with the given details */
@@ -67,4 +67,8 @@
int other_port,
gchar *setup_method,
guint32 setup_frame_number,
- int rtp_event_pt);
+ GHashTable *rtp_dyn_payload);
+
+/* Free and destroy the dyn_payload hash table */
+void rtp_free_hash_dyn_payload(GHashTable *rtp_dyn_payload);
+
- Prev by Date: [Ethereal-dev] Buildbot crash output
- Next by Date: Re: [Ethereal-dev] pcap: file has %u-byte packet, bigger than maximumof %u - On mac OS X
- Previous by thread: Re: [Ethereal-dev] Re: [Ethereal-cvs] rev 13924: /trunk/epan/dissectors/: packet-sctp.c
- Next by thread: [Ethereal-dev] CRITICAL: Ethereal 0.10.10 Locks up Windows XP Solid!
- Index(es):