From Alejandro Vaquero:

a patch for the VoipCalls to fix a couple of issues:
- a problem with the RTP Events (RFC2833) not been handle correctly
- Display the RTP stream in time order when the setup frame is after the 
RTP stream.
- fix a init issue that caused the H245 packet to not been displayed 
correctly.

svn path=/trunk/; revision=17383
This commit is contained in:
Anders Broman 2006-02-23 20:02:23 +00:00
parent 48551d9d85
commit 1fd7fbdb1d
4 changed files with 49 additions and 40 deletions

View File

@ -115,27 +115,33 @@ dissect_rtp_events( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
val_to_str( rtp_evt, rtp_event_type_values, "Unknown (%u)" ));
}
if ( tree )
{
ti = proto_tree_add_item( tree, proto_rtp_events, tvb, offset, -1, FALSE );
rtp_events_tree = proto_item_add_subtree( ti, ett_rtp_events );
ti = proto_tree_add_item( tree, proto_rtp_events, tvb, offset, -1, FALSE );
rtp_events_tree = proto_item_add_subtree( ti, ett_rtp_events );
proto_tree_add_uint ( rtp_events_tree, hf_rtp_events_event, tvb, offset, 1, rtp_evt);
proto_tree_add_uint ( rtp_events_tree, hf_rtp_events_event, tvb, offset, 1, rtp_evt);
octet = tvb_get_guint8(tvb, offset +1 );
proto_tree_add_boolean (rtp_events_tree, hf_rtp_events_end, tvb, offset+1, 1, octet);
proto_tree_add_boolean (rtp_events_tree, hf_rtp_events_reserved, tvb, offset+1, 1, octet);
proto_tree_add_uint ( rtp_events_tree, hf_rtp_events_volume, tvb, offset+1, 1, octet);
octet = tvb_get_guint8(tvb, offset +1 );
proto_tree_add_boolean (rtp_events_tree, hf_rtp_events_end, tvb, offset+1, 1, octet);
proto_tree_add_boolean (rtp_events_tree, hf_rtp_events_reserved, tvb, offset+1, 1, octet);
proto_tree_add_uint ( rtp_events_tree, hf_rtp_events_volume, tvb, offset+1, 1, octet);
proto_tree_add_item ( rtp_events_tree, hf_rtp_events_duration, tvb, offset+2, 2, FALSE);
proto_tree_add_item ( rtp_events_tree, hf_rtp_events_duration, tvb, offset+2, 2, FALSE);
/* Make end-of-event packets obvious in the info column */
if ((octet & 0x80) && check_col(pinfo->cinfo, COL_INFO))
{
col_append_str(pinfo->cinfo, COL_INFO, " (end)");
}
/* set the end info for the tap */
if (octet & 0x80)
{
rtp_event_info.info_end = TRUE;
} else
{
rtp_event_info.info_end = FALSE;
}
/* Make end-of-event packets obvious in the info column */
if ((octet & 0x80) && check_col(pinfo->cinfo, COL_INFO))
{
col_append_str(pinfo->cinfo, COL_INFO, " (end)");
}
}
tap_queue_packet(rtp_event_tap, pinfo, &rtp_event_info);
}

View File

@ -255,5 +255,6 @@ static const value_string rtp_event_type_values[] =
struct _rtp_event_info {
guint8 info_rtp_evt;
guint32 info_setup_frame_num; /* the frame num of the packet that set this RTP connection */
gboolean info_end;
};

View File

@ -975,8 +975,6 @@ static void dialog_graph_draw(graph_analysis_data_t* user_data)
#else
pango_layout_set_text(big_layout, label_string, -1);
pango_layout_get_pixel_size(big_layout, &label_width, &label_height);
label_width = label_height = 0;
#endif
if (start_arrow<end_arrow){
arrow_width = end_arrow-start_arrow;

View File

@ -376,36 +376,26 @@ void insert_to_graph(voip_calls_tapinfo_t *tapinfo _U_, packet_info *pinfo, cons
/* ***************************TAP for RTP Events*****************************/
/****************************************************************************/
static guint32 rtp_evt_frame_num = 0;
static guint8 rtp_evt = 0;
static gboolean rtp_evt_end = FALSE;
/*static guint32 rtp_evt_setup_frame_num = 0;*/
/****************************************************************************/
/* whenever a rtp event packet is seen by the tap listener */
static int
rtp_event_packet(void *ptr _U_, packet_info *pinfo _U_, epan_dissect_t *edt _U_, const void *rtp_event_info)
{
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);
}
rtp_evt_frame_num = pinfo->fd->num;
rtp_evt = pi->info_rtp_evt;
rtp_evt_end = pi->info_end;
return 0;
}
@ -500,9 +490,9 @@ RTP_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const vo
&& (tmp_listinfo->ssrc == pi->info_sync_src) && (tmp_listinfo->end_stream == FALSE)){
/* if the payload type has changed, we mark the stream as finished to create a new one
this is to show multiple payload changes in the Graph for example for DTMF RFC2833 */
if ( tmp_listinfo->pt != pi->info_payload_type )
if ( tmp_listinfo->pt != pi->info_payload_type ) {
tmp_listinfo->end_stream = TRUE;
else {
} else {
strinfo = (voip_rtp_stream_info_t*)(list->data);
break;
}
@ -510,6 +500,11 @@ RTP_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const vo
list = g_list_next (list);
}
/* if this is a duplicated RTP Event End, just return */
if ((rtp_evt_frame_num == pinfo->fd->num) && !strinfo && (rtp_evt_end == TRUE)) {
return 0;
}
/* not in the list? then create a new entry */
if (strinfo==NULL){
strinfo = g_malloc(sizeof(voip_rtp_stream_info_t));
@ -543,6 +538,14 @@ RTP_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const vo
strinfo->npackets++;
strinfo->stop_rel_sec = pinfo->fd->rel_ts.secs;
strinfo->stop_rel_usec = pinfo->fd->rel_ts.nsecs/1000;
/* process RTP Event */
if (rtp_evt_frame_num == pinfo->fd->num) {
strinfo->rtp_event = rtp_evt;
if (rtp_evt_end == TRUE) {
strinfo->end_stream = TRUE;
}
}
}
the_tapinfo_struct.redraw = TRUE;
@ -572,13 +575,15 @@ static void RTP_packet_draw(void *prs _U_)
/* using the setup frame number of the RTP stream, we get the call number that it belongs */
voip_calls_graph_list = g_list_first(the_tapinfo_struct.graph_analysis->list);
item = 0;
while (voip_calls_graph_list)
{
gai = voip_calls_graph_list->data;
conv_num = gai->conv_num;
/* if we get the setup frame number, then get the time position to graph the RTP arrow */
if (rtp_listinfo->setup_frame_number == gai->frame_num){
/* look again from the begining because there are cases where the Setup frame is after the RTP */
voip_calls_graph_list = g_list_first(the_tapinfo_struct.graph_analysis->list);
item = 0;
while(voip_calls_graph_list){
gai = voip_calls_graph_list->data;
/* if RTP was already in the Graph, just update the comment information */
@ -613,7 +618,6 @@ static void RTP_packet_draw(void *prs _U_)
break;
}
voip_calls_graph_list = g_list_next(voip_calls_graph_list);
item++;
}
rtp_streams_list = g_list_next(rtp_streams_list);
}