2005-02-01 12:12:35 +00:00
/* voip_calls.c
2006-05-22 07:29:40 +00:00
* VoIP calls summary addition for Wireshark
2005-02-01 12:12:35 +00:00
*
* $ Id $
*
* Copyright 2004 , Ericsson , Spain
* By Francisco Alcoba < francisco . alcoba @ ericsson . com >
*
* based on h323_calls . c
* Copyright 2004 , Iskratel , Ltd , Kranj
* By Miha Jemec < m . jemec @ iskratel . si >
2008-08-05 17:33:14 +00:00
*
2006-01-15 15:01:14 +00:00
* H323 , RTP , RTP Event , MGCP , AudioCodes ( ISDN PRI and CAS ) , T38 and Graph Support
2005-02-01 12:12:35 +00:00
* By Alejandro Vaquero , alejandro . vaquero @ verso . com
* Copyright 2005 , Verso Technologies Inc .
*
2006-05-21 05:12:17 +00:00
* Wireshark - Network traffic analyzer
* By Gerald Combs < gerald @ wireshark . org >
2005-02-01 12:12:35 +00:00
* Copyright 1998 Gerald Combs
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
2012-06-28 22:56:06 +00:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA .
2005-02-01 12:12:35 +00:00
*/
2012-09-20 01:48:30 +00:00
# include "config.h"
2005-02-14 22:06:22 +00:00
# include <string.h>
2008-04-13 03:32:24 +00:00
# include <epan/epan.h>
# include <epan/packet.h>
2005-02-01 12:12:35 +00:00
# include <epan/tap.h>
2007-10-24 08:30:46 +00:00
# include <epan/tap-voip.h>
2005-02-01 12:12:35 +00:00
# include <epan/dissectors/packet-sip.h>
# include <epan/dissectors/packet-mtp3.h>
# include <epan/dissectors/packet-isup.h>
# include <epan/dissectors/packet-h225.h>
# include <epan/dissectors/packet-h245.h>
# include <epan/dissectors/packet-q931.h>
# include <epan/dissectors/packet-sdp.h>
2007-10-15 22:20:53 +00:00
# include <epan/dissectors/packet-mgcp.h>
2005-06-27 06:20:23 +00:00
# include <epan/dissectors/packet-actrace.h>
2005-02-01 12:12:35 +00:00
# include <epan/dissectors/packet-rtp.h>
2005-03-10 19:32:22 +00:00
# include <epan/dissectors/packet-rtp-events.h>
2006-01-15 15:01:14 +00:00
# include <epan/dissectors/packet-t38.h>
2007-05-04 07:10:15 +00:00
# include <epan/dissectors/packet-t30.h>
2007-03-18 22:14:12 +00:00
# include <epan/dissectors/packet-h248.h>
2007-03-21 00:59:00 +00:00
# include <epan/dissectors/packet-sccp.h>
2007-09-10 07:21:27 +00:00
# include <plugins/unistim/packet-unistim.h>
2009-01-30 21:25:52 +00:00
# include <epan/dissectors/packet-skinny.h>
2009-03-11 06:43:46 +00:00
# include <epan/dissectors/packet-iax2.h>
2005-09-17 00:02:31 +00:00
# include <epan/rtp_pt.h>
2005-02-01 12:12:35 +00:00
2012-01-16 01:07:52 +00:00
# include "ui/alert_box.h"
# include "ui/simple_dialog.h"
# include "ui/ui_util.h"
2008-04-13 03:32:24 +00:00
2012-01-15 21:59:11 +00:00
# include "ui/gtk/graph_analysis.h"
# include "ui/gtk/voip_calls.h"
# include "ui/gtk/voip_calls_dlg.h"
# include "ui/gtk/main.h"
2005-02-01 12:12:35 +00:00
2006-09-21 17:39:17 +00:00
# ifdef HAVE_LIBPORTAUDIO
2012-01-15 21:59:11 +00:00
# include "ui/gtk/rtp_player.h"
2006-10-20 20:05:27 +00:00
# endif /* HAVE_LIBPORTAUDIO */
2006-09-21 17:39:17 +00:00
2008-04-13 03:32:24 +00:00
2007-03-21 00:59:00 +00:00
const char * voip_call_state_name [ 8 ] = {
" " ,
2005-02-01 12:12:35 +00:00
" CALL SETUP " ,
2005-02-20 15:53:11 +00:00
" RINGING " ,
2005-02-01 12:12:35 +00:00
" IN CALL " ,
" CANCELLED " ,
" COMPLETED " ,
" REJECTED " ,
" UNKNOWN "
2008-12-19 11:30:50 +00:00
} ;
2005-02-01 12:12:35 +00:00
/* defines whether we can consider the call active */
2007-03-18 22:14:12 +00:00
const char * voip_protocol_name [ ] = {
2005-02-01 12:12:35 +00:00
" SIP " ,
" ISUP " ,
2006-10-20 18:41:40 +00:00
" H.323 " ,
2005-06-27 06:20:23 +00:00
" MGCP " ,
" AC_ISDN " ,
2006-01-15 15:01:14 +00:00
" AC_CAS " ,
2007-03-18 22:14:12 +00:00
" T.38 " ,
2007-03-21 00:59:00 +00:00
" H.248 " ,
" SCCP " ,
" BSSMAP " ,
2007-09-10 07:21:27 +00:00
" RANAP " ,
2007-10-24 08:30:46 +00:00
" UNISTIM " ,
2009-01-30 21:25:52 +00:00
" SKINNY " ,
2009-03-11 06:43:46 +00:00
" IAX2 " ,
2007-10-24 08:30:46 +00:00
" VoIP "
2007-03-18 22:14:12 +00:00
} ;
2005-02-01 12:12:35 +00:00
2005-04-14 00:26:11 +00:00
typedef struct {
2005-08-06 10:30:21 +00:00
gchar * frame_label ;
gchar * comment ;
2005-04-14 00:26:11 +00:00
} graph_str ;
# define H245_MAX 6
typedef struct {
guint32 frame_num ;
gint8 labels_count ;
graph_str labels [ H245_MAX ] ;
} h245_labels_t ;
2005-02-01 12:12:35 +00:00
2005-05-05 11:07:22 +00:00
static h245_labels_t h245_labels ;
2005-02-01 12:12:35 +00:00
2011-09-13 05:29:56 +00:00
/* defines a RTP stream */
typedef struct _voip_rtp_stream_info {
address src_addr ;
guint16 src_port ;
address dest_addr ;
guint16 dest_port ;
guint32 ssrc ;
guint32 pt ;
gchar * pt_str ;
2012-03-14 17:26:49 +00:00
gboolean is_srtp ;
2011-09-13 05:29:56 +00:00
guint32 npackets ;
gboolean end_stream ;
guint32 setup_frame_number ; /* frame number of setup message */
/* The frame_data struct holds the frame number and timing information needed. */
2012-03-14 17:26:49 +00:00
frame_data * start_fd ;
2011-09-13 05:29:56 +00:00
frame_data * stop_fd ;
gint32 rtp_event ;
} voip_rtp_stream_info_t ;
2005-02-01 12:12:35 +00:00
/****************************************************************************/
/* the one and only global voip_calls_tapinfo_t structure */
static voip_calls_tapinfo_t the_tapinfo_struct =
2012-02-06 17:23:04 +00:00
{ 0 , NULL , { 0 } , 0 , NULL , 0 , 0 , 0 , 0 , NULL , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ;
2005-02-01 12:12:35 +00:00
2005-02-05 11:07:21 +00:00
/* the one and only global voip_rtp_tapinfo_t structure */
static voip_rtp_tapinfo_t the_tapinfo_rtp_struct =
2005-03-10 19:32:22 +00:00
{ 0 , NULL , 0 , 0 } ;
2005-02-01 12:12:35 +00:00
/****************************************************************************/
/* when there is a [re]reading of packet's */
void voip_calls_reset ( voip_calls_tapinfo_t * tapinfo )
{
2008-01-09 08:34:58 +00:00
voip_calls_info_t * callsinfo ;
2008-01-13 04:24:24 +00:00
voip_rtp_tapinfo_t * rtp_tapinfo = & the_tapinfo_rtp_struct ;
voip_rtp_stream_info_t * strinfo ;
2005-02-01 12:12:35 +00:00
graph_analysis_item_t * graph_item ;
2008-12-19 11:30:50 +00:00
GList * list ;
2005-02-01 12:12:35 +00:00
2006-09-10 18:03:22 +00:00
# ifdef HAVE_LIBPORTAUDIO
2006-10-20 20:05:27 +00:00
/* reset the RTP player */
2006-08-30 21:51:31 +00:00
reset_rtp_player ( ) ;
# endif
2005-02-01 12:12:35 +00:00
/* free the data items first */
2008-01-09 08:34:58 +00:00
list = g_list_first ( tapinfo - > callsinfo_list ) ;
2005-02-01 12:12:35 +00:00
while ( list )
{
2013-03-21 02:29:09 +00:00
callsinfo = ( voip_calls_info_t * ) list - > data ;
2009-03-13 22:06:48 +00:00
g_free ( callsinfo - > call_id ) ;
2008-01-09 08:34:58 +00:00
g_free ( callsinfo - > from_identity ) ;
g_free ( callsinfo - > to_identity ) ;
g_free ( ( void * ) ( callsinfo - > initial_speaker . data ) ) ;
2009-03-13 22:06:48 +00:00
g_free ( callsinfo - > protocol_name ) ;
g_free ( callsinfo - > call_comment ) ;
2008-08-05 17:33:14 +00:00
2008-01-09 08:34:58 +00:00
if ( callsinfo - > free_prot_info & & callsinfo - > prot_info )
callsinfo - > free_prot_info ( callsinfo - > prot_info ) ;
2005-02-01 12:12:35 +00:00
g_free ( list - > data ) ;
list = g_list_next ( list ) ;
}
2008-01-09 08:34:58 +00:00
g_list_free ( tapinfo - > callsinfo_list ) ;
2012-02-06 17:23:04 +00:00
/* free the SIP_HASH */
if ( NULL ! = tapinfo - > callsinfo_hashtable [ SIP_HASH ] )
g_hash_table_remove_all ( tapinfo - > callsinfo_hashtable [ SIP_HASH ] ) ;
2008-01-09 08:34:58 +00:00
tapinfo - > callsinfo_list = NULL ;
2005-02-01 12:12:35 +00:00
tapinfo - > ncalls = 0 ;
tapinfo - > npackets = 0 ;
tapinfo - > start_packets = 0 ;
2006-10-20 18:41:40 +00:00
tapinfo - > completed_calls = 0 ;
tapinfo - > rejected_calls = 0 ;
2012-02-06 17:23:04 +00:00
tapinfo - > reversed = 0 ;
2005-02-01 12:12:35 +00:00
/* free the graph data items first */
2012-02-06 17:23:04 +00:00
if ( NULL ! = tapinfo - > graph_analysis - > ht )
g_hash_table_remove_all ( tapinfo - > graph_analysis - > ht ) ;
2005-02-01 12:12:35 +00:00
list = g_list_first ( tapinfo - > graph_analysis - > list ) ;
while ( list )
{
2013-03-21 02:29:09 +00:00
graph_item = ( graph_analysis_item_t * ) list - > data ;
2005-02-01 12:12:35 +00:00
g_free ( graph_item - > frame_label ) ;
g_free ( graph_item - > comment ) ;
2005-10-03 05:55:26 +00:00
g_free ( ( void * ) graph_item - > src_addr . data ) ;
g_free ( ( void * ) graph_item - > dst_addr . data ) ;
2005-02-01 12:12:35 +00:00
g_free ( list - > data ) ;
list = g_list_next ( list ) ;
}
g_list_free ( tapinfo - > graph_analysis - > list ) ;
tapinfo - > graph_analysis - > nconv = 0 ;
tapinfo - > graph_analysis - > list = NULL ;
+ + ( tapinfo - > launch_count ) ;
2008-01-13 04:24:24 +00:00
/* free the strinfo data items first */
list = g_list_first ( rtp_tapinfo - > list ) ;
while ( list )
{
2013-03-21 02:29:09 +00:00
strinfo = ( voip_rtp_stream_info_t * ) list - > data ;
2008-01-13 04:24:24 +00:00
g_free ( strinfo - > pt_str ) ;
list = g_list_next ( list ) ;
}
g_list_free ( rtp_tapinfo - > list ) ;
rtp_tapinfo - > list = NULL ;
2005-02-01 12:12:35 +00:00
return ;
}
/****************************************************************************/
2012-04-04 16:55:14 +00:00
void graph_analysis_data_init ( void ) {
2013-03-21 02:29:09 +00:00
the_tapinfo_struct . graph_analysis = ( graph_analysis_info_t * ) g_malloc ( sizeof ( graph_analysis_info_t ) ) ;
2005-02-01 12:12:35 +00:00
the_tapinfo_struct . graph_analysis - > nconv = 0 ;
the_tapinfo_struct . graph_analysis - > list = NULL ;
2012-02-06 17:23:04 +00:00
the_tapinfo_struct . graph_analysis - > ht = g_hash_table_new ( g_int_hash , g_int_equal ) ;
2005-02-01 12:12:35 +00:00
}
/****************************************************************************/
/* Add a new item into the graph */
2008-12-19 11:30:50 +00:00
static void add_to_graph ( voip_calls_tapinfo_t * tapinfo _U_ , packet_info * pinfo , const gchar * frame_label , const gchar * comment , guint16 call_num , address * src_addr , address * dst_addr , guint16 line_style )
2005-02-01 12:12:35 +00:00
{
graph_analysis_item_t * gai ;
2013-03-21 02:29:09 +00:00
gai = ( graph_analysis_item_t * ) g_malloc ( sizeof ( graph_analysis_item_t ) ) ;
2011-09-13 12:39:11 +00:00
gai - > fd = pinfo - > fd ;
2005-06-27 06:20:23 +00:00
COPY_ADDRESS ( & ( gai - > src_addr ) , src_addr ) ;
COPY_ADDRESS ( & ( gai - > dst_addr ) , dst_addr ) ;
2005-02-01 12:12:35 +00:00
gai - > port_src = pinfo - > srcport ;
gai - > port_dst = pinfo - > destport ;
if ( frame_label ! = NULL )
gai - > frame_label = g_strdup ( frame_label ) ;
else
gai - > frame_label = g_strdup ( " " ) ;
if ( comment ! = NULL )
gai - > comment = g_strdup ( comment ) ;
else
gai - > comment = g_strdup ( " " ) ;
gai - > conv_num = call_num ;
2006-01-15 15:01:14 +00:00
gai - > line_style = line_style ;
2005-02-01 12:12:35 +00:00
gai - > display = FALSE ;
2012-02-06 17:23:04 +00:00
tapinfo - > graph_analysis - > list = g_list_prepend ( tapinfo - > graph_analysis - > list , gai ) ;
2012-03-14 17:26:49 +00:00
g_hash_table_insert ( tapinfo - > graph_analysis - > ht , & gai - > fd - > num , gai ) ;
2005-02-01 12:12:35 +00:00
}
/****************************************************************************/
/* Append str to frame_label and comment in a graph item */
/* return 0 if the frame_num is not in the graph list */
2005-08-20 14:02:00 +00:00
static int append_to_frame_graph ( voip_calls_tapinfo_t * tapinfo _U_ , guint32 frame_num , const gchar * new_frame_label , const gchar * new_comment )
2005-02-01 12:12:35 +00:00
{
2012-02-06 17:23:04 +00:00
graph_analysis_item_t * gai = NULL ;
2008-12-19 11:30:50 +00:00
gchar * frame_label = NULL ;
gchar * comment = NULL ;
2005-02-01 12:12:35 +00:00
2012-02-06 17:23:04 +00:00
if ( NULL ! = tapinfo - > graph_analysis - > ht )
2013-03-21 02:29:09 +00:00
gai = ( graph_analysis_item_t * ) g_hash_table_lookup ( tapinfo - > graph_analysis - > ht , & frame_num ) ;
2012-04-04 16:55:14 +00:00
if ( gai ) {
2012-02-06 17:23:04 +00:00
frame_label = gai - > frame_label ;
comment = gai - > comment ;
2005-02-01 12:12:35 +00:00
2012-04-04 16:55:14 +00:00
if ( new_frame_label ! = NULL ) {
2012-02-06 17:23:04 +00:00
gai - > frame_label = g_strdup_printf ( " %s %s " , frame_label , new_frame_label ) ;
g_free ( frame_label ) ;
}
2005-02-01 12:12:35 +00:00
2012-04-04 16:55:14 +00:00
if ( new_comment ! = NULL ) {
2012-02-06 17:23:04 +00:00
gai - > comment = g_strdup_printf ( " %s %s " , comment , new_comment ) ;
g_free ( comment ) ;
2005-02-01 12:12:35 +00:00
}
}
2008-12-19 11:30:50 +00:00
2012-02-06 17:23:04 +00:00
return gai ? 1 : 0 ;
2005-02-01 12:12:35 +00:00
}
2005-04-14 00:26:11 +00:00
/****************************************************************************/
/* Change the frame_label and comment in a graph item if not NULL*/
/* return 0 if the frame_num is not in the graph list */
2005-08-20 14:02:00 +00:00
static int change_frame_graph ( voip_calls_tapinfo_t * tapinfo _U_ , guint32 frame_num , const gchar * new_frame_label , const gchar * new_comment )
2005-04-14 00:26:11 +00:00
{
2012-02-06 17:23:04 +00:00
graph_analysis_item_t * gai = NULL ;
2008-12-19 11:30:50 +00:00
gchar * frame_label = NULL ;
gchar * comment = NULL ;
2005-04-14 00:26:11 +00:00
2012-02-06 17:23:04 +00:00
if ( NULL ! = tapinfo - > graph_analysis - > ht )
2013-03-21 02:29:09 +00:00
gai = ( graph_analysis_item_t * ) g_hash_table_lookup ( tapinfo - > graph_analysis - > ht , & frame_num ) ;
2012-04-04 16:55:14 +00:00
if ( gai ) {
2012-02-06 17:23:04 +00:00
frame_label = gai - > frame_label ;
comment = gai - > comment ;
2005-04-14 00:26:11 +00:00
2012-04-04 16:55:14 +00:00
if ( new_frame_label ! = NULL ) {
2012-02-06 17:23:04 +00:00
gai - > frame_label = g_strdup ( new_frame_label ) ;
g_free ( frame_label ) ;
}
2005-04-14 00:26:11 +00:00
2012-04-04 16:55:14 +00:00
if ( new_comment ! = NULL ) {
2012-02-06 17:23:04 +00:00
gai - > comment = g_strdup ( new_comment ) ;
g_free ( comment ) ;
2005-04-14 00:26:11 +00:00
}
}
2008-12-19 11:30:50 +00:00
2012-02-06 17:23:04 +00:00
return gai ? 1 : 0 ;
2005-04-14 00:26:11 +00:00
}
2005-02-07 21:09:23 +00:00
/****************************************************************************/
/* Change all the graph items with call_num to new_call_num */
2005-08-20 14:02:00 +00:00
static guint change_call_num_graph ( voip_calls_tapinfo_t * tapinfo _U_ , guint16 call_num , guint16 new_call_num )
2005-02-07 21:09:23 +00:00
{
graph_analysis_item_t * gai ;
2008-12-19 11:30:50 +00:00
GList * list ;
2005-02-07 21:09:23 +00:00
guint items_changed ;
items_changed = 0 ;
list = g_list_first ( tapinfo - > graph_analysis - > list ) ;
while ( list )
{
2013-03-21 02:29:09 +00:00
gai = ( graph_analysis_item_t * ) list - > data ;
2012-04-04 16:55:14 +00:00
if ( gai - > conv_num = = call_num ) {
2005-02-07 21:09:23 +00:00
gai - > conv_num = new_call_num ;
items_changed + + ;
}
2008-12-19 11:30:50 +00:00
list = g_list_next ( list ) ;
2005-02-07 21:09:23 +00:00
}
return items_changed ;
}
2006-01-15 15:01:14 +00:00
/****************************************************************************/
/* Insert the item in the graph list */
2011-09-13 12:39:11 +00:00
static void insert_to_graph_t38 ( voip_calls_tapinfo_t * tapinfo _U_ , packet_info * pinfo , const gchar * frame_label , const gchar * comment , guint16 call_num , address * src_addr , address * dst_addr , guint16 line_style , guint32 frame_num )
2006-01-15 15:01:14 +00:00
{
graph_analysis_item_t * gai , * new_gai ;
2008-12-19 11:30:50 +00:00
GList * list ;
2006-01-15 15:01:14 +00:00
guint item_num ;
gboolean inserted ;
2013-03-21 02:29:09 +00:00
new_gai = ( graph_analysis_item_t * ) g_malloc ( sizeof ( graph_analysis_item_t ) ) ;
2012-09-04 02:35:25 +00:00
new_gai - > fd = packet_list_get_row_data ( frame_num ) ;
2006-01-15 15:01:14 +00:00
COPY_ADDRESS ( & ( new_gai - > src_addr ) , src_addr ) ;
COPY_ADDRESS ( & ( new_gai - > dst_addr ) , dst_addr ) ;
new_gai - > port_src = pinfo - > srcport ;
new_gai - > port_dst = pinfo - > destport ;
if ( frame_label ! = NULL )
new_gai - > frame_label = g_strdup ( frame_label ) ;
else
new_gai - > frame_label = g_strdup ( " " ) ;
if ( comment ! = NULL )
new_gai - > comment = g_strdup ( comment ) ;
else
new_gai - > comment = g_strdup ( " " ) ;
new_gai - > conv_num = call_num ;
new_gai - > line_style = line_style ;
new_gai - > display = FALSE ;
2008-08-05 17:33:14 +00:00
item_num = 0 ;
2006-01-15 15:01:14 +00:00
inserted = FALSE ;
list = g_list_first ( tapinfo - > graph_analysis - > list ) ;
while ( list )
{
2013-03-21 02:29:09 +00:00
gai = ( graph_analysis_item_t * ) list - > data ;
2012-04-04 16:55:14 +00:00
if ( gai - > fd - > num > frame_num ) {
2006-01-15 15:01:14 +00:00
the_tapinfo_struct . graph_analysis - > list = g_list_insert ( the_tapinfo_struct . graph_analysis - > list , new_gai , item_num ) ;
2012-03-14 16:46:59 +00:00
g_hash_table_insert ( tapinfo - > graph_analysis - > ht , & new_gai - > fd - > num , new_gai ) ;
2006-01-15 15:01:14 +00:00
inserted = TRUE ;
break ;
}
2008-12-19 11:30:50 +00:00
list = g_list_next ( list ) ;
2006-01-15 15:01:14 +00:00
item_num + + ;
}
2012-04-04 16:55:14 +00:00
if ( ! inserted ) {
2012-03-14 16:46:59 +00:00
tapinfo - > graph_analysis - > list = g_list_prepend ( tapinfo - > graph_analysis - > list , new_gai ) ;
g_hash_table_insert ( tapinfo - > graph_analysis - > ht , & new_gai - > fd - > num , new_gai ) ;
}
2006-01-15 15:01:14 +00:00
}
2005-03-10 19:32:22 +00:00
/****************************************************************************/
/* ***************************TAP for RTP Events*****************************/
/****************************************************************************/
2006-02-23 20:02:23 +00:00
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;*/
2005-03-10 19:32:22 +00:00
/****************************************************************************/
/* whenever a rtp event packet is seen by the tap listener */
2008-08-05 17:33:14 +00:00
static int
2008-11-25 08:21:53 +00:00
rtp_event_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * rtp_event_info )
2005-03-10 19:32:22 +00:00
{
2013-03-21 02:29:09 +00:00
const struct _rtp_event_info * pi = ( const struct _rtp_event_info * ) rtp_event_info ;
2005-03-10 19:32:22 +00:00
/* do not consider RTP events packets without a setup frame */
2012-04-04 16:55:14 +00:00
if ( pi - > info_setup_frame_num = = 0 ) {
2005-03-10 19:32:22 +00:00
return 0 ;
}
2006-02-23 20:02:23 +00:00
rtp_evt_frame_num = pinfo - > fd - > num ;
rtp_evt = pi - > info_rtp_evt ;
rtp_evt_end = pi - > info_end ;
2005-03-10 19:32:22 +00:00
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 ,
2009-06-05 22:42:47 +00:00
0 ,
2005-03-10 19:32:22 +00:00
NULL ,
rtp_event_packet ,
NULL
) ;
2008-08-05 17:33:14 +00:00
2005-03-10 19:32:22 +00:00
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2005-03-10 19:32:22 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_rtp_event_tap_listener = TRUE ;
}
}
/****************************************************************************/
void
remove_tap_listener_rtp_event ( void )
{
remove_tap_listener ( & ( the_tapinfo_rtp_struct . rtp_event_dummy ) ) ;
have_rtp_event_tap_listener = FALSE ;
}
2005-02-05 11:07:21 +00:00
/****************************************************************************/
/* ***************************TAP for RTP **********************************/
/****************************************************************************/
/****************************************************************************/
/* when there is a [re]reading of RTP packet's */
2005-08-20 14:02:00 +00:00
static void voip_rtp_reset ( void * ptr _U_ )
2005-02-05 11:07:21 +00:00
{
2005-02-05 23:34:56 +00:00
voip_rtp_tapinfo_t * tapinfo = & the_tapinfo_rtp_struct ;
2008-12-19 11:30:50 +00:00
GList * list ;
2005-02-05 11:07:21 +00:00
/* free the data items first */
list = g_list_first ( tapinfo - > list ) ;
while ( list )
{
g_free ( list - > data ) ;
list = g_list_next ( list ) ;
}
g_list_free ( tapinfo - > list ) ;
tapinfo - > list = NULL ;
tapinfo - > nstreams = 0 ;
return ;
}
/****************************************************************************/
/* whenever a RTP packet is seen by the tap listener */
2008-08-05 17:33:14 +00:00
static int
2008-12-19 11:30:50 +00:00
RTP_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , void const * RTPinfo )
2005-02-05 11:07:21 +00:00
{
voip_rtp_tapinfo_t * tapinfo = & the_tapinfo_rtp_struct ;
voip_rtp_stream_info_t * tmp_listinfo ;
voip_rtp_stream_info_t * strinfo = NULL ;
2008-12-19 11:30:50 +00:00
GList * list ;
2005-03-27 20:54:18 +00:00
struct _rtp_conversation_info * p_conv_data = NULL ;
2005-02-05 11:07:21 +00:00
2013-03-21 02:29:09 +00:00
const struct _rtp_info * pi = ( const struct _rtp_info * ) RTPinfo ;
2005-02-05 11:07:21 +00:00
/* do not consider RTP packets without a setup frame */
2012-04-04 16:55:14 +00:00
if ( pi - > info_setup_frame_num = = 0 ) {
2005-02-05 11:07:21 +00:00
return 0 ;
}
2006-08-30 21:51:31 +00:00
/* add this RTP for future listening using the RTP Player*/
2006-09-10 18:03:22 +00:00
# ifdef HAVE_LIBPORTAUDIO
2006-08-30 21:51:31 +00:00
add_rtp_packet ( pi , pinfo ) ;
# endif
2008-08-05 17:33:14 +00:00
2009-04-08 13:41:30 +00:00
/* check whether we already have a RTP stream with this setup frame and ssrc in the list */
2005-02-05 11:07:21 +00:00
list = g_list_first ( tapinfo - > list ) ;
while ( list )
{
2013-03-21 02:29:09 +00:00
tmp_listinfo = ( voip_rtp_stream_info_t * ) list - > data ;
2008-08-05 17:33:14 +00:00
if ( ( tmp_listinfo - > setup_frame_number = = pi - > info_setup_frame_num )
2012-04-04 16:55:14 +00:00
& & ( tmp_listinfo - > ssrc = = pi - > info_sync_src ) & & ( tmp_listinfo - > end_stream = = FALSE ) ) {
2005-03-07 19:10:21 +00:00
/* if the payload type has changed, we mark the stream as finished to create a new one
2008-08-05 17:33:14 +00:00
this is to show multiple payload changes in the Graph for example for DTMF RFC2833 */
2006-02-23 20:02:23 +00:00
if ( tmp_listinfo - > pt ! = pi - > info_payload_type ) {
2005-03-07 19:10:21 +00:00
tmp_listinfo - > end_stream = TRUE ;
2006-02-23 20:02:23 +00:00
} else {
2005-02-05 11:07:21 +00:00
strinfo = ( voip_rtp_stream_info_t * ) ( list - > data ) ;
break ;
2005-03-07 19:10:21 +00:00
}
2005-02-05 11:07:21 +00:00
}
2008-12-19 11:30:50 +00:00
list = g_list_next ( list ) ;
2005-02-05 11:07:21 +00:00
}
2006-02-23 20:02:23 +00:00
/* 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 ;
}
2005-02-05 11:07:21 +00:00
/* not in the list? then create a new entry */
2012-04-04 16:55:14 +00:00
if ( strinfo = = NULL ) {
2013-03-21 02:29:09 +00:00
strinfo = ( voip_rtp_stream_info_t * ) g_malloc ( sizeof ( voip_rtp_stream_info_t ) ) ;
2005-02-05 11:07:21 +00:00
COPY_ADDRESS ( & ( strinfo - > src_addr ) , & ( pinfo - > src ) ) ;
strinfo - > src_port = pinfo - > srcport ;
COPY_ADDRESS ( & ( strinfo - > dest_addr ) , & ( pinfo - > dst ) ) ;
strinfo - > dest_port = pinfo - > destport ;
strinfo - > ssrc = pi - > info_sync_src ;
2005-03-07 19:10:21 +00:00
strinfo - > end_stream = FALSE ;
2005-02-05 11:07:21 +00:00
strinfo - > pt = pi - > info_payload_type ;
2005-03-27 20:54:18 +00:00
strinfo - > pt_str = NULL ;
2007-11-02 07:43:49 +00:00
strinfo - > is_srtp = pi - > info_is_srtp ;
2005-03-27 20:54:18 +00:00
/* if it is dynamic payload, let use the conv data to see if it is defined */
2010-07-14 18:40:11 +00:00
if ( ( strinfo - > pt > = PT_UNDF_96 ) & & ( strinfo - > pt < = PT_UNDF_127 ) ) {
2005-03-27 20:54:18 +00:00
/* Use existing packet info if available */
2013-05-12 18:11:02 +00:00
p_conv_data = ( struct _rtp_conversation_info * ) p_get_proto_data ( pinfo - > fd , proto_get_id_by_filter_name ( " rtp " ) , 0 ) ;
2010-07-14 18:40:11 +00:00
if ( p_conv_data & & p_conv_data - > rtp_dyn_payload ) {
encoding_name_and_rate_t * encoding_name_and_rate_pt = NULL ;
2013-03-21 02:29:09 +00:00
encoding_name_and_rate_pt = ( encoding_name_and_rate_t * ) g_hash_table_lookup ( p_conv_data - > rtp_dyn_payload , & strinfo - > pt ) ;
2010-07-14 18:40:11 +00:00
if ( encoding_name_and_rate_pt ) {
strinfo - > pt_str = g_strdup ( encoding_name_and_rate_pt - > encoding_name ) ;
}
}
2005-03-27 20:54:18 +00:00
}
2010-11-08 14:43:59 +00:00
if ( ! strinfo - > pt_str ) strinfo - > pt_str = g_strdup ( val_to_str_ext ( strinfo - > pt , & rtp_payload_type_short_vals_ext , " %u " ) ) ;
2005-02-05 11:07:21 +00:00
strinfo - > npackets = 0 ;
2011-09-12 19:32:49 +00:00
strinfo - > start_fd = pinfo - > fd ;
2005-02-05 11:07:21 +00:00
strinfo - > setup_frame_number = pi - > info_setup_frame_num ;
2005-03-10 19:32:22 +00:00
strinfo - > rtp_event = - 1 ;
2012-02-07 06:56:45 +00:00
tapinfo - > list = g_list_prepend ( tapinfo - > list , strinfo ) ;
2005-02-05 11:07:21 +00:00
}
2012-04-04 16:55:14 +00:00
/* Add the info to the existing RTP stream */
strinfo - > npackets + + ;
strinfo - > stop_fd = pinfo - > fd ;
2006-02-23 20:02:23 +00:00
2012-04-04 16:55:14 +00:00
/* 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 ;
2006-02-23 20:02:23 +00:00
}
2005-02-05 11:07:21 +00:00
}
From Alejandro Vaquero
- avoid the clist of the calls dlg to be refreshed multiple times when
first appear.
- destroy the Graph window when the data is not valid anymore.
- fixes an H245 packet count error
- resizing the Graph windows when is displayed (up to 5 columns).
With a change to leave static voip_calls_tapinfo_t the_tapinfo_struct =
{0, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0};
alone.
svn path=/trunk/; revision=14852
2005-07-05 05:16:28 +00:00
the_tapinfo_struct . redraw = TRUE ;
2005-02-05 11:07:21 +00:00
return 1 ;
}
/****************************************************************************/
/* whenever a redraw in the RTP tap listener */
2005-08-20 14:02:00 +00:00
static void RTP_packet_draw ( void * prs _U_ )
2012-03-14 16:46:59 +00:00
{
voip_rtp_tapinfo_t * rtp_tapinfo = & the_tapinfo_rtp_struct ;
GList * rtp_streams_list ;
voip_rtp_stream_info_t * rtp_listinfo ;
2012-03-14 17:26:49 +00:00
/* GList *voip_calls_graph_list; */
2012-03-14 16:46:59 +00:00
graph_analysis_item_t * gai ;
graph_analysis_item_t * new_gai ;
guint16 conv_num ;
guint32 duration ;
/* add each rtp stream to the graph */
rtp_streams_list = g_list_first ( rtp_tapinfo - > list ) ;
while ( rtp_streams_list )
{
2013-03-21 02:29:09 +00:00
rtp_listinfo = ( voip_rtp_stream_info_t * ) rtp_streams_list - > data ;
2012-03-14 16:46:59 +00:00
/* using the setup frame number of the RTP stream, we get the call number that it belongs to*/
2012-03-14 17:26:49 +00:00
/* voip_calls_graph_list = g_list_first(the_tapinfo_struct.graph_analysis->list); */
2012-03-14 16:46:59 +00:00
2013-03-21 02:29:09 +00:00
gai = ( graph_analysis_item_t * ) g_hash_table_lookup ( the_tapinfo_struct . graph_analysis - > ht , & rtp_listinfo - > setup_frame_number ) ;
2012-04-04 16:55:14 +00:00
if ( gai ! = NULL ) {
2012-03-14 17:26:49 +00:00
/* Found the setup frame*/
2012-03-14 16:46:59 +00:00
conv_num = gai - > conv_num ;
/* if RTP was already in the Graph, just update the comment information */
2013-03-21 02:29:09 +00:00
gai = ( graph_analysis_item_t * ) g_hash_table_lookup ( the_tapinfo_struct . graph_analysis - > ht , & rtp_listinfo - > start_fd - > num ) ;
2012-04-04 16:55:14 +00:00
if ( gai ! = NULL ) {
2012-03-14 16:46:59 +00:00
duration = ( guint32 ) ( nstime_to_msec ( & rtp_listinfo - > stop_fd - > rel_ts ) - nstime_to_msec ( & rtp_listinfo - > start_fd - > rel_ts ) ) ;
g_free ( gai - > comment ) ;
gai - > comment = g_strdup_printf ( " %s Num packets:%u Duration:%u.%03us SSRC:0x%X " ,
( rtp_listinfo - > is_srtp ) ? " SRTP " : " RTP " , rtp_listinfo - > npackets ,
duration / 1000 , ( duration % 1000 ) , rtp_listinfo - > ssrc ) ;
2012-04-04 16:57:31 +00:00
} else {
2013-03-21 02:29:09 +00:00
new_gai = ( graph_analysis_item_t * ) g_malloc ( sizeof ( graph_analysis_item_t ) ) ;
2012-03-14 16:46:59 +00:00
new_gai - > fd = rtp_listinfo - > start_fd ;
COPY_ADDRESS ( & ( new_gai - > src_addr ) , & ( rtp_listinfo - > src_addr ) ) ;
COPY_ADDRESS ( & ( new_gai - > dst_addr ) , & ( rtp_listinfo - > dest_addr ) ) ;
new_gai - > port_src = rtp_listinfo - > src_port ;
new_gai - > port_dst = rtp_listinfo - > dest_port ;
duration = ( guint32 ) ( nstime_to_msec ( & rtp_listinfo - > stop_fd - > rel_ts ) - nstime_to_msec ( & rtp_listinfo - > start_fd - > rel_ts ) ) ;
new_gai - > frame_label = g_strdup_printf ( " %s (%s) %s " ,
( rtp_listinfo - > is_srtp ) ? " SRTP " : " RTP " ,
rtp_listinfo - > pt_str ,
( rtp_listinfo - > rtp_event = = - 1 ) ?
" " : val_to_str_const ( rtp_listinfo - > rtp_event , rtp_event_type_values , " Unknown RTP Event " ) ) ;
new_gai - > comment = g_strdup_printf ( " %s Num packets:%u Duration:%u.%03us SSRC:0x%X " ,
( rtp_listinfo - > is_srtp ) ? " SRTP " : " RTP " , rtp_listinfo - > npackets ,
duration / 1000 , ( duration % 1000 ) , rtp_listinfo - > ssrc ) ;
new_gai - > conv_num = conv_num ;
new_gai - > display = FALSE ;
new_gai - > line_style = 2 ; /* the arrow line will be 2 pixels width */
the_tapinfo_struct . graph_analysis - > list = g_list_prepend ( the_tapinfo_struct . graph_analysis - > list , new_gai ) ;
g_hash_table_insert ( the_tapinfo_struct . graph_analysis - > ht , & rtp_listinfo - > start_fd , new_gai ) ;
}
}
rtp_streams_list = g_list_next ( rtp_streams_list ) ;
} /* while (rtp_streams_list) */
}
#if 0
static void RTP_packet_draw ( void * prs _U_ )
2005-02-05 11:07:21 +00:00
{
voip_rtp_tapinfo_t * rtp_tapinfo = & the_tapinfo_rtp_struct ;
2008-12-19 11:30:50 +00:00
GList * rtp_streams_list ;
2005-02-05 11:07:21 +00:00
voip_rtp_stream_info_t * rtp_listinfo ;
2008-12-19 11:30:50 +00:00
GList * voip_calls_graph_list ;
2005-02-05 11:07:21 +00:00
guint item ;
graph_analysis_item_t * gai ;
graph_analysis_item_t * new_gai ;
guint16 conv_num ;
guint32 duration ;
/* add each rtp stream to the graph */
rtp_streams_list = g_list_first ( rtp_tapinfo - > list ) ;
while ( rtp_streams_list )
{
rtp_listinfo = rtp_streams_list - > data ;
2012-03-14 09:53:33 +00:00
/* using the setup frame number of the RTP stream, we get the call number that it belongs to*/
2005-02-05 11:07:21 +00:00
voip_calls_graph_list = g_list_first ( the_tapinfo_struct . graph_analysis - > list ) ;
while ( voip_calls_graph_list )
2008-08-05 17:33:14 +00:00
{
2005-02-05 11:07:21 +00:00
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 */
2012-04-04 16:55:14 +00:00
if ( rtp_listinfo - > setup_frame_number = = gai - > fd - > num ) {
2013-02-26 04:42:26 +00:00
/* look again from the beginning because there are cases where the Setup frame is after the RTP */
2006-02-23 20:02:23 +00:00
voip_calls_graph_list = g_list_first ( the_tapinfo_struct . graph_analysis - > list ) ;
item = 0 ;
2012-04-04 16:55:14 +00:00
while ( voip_calls_graph_list ) {
2005-02-05 11:07:21 +00:00
gai = voip_calls_graph_list - > data ;
/* if RTP was already in the Graph, just update the comment information */
2012-04-04 16:55:14 +00:00
if ( rtp_listinfo - > start_fd - > num = = gai - > fd - > num ) {
2011-09-12 19:32:49 +00:00
duration = ( guint32 ) ( nstime_to_msec ( & rtp_listinfo - > stop_fd - > rel_ts ) - nstime_to_msec ( & rtp_listinfo - > start_fd - > rel_ts ) ) ;
2005-02-05 11:07:21 +00:00
g_free ( gai - > comment ) ;
2008-08-05 17:33:14 +00:00
gai - > comment = g_strdup_printf ( " %s Num packets:%u Duration:%u.%03us SSRC:0x%X " ,
( rtp_listinfo - > is_srtp ) ? " SRTP " : " RTP " , rtp_listinfo - > npackets ,
2010-03-03 20:35:50 +00:00
duration / 1000 , ( duration % 1000 ) , rtp_listinfo - > ssrc ) ;
2005-02-05 11:07:21 +00:00
break ;
2006-10-24 05:17:49 +00:00
}
/* we increment the list here to be able to check if it is the last item in this calls, which means the RTP is after so we have to draw it */
voip_calls_graph_list = g_list_next ( voip_calls_graph_list ) ;
if ( ! voip_calls_graph_list ) item + + ;
2005-02-05 11:07:21 +00:00
/* add the RTP item to the graph if was not there*/
2012-04-04 16:55:14 +00:00
if ( rtp_listinfo - > start_fd - > num < gai - > fd - > num | | ! voip_calls_graph_list ) {
2005-02-05 11:07:21 +00:00
new_gai = g_malloc ( sizeof ( graph_analysis_item_t ) ) ;
2011-09-13 12:39:11 +00:00
new_gai - > fd = rtp_listinfo - > start_fd ;
2005-02-24 21:31:20 +00:00
COPY_ADDRESS ( & ( new_gai - > src_addr ) , & ( rtp_listinfo - > src_addr ) ) ;
COPY_ADDRESS ( & ( new_gai - > dst_addr ) , & ( rtp_listinfo - > dest_addr ) ) ;
2005-02-05 11:07:21 +00:00
new_gai - > port_src = rtp_listinfo - > src_port ;
new_gai - > port_dst = rtp_listinfo - > dest_port ;
2011-09-12 19:32:49 +00:00
duration = ( guint32 ) ( nstime_to_msec ( & rtp_listinfo - > stop_fd - > rel_ts ) - nstime_to_msec ( & rtp_listinfo - > start_fd - > rel_ts ) ) ;
2010-11-05 22:44:03 +00:00
new_gai - > frame_label = g_strdup_printf ( " %s (%s) %s " ,
( rtp_listinfo - > is_srtp ) ? " SRTP " : " RTP " ,
rtp_listinfo - > pt_str ,
( rtp_listinfo - > rtp_event = = - 1 ) ?
" " : val_to_str_const ( rtp_listinfo - > rtp_event , rtp_event_type_values , " Unknown RTP Event " ) ) ;
2008-08-05 17:33:14 +00:00
new_gai - > comment = g_strdup_printf ( " %s Num packets:%u Duration:%u.%03us SSRC:0x%X " ,
( rtp_listinfo - > is_srtp ) ? " SRTP " : " RTP " , rtp_listinfo - > npackets ,
2010-03-03 20:35:50 +00:00
duration / 1000 , ( duration % 1000 ) , rtp_listinfo - > ssrc ) ;
2005-02-05 11:07:21 +00:00
new_gai - > conv_num = conv_num ;
new_gai - > display = FALSE ;
new_gai - > line_style = 2 ; /* the arrow line will be 2 pixels width */
the_tapinfo_struct . graph_analysis - > list = g_list_insert ( the_tapinfo_struct . graph_analysis - > list , new_gai , item ) ;
break ;
}
2006-10-24 05:17:49 +00:00
if ( voip_calls_graph_list ) item + + ;
2005-02-05 11:07:21 +00:00
}
break ;
}
voip_calls_graph_list = g_list_next ( voip_calls_graph_list ) ;
}
rtp_streams_list = g_list_next ( rtp_streams_list ) ;
}
}
2012-03-14 16:46:59 +00:00
# endif
2005-02-05 11:07:21 +00:00
static gboolean have_RTP_tap_listener = FALSE ;
/****************************************************************************/
void
rtp_init_tap ( void )
{
GString * error_string ;
if ( have_RTP_tap_listener = = FALSE )
{
/* don't register tap listener, if we have it already */
2005-02-05 23:34:56 +00:00
error_string = register_tap_listener ( " rtp " , & ( the_tapinfo_rtp_struct . rtp_dummy ) , NULL ,
2009-06-05 22:42:47 +00:00
0 ,
2008-08-05 17:33:14 +00:00
voip_rtp_reset ,
RTP_packet ,
2005-02-05 11:07:21 +00:00
RTP_packet_draw
) ;
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2005-02-05 11:07:21 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_RTP_tap_listener = TRUE ;
}
}
/****************************************************************************/
void
remove_tap_listener_rtp ( void )
{
remove_tap_listener ( & ( the_tapinfo_rtp_struct . rtp_dummy ) ) ;
have_RTP_tap_listener = FALSE ;
}
2006-01-15 15:01:14 +00:00
/****************************************************************************/
/******************************TAP for T38 **********************************/
/****************************************************************************/
/****************************************************************************/
/* whenever a T38 packet is seen by the tap listener */
2008-08-05 17:33:14 +00:00
static int
2006-01-15 15:01:14 +00:00
T38_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * T38info )
{
voip_calls_tapinfo_t * tapinfo = & the_tapinfo_struct ;
2008-01-09 08:34:58 +00:00
voip_calls_info_t * callsinfo = NULL ;
2006-01-15 15:01:14 +00:00
voip_calls_info_t * tmp_listinfo ;
2008-12-19 11:30:50 +00:00
GList * voip_calls_graph_list ;
GList * list ;
2006-01-15 15:01:14 +00:00
gchar * frame_label = NULL ;
gchar * comment = NULL ;
2006-01-16 06:31:25 +00:00
graph_analysis_item_t * tmp_gai , * gai = NULL ;
2006-01-15 15:01:14 +00:00
guint16 line_style = 2 ;
double duration ;
int conv_num = - 1 ;
2013-03-21 02:29:09 +00:00
const t38_packet_info * pi = ( const t38_packet_info * ) T38info ;
2006-01-15 15:01:14 +00:00
if ( pi - > setup_frame_number ! = 0 ) {
/* using the setup frame number of the T38 packet, we get the call number that it belongs */
voip_calls_graph_list = g_list_first ( tapinfo - > graph_analysis - > list ) ;
while ( voip_calls_graph_list )
2008-08-05 17:33:14 +00:00
{
2013-03-21 02:29:09 +00:00
tmp_gai = ( graph_analysis_item_t * ) voip_calls_graph_list - > data ;
2012-04-04 16:55:14 +00:00
if ( pi - > setup_frame_number = = tmp_gai - > fd - > num ) {
2006-01-15 15:01:14 +00:00
gai = tmp_gai ;
break ;
}
voip_calls_graph_list = g_list_next ( voip_calls_graph_list ) ;
}
if ( gai ) conv_num = ( int ) gai - > conv_num ;
}
2008-08-05 17:33:14 +00:00
/* if setup_frame_number in the t38 packet is 0, it means it was not set using an SDP or H245 sesion, which means we don't
2006-10-17 01:29:55 +00:00
* have the associated Voip calls . It probably means the the packet was decoded using the default t38 port , or using " Decode as.. "
2006-01-15 15:01:14 +00:00
* in this case we create a " voip " call that only have t38 media ( no signaling )
2008-08-05 17:33:14 +00:00
* OR if we have not found the Setup message in the graph .
2006-01-15 15:01:14 +00:00
*/
2012-04-04 16:55:14 +00:00
if ( ( pi - > setup_frame_number = = 0 ) | | ( gai = = NULL ) ) {
2006-07-25 09:21:41 +00:00
/* check whether we already have a call with these parameters in the list */
2008-01-09 08:34:58 +00:00
list = g_list_first ( tapinfo - > callsinfo_list ) ;
2006-01-15 15:01:14 +00:00
while ( list )
{
2013-03-21 02:29:09 +00:00
tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2012-04-04 16:55:14 +00:00
if ( tmp_listinfo - > protocol = = MEDIA_T38 ) {
2008-01-09 08:34:58 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
2006-01-15 15:01:14 +00:00
break ;
}
list = g_list_next ( list ) ;
}
/* not in the list? then create a new entry */
2012-04-04 16:55:14 +00:00
if ( callsinfo = = NULL ) {
2013-03-21 02:29:09 +00:00
callsinfo = ( voip_calls_info_t * ) g_malloc0 ( sizeof ( voip_calls_info_t ) ) ;
2008-01-09 08:34:58 +00:00
callsinfo - > call_active_state = VOIP_ACTIVE ;
callsinfo - > call_state = VOIP_UNKNOWN ;
callsinfo - > from_identity = g_strdup ( " T38 Media only " ) ;
callsinfo - > to_identity = g_strdup ( " T38 Media only " ) ;
COPY_ADDRESS ( & ( callsinfo - > initial_speaker ) , & ( pinfo - > src ) ) ;
callsinfo - > selected = FALSE ;
2011-09-13 05:29:56 +00:00
callsinfo - > start_fd = pinfo - > fd ;
2008-01-09 08:34:58 +00:00
callsinfo - > protocol = MEDIA_T38 ;
callsinfo - > prot_info = NULL ;
callsinfo - > free_prot_info = NULL ;
callsinfo - > npackets = 0 ;
callsinfo - > call_num = tapinfo - > ncalls + + ;
2012-02-07 06:56:45 +00:00
tapinfo - > callsinfo_list = g_list_prepend ( tapinfo - > callsinfo_list , callsinfo ) ;
2008-01-09 08:34:58 +00:00
}
+ + ( callsinfo - > npackets ) ;
2006-01-15 15:01:14 +00:00
/* increment the packets counter of all calls */
+ + ( tapinfo - > npackets ) ;
2008-01-09 08:34:58 +00:00
conv_num = ( int ) callsinfo - > call_num ;
2006-01-15 15:01:14 +00:00
}
/* at this point we should have found the call num for this t38 packets belong */
if ( conv_num = = - 1 ) {
return 0 ;
}
/* add the item to the graph list */
if ( pi - > type_msg = = 0 ) { /* 0=t30-indicator */
2007-05-04 07:10:15 +00:00
frame_label = g_strdup ( val_to_str ( pi - > t30ind_value , t38_T30_indicator_vals , " Ukn (0x%02X) " ) ) ;
comment = g_strdup_printf ( " t38:t30 Ind:%s " , val_to_str ( pi - > t30ind_value , t38_T30_indicator_vals , " Ukn (0x%02X) " ) ) ;
2006-01-15 15:01:14 +00:00
line_style = 1 ;
} else if ( pi - > type_msg = = 1 ) { /* 1=data */
2012-04-04 16:55:14 +00:00
switch ( pi - > Data_Field_field_type_value ) {
2006-01-15 15:01:14 +00:00
case 0 : /* hdlc-data */
break ;
case 2 : /* hdlc-fcs-OK */
case 4 : /* hdlc-fcs-OK-sig-end */
2008-12-19 11:30:50 +00:00
frame_label = g_strdup_printf ( " %s %s " , val_to_str ( pi - > t30_Facsimile_Control & 0x7F , t30_facsimile_control_field_vals_short , " Ukn (0x%02X) " ) , pi - > desc ) ;
comment = g_strdup_printf ( " t38:%s:HDLC:%s " , val_to_str ( pi - > data_value , t38_T30_data_vals , " Ukn (0x%02X) " ) , val_to_str ( pi - > t30_Facsimile_Control & 0x7F , t30_facsimile_control_field_vals , " Ukn (0x%02X) " ) ) ;
2006-01-15 15:01:14 +00:00
break ;
case 3 : /* hdlc-fcs-BAD */
case 5 : /* hdlc-fcs-BAD-sig-end */
frame_label = g_strdup ( pi - > Data_Field_field_type_value = = 3 ? " fcs-BAD " : " fcs-BAD-sig-end " ) ;
2007-05-04 07:10:15 +00:00
comment = g_strdup_printf ( " WARNING: received t38:%s:HDLC:%s " , val_to_str ( pi - > data_value , t38_T30_data_vals , " Ukn (0x%02X) " ) , pi - > Data_Field_field_type_value = = 3 ? " fcs-BAD " : " fcs-BAD-sig-end " ) ;
2006-01-15 15:01:14 +00:00
break ;
case 7 : /* t4-non-ecm-sig-end */
duration = nstime_to_sec ( & pinfo - > fd - > rel_ts ) - pi - > time_first_t4_data ;
2007-05-04 07:10:15 +00:00
frame_label = g_strdup_printf ( " t4-non-ecm-data:%s " , val_to_str ( pi - > data_value , t38_T30_data_vals , " Ukn (0x%02X) " ) ) ;
comment = g_strdup_printf ( " t38:t4-non-ecm-data:%s Duration: %.2fs %s " , val_to_str ( pi - > data_value , t38_T30_data_vals , " Ukn (0x%02X) " ) , duration , pi - > desc_comment ) ;
2011-09-13 12:39:11 +00:00
insert_to_graph_t38 ( tapinfo , pinfo , frame_label , comment , ( guint16 ) conv_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , line_style , pi - > frame_num_first_t4_data ) ;
2006-01-15 15:01:14 +00:00
break ;
}
}
if ( frame_label & & ! ( pi - > Data_Field_field_type_value = = 7 & & pi - > type_msg = = 1 ) ) {
add_to_graph ( tapinfo , pinfo , frame_label , comment , ( guint16 ) conv_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , line_style ) ;
}
g_free ( comment ) ;
g_free ( frame_label ) ;
2008-08-05 17:33:14 +00:00
2006-01-15 15:01:14 +00:00
tapinfo - > redraw = TRUE ;
return 1 ; /* refresh output */
}
static gboolean have_T38_tap_listener = FALSE ;
/****************************************************************************/
void
t38_init_tap ( void )
{
GString * error_string ;
if ( have_T38_tap_listener = = FALSE )
{
/* don't register tap listener, if we have it already */
error_string = register_tap_listener ( " t38 " , & ( the_tapinfo_struct . t38_dummy ) , NULL ,
2009-06-05 22:42:47 +00:00
0 ,
2008-08-05 17:33:14 +00:00
voip_calls_dlg_reset ,
T38_packet ,
2006-01-15 15:01:14 +00:00
voip_calls_dlg_draw
) ;
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2006-01-15 15:01:14 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_T38_tap_listener = TRUE ;
}
}
/****************************************************************************/
void
remove_tap_listener_t38 ( void )
{
remove_tap_listener ( & ( the_tapinfo_struct . t38_dummy ) ) ;
have_T38_tap_listener = FALSE ;
}
2005-04-14 00:26:11 +00:00
/****************************************************************************/
static gchar * sdp_summary = NULL ;
static guint32 sdp_frame_num = 0 ;
2005-02-01 12:12:35 +00:00
/****************************************************************************/
/* ***************************TAP for SIP **********************************/
/****************************************************************************/
2007-03-18 22:14:12 +00:00
static void free_sip_info ( gpointer p ) {
2013-03-21 02:29:09 +00:00
sip_calls_info_t * si = ( sip_calls_info_t * ) p ;
2008-08-05 17:33:14 +00:00
2009-03-13 22:06:48 +00:00
g_free ( si - > call_identifier ) ;
2007-03-18 22:14:12 +00:00
g_free ( si ) ;
}
2005-02-01 12:12:35 +00:00
/****************************************************************************/
/* whenever a SIP packet is seen by the tap listener */
2008-08-05 17:33:14 +00:00
static int
2005-02-02 01:02:09 +00:00
SIPcalls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * SIPinfo )
2005-02-01 12:12:35 +00:00
{
2005-02-02 01:02:09 +00:00
voip_calls_tapinfo_t * tapinfo = & the_tapinfo_struct ;
2005-02-01 12:12:35 +00:00
/* we just take note of the ISUP data here; when we receive the MTP3 part everything will
be compared with existing calls */
2008-01-09 08:34:58 +00:00
voip_calls_info_t * callsinfo = NULL ;
2005-02-21 02:36:55 +00:00
sip_calls_info_t * tmp_sipinfo = NULL ;
2005-02-24 21:31:20 +00:00
address tmp_src , tmp_dst ;
2005-02-01 12:12:35 +00:00
gchar * frame_label = NULL ;
gchar * comment = NULL ;
2012-02-06 17:23:04 +00:00
gchar * key = NULL ;
2005-02-01 12:12:35 +00:00
2013-03-21 02:29:09 +00:00
const sip_info_value_t * pi = ( const sip_info_value_t * ) SIPinfo ;
2005-02-01 12:12:35 +00:00
/* do not consider packets without call_id */
2012-04-04 16:55:14 +00:00
if ( pi - > tap_call_id = = NULL ) {
2005-02-01 12:12:35 +00:00
return 0 ;
}
2012-02-06 17:23:04 +00:00
key = pi - > tap_call_id ;
/* init the hash table */
if ( NULL = = tapinfo - > callsinfo_hashtable [ SIP_HASH ] ) {
/* TODO: check how efficient g_str_hash is for sip call ids */
tapinfo - > callsinfo_hashtable [ SIP_HASH ] = g_hash_table_new_full ( g_str_hash ,
g_str_equal ,
NULL , /* key_destroy_func */
NULL ) ; /* value_destroy_func */
2005-02-01 12:12:35 +00:00
}
2012-02-06 17:23:04 +00:00
/* search the call information in the SIP_HASH */
2013-03-21 02:29:09 +00:00
callsinfo = ( voip_calls_info_t * ) g_hash_table_lookup ( tapinfo - > callsinfo_hashtable [ SIP_HASH ] , key ) ;
2012-04-04 16:52:18 +00:00
2012-02-06 17:23:04 +00:00
/* not in the hash? then create a new entry if the message is INVITE -i.e. if this session is a call*/
2012-04-04 16:55:14 +00:00
if ( ( callsinfo = = NULL ) & & ( pi - > request_method ! = NULL ) ) {
if ( strcmp ( pi - > request_method , " INVITE " ) = = 0 ) {
2013-03-21 02:29:09 +00:00
callsinfo = ( voip_calls_info_t * ) g_malloc0 ( sizeof ( voip_calls_info_t ) ) ;
2008-01-09 08:34:58 +00:00
callsinfo - > call_active_state = VOIP_ACTIVE ;
callsinfo - > call_state = VOIP_CALL_SETUP ;
callsinfo - > from_identity = g_strdup ( pi - > tap_from_addr ) ;
callsinfo - > to_identity = g_strdup ( pi - > tap_to_addr ) ;
COPY_ADDRESS ( & ( callsinfo - > initial_speaker ) , & ( pinfo - > src ) ) ;
callsinfo - > selected = FALSE ;
2011-09-13 05:29:56 +00:00
callsinfo - > start_fd = pinfo - > fd ;
2008-01-09 08:34:58 +00:00
callsinfo - > protocol = VOIP_SIP ;
callsinfo - > prot_info = g_malloc ( sizeof ( sip_calls_info_t ) ) ;
callsinfo - > free_prot_info = free_sip_info ;
2013-03-21 02:29:09 +00:00
tmp_sipinfo = ( sip_calls_info_t * ) callsinfo - > prot_info ;
2007-03-18 22:14:12 +00:00
tmp_sipinfo - > call_identifier = g_strdup ( pi - > tap_call_id ) ;
tmp_sipinfo - > sip_state = SIP_INVITE_SENT ;
tmp_sipinfo - > invite_cseq = pi - > tap_cseq_number ;
2008-01-09 08:34:58 +00:00
callsinfo - > npackets = 0 ;
callsinfo - > call_num = tapinfo - > ncalls + + ;
2012-02-06 17:23:04 +00:00
tapinfo - > callsinfo_list = g_list_prepend ( tapinfo - > callsinfo_list , callsinfo ) ;
/* insert the call information in the SIP_HASH */
2012-03-14 17:26:49 +00:00
g_hash_table_insert ( tapinfo - > callsinfo_hashtable [ SIP_HASH ] ,
2012-02-06 17:23:04 +00:00
tmp_sipinfo - > call_identifier , callsinfo ) ;
2005-02-01 12:12:35 +00:00
}
}
2012-04-04 16:55:14 +00:00
if ( callsinfo ! = NULL ) {
2013-03-21 02:29:09 +00:00
tmp_sipinfo = ( sip_calls_info_t * ) callsinfo - > prot_info ;
2005-02-01 12:12:35 +00:00
/* let's analyze the call state */
2005-02-24 21:31:20 +00:00
COPY_ADDRESS ( & ( tmp_src ) , & ( pinfo - > src ) ) ;
COPY_ADDRESS ( & ( tmp_dst ) , & ( pinfo - > dst ) ) ;
2008-08-05 17:33:14 +00:00
2012-04-04 16:55:14 +00:00
if ( pi - > request_method = = NULL ) {
2006-06-23 15:22:12 +00:00
frame_label = g_strdup_printf ( " %u %s " , pi - > response_code , pi - > reason_phrase ) ;
2009-03-12 07:56:42 +00:00
comment = g_strdup ( " SIP Status " ) ;
2005-02-01 12:12:35 +00:00
2012-04-04 16:55:14 +00:00
if ( ( tmp_sipinfo & & pi - > tap_cseq_number = = tmp_sipinfo - > invite_cseq ) & & ( ADDRESSES_EQUAL ( & tmp_dst , & ( callsinfo - > initial_speaker ) ) ) ) {
if ( ( pi - > response_code > 199 ) & & ( pi - > response_code < 300 ) & & ( tmp_sipinfo - > sip_state = = SIP_INVITE_SENT ) ) {
2005-02-01 12:12:35 +00:00
tmp_sipinfo - > sip_state = SIP_200_REC ;
}
2012-04-04 16:55:14 +00:00
else if ( ( pi - > response_code > 299 ) & & ( tmp_sipinfo - > sip_state = = SIP_INVITE_SENT ) ) {
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_REJECTED ;
2005-02-01 12:12:35 +00:00
tapinfo - > rejected_calls + + ;
}
}
}
2012-04-04 16:57:31 +00:00
else {
2005-02-01 12:12:35 +00:00
frame_label = g_strdup ( pi - > request_method ) ;
2012-04-04 16:55:14 +00:00
if ( ( strcmp ( pi - > request_method , " INVITE " ) = = 0 ) & & ( ADDRESSES_EQUAL ( & tmp_src , & ( callsinfo - > initial_speaker ) ) ) ) {
2005-02-01 12:12:35 +00:00
tmp_sipinfo - > invite_cseq = pi - > tap_cseq_number ;
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_CALL_SETUP ;
comment = g_strdup_printf ( " SIP From: %s To:%s " , callsinfo - > from_identity , callsinfo - > to_identity ) ;
2005-02-01 12:12:35 +00:00
}
else if ( ( strcmp ( pi - > request_method , " ACK " ) = = 0 ) & & ( pi - > tap_cseq_number = = tmp_sipinfo - > invite_cseq )
2008-01-09 08:34:58 +00:00
& & ( ADDRESSES_EQUAL ( & tmp_src , & ( callsinfo - > initial_speaker ) ) ) & & ( tmp_sipinfo - > sip_state = = SIP_200_REC )
2012-04-04 16:55:14 +00:00
& & ( callsinfo - > call_state = = VOIP_CALL_SETUP ) ) {
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_IN_CALL ;
2009-03-12 07:56:42 +00:00
comment = g_strdup ( " SIP Request " ) ;
2005-02-01 12:12:35 +00:00
}
2012-04-04 16:55:14 +00:00
else if ( strcmp ( pi - > request_method , " BYE " ) = = 0 ) {
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_COMPLETED ;
2005-02-01 12:12:35 +00:00
tapinfo - > completed_calls + + ;
2009-03-12 07:56:42 +00:00
comment = g_strdup ( " SIP Request " ) ;
2005-02-01 12:12:35 +00:00
}
else if ( ( strcmp ( pi - > request_method , " CANCEL " ) = = 0 ) & & ( pi - > tap_cseq_number = = tmp_sipinfo - > invite_cseq )
2012-04-04 16:55:14 +00:00
& & ( ADDRESSES_EQUAL ( & tmp_src , & ( callsinfo - > initial_speaker ) ) ) & & ( callsinfo - > call_state = = VOIP_CALL_SETUP ) ) {
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_CANCELLED ;
2005-02-01 12:12:35 +00:00
tmp_sipinfo - > sip_state = SIP_CANCEL_SENT ;
2009-03-12 07:56:42 +00:00
comment = g_strdup ( " SIP Request " ) ;
2005-02-01 12:12:35 +00:00
} else {
2009-03-12 07:56:42 +00:00
comment = g_strdup ( " SIP Request " ) ;
2005-02-01 12:12:35 +00:00
}
}
2011-09-13 05:29:56 +00:00
callsinfo - > stop_fd = pinfo - > fd ;
2008-01-09 08:34:58 +00:00
+ + ( callsinfo - > npackets ) ;
2005-02-01 12:12:35 +00:00
/* increment the packets counter of all calls */
+ + ( tapinfo - > npackets ) ;
/* add to the graph */
2008-08-05 17:33:14 +00:00
add_to_graph ( tapinfo , pinfo , frame_label , comment , callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
2005-02-01 12:12:35 +00:00
g_free ( comment ) ;
g_free ( frame_label ) ;
2005-02-24 21:31:20 +00:00
g_free ( ( void * ) tmp_src . data ) ;
g_free ( ( void * ) tmp_dst . data ) ;
2005-04-14 00:26:11 +00:00
/* add SDP info if apply */
2012-04-04 16:55:14 +00:00
if ( ( sdp_summary ! = NULL ) & & ( sdp_frame_num = = pinfo - > fd - > num ) ) {
2005-04-14 00:26:11 +00:00
append_to_frame_graph ( tapinfo , pinfo - > fd - > num , sdp_summary , NULL ) ;
g_free ( sdp_summary ) ;
sdp_summary = NULL ;
}
2005-02-01 12:12:35 +00:00
}
From Alejandro Vaquero
- avoid the clist of the calls dlg to be refreshed multiple times when
first appear.
- destroy the Graph window when the data is not valid anymore.
- fixes an H245 packet count error
- resizing the Graph windows when is displayed (up to 5 columns).
With a change to leave static voip_calls_tapinfo_t the_tapinfo_struct =
{0, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0};
alone.
svn path=/trunk/; revision=14852
2005-07-05 05:16:28 +00:00
tapinfo - > redraw = TRUE ;
2005-02-01 12:12:35 +00:00
return 1 ; /* refresh output */
}
/****************************************************************************/
From Alejandro Vaquero
- avoid the clist of the calls dlg to be refreshed multiple times when
first appear.
- destroy the Graph window when the data is not valid anymore.
- fixes an H245 packet count error
- resizing the Graph windows when is displayed (up to 5 columns).
With a change to leave static voip_calls_tapinfo_t the_tapinfo_struct =
{0, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0};
alone.
svn path=/trunk/; revision=14852
2005-07-05 05:16:28 +00:00
voip_calls_tapinfo_t * voip_calls_get_info ( void )
2005-02-01 12:12:35 +00:00
{
return & the_tapinfo_struct ;
}
/****************************************************************************/
/* TAP INTERFACE */
/****************************************************************************/
static gboolean have_SIP_tap_listener = FALSE ;
/****************************************************************************/
void
sip_calls_init_tap ( void )
{
GString * error_string ;
if ( have_SIP_tap_listener = = FALSE )
{
/* don't register tap listener, if we have it already */
2005-02-02 01:02:09 +00:00
error_string = register_tap_listener ( " sip " , & ( the_tapinfo_struct . sip_dummy ) , NULL ,
2009-06-05 22:42:47 +00:00
0 ,
2008-08-05 17:33:14 +00:00
voip_calls_dlg_reset ,
SIPcalls_packet ,
2005-02-02 01:02:09 +00:00
voip_calls_dlg_draw
) ;
2005-02-01 12:12:35 +00:00
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2005-02-01 12:12:35 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_SIP_tap_listener = TRUE ;
}
}
/****************************************************************************/
void
remove_tap_listener_sip_calls ( void )
{
2005-02-02 01:02:09 +00:00
remove_tap_listener ( & ( the_tapinfo_struct . sip_dummy ) ) ;
2005-02-01 12:12:35 +00:00
have_SIP_tap_listener = FALSE ;
}
/****************************************************************************/
/* ***************************TAP for ISUP **********************************/
/****************************************************************************/
2005-04-05 08:14:58 +00:00
static guint32 mtp3_opc , mtp3_dpc ;
static guint8 mtp3_ni ;
static guint32 mtp3_frame_num ;
2005-02-01 12:12:35 +00:00
/****************************************************************************/
/* whenever a isup_ packet is seen by the tap listener */
2008-08-05 17:33:14 +00:00
static int
2005-02-02 01:02:09 +00:00
isup_calls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * isup_info _U_ )
2005-02-01 12:12:35 +00:00
{
2005-02-02 01:02:09 +00:00
voip_calls_tapinfo_t * tapinfo = & the_tapinfo_struct ;
2005-02-01 12:12:35 +00:00
voip_calls_info_t * tmp_listinfo ;
2008-01-09 08:34:58 +00:00
voip_calls_info_t * callsinfo = NULL ;
2005-02-01 12:12:35 +00:00
isup_calls_info_t * tmp_isupinfo ;
gboolean found = FALSE ;
2005-02-21 02:36:55 +00:00
gboolean forward = FALSE ;
2005-05-02 14:45:43 +00:00
gboolean right_pair ;
2008-12-19 11:30:50 +00:00
GList * list ;
2005-02-03 21:50:19 +00:00
gchar * frame_label = NULL ;
gchar * comment = NULL ;
2005-02-01 12:12:35 +00:00
2005-04-05 08:14:58 +00:00
/*voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; unused */
2013-03-21 02:29:09 +00:00
const isup_tap_rec_t * pi = ( const isup_tap_rec_t * ) isup_info ;
2008-08-05 17:33:14 +00:00
2005-04-05 08:14:58 +00:00
/* check if the lower layer is MTP matching the frame number */
if ( mtp3_frame_num ! = pinfo - > fd - > num ) return 0 ;
2008-08-05 17:33:14 +00:00
2006-07-25 09:21:41 +00:00
/* check whether we already have a call with these parameters in the list */
2008-01-09 08:34:58 +00:00
list = g_list_first ( tapinfo - > callsinfo_list ) ;
2005-02-01 12:12:35 +00:00
while ( list )
{
2005-05-02 14:45:43 +00:00
right_pair = TRUE ;
2013-03-21 02:58:59 +00:00
tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2012-04-04 16:55:14 +00:00
if ( ( tmp_listinfo - > protocol = = VOIP_ISUP ) & & ( tmp_listinfo - > call_active_state = = VOIP_ACTIVE ) ) {
2013-03-21 02:58:59 +00:00
tmp_isupinfo = ( isup_calls_info_t * ) tmp_listinfo - > prot_info ;
2005-04-05 08:14:58 +00:00
if ( ( tmp_isupinfo - > cic = = pinfo - > circuit_id ) & & ( tmp_isupinfo - > ni = = mtp3_ni ) ) {
2012-04-04 16:55:14 +00:00
if ( ( tmp_isupinfo - > opc = = mtp3_opc ) & & ( tmp_isupinfo - > dpc = = mtp3_dpc ) ) {
2005-02-01 12:12:35 +00:00
forward = TRUE ;
2012-04-04 16:55:14 +00:00
} else if ( ( tmp_isupinfo - > dpc = = mtp3_opc ) & & ( tmp_isupinfo - > opc = = mtp3_dpc ) ) {
2005-02-01 12:12:35 +00:00
forward = FALSE ;
2012-04-04 16:57:31 +00:00
} else {
2007-03-21 00:59:00 +00:00
right_pair = FALSE ;
}
2008-08-05 17:33:14 +00:00
2012-04-04 16:55:14 +00:00
if ( right_pair ) {
2005-02-01 12:12:35 +00:00
/* if there is an IAM for a call that is not in setup state, that means the previous call in the same
cic is no longer active */
2012-04-04 16:55:14 +00:00
if ( tmp_listinfo - > call_state = = VOIP_CALL_SETUP ) {
2005-02-01 12:12:35 +00:00
found = TRUE ;
2012-04-04 16:55:14 +00:00
} else if ( pi - > message_type ! = 1 ) {
2005-02-01 12:12:35 +00:00
found = TRUE ;
2012-04-04 16:57:31 +00:00
} else {
2005-02-01 12:12:35 +00:00
tmp_listinfo - > call_active_state = VOIP_INACTIVE ;
}
}
2008-08-05 17:33:14 +00:00
2012-04-04 16:55:14 +00:00
if ( found ) {
2008-01-09 08:34:58 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
2005-02-01 12:12:35 +00:00
break ;
}
}
}
list = g_list_next ( list ) ;
}
/* not in the list? then create a new entry if the message is IAM
- i . e . if this session is a call */
2012-04-04 16:55:14 +00:00
if ( ( callsinfo = = NULL ) & & ( pi - > message_type = = 1 ) ) {
2013-03-21 02:58:59 +00:00
callsinfo = ( voip_calls_info_t * ) g_malloc0 ( sizeof ( voip_calls_info_t ) ) ;
2008-01-09 08:34:58 +00:00
callsinfo - > call_active_state = VOIP_ACTIVE ;
callsinfo - > call_state = VOIP_UNKNOWN ;
COPY_ADDRESS ( & ( callsinfo - > initial_speaker ) , & ( pinfo - > src ) ) ;
callsinfo - > selected = FALSE ;
2011-09-13 05:29:56 +00:00
callsinfo - > start_fd = pinfo - > fd ;
2008-01-09 08:34:58 +00:00
callsinfo - > protocol = VOIP_ISUP ;
2012-04-04 16:55:14 +00:00
if ( pi - > calling_number ! = NULL ) {
2008-01-09 08:34:58 +00:00
callsinfo - > from_identity = g_strdup ( pi - > calling_number ) ;
2005-04-05 08:14:58 +00:00
}
2012-04-04 16:55:14 +00:00
if ( pi - > called_number ! = NULL ) {
2008-01-09 08:34:58 +00:00
callsinfo - > to_identity = g_strdup ( pi - > called_number ) ;
2005-04-05 08:14:58 +00:00
}
2008-01-09 08:34:58 +00:00
callsinfo - > prot_info = g_malloc ( sizeof ( isup_calls_info_t ) ) ;
callsinfo - > free_prot_info = g_free ;
2013-03-21 02:58:59 +00:00
tmp_isupinfo = ( isup_calls_info_t * ) callsinfo - > prot_info ;
2005-04-05 08:14:58 +00:00
tmp_isupinfo - > opc = mtp3_opc ;
tmp_isupinfo - > dpc = mtp3_dpc ;
tmp_isupinfo - > ni = mtp3_ni ;
2005-02-01 12:12:35 +00:00
tmp_isupinfo - > cic = pinfo - > circuit_id ;
2008-01-09 08:34:58 +00:00
callsinfo - > npackets = 0 ;
callsinfo - > call_num = tapinfo - > ncalls + + ;
2012-02-07 06:56:45 +00:00
tapinfo - > callsinfo_list = g_list_prepend ( tapinfo - > callsinfo_list , callsinfo ) ;
2005-02-01 12:12:35 +00:00
}
2008-08-05 17:33:14 +00:00
2012-04-04 16:55:14 +00:00
if ( callsinfo ! = NULL ) {
2011-09-13 05:29:56 +00:00
callsinfo - > stop_fd = pinfo - > fd ;
2008-01-09 08:34:58 +00:00
+ + ( callsinfo - > npackets ) ;
2005-02-01 12:12:35 +00:00
/* Let's analyze the call state */
2010-11-05 22:44:03 +00:00
frame_label = g_strdup ( val_to_str_ext_const ( pi - > message_type , & isup_message_type_value_acro_ext , " Unknown " ) ) ;
2005-02-03 21:50:19 +00:00
2012-04-04 16:55:14 +00:00
if ( callsinfo - > npackets = = 1 ) { /* this is the first packet, that must be an IAM */
2007-03-21 00:59:00 +00:00
2012-04-04 16:55:14 +00:00
if ( ( pi - > calling_number ! = NULL ) & & ( pi - > called_number ! = NULL ) ) {
2005-04-05 08:14:58 +00:00
comment = g_strdup_printf ( " Call from %s to %s " ,
pi - > calling_number , pi - > called_number ) ;
}
2012-04-04 16:55:14 +00:00
} else if ( callsinfo - > npackets = = 2 ) { /* in the second packet we show the SPs */
if ( forward ) {
2005-02-03 21:50:19 +00:00
comment = g_strdup_printf ( " %i-%i -> %i-%i. Cic:%i " ,
2005-04-05 08:14:58 +00:00
mtp3_ni , mtp3_opc ,
mtp3_ni , mtp3_dpc , pinfo - > circuit_id ) ;
2007-03-21 00:59:00 +00:00
} else {
2005-02-03 21:50:19 +00:00
comment = g_strdup_printf ( " %i-%i -> %i-%i. Cic:%i " ,
2005-04-05 08:14:58 +00:00
mtp3_ni , mtp3_dpc ,
mtp3_ni , mtp3_opc , pinfo - > circuit_id ) ;
2005-02-03 21:50:19 +00:00
}
}
2007-03-21 00:59:00 +00:00
2012-04-04 16:55:14 +00:00
switch ( pi - > message_type ) {
2005-02-01 12:12:35 +00:00
case 1 : /* IAM */
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_CALL_SETUP ;
2005-02-01 12:12:35 +00:00
break ;
case 7 : /* CONNECT */
case 9 : /* ANSWER */
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_IN_CALL ;
2005-02-01 12:12:35 +00:00
break ;
case 12 : /* RELEASE */
2012-04-04 16:55:14 +00:00
if ( callsinfo - > call_state = = VOIP_CALL_SETUP ) {
if ( forward ) {
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_CANCELLED ;
2005-02-01 12:12:35 +00:00
}
2012-04-04 16:57:31 +00:00
else {
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_REJECTED ;
2005-02-01 12:12:35 +00:00
tapinfo - > rejected_calls + + ;
}
}
2012-04-04 16:55:14 +00:00
else if ( callsinfo - > call_state = = VOIP_IN_CALL ) {
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_COMPLETED ;
2005-02-01 12:12:35 +00:00
tapinfo - > completed_calls + + ;
}
2010-11-05 22:44:03 +00:00
comment = g_strdup_printf ( " Cause %i - %s " ,
pi - > cause_value ,
val_to_str_ext_const ( pi - > cause_value , & q931_cause_code_vals_ext , " (Unknown) " ) ) ;
2005-02-01 12:12:35 +00:00
break ;
}
/* increment the packets counter of all calls */
+ + ( tapinfo - > npackets ) ;
2005-02-03 21:50:19 +00:00
/* add to the graph */
2008-08-05 17:33:14 +00:00
add_to_graph ( tapinfo , pinfo , frame_label , comment , callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
2005-02-03 21:50:19 +00:00
g_free ( comment ) ;
g_free ( frame_label ) ;
2005-02-01 12:12:35 +00:00
}
From Alejandro Vaquero
- avoid the clist of the calls dlg to be refreshed multiple times when
first appear.
- destroy the Graph window when the data is not valid anymore.
- fixes an H245 packet count error
- resizing the Graph windows when is displayed (up to 5 columns).
With a change to leave static voip_calls_tapinfo_t the_tapinfo_struct =
{0, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0};
alone.
svn path=/trunk/; revision=14852
2005-07-05 05:16:28 +00:00
tapinfo - > redraw = TRUE ;
2005-02-01 12:12:35 +00:00
From Alejandro Vaquero
- avoid the clist of the calls dlg to be refreshed multiple times when
first appear.
- destroy the Graph window when the data is not valid anymore.
- fixes an H245 packet count error
- resizing the Graph windows when is displayed (up to 5 columns).
With a change to leave static voip_calls_tapinfo_t the_tapinfo_struct =
{0, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0};
alone.
svn path=/trunk/; revision=14852
2005-07-05 05:16:28 +00:00
return 1 ; /* refresh output */
2005-02-01 12:12:35 +00:00
}
/****************************************************************************/
2005-04-05 08:14:58 +00:00
static gboolean have_isup_tap_listener = FALSE ;
void
isup_calls_init_tap ( void )
{
GString * error_string ;
if ( have_isup_tap_listener = = FALSE )
{
error_string = register_tap_listener ( " isup " , & ( the_tapinfo_struct . isup_dummy ) ,
NULL ,
2009-06-05 22:42:47 +00:00
0 ,
2008-08-05 17:33:14 +00:00
voip_calls_dlg_reset ,
isup_calls_packet ,
2005-04-05 08:14:58 +00:00
voip_calls_dlg_draw
) ;
2008-08-05 17:33:14 +00:00
2005-04-05 08:14:58 +00:00
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2005-04-05 08:14:58 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_isup_tap_listener = TRUE ;
}
}
/****************************************************************************/
void
remove_tap_listener_isup_calls ( void )
{
remove_tap_listener ( & ( the_tapinfo_struct . isup_dummy ) ) ;
have_isup_tap_listener = FALSE ;
}
/****************************************************************************/
/* ***************************TAP for MTP3 **********************************/
/****************************************************************************/
/****************************************************************************/
/* whenever a mtp3_ packet is seen by the tap listener */
2008-08-05 17:33:14 +00:00
static int
2005-04-05 08:14:58 +00:00
mtp3_calls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * mtp3_info _U_ )
{
2013-03-21 02:58:59 +00:00
const mtp3_tap_rec_t * pi = ( mtp3_tap_rec_t * ) mtp3_info ;
2005-04-05 08:14:58 +00:00
/* keep the data in memory to use when the ISUP information arrives */
mtp3_opc = pi - > addr_opc . pc ;
mtp3_dpc = pi - > addr_dpc . pc ;
mtp3_ni = pi - > addr_opc . ni ;
mtp3_frame_num = pinfo - > fd - > num ;
return 0 ;
}
/****************************************************************************/
2005-02-01 12:12:35 +00:00
static gboolean have_mtp3_tap_listener = FALSE ;
2007-03-18 23:16:54 +00:00
static gboolean have_m3ua_tap_listener = FALSE ;
2005-02-01 12:12:35 +00:00
void
mtp3_calls_init_tap ( void )
{
GString * error_string ;
if ( have_mtp3_tap_listener = = FALSE )
{
2005-02-02 01:02:09 +00:00
error_string = register_tap_listener ( " mtp3 " , & ( the_tapinfo_struct . mtp3_dummy ) ,
2005-02-01 12:12:35 +00:00
NULL ,
2009-06-05 22:42:47 +00:00
0 ,
2008-08-05 17:33:14 +00:00
voip_calls_dlg_reset ,
mtp3_calls_packet ,
2005-02-02 01:02:09 +00:00
voip_calls_dlg_draw
) ;
2005-02-01 12:12:35 +00:00
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2005-02-01 12:12:35 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_mtp3_tap_listener = TRUE ;
}
2008-08-05 17:33:14 +00:00
2007-03-18 23:16:54 +00:00
if ( have_m3ua_tap_listener = = FALSE )
{
error_string = register_tap_listener ( " m3ua " , & ( the_tapinfo_struct . mtp3_dummy ) ,
2009-06-05 22:42:47 +00:00
NULL ,
0 ,
voip_calls_dlg_reset ,
mtp3_calls_packet ,
voip_calls_dlg_draw
) ;
2008-08-05 17:33:14 +00:00
2007-03-18 23:16:54 +00:00
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2007-03-18 23:16:54 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_m3ua_tap_listener = TRUE ;
}
2008-08-05 17:33:14 +00:00
2005-02-01 12:12:35 +00:00
}
/****************************************************************************/
void
remove_tap_listener_mtp3_calls ( void )
{
2005-02-02 01:02:09 +00:00
remove_tap_listener ( & ( the_tapinfo_struct . mtp3_dummy ) ) ;
2007-03-18 23:16:54 +00:00
remove_tap_listener ( & ( the_tapinfo_struct . m3ua_dummy ) ) ;
2005-02-01 12:12:35 +00:00
have_mtp3_tap_listener = FALSE ;
2007-03-18 23:16:54 +00:00
have_m3ua_tap_listener = FALSE ;
2005-02-01 12:12:35 +00:00
}
/****************************************************************************/
/* ***************************TAP for Q931 **********************************/
/****************************************************************************/
2005-04-14 00:26:11 +00:00
void h245_add_to_graph ( guint32 new_frame_num ) ;
2006-03-19 20:45:45 +00:00
static const e_guid_t guid_allzero = { 0 , 0 , 0 , { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } } ;
2005-04-14 00:26:11 +00:00
/* defines specific H323 data */
2005-02-01 12:12:35 +00:00
static gchar * q931_calling_number ;
static gchar * q931_called_number ;
static guint8 q931_cause_value ;
static gint32 q931_crv ;
static guint32 q931_frame_num ;
2005-04-14 00:26:11 +00:00
static guint32 h225_frame_num = 0 ;
static guint16 h225_call_num = 0 ;
static h225_cs_type h225_cstype = H225_OTHER ;
static gboolean h225_is_faststart ;
2005-06-27 06:20:23 +00:00
static guint32 actrace_frame_num = 0 ;
static gint32 actrace_trunk = 0 ;
static gint32 actrace_direction = 0 ;
2005-02-01 12:12:35 +00:00
/****************************************************************************/
/* whenever a q931_ packet is seen by the tap listener */
2008-08-05 17:33:14 +00:00
static int
2009-10-10 22:00:07 +00:00
q931_calls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * q931_info )
2005-02-01 12:12:35 +00:00
{
2005-04-14 00:26:11 +00:00
GList * list , * list2 ;
2008-08-05 17:33:14 +00:00
voip_calls_tapinfo_t * tapinfo = & the_tapinfo_struct ;
2005-04-14 00:26:11 +00:00
h323_calls_info_t * tmp_h323info , * tmp2_h323info ;
2005-06-27 06:20:23 +00:00
actrace_isdn_calls_info_t * tmp_actrace_isdn_info ;
2005-04-14 00:26:11 +00:00
voip_calls_info_t * tmp_listinfo ;
2008-01-09 08:34:58 +00:00
voip_calls_info_t * callsinfo = NULL ;
2005-04-14 00:26:11 +00:00
h245_address_t * h245_add = NULL ;
gchar * comment ;
2013-03-21 02:58:59 +00:00
const q931_packet_info * pi = ( const q931_packet_info * ) q931_info ;
2005-02-01 12:12:35 +00:00
/* free previously allocated q931_calling/ed_number */
g_free ( q931_calling_number ) ;
g_free ( q931_called_number ) ;
2008-08-05 17:33:14 +00:00
2005-02-01 12:12:35 +00:00
if ( pi - > calling_number ! = NULL )
q931_calling_number = g_strdup ( pi - > calling_number ) ;
else
q931_calling_number = g_strdup ( " " ) ;
if ( pi - > called_number ! = NULL )
q931_called_number = g_strdup ( pi - > called_number ) ;
else
q931_called_number = g_strdup ( " " ) ;
q931_cause_value = pi - > cause_value ;
q931_frame_num = pinfo - > fd - > num ;
q931_crv = pi - > crv ;
2005-04-14 00:26:11 +00:00
/* add staff to H323 calls */
if ( h225_frame_num = = q931_frame_num ) {
2005-05-05 11:07:22 +00:00
tmp_h323info = NULL ;
2008-01-09 08:34:58 +00:00
list = g_list_first ( tapinfo - > callsinfo_list ) ;
2005-04-14 00:26:11 +00:00
while ( list )
{
2013-03-21 02:58:59 +00:00
tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2012-04-04 16:55:14 +00:00
if ( ( tmp_listinfo - > protocol = = VOIP_H323 ) & & ( tmp_listinfo - > call_num = = h225_call_num ) ) {
2013-03-21 02:58:59 +00:00
tmp_h323info = ( h323_calls_info_t * ) tmp_listinfo - > prot_info ;
2008-01-09 08:34:58 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
2005-04-14 00:26:11 +00:00
/* Add the CRV to the h323 call */
if ( tmp_h323info - > q931_crv = = - 1 ) {
tmp_h323info - > q931_crv = q931_crv ;
} else if ( tmp_h323info - > q931_crv ! = q931_crv ) {
tmp_h323info - > q931_crv2 = q931_crv ;
}
break ;
}
list = g_list_next ( list ) ;
}
2008-01-09 08:34:58 +00:00
if ( callsinfo ! = NULL ) {
2005-04-14 00:26:11 +00:00
comment = NULL ;
if ( h225_cstype = = H225_SETUP ) {
/* set te calling and called number from the Q931 packet */
2012-04-04 16:55:14 +00:00
if ( q931_calling_number ! = NULL ) {
2008-01-09 08:34:58 +00:00
g_free ( callsinfo - > from_identity ) ;
callsinfo - > from_identity = g_strdup ( q931_calling_number ) ;
2005-04-14 00:26:11 +00:00
}
2012-04-04 16:55:14 +00:00
if ( q931_called_number ! = NULL ) {
2008-01-09 08:34:58 +00:00
g_free ( callsinfo - > to_identity ) ;
callsinfo - > to_identity = g_strdup ( q931_called_number ) ;
2005-04-14 00:26:11 +00:00
}
/* check if there is an LRQ/LCF that match this Setup */
2008-08-05 17:33:14 +00:00
/* TODO: we are just checking the DialedNumer in LRQ/LCF agains the Setup
we should also check if the h225 signaling IP and port match the destination
2005-04-14 00:26:11 +00:00
Setup ip and port */
2008-01-09 08:34:58 +00:00
list = g_list_first ( tapinfo - > callsinfo_list ) ;
2005-04-14 00:26:11 +00:00
while ( list )
{
2013-03-21 02:58:59 +00:00
tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2012-04-04 16:55:14 +00:00
if ( tmp_listinfo - > protocol = = VOIP_H323 ) {
2013-03-21 02:58:59 +00:00
tmp2_h323info = ( h323_calls_info_t * ) tmp_listinfo - > prot_info ;
2008-08-05 17:33:14 +00:00
2005-04-14 00:26:11 +00:00
/* check if the called number match a LRQ/LCF */
2008-08-05 17:33:14 +00:00
if ( ( strcmp ( callsinfo - > to_identity , tmp_listinfo - > to_identity ) = = 0 )
2012-04-04 16:55:14 +00:00
& & ( memcmp ( & tmp2_h323info - > guid , & guid_allzero , GUID_LEN ) = = 0 ) ) {
2005-04-14 00:26:11 +00:00
/* change the call graph to the LRQ/LCF to belong to this call */
2008-01-09 08:34:58 +00:00
callsinfo - > npackets + = change_call_num_graph ( tapinfo , tmp_listinfo - > call_num , callsinfo - > call_num ) ;
2008-08-05 17:33:14 +00:00
2005-04-14 00:26:11 +00:00
/* remove this LRQ/LCF call entry because we have found the Setup that match them */
g_free ( tmp_listinfo - > from_identity ) ;
g_free ( tmp_listinfo - > to_identity ) ;
g_free ( tmp2_h323info - > guid ) ;
2008-08-05 17:33:14 +00:00
2005-04-14 00:26:11 +00:00
list2 = g_list_first ( tmp2_h323info - > h245_list ) ;
while ( list2 )
{
2013-03-21 02:58:59 +00:00
h245_add = ( h245_address_t * ) list2 - > data ;
2005-04-14 00:26:11 +00:00
g_free ( ( void * ) h245_add - > h245_address . data ) ;
g_free ( list2 - > data ) ;
list2 = g_list_next ( list2 ) ;
}
g_list_free ( tmp_h323info - > h245_list ) ;
tmp_h323info - > h245_list = NULL ;
g_free ( tmp_listinfo - > prot_info ) ;
2008-01-09 08:34:58 +00:00
tapinfo - > callsinfo_list = g_list_remove ( tapinfo - > callsinfo_list , tmp_listinfo ) ;
2005-04-14 00:26:11 +00:00
break ;
}
}
list = g_list_next ( list ) ;
}
2008-08-05 17:33:14 +00:00
comment = g_strdup_printf ( " H225 From: %s To:%s TunnH245:%s FS:%s " , callsinfo - > from_identity , callsinfo - > to_identity , ( tmp_h323info - > is_h245Tunneling = = TRUE ? " on " : " off " ) ,
2005-04-14 00:26:11 +00:00
( h225_is_faststart = = TRUE ? " on " : " off " ) ) ;
} else if ( h225_cstype = = H225_RELEASE_COMPLET ) {
/* get the Q931 Release cause code */
2012-04-04 16:55:14 +00:00
if ( q931_cause_value ! = 0xFF ) {
2010-11-05 22:44:03 +00:00
comment = g_strdup_printf ( " H225 Q931 Rel Cause (%i):%s " , q931_cause_value ,
val_to_str_ext_const ( q931_cause_value , & q931_cause_code_vals_ext , " <unknown> " ) ) ;
2005-04-14 00:26:11 +00:00
} else { /* Cause not set */
comment = g_strdup ( " H225 No Q931 Rel Cause " ) ;
}
}
/* change the graph comment for this new one */
if ( comment ! = NULL ) {
change_frame_graph ( tapinfo , h225_frame_num , NULL , comment ) ;
g_free ( comment ) ;
}
}
/* we reset the h225_frame_num to 0 because there could be empty h225 in the same frame
as non empty h225 ( e . g connect ) , so we don ' t have to be here twice */
h225_frame_num = 0 ;
2005-06-27 06:20:23 +00:00
/* add staff to H245 */
2005-04-14 00:26:11 +00:00
} else if ( h245_labels . frame_num = = q931_frame_num ) {
2008-08-05 17:33:14 +00:00
/* there are empty H225 frames that don't have guid (guaid=0) but they have h245 info,
so the only way to match those frames is with the Q931 CRV number */
2008-01-09 08:34:58 +00:00
list = g_list_first ( tapinfo - > callsinfo_list ) ;
2005-04-14 00:26:11 +00:00
while ( list )
{
2013-03-21 02:58:59 +00:00
tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2012-04-04 16:55:14 +00:00
if ( tmp_listinfo - > protocol = = VOIP_H323 ) {
2013-03-21 02:58:59 +00:00
tmp_h323info = ( h323_calls_info_t * ) tmp_listinfo - > prot_info ;
2012-04-04 16:55:14 +00:00
if ( ( ( tmp_h323info - > q931_crv = = q931_crv ) | | ( tmp_h323info - > q931_crv2 = = q931_crv ) ) & & ( q931_crv ! = - 1 ) ) {
2005-04-14 00:26:11 +00:00
/* if the frame number exists in graph, append to it*/
2008-11-25 08:21:53 +00:00
if ( ! append_to_frame_graph ( tapinfo , q931_frame_num , NULL , NULL ) ) {
2005-04-14 00:26:11 +00:00
/* if not exist, add to the graph */
2008-11-25 08:21:53 +00:00
add_to_graph ( tapinfo , pinfo , NULL , NULL , tmp_listinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
From Alejandro Vaquero
- avoid the clist of the calls dlg to be refreshed multiple times when
first appear.
- destroy the Graph window when the data is not valid anymore.
- fixes an H245 packet count error
- resizing the Graph windows when is displayed (up to 5 columns).
With a change to leave static voip_calls_tapinfo_t the_tapinfo_struct =
{0, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0};
alone.
svn path=/trunk/; revision=14852
2005-07-05 05:16:28 +00:00
+ + ( tmp_listinfo - > npackets ) ;
/* increment the packets counter of all calls */
+ + ( tapinfo - > npackets ) ;
2005-04-14 00:26:11 +00:00
}
2008-08-05 17:33:14 +00:00
2005-04-14 00:26:11 +00:00
/* Add the H245 info if exists to the Graph */
h245_add_to_graph ( pinfo - > fd - > num ) ;
break ;
}
}
list = g_list_next ( list ) ;
}
2005-06-27 06:20:23 +00:00
2013-04-05 05:09:31 +00:00
/* add stuff to ACTRACE */
} else {
2005-06-27 06:20:23 +00:00
address pstn_add ;
2008-11-25 08:21:53 +00:00
comment = NULL ;
2008-01-09 08:34:58 +00:00
callsinfo = NULL ;
list = g_list_first ( tapinfo - > callsinfo_list ) ;
2005-06-27 06:20:23 +00:00
while ( list )
{
2013-03-21 02:58:59 +00:00
tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2012-04-04 16:55:14 +00:00
if ( tmp_listinfo - > protocol = = VOIP_AC_ISDN ) {
2013-03-21 02:58:59 +00:00
tmp_actrace_isdn_info = ( actrace_isdn_calls_info_t * ) tmp_listinfo - > prot_info ;
2005-06-27 06:20:23 +00:00
/* TODO: Also check the IP of the Blade, and if the call is complete (no active) */
if ( ( tmp_actrace_isdn_info - > crv = = q931_crv ) & & ( tmp_actrace_isdn_info - > trunk = = actrace_trunk ) ) {
2008-01-09 08:34:58 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
2005-06-27 06:20:23 +00:00
break ;
}
}
list = g_list_next ( list ) ;
}
2005-07-07 04:03:35 +00:00
SET_ADDRESS ( & pstn_add , AT_STRINGZ , 5 , g_strdup ( " PSTN " ) ) ;
2005-06-27 06:20:23 +00:00
/* if it is a new call, add it to the list */
2008-01-09 08:34:58 +00:00
if ( ! callsinfo ) {
2013-03-21 02:58:59 +00:00
callsinfo = ( voip_calls_info_t * ) g_malloc0 ( sizeof ( voip_calls_info_t ) ) ;
2008-01-09 08:34:58 +00:00
callsinfo - > call_active_state = VOIP_ACTIVE ;
callsinfo - > call_state = VOIP_CALL_SETUP ;
callsinfo - > from_identity = g_strdup ( q931_calling_number ) ;
callsinfo - > to_identity = g_strdup ( q931_called_number ) ;
COPY_ADDRESS ( & ( callsinfo - > initial_speaker ) , actrace_direction ? & pstn_add : & ( pinfo - > src ) ) ;
callsinfo - > selected = FALSE ;
2011-09-13 05:29:56 +00:00
callsinfo - > start_fd = pinfo - > fd ;
2008-01-09 08:34:58 +00:00
callsinfo - > protocol = VOIP_AC_ISDN ;
callsinfo - > prot_info = g_malloc ( sizeof ( actrace_isdn_calls_info_t ) ) ;
callsinfo - > free_prot_info = g_free ;
2013-03-21 02:58:59 +00:00
tmp_actrace_isdn_info = ( actrace_isdn_calls_info_t * ) callsinfo - > prot_info ;
2005-06-27 06:20:23 +00:00
tmp_actrace_isdn_info - > crv = q931_crv ;
tmp_actrace_isdn_info - > trunk = actrace_trunk ;
2008-01-09 08:34:58 +00:00
callsinfo - > npackets = 0 ;
callsinfo - > call_num = tapinfo - > ncalls + + ;
2012-02-07 06:56:45 +00:00
tapinfo - > callsinfo_list = g_list_prepend ( tapinfo - > callsinfo_list , callsinfo ) ;
2005-06-27 06:20:23 +00:00
}
2011-09-13 05:29:56 +00:00
callsinfo - > stop_fd = pinfo - > fd ;
2008-01-09 08:34:58 +00:00
+ + ( callsinfo - > npackets ) ;
2005-06-27 06:20:23 +00:00
/* increment the packets counter of all calls */
+ + ( tapinfo - > npackets ) ;
2012-04-04 16:55:14 +00:00
switch ( pi - > message_type ) {
2005-06-27 06:20:23 +00:00
case Q931_SETUP :
comment = g_strdup_printf ( " AC_ISDN trunk:%u Calling: %s Called:%s " , actrace_trunk , q931_calling_number , q931_called_number ) ;
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_CALL_SETUP ;
2005-06-27 06:20:23 +00:00
break ;
case Q931_CONNECT :
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_IN_CALL ;
2005-06-27 06:20:23 +00:00
break ;
case Q931_RELEASE_COMPLETE :
case Q931_RELEASE :
case Q931_DISCONNECT :
2012-04-04 16:55:14 +00:00
if ( callsinfo - > call_state = = VOIP_CALL_SETUP ) {
if ( ADDRESSES_EQUAL ( & ( callsinfo - > initial_speaker ) , actrace_direction ? & pstn_add : & ( pinfo - > src ) ) ) { /* forward direction */
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_CANCELLED ;
2005-06-27 06:20:23 +00:00
}
2012-04-04 16:57:31 +00:00
else { /* reverse */
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_REJECTED ;
2005-06-27 06:20:23 +00:00
tapinfo - > rejected_calls + + ;
}
2012-04-04 16:55:14 +00:00
} else if ( ( callsinfo - > call_state ! = VOIP_CANCELLED ) & & ( callsinfo - > call_state ! = VOIP_REJECTED ) ) {
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_COMPLETED ;
2005-06-27 06:20:23 +00:00
tapinfo - > completed_calls + + ;
}
2012-04-04 16:55:14 +00:00
if ( q931_cause_value ! = 0xFF ) {
2010-11-05 22:44:03 +00:00
comment = g_strdup_printf ( " AC_ISDN trunk:%u Q931 Rel Cause (%i):%s " , actrace_trunk , q931_cause_value ,
val_to_str_ext_const ( q931_cause_value , & q931_cause_code_vals_ext , " <unknown> " ) ) ;
2005-06-27 06:20:23 +00:00
} else { /* Cause not set */
comment = g_strdup ( " AC_ISDN No Q931 Rel Cause " ) ;
}
break ;
}
if ( ! comment )
comment = g_strdup_printf ( " AC_ISDN trunk:%u " , actrace_trunk ) ;
2008-08-05 17:33:14 +00:00
add_to_graph ( tapinfo , pinfo , val_to_str ( pi - > message_type , q931_message_type_vals , " <unknown> " ) , comment , callsinfo - > call_num ,
2005-06-27 06:20:23 +00:00
actrace_direction ? & pstn_add : & ( pinfo - > src ) ,
2006-01-15 15:01:14 +00:00
actrace_direction ? & ( pinfo - > src ) : & pstn_add ,
1 ) ;
2005-06-27 06:20:23 +00:00
g_free ( comment ) ;
g_free ( ( char * ) pstn_add . data ) ;
2005-04-14 00:26:11 +00:00
}
2005-06-27 06:20:23 +00:00
From Alejandro Vaquero
- avoid the clist of the calls dlg to be refreshed multiple times when
first appear.
- destroy the Graph window when the data is not valid anymore.
- fixes an H245 packet count error
- resizing the Graph windows when is displayed (up to 5 columns).
With a change to leave static voip_calls_tapinfo_t the_tapinfo_struct =
{0, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0};
alone.
svn path=/trunk/; revision=14852
2005-07-05 05:16:28 +00:00
tapinfo - > redraw = TRUE ;
return 1 ; /* refresh output */
2005-02-01 12:12:35 +00:00
}
/****************************************************************************/
static gboolean have_q931_tap_listener = FALSE ;
void
q931_calls_init_tap ( void )
{
GString * error_string ;
if ( have_q931_tap_listener = = FALSE )
{
2005-02-02 01:02:09 +00:00
error_string = register_tap_listener ( " q931 " , & ( the_tapinfo_struct . q931_dummy ) ,
2005-02-01 12:12:35 +00:00
NULL ,
2009-06-05 22:42:47 +00:00
0 ,
2005-02-02 01:02:09 +00:00
voip_calls_dlg_reset ,
q931_calls_packet ,
voip_calls_dlg_draw
) ;
2008-08-05 17:33:14 +00:00
2005-02-01 12:12:35 +00:00
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2005-02-01 12:12:35 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_q931_tap_listener = TRUE ;
}
}
/****************************************************************************/
void
remove_tap_listener_q931_calls ( void )
{
2005-02-02 01:02:09 +00:00
remove_tap_listener ( & ( the_tapinfo_struct . q931_dummy ) ) ;
2005-02-01 12:12:35 +00:00
have_q931_tap_listener = FALSE ;
}
/****************************************************************************/
/****************************TAP for H323 ***********************************/
/****************************************************************************/
2005-08-20 14:02:00 +00:00
static void add_h245_Address ( h323_calls_info_t * h323info , h245_address_t * h245_address )
2005-02-24 21:31:20 +00:00
{
2012-02-07 06:56:45 +00:00
h323info - > h245_list = g_list_prepend ( h323info - > h245_list , h245_address ) ;
2005-02-01 12:12:35 +00:00
}
2007-03-18 22:14:12 +00:00
static void free_h225_info ( gpointer p ) {
2013-03-21 02:58:59 +00:00
h323_calls_info_t * tmp_h323info = ( h323_calls_info_t * ) p ;
2007-03-18 22:14:12 +00:00
2009-03-13 22:06:48 +00:00
g_free ( tmp_h323info - > guid ) ;
2007-03-18 22:14:12 +00:00
if ( tmp_h323info - > h245_list ) {
2008-12-19 11:30:50 +00:00
GList * list2 = g_list_first ( tmp_h323info - > h245_list ) ;
2007-03-18 22:14:12 +00:00
while ( list2 )
{
2013-03-21 02:58:59 +00:00
h245_address_t * h245_add = ( h245_address_t * ) list2 - > data ;
2007-03-18 22:14:12 +00:00
g_free ( ( void * ) h245_add - > h245_address . data ) ;
g_free ( list2 - > data ) ;
list2 = g_list_next ( list2 ) ;
}
2008-08-05 17:33:14 +00:00
2007-03-18 22:14:12 +00:00
g_list_free ( tmp_h323info - > h245_list ) ;
2008-08-05 17:33:14 +00:00
2007-03-18 22:14:12 +00:00
}
2008-08-05 17:33:14 +00:00
2007-03-18 22:14:12 +00:00
g_free ( p ) ;
}
2005-02-01 12:12:35 +00:00
/****************************************************************************/
/* whenever a H225 packet is seen by the tap listener */
2008-08-05 17:33:14 +00:00
static int
2005-02-02 01:02:09 +00:00
H225calls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * H225info )
2005-02-01 12:12:35 +00:00
{
2005-02-02 01:02:09 +00:00
voip_calls_tapinfo_t * tapinfo = & the_tapinfo_struct ;
2005-02-01 12:12:35 +00:00
voip_calls_info_t * tmp_listinfo ;
2008-01-09 08:34:58 +00:00
voip_calls_info_t * callsinfo = NULL ;
2005-02-21 02:36:55 +00:00
h323_calls_info_t * tmp_h323info = NULL ;
2005-02-01 12:12:35 +00:00
gchar * frame_label ;
gchar * comment ;
2005-04-14 00:26:11 +00:00
GList * list ;
2005-02-24 21:31:20 +00:00
h245_address_t * h245_add = NULL ;
2008-08-05 17:33:14 +00:00
2013-03-21 02:58:59 +00:00
const h225_packet_info * pi = ( const h225_packet_info * ) H225info ;
2008-08-05 17:33:14 +00:00
2005-02-07 21:09:23 +00:00
/* if not guid and RAS and not LRQ, LCF or LRJ return because did not belong to a call */
2005-04-14 00:26:11 +00:00
/* OR, if not guid and is H225 return because doesn't belong to a call */
2006-03-19 20:45:45 +00:00
if ( ( memcmp ( & pi - > guid , & guid_allzero , GUID_LEN ) = = 0 ) )
2005-04-14 00:26:11 +00:00
if ( ( ( pi - > msg_type = = H225_RAS ) & & ( ( pi - > msg_tag < 18 ) | | ( pi - > msg_tag > 20 ) ) ) | | ( pi - > msg_type ! = H225_RAS ) )
return 0 ;
2008-08-05 17:33:14 +00:00
2005-04-14 00:26:11 +00:00
/* if it is RAS LCF or LRJ*/
2008-08-05 17:33:14 +00:00
if ( ( pi - > msg_type = = H225_RAS ) & & ( ( pi - > msg_tag = = 19 ) | | ( pi - > msg_tag = = 20 ) ) ) {
2005-02-07 21:09:23 +00:00
/* if the LCF/LRJ doesn't match to a LRQ, just return */
if ( ! pi - > request_available ) return 0 ;
2008-08-05 17:33:14 +00:00
2006-07-25 09:21:41 +00:00
/* check whether we already have a call with this request SeqNum */
2008-01-09 08:34:58 +00:00
list = g_list_first ( tapinfo - > callsinfo_list ) ;
2005-02-07 21:09:23 +00:00
while ( list )
{
2013-03-21 02:58:59 +00:00
tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2006-07-25 09:21:41 +00:00
g_assert ( tmp_listinfo ! = NULL ) ;
2012-04-04 16:55:14 +00:00
if ( tmp_listinfo - > protocol = = VOIP_H323 ) {
2013-03-21 02:58:59 +00:00
tmp_h323info = ( h323_calls_info_t * ) tmp_listinfo - > prot_info ;
2005-02-07 21:09:23 +00:00
if ( tmp_h323info - > requestSeqNum = = pi - > requestSeqNum ) {
2008-01-09 08:34:58 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
2005-02-07 21:09:23 +00:00
break ;
}
}
list = g_list_next ( list ) ;
}
2005-02-01 12:12:35 +00:00
} else {
2006-07-25 09:21:41 +00:00
/* check whether we already have a call with this guid in the list */
2008-01-09 08:34:58 +00:00
list = g_list_first ( tapinfo - > callsinfo_list ) ;
2005-02-01 12:12:35 +00:00
while ( list )
{
2013-03-21 02:58:59 +00:00
tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2012-04-04 16:55:14 +00:00
if ( tmp_listinfo - > protocol = = VOIP_H323 ) {
2013-03-21 02:58:59 +00:00
tmp_h323info = ( h323_calls_info_t * ) tmp_listinfo - > prot_info ;
2006-06-22 11:08:35 +00:00
g_assert ( tmp_h323info ! = NULL ) ;
2012-04-04 16:55:14 +00:00
if ( ( memcmp ( tmp_h323info - > guid , & guid_allzero , GUID_LEN ) ! = 0 ) & & ( memcmp ( tmp_h323info - > guid , & pi - > guid , GUID_LEN ) = = 0 ) ) {
2008-01-09 08:34:58 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
2005-02-01 12:12:35 +00:00
break ;
}
}
list = g_list_next ( list ) ;
}
}
2008-08-05 17:33:14 +00:00
2005-04-14 00:26:11 +00:00
h225_cstype = pi - > cs_type ;
h225_is_faststart = pi - > is_faststart ;
2005-02-01 12:12:35 +00:00
/* not in the list? then create a new entry */
2012-04-04 16:55:14 +00:00
if ( callsinfo = = NULL ) {
2013-03-21 02:58:59 +00:00
callsinfo = ( voip_calls_info_t * ) g_malloc0 ( sizeof ( voip_calls_info_t ) ) ;
2008-01-09 08:34:58 +00:00
callsinfo - > call_active_state = VOIP_ACTIVE ;
callsinfo - > call_state = VOIP_UNKNOWN ;
callsinfo - > from_identity = g_strdup ( " " ) ;
callsinfo - > to_identity = g_strdup ( " " ) ;
COPY_ADDRESS ( & ( callsinfo - > initial_speaker ) , & ( pinfo - > src ) ) ;
callsinfo - > selected = FALSE ;
2011-09-13 05:29:56 +00:00
callsinfo - > start_fd = pinfo - > fd ;
2008-01-09 08:34:58 +00:00
callsinfo - > protocol = VOIP_H323 ;
callsinfo - > prot_info = g_malloc ( sizeof ( h323_calls_info_t ) ) ;
callsinfo - > free_prot_info = free_h225_info ;
2008-08-05 17:33:14 +00:00
2013-03-21 02:58:59 +00:00
tmp_h323info = ( h323_calls_info_t * ) callsinfo - > prot_info ;
2006-06-22 11:08:35 +00:00
g_assert ( tmp_h323info ! = NULL ) ;
2013-03-21 02:58:59 +00:00
tmp_h323info - > guid = ( e_guid_t * ) g_memdup ( & pi - > guid , sizeof pi - > guid ) ;
2005-02-24 21:31:20 +00:00
tmp_h323info - > h225SetupAddr . type = AT_NONE ;
tmp_h323info - > h225SetupAddr . len = 0 ;
2005-02-01 12:12:35 +00:00
tmp_h323info - > h245_list = NULL ;
tmp_h323info - > is_faststart_Setup = FALSE ;
tmp_h323info - > is_faststart_Proc = FALSE ;
tmp_h323info - > is_h245Tunneling = FALSE ;
tmp_h323info - > is_h245 = FALSE ;
tmp_h323info - > q931_crv = - 1 ;
tmp_h323info - > q931_crv2 = - 1 ;
2005-02-07 21:09:23 +00:00
tmp_h323info - > requestSeqNum = 0 ;
2008-01-09 08:34:58 +00:00
callsinfo - > call_num = tapinfo - > ncalls + + ;
callsinfo - > npackets = 0 ;
2008-08-05 17:33:14 +00:00
2012-02-07 06:56:45 +00:00
tapinfo - > callsinfo_list = g_list_prepend ( tapinfo - > callsinfo_list , callsinfo ) ;
2005-02-21 22:53:01 +00:00
}
2005-02-24 21:31:20 +00:00
2012-04-04 16:57:31 +00:00
h225_frame_num = pinfo - > fd - > num ;
h225_call_num = callsinfo - > call_num ;
2005-02-24 21:31:20 +00:00
2012-04-04 16:57:31 +00:00
/* let's analyze the call state */
2005-04-14 00:26:11 +00:00
2012-04-04 16:57:31 +00:00
callsinfo - > stop_fd = pinfo - > fd ;
+ + ( callsinfo - > npackets ) ;
/* increment the packets counter of all calls */
+ + ( tapinfo - > npackets ) ;
2005-02-24 21:31:20 +00:00
2012-04-04 16:57:31 +00:00
/* XXX: it is supposed to be initialized isn't it? */
g_assert ( tmp_h323info ! = NULL ) ;
2005-02-24 21:31:20 +00:00
2012-04-04 16:57:31 +00:00
/* change the status */
if ( pi - > msg_type = = H225_CS ) {
2005-02-24 21:31:20 +00:00
2012-04-04 16:57:31 +00:00
/* this is still IPv4 only, because the dissector is */
if ( pi - > is_h245 = = TRUE ) {
2013-03-21 02:58:59 +00:00
h245_add = ( h245_address_t * ) g_malloc ( sizeof ( h245_address_t ) ) ;
2012-04-04 16:57:31 +00:00
h245_add - > h245_address . type = AT_IPv4 ;
h245_add - > h245_address . len = 4 ;
h245_add - > h245_address . data = g_malloc ( sizeof ( pi - > h245_address ) ) ;
memcpy ( ( void * ) ( h245_add - > h245_address . data ) , & ( pi - > h245_address ) , 4 ) ;
h245_add - > h245_port = pi - > h245_port ;
add_h245_Address ( tmp_h323info , h245_add ) ;
}
2005-02-24 21:31:20 +00:00
2012-04-04 16:57:31 +00:00
if ( pi - > cs_type ! = H225_RELEASE_COMPLET ) tmp_h323info - > is_h245Tunneling = pi - > is_h245Tunneling ;
2005-02-24 21:31:20 +00:00
2012-04-04 16:57:31 +00:00
frame_label = g_strdup ( pi - > frame_label ) ;
2005-02-24 21:31:20 +00:00
2012-04-04 16:57:31 +00:00
switch ( pi - > cs_type ) {
case H225_SETUP :
tmp_h323info - > is_faststart_Setup = pi - > is_faststart ;
2005-04-14 00:26:11 +00:00
2012-04-04 16:57:31 +00:00
/* Set the Setup address if it was not set */
if ( tmp_h323info - > h225SetupAddr . type = = AT_NONE )
COPY_ADDRESS ( & ( tmp_h323info - > h225SetupAddr ) , & ( pinfo - > src ) ) ;
callsinfo - > call_state = VOIP_CALL_SETUP ;
comment = g_strdup_printf ( " H225 TunnH245:%s FS:%s " , ( tmp_h323info - > is_h245Tunneling = = TRUE ? " on " : " off " ) ,
( pi - > is_faststart = = TRUE ? " on " : " off " ) ) ;
break ;
case H225_CONNECT :
callsinfo - > call_state = VOIP_IN_CALL ;
if ( pi - > is_faststart = = TRUE ) tmp_h323info - > is_faststart_Proc = TRUE ;
2008-08-05 17:33:14 +00:00
comment = g_strdup_printf ( " H225 TunnH245:%s FS:%s " , ( tmp_h323info - > is_h245Tunneling = = TRUE ? " on " : " off " ) ,
2005-02-21 22:53:01 +00:00
( pi - > is_faststart = = TRUE ? " on " : " off " ) ) ;
2012-04-04 16:57:31 +00:00
break ;
case H225_RELEASE_COMPLET :
if ( callsinfo - > call_state = = VOIP_CALL_SETUP ) {
if ( ADDRESSES_EQUAL ( & ( tmp_h323info - > h225SetupAddr ) , & ( pinfo - > src ) ) ) { /* forward direction */
callsinfo - > call_state = VOIP_CANCELLED ;
2005-02-01 12:12:35 +00:00
}
2012-04-04 16:57:31 +00:00
else { /* reverse */
callsinfo - > call_state = VOIP_REJECTED ;
tapinfo - > rejected_calls + + ;
}
} else {
callsinfo - > call_state = VOIP_COMPLETED ;
tapinfo - > completed_calls + + ;
2008-08-05 17:33:14 +00:00
}
2012-04-04 16:57:31 +00:00
comment = g_strdup ( " H225 No Q931 Rel Cause " ) ;
break ;
case H225_PROGRESS :
case H225_ALERTING :
case H225_CALL_PROCEDING :
if ( pi - > is_faststart = = TRUE ) tmp_h323info - > is_faststart_Proc = TRUE ;
comment = g_strdup_printf ( " H225 TunnH245:%s FS:%s " , ( tmp_h323info - > is_h245Tunneling = = TRUE ? " on " : " off " ) ,
( pi - > is_faststart = = TRUE ? " on " : " off " ) ) ;
break ;
default :
comment = g_strdup_printf ( " H225 TunnH245:%s FS:%s " , ( tmp_h323info - > is_h245Tunneling = = TRUE ? " on " : " off " ) ,
( pi - > is_faststart = = TRUE ? " on " : " off " ) ) ;
2008-08-05 17:33:14 +00:00
}
2012-04-04 16:57:31 +00:00
}
else if ( pi - > msg_type = = H225_RAS ) {
switch ( pi - > msg_tag ) {
case 18 : /* LRQ */
if ( ! pi - > is_duplicate ) {
g_free ( callsinfo - > to_identity ) ;
callsinfo - > to_identity = g_strdup ( pi - > dialedDigits ) ;
tmp_h323info - > requestSeqNum = pi - > requestSeqNum ;
2008-12-19 11:30:50 +00:00
}
2012-04-04 16:57:31 +00:00
case 19 : /* LCF */
if ( strlen ( pi - > dialedDigits ) )
comment = g_strdup_printf ( " H225 RAS dialedDigits: %s " , pi - > dialedDigits ) ;
else
comment = g_strdup ( " H225 RAS " ) ;
break ;
default :
comment = g_strdup ( " H225 RAS " ) ;
2005-02-01 12:12:35 +00:00
}
2012-04-04 16:57:31 +00:00
frame_label = g_strdup ( val_to_str_const ( pi - > msg_tag , h225_RasMessage_vals , " <unknown> " ) ) ;
} else {
frame_label = g_strdup ( " H225: Unknown " ) ;
comment = NULL ;
}
2005-02-01 12:12:35 +00:00
2012-04-04 16:57:31 +00:00
/* add to graph analysis */
2005-02-01 12:12:35 +00:00
2012-04-04 16:57:31 +00:00
/* if the frame number exists in graph, append to it*/
if ( ! append_to_frame_graph ( tapinfo , pinfo - > fd - > num , pi - > frame_label , comment ) ) {
/* if not exist, add to the graph */
add_to_graph ( tapinfo , pinfo , frame_label , comment , callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
}
2005-04-14 00:26:11 +00:00
2012-04-04 16:57:31 +00:00
/* Add the H245 info if exists to the Graph */
h245_add_to_graph ( pinfo - > fd - > num ) ;
2008-08-05 17:33:14 +00:00
2012-04-04 16:57:31 +00:00
g_free ( frame_label ) ;
g_free ( comment ) ;
2008-08-05 17:33:14 +00:00
From Alejandro Vaquero
- avoid the clist of the calls dlg to be refreshed multiple times when
first appear.
- destroy the Graph window when the data is not valid anymore.
- fixes an H245 packet count error
- resizing the Graph windows when is displayed (up to 5 columns).
With a change to leave static voip_calls_tapinfo_t the_tapinfo_struct =
{0, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0};
alone.
svn path=/trunk/; revision=14852
2005-07-05 05:16:28 +00:00
tapinfo - > redraw = TRUE ;
2005-02-01 12:12:35 +00:00
return 1 ; /* refresh output */
}
/****************************************************************************/
/* TAP INTERFACE */
/****************************************************************************/
static gboolean have_H225_tap_listener = FALSE ;
/****************************************************************************/
void
h225_calls_init_tap ( void )
{
GString * error_string ;
if ( have_H225_tap_listener = = FALSE )
{
/* don't register tap listener, if we have it already */
2005-02-02 01:02:09 +00:00
error_string = register_tap_listener ( " h225 " , & ( the_tapinfo_struct . h225_dummy ) , NULL ,
2009-06-05 22:42:47 +00:00
0 ,
2008-08-05 17:33:14 +00:00
voip_calls_dlg_reset ,
H225calls_packet ,
2005-02-02 01:02:09 +00:00
voip_calls_dlg_draw
) ;
2008-08-05 17:33:14 +00:00
2005-02-01 12:12:35 +00:00
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2005-02-01 12:12:35 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_H225_tap_listener = TRUE ;
}
}
/****************************************************************************/
void
remove_tap_listener_h225_calls ( void )
{
2005-02-02 01:02:09 +00:00
remove_tap_listener ( & ( the_tapinfo_struct . h225_dummy ) ) ;
2005-02-01 12:12:35 +00:00
have_H225_tap_listener = FALSE ;
}
2008-08-05 17:33:14 +00:00
/* Add the h245 label info to the graph */
2005-04-14 00:26:11 +00:00
void h245_add_to_graph ( guint32 new_frame_num )
{
gint8 n ;
2008-08-05 17:33:14 +00:00
2005-04-14 00:26:11 +00:00
if ( new_frame_num ! = h245_labels . frame_num ) return ;
for ( n = 0 ; n < h245_labels . labels_count ; n + + ) {
append_to_frame_graph ( & the_tapinfo_struct , new_frame_num , h245_labels . labels [ n ] . frame_label , h245_labels . labels [ n ] . comment ) ;
g_free ( h245_labels . labels [ n ] . frame_label ) ;
h245_labels . labels [ n ] . frame_label = NULL ;
g_free ( h245_labels . labels [ n ] . comment ) ;
h245_labels . labels [ n ] . comment = NULL ;
}
h245_labels . frame_num = 0 ;
h245_labels . labels_count = 0 ;
}
2008-08-05 17:33:14 +00:00
/* free the h245_labels if the frame number is different */
2005-08-20 14:02:00 +00:00
static void h245_free_labels ( guint32 new_frame_num )
2005-04-14 00:26:11 +00:00
{
gint8 n ;
2008-08-05 17:33:14 +00:00
2005-04-14 00:26:11 +00:00
if ( new_frame_num = = h245_labels . frame_num ) return ;
for ( n = 0 ; n < h245_labels . labels_count ; n + + ) {
g_free ( h245_labels . labels [ n ] . frame_label ) ;
h245_labels . labels [ n ] . frame_label = NULL ;
g_free ( h245_labels . labels [ n ] . comment ) ;
h245_labels . labels [ n ] . comment = NULL ;
}
h245_labels . frame_num = 0 ;
h245_labels . labels_count = 0 ;
}
2008-08-05 17:33:14 +00:00
/* add the frame_label and comment to h245_labels and free the actual one if it is different frame num */
2007-05-29 02:29:38 +00:00
static void h245_add_label ( guint32 new_frame_num , const gchar * frame_label , const gchar * comment )
2005-04-14 00:26:11 +00:00
{
h245_free_labels ( new_frame_num ) ;
h245_labels . frame_num = new_frame_num ;
h245_labels . labels [ h245_labels . labels_count ] . frame_label = g_strdup ( frame_label ) ;
h245_labels . labels [ h245_labels . labels_count ] . comment = g_strdup ( comment ) ;
if ( h245_labels . labels_count < ( H245_MAX - 1 ) )
h245_labels . labels_count + + ;
}
2005-02-01 12:12:35 +00:00
/****************************************************************************/
/* whenever a H245dg packet is seen by the tap listener (when H245 tunneling is ON) */
2008-08-05 17:33:14 +00:00
static int
2005-02-02 01:02:09 +00:00
H245dgcalls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * H245info )
2005-02-01 12:12:35 +00:00
{
2005-02-02 01:02:09 +00:00
voip_calls_tapinfo_t * tapinfo = & the_tapinfo_struct ;
2005-02-01 12:12:35 +00:00
voip_calls_info_t * tmp_listinfo ;
2008-01-09 08:34:58 +00:00
voip_calls_info_t * callsinfo = NULL ;
2005-02-01 12:12:35 +00:00
h323_calls_info_t * tmp_h323info ;
2008-12-19 11:30:50 +00:00
GList * list ;
GList * list2 ;
2005-02-01 12:12:35 +00:00
h245_address_t * h245_add = NULL ;
2013-03-21 02:58:59 +00:00
const h245_packet_info * pi = ( h245_packet_info * ) H245info ;
2005-02-01 12:12:35 +00:00
2005-04-14 00:26:11 +00:00
/* check if Tunneling is OFF and we have a call with this H245 add */
2008-01-09 08:34:58 +00:00
list = g_list_first ( tapinfo - > callsinfo_list ) ;
2005-02-01 12:12:35 +00:00
while ( list )
{
2013-03-21 02:58:59 +00:00
tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2012-04-04 16:55:14 +00:00
if ( tmp_listinfo - > protocol = = VOIP_H323 ) {
2013-03-21 02:58:59 +00:00
tmp_h323info = ( h323_calls_info_t * ) tmp_listinfo - > prot_info ;
2005-02-01 12:12:35 +00:00
list2 = g_list_first ( tmp_h323info - > h245_list ) ;
while ( list2 )
{
2013-03-21 02:58:59 +00:00
h245_add = ( h245_address_t * ) list2 - > data ;
2008-11-25 08:21:53 +00:00
if ( ( ADDRESSES_EQUAL ( & ( h245_add - > h245_address ) , & ( pinfo - > src ) ) & & ( h245_add - > h245_port = = pinfo - > srcport ) )
2012-04-04 16:55:14 +00:00
| | ( ADDRESSES_EQUAL ( & ( h245_add - > h245_address ) , & ( pinfo - > dst ) ) & & ( h245_add - > h245_port = = pinfo - > destport ) ) ) {
2008-01-09 08:34:58 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
2005-02-01 12:12:35 +00:00
2008-01-09 08:34:58 +00:00
+ + ( callsinfo - > npackets ) ;
2005-02-01 12:12:35 +00:00
/* increment the packets counter of all calls */
+ + ( tapinfo - > npackets ) ;
break ;
2008-08-05 17:33:14 +00:00
}
2008-12-19 11:30:50 +00:00
list2 = g_list_next ( list2 ) ;
2005-02-01 12:12:35 +00:00
}
2008-01-09 08:34:58 +00:00
if ( callsinfo ! = NULL ) break ;
2005-02-01 12:12:35 +00:00
}
list = g_list_next ( list ) ;
}
2005-04-14 00:26:11 +00:00
/* Tunnel is OFF, and we matched the h245 add so we add it to graph */
2012-04-04 16:55:14 +00:00
if ( callsinfo ! = NULL ) {
2008-01-09 08:34:58 +00:00
+ + ( callsinfo - > npackets ) ;
From Alejandro Vaquero
- avoid the clist of the calls dlg to be refreshed multiple times when
first appear.
- destroy the Graph window when the data is not valid anymore.
- fixes an H245 packet count error
- resizing the Graph windows when is displayed (up to 5 columns).
With a change to leave static voip_calls_tapinfo_t the_tapinfo_struct =
{0, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0};
alone.
svn path=/trunk/; revision=14852
2005-07-05 05:16:28 +00:00
/* increment the packets counter of all calls */
+ + ( tapinfo - > npackets ) ;
2005-04-14 00:26:11 +00:00
/* if the frame number exists in graph, append to it*/
2008-11-25 08:21:53 +00:00
if ( ! append_to_frame_graph ( tapinfo , pinfo - > fd - > num , pi - > frame_label , pi - > comment ) ) {
2005-04-14 00:26:11 +00:00
/* if not exist, add to the graph */
2008-11-25 08:21:53 +00:00
add_to_graph ( tapinfo , pinfo , pi - > frame_label , pi - > comment , callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
2005-04-14 00:26:11 +00:00
}
2008-08-05 17:33:14 +00:00
} else {
/* Tunnel is ON, so we save the label info to use it into h225 or q931 tap. OR may be
tunnel OFF but we did not matched the h245 add , in this case nobady will set this label
since the frame_num will not match */
2005-04-14 00:26:11 +00:00
h245_add_label ( pinfo - > fd - > num , ( gchar * ) pi - > frame_label , ( gchar * ) pi - > comment ) ;
2005-02-01 12:12:35 +00:00
}
From Alejandro Vaquero
- avoid the clist of the calls dlg to be refreshed multiple times when
first appear.
- destroy the Graph window when the data is not valid anymore.
- fixes an H245 packet count error
- resizing the Graph windows when is displayed (up to 5 columns).
With a change to leave static voip_calls_tapinfo_t the_tapinfo_struct =
{0, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0};
alone.
svn path=/trunk/; revision=14852
2005-07-05 05:16:28 +00:00
tapinfo - > redraw = TRUE ;
2005-02-01 12:12:35 +00:00
return 1 ; /* refresh output */
}
/****************************************************************************/
/* TAP INTERFACE */
/****************************************************************************/
static gboolean have_H245dg_tap_listener = FALSE ;
/****************************************************************************/
void
h245dg_calls_init_tap ( void )
{
GString * error_string ;
if ( have_H245dg_tap_listener = = FALSE )
{
/* don't register tap listener, if we have it already */
2005-02-02 01:02:09 +00:00
error_string = register_tap_listener ( " h245dg " , & ( the_tapinfo_struct . h245dg_dummy ) , NULL ,
2009-06-05 22:42:47 +00:00
0 ,
2005-02-02 01:02:09 +00:00
voip_calls_dlg_reset ,
2008-08-05 17:33:14 +00:00
H245dgcalls_packet ,
2005-02-02 01:02:09 +00:00
voip_calls_dlg_draw
) ;
2008-08-05 17:33:14 +00:00
2005-02-01 12:12:35 +00:00
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2005-02-01 12:12:35 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_H245dg_tap_listener = TRUE ;
}
}
/****************************************************************************/
void
remove_tap_listener_h245dg_calls ( void )
{
2005-02-02 01:02:09 +00:00
remove_tap_listener ( & ( the_tapinfo_struct . h245dg_dummy ) ) ;
2005-02-01 12:12:35 +00:00
have_H245dg_tap_listener = FALSE ;
}
/****************************************************************************/
/****************************TAP for SDP PROTOCOL ***************************/
/****************************************************************************/
/* whenever a SDP packet is seen by the tap listener */
2008-08-05 17:33:14 +00:00
static int
2005-02-02 01:02:09 +00:00
SDPcalls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * SDPinfo )
2005-02-01 12:12:35 +00:00
{
2005-02-02 01:02:09 +00:00
voip_calls_tapinfo_t * tapinfo = & the_tapinfo_struct ;
2013-03-21 02:58:59 +00:00
const sdp_packet_info * pi = ( sdp_packet_info * ) SDPinfo ;
2005-02-20 15:53:11 +00:00
2005-04-14 00:26:11 +00:00
/* There are protocols like MGCP/SIP where the SDP is called before the tap for the
MGCP / SIP packet , in those cases we assign the SPD summary to global lastSDPsummary
2008-08-05 17:33:14 +00:00
to use it later
2005-02-20 15:53:11 +00:00
*/
g_free ( sdp_summary ) ;
sdp_frame_num = pinfo - > fd - > num ;
2005-02-01 12:12:35 +00:00
/* Append to graph the SDP summary if the packet exists */
2005-02-20 15:53:11 +00:00
sdp_summary = g_strdup_printf ( " SDP (%s) " , pi - > summary_str ) ;
append_to_frame_graph ( tapinfo , pinfo - > fd - > num , sdp_summary , NULL ) ;
2005-02-01 12:12:35 +00:00
From Alejandro Vaquero
- avoid the clist of the calls dlg to be refreshed multiple times when
first appear.
- destroy the Graph window when the data is not valid anymore.
- fixes an H245 packet count error
- resizing the Graph windows when is displayed (up to 5 columns).
With a change to leave static voip_calls_tapinfo_t the_tapinfo_struct =
{0, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0};
alone.
svn path=/trunk/; revision=14852
2005-07-05 05:16:28 +00:00
tapinfo - > redraw = TRUE ;
2005-02-01 12:12:35 +00:00
return 1 ; /* refresh output */
}
/****************************************************************************/
/* TAP INTERFACE */
/****************************************************************************/
static gboolean have_sdp_tap_listener = FALSE ;
/****************************************************************************/
void
sdp_calls_init_tap ( void )
{
GString * error_string ;
if ( have_sdp_tap_listener = = FALSE )
{
/* don't register tap listener, if we have it already */
2005-02-02 01:02:09 +00:00
error_string = register_tap_listener ( " sdp " , & ( the_tapinfo_struct . sdp_dummy ) , NULL ,
2009-06-05 22:42:47 +00:00
0 ,
2008-08-05 17:33:14 +00:00
voip_calls_dlg_reset ,
SDPcalls_packet ,
2005-02-02 01:02:09 +00:00
voip_calls_dlg_draw
) ;
2008-08-05 17:33:14 +00:00
2005-02-01 12:12:35 +00:00
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2005-02-01 12:12:35 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_sdp_tap_listener = TRUE ;
}
}
/****************************************************************************/
void
remove_tap_listener_sdp_calls ( void )
{
2005-02-02 01:02:09 +00:00
remove_tap_listener ( & ( the_tapinfo_struct . sdp_dummy ) ) ;
2005-02-01 12:12:35 +00:00
have_sdp_tap_listener = FALSE ;
}
2005-02-20 15:53:11 +00:00
/****************************************************************************/
/* ***************************TAP for MGCP **********************************/
/****************************************************************************/
/*
This function will look for a signal / event in the SignalReq / ObsEvent string
2008-08-05 17:33:14 +00:00
and return true if it is found
2005-02-20 15:53:11 +00:00
*/
2010-01-29 19:09:01 +00:00
static gboolean isSignal ( const gchar * signal_str_p , const gchar * signalStr )
2005-02-20 15:53:11 +00:00
{
2008-08-05 17:33:14 +00:00
gint i ;
2005-02-20 15:53:11 +00:00
gchar * * resultArray ;
2008-08-05 17:33:14 +00:00
2005-02-20 15:53:11 +00:00
/* if there is no signalStr, just return false */
if ( signalStr = = NULL ) return FALSE ;
/* if are both "blank" return true */
2010-01-29 19:09:01 +00:00
if ( ( * signal_str_p = = ' \0 ' ) & & ( * signalStr = = ' \0 ' ) ) return TRUE ;
2005-02-20 15:53:11 +00:00
2010-01-29 19:09:01 +00:00
/* look for signal in signalStr */
2005-02-20 15:53:11 +00:00
resultArray = g_strsplit ( signalStr , " , " , 10 ) ;
for ( i = 0 ; resultArray [ i ] ; i + + ) {
g_strstrip ( resultArray [ i ] ) ;
2010-01-29 19:09:01 +00:00
if ( strcmp ( resultArray [ i ] , signal_str_p ) = = 0 ) return TRUE ;
2005-02-20 15:53:11 +00:00
}
g_strfreev ( resultArray ) ;
2008-08-05 17:33:14 +00:00
2005-02-20 15:53:11 +00:00
return FALSE ;
}
/*
This function will get the Caller ID info and replace the current string
This is how it looks the caller Id : rg , ci ( 02 / 16 / 08 / 29 , " 3035550002 " , " Ale Sipura 2 " )
*/
2005-08-20 14:02:00 +00:00
static void mgcpCallerID ( gchar * signalStr , gchar * * callerId )
2005-02-20 15:53:11 +00:00
{
gchar * * arrayStr ;
2008-08-05 17:33:14 +00:00
2005-02-20 15:53:11 +00:00
/* if there is no signalStr, just return false */
if ( signalStr = = NULL ) return ;
arrayStr = g_strsplit ( signalStr , " \" " , 10 ) ;
if ( arrayStr [ 0 ] = = NULL ) return ;
/* look for the ci signal */
2005-02-23 08:37:30 +00:00
if ( strstr ( arrayStr [ 0 ] , " ci( " ) & & ( arrayStr [ 1 ] ! = NULL ) ) {
2005-02-22 19:37:46 +00:00
/* free the previous "From" field of the call, and assign the new */
g_free ( * callerId ) ;
* callerId = g_strdup ( arrayStr [ 1 ] ) ;
2005-02-20 15:53:11 +00:00
}
g_strfreev ( arrayStr ) ;
return ;
}
/*
This function will get the Dialed Digits and replace the current string
This is how it looks the dialed digits 5 , 5 , 5 , 0 , 0 , 0 , 2 , # , *
*/
2005-08-20 14:02:00 +00:00
static void mgcpDialedDigits ( gchar * signalStr , gchar * * dialedDigits )
2005-02-20 15:53:11 +00:00
{
gchar * tmpStr ;
2012-09-01 23:33:54 +00:00
gchar * resultStr ;
2008-08-05 17:33:14 +00:00
gint i , j ;
2005-02-20 15:53:11 +00:00
2012-09-01 23:33:54 +00:00
/* start with 1 for the null-terminator */
guint resultStrLen = 1 ;
2005-02-20 15:53:11 +00:00
/* if there is no signalStr, just return false */
if ( signalStr = = NULL ) return ;
tmpStr = g_strdup ( signalStr ) ;
2008-08-05 17:33:14 +00:00
2005-02-21 22:53:01 +00:00
for ( i = 0 ; tmpStr [ i ] ; i + + ) {
switch ( tmpStr [ i ] ) {
case ' 0 ' : case ' 1 ' : case ' 2 ' : case ' 3 ' : case ' 4 ' :
case ' 5 ' : case ' 6 ' : case ' 7 ' : case ' 8 ' : case ' 9 ' :
case ' # ' : case ' * ' :
2012-09-01 23:33:54 +00:00
resultStrLen + + ;
2005-02-21 22:53:01 +00:00
break ;
default :
tmpStr [ i ] = ' ? ' ;
break ;
}
}
2008-08-05 17:33:14 +00:00
2012-09-01 23:33:54 +00:00
if ( resultStrLen = = 1 ) {
g_free ( tmpStr ) ;
return ;
}
2013-03-21 02:58:59 +00:00
resultStr = ( gchar * ) g_malloc ( resultStrLen ) ;
2012-09-01 23:33:54 +00:00
for ( i = 0 , j = 0 ; tmpStr [ i ] ; i + + ) {
2005-02-20 15:53:11 +00:00
if ( tmpStr [ i ] ! = ' ? ' )
resultStr [ j + + ] = tmpStr [ i ] ;
}
resultStr [ j ] = ' \0 ' ;
g_free ( * dialedDigits ) ;
g_free ( tmpStr ) ;
2013-02-26 04:42:26 +00:00
2012-09-01 23:33:54 +00:00
* dialedDigits = resultStr ;
2005-02-20 15:53:11 +00:00
return ;
}
/****************************************************************************/
/* whenever a MGCP packet is seen by the tap listener */
2008-08-05 17:33:14 +00:00
static int
2005-02-20 15:53:11 +00:00
MGCPcalls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * MGCPinfo )
{
voip_calls_tapinfo_t * tapinfo = & the_tapinfo_struct ;
voip_calls_info_t * tmp_listinfo ;
2008-01-09 08:34:58 +00:00
voip_calls_info_t * callsinfo = NULL ;
2005-02-21 02:36:55 +00:00
mgcp_calls_info_t * tmp_mgcpinfo = NULL ;
2008-12-19 11:30:50 +00:00
GList * list ;
GList * listGraph ;
2005-02-20 15:53:11 +00:00
gchar * frame_label = NULL ;
gchar * comment = NULL ;
graph_analysis_item_t * gai ;
2013-03-21 02:58:59 +00:00
gboolean newcall = FALSE ;
2005-02-21 02:36:55 +00:00
gboolean fromEndpoint = FALSE ; /* true for calls originated in Endpoints, false for calls from MGC */
2005-02-20 15:53:11 +00:00
gdouble diff_time ;
2013-03-21 02:58:59 +00:00
const mgcp_info_t * pi = ( mgcp_info_t * ) MGCPinfo ;
2005-02-20 15:53:11 +00:00
2012-04-04 16:55:14 +00:00
if ( ( pi - > mgcp_type = = MGCP_REQUEST ) & & ! pi - > is_duplicate ) {
2006-07-25 09:21:41 +00:00
/* check whether we already have a call with this Endpoint and it is active*/
2008-01-09 08:34:58 +00:00
list = g_list_first ( tapinfo - > callsinfo_list ) ;
2005-02-20 15:53:11 +00:00
while ( list )
{
2013-03-21 02:58:59 +00:00
tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2012-04-04 16:55:14 +00:00
if ( ( tmp_listinfo - > protocol = = VOIP_MGCP ) & & ( tmp_listinfo - > call_active_state = = VOIP_ACTIVE ) ) {
2013-03-21 02:58:59 +00:00
tmp_mgcpinfo = ( mgcp_calls_info_t * ) tmp_listinfo - > prot_info ;
2012-04-04 16:55:14 +00:00
if ( pi - > endpointId ! = NULL ) {
if ( g_ascii_strcasecmp ( tmp_mgcpinfo - > endpointId , pi - > endpointId ) = = 0 ) {
2005-02-20 15:53:11 +00:00
/*
2006-07-05 05:18:06 +00:00
check first if it is an ended call . We can still match packets to this Endpoint 2 seconds
after the call has been released
2005-02-20 15:53:11 +00:00
*/
2011-09-13 05:29:56 +00:00
diff_time = nstime_to_sec ( & pinfo - > fd - > rel_ts ) - nstime_to_sec ( & tmp_listinfo - > stop_fd - > rel_ts ) ;
2006-07-05 05:18:06 +00:00
if ( ( ( tmp_listinfo - > call_state = = VOIP_CANCELLED ) | |
( tmp_listinfo - > call_state = = VOIP_COMPLETED ) | |
( tmp_listinfo - > call_state = = VOIP_REJECTED ) ) & &
( diff_time > 2 ) )
{
2005-02-20 15:53:11 +00:00
tmp_listinfo - > call_active_state = VOIP_INACTIVE ;
} else {
2008-01-09 08:34:58 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
2005-02-20 15:53:11 +00:00
break ;
}
}
}
}
list = g_list_next ( list ) ;
}
2008-08-05 17:33:14 +00:00
2005-02-20 15:53:11 +00:00
/* there is no call with this Endpoint, lets see if this a new call or not */
2012-04-04 16:55:14 +00:00
if ( callsinfo = = NULL ) {
if ( ( strcmp ( pi - > code , " NTFY " ) = = 0 ) & & isSignal ( " hd " , pi - > observedEvents ) ) { /* off hook transition */
2008-08-05 17:33:14 +00:00
/* this is a new call from the Endpoint */
2005-02-20 15:53:11 +00:00
fromEndpoint = TRUE ;
2013-03-21 02:58:59 +00:00
newcall = TRUE ;
2012-04-04 16:55:14 +00:00
} else if ( strcmp ( pi - > code , " CRCX " ) = = 0 ) {
2005-02-20 15:53:11 +00:00
/* this is a new call from the MGC */
fromEndpoint = FALSE ;
2013-03-21 02:58:59 +00:00
newcall = TRUE ;
2005-02-20 15:53:11 +00:00
}
2013-03-21 02:58:59 +00:00
if ( ! newcall ) return 0 ;
2008-08-05 17:33:14 +00:00
}
2005-02-20 15:53:11 +00:00
} else if ( ( ( pi - > mgcp_type = = MGCP_RESPONSE ) & & pi - > request_available ) | |
( ( pi - > mgcp_type = = MGCP_REQUEST ) & & pi - > is_duplicate ) ) {
2006-06-15 21:38:37 +00:00
/* if it is a response OR if it is a duplicated Request, lets look in the Graph to see
if there is a request that matches */
2005-02-20 15:53:11 +00:00
listGraph = g_list_first ( tapinfo - > graph_analysis - > list ) ;
while ( listGraph )
{
2013-03-21 02:58:59 +00:00
gai = ( graph_analysis_item_t * ) listGraph - > data ;
2012-04-04 16:55:14 +00:00
if ( gai - > fd - > num = = pi - > req_num ) {
2005-02-20 15:53:11 +00:00
/* there is a request that match, so look the associated call with this call_num */
2008-01-09 08:34:58 +00:00
list = g_list_first ( tapinfo - > callsinfo_list ) ;
2005-02-20 15:53:11 +00:00
while ( list )
{
2013-03-21 02:58:59 +00:00
tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2012-04-04 16:55:14 +00:00
if ( tmp_listinfo - > protocol = = VOIP_MGCP ) {
if ( tmp_listinfo - > call_num = = gai - > conv_num ) {
2013-03-21 02:58:59 +00:00
tmp_mgcpinfo = ( mgcp_calls_info_t * ) tmp_listinfo - > prot_info ;
2008-01-09 08:34:58 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
2005-02-20 15:53:11 +00:00
break ;
}
}
list = g_list_next ( list ) ;
}
2008-01-09 08:34:58 +00:00
if ( callsinfo ! = NULL ) break ;
2005-02-20 15:53:11 +00:00
}
listGraph = g_list_next ( listGraph ) ;
}
/* if there is not a matching request, just return */
2008-01-09 08:34:58 +00:00
if ( callsinfo = = NULL ) return 0 ;
2005-02-20 15:53:11 +00:00
} else return 0 ;
/* not in the list? then create a new entry */
2012-04-04 16:55:14 +00:00
if ( callsinfo = = NULL ) {
2013-03-21 02:58:59 +00:00
callsinfo = ( voip_calls_info_t * ) g_malloc0 ( sizeof ( voip_calls_info_t ) ) ;
2008-01-09 08:34:58 +00:00
callsinfo - > call_active_state = VOIP_ACTIVE ;
callsinfo - > call_state = VOIP_CALL_SETUP ;
2005-02-20 15:53:11 +00:00
if ( fromEndpoint ) {
2008-01-09 08:34:58 +00:00
callsinfo - > from_identity = g_strdup ( pi - > endpointId ) ;
callsinfo - > to_identity = g_strdup ( " " ) ;
2005-02-20 15:53:11 +00:00
} else {
2008-01-09 08:34:58 +00:00
callsinfo - > from_identity = g_strdup ( " " ) ;
callsinfo - > to_identity = g_strdup ( pi - > endpointId ) ;
}
COPY_ADDRESS ( & ( callsinfo - > initial_speaker ) , & ( pinfo - > src ) ) ;
callsinfo - > selected = FALSE ;
2011-09-13 05:29:56 +00:00
callsinfo - > start_fd = pinfo - > fd ;
2008-01-09 08:34:58 +00:00
callsinfo - > protocol = VOIP_MGCP ;
callsinfo - > prot_info = g_malloc ( sizeof ( mgcp_calls_info_t ) ) ;
callsinfo - > free_prot_info = g_free ;
2013-03-21 02:58:59 +00:00
tmp_mgcpinfo = ( mgcp_calls_info_t * ) callsinfo - > prot_info ;
2005-02-20 15:53:11 +00:00
tmp_mgcpinfo - > endpointId = g_strdup ( pi - > endpointId ) ;
tmp_mgcpinfo - > fromEndpoint = fromEndpoint ;
2008-01-09 08:34:58 +00:00
callsinfo - > npackets = 0 ;
callsinfo - > call_num = tapinfo - > ncalls + + ;
2012-02-07 06:56:45 +00:00
tapinfo - > callsinfo_list = g_list_prepend ( tapinfo - > callsinfo_list , callsinfo ) ;
2005-02-20 15:53:11 +00:00
}
2005-02-21 02:36:55 +00:00
g_assert ( tmp_mgcpinfo ! = NULL ) ;
2005-02-20 15:53:11 +00:00
/* change call state and add to graph */
switch ( pi - > mgcp_type )
{
case MGCP_REQUEST :
2012-04-04 16:55:14 +00:00
if ( ( strcmp ( pi - > code , " NTFY " ) = = 0 ) & & ( pi - > observedEvents ! = NULL ) ) {
2005-02-20 15:53:11 +00:00
frame_label = g_strdup_printf ( " %s ObsEvt:%s " , pi - > code , pi - > observedEvents ) ;
2012-04-04 16:55:14 +00:00
if ( tmp_mgcpinfo - > fromEndpoint ) {
2006-01-15 15:01:14 +00:00
/* use the Dialed digits to fill the "To" for the call, but use the first NTFY */
2008-01-09 08:34:58 +00:00
if ( callsinfo - > to_identity [ 0 ] = = ' \0 ' ) mgcpDialedDigits ( pi - > observedEvents , & ( callsinfo - > to_identity ) ) ;
2005-02-20 15:53:11 +00:00
/* from MGC and the user picked up, the call is connected */
2008-08-05 17:33:14 +00:00
} else if ( isSignal ( " hd " , pi - > observedEvents ) )
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_IN_CALL ;
2005-02-20 15:53:11 +00:00
/* hung up signal */
if ( isSignal ( " hu " , pi - > observedEvents ) ) {
2012-04-04 16:55:14 +00:00
if ( ( callsinfo - > call_state = = VOIP_CALL_SETUP ) | | ( callsinfo - > call_state = = VOIP_RINGING ) ) {
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_CANCELLED ;
2005-02-20 15:53:11 +00:00
} else {
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_COMPLETED ;
2005-02-20 15:53:11 +00:00
}
2008-08-05 17:33:14 +00:00
}
2005-02-20 15:53:11 +00:00
} else if ( strcmp ( pi - > code , " RQNT " ) = = 0 ) {
/* for calls from Endpoint: if there is a "no signal" RQNT and the call was RINGING, we assume this is the CONNECT */
2008-08-05 17:33:14 +00:00
if ( tmp_mgcpinfo - > fromEndpoint & & isSignal ( " " , pi - > signalReq ) & & ( callsinfo - > call_state = = VOIP_RINGING ) ) {
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_IN_CALL ;
2005-02-20 15:53:11 +00:00
}
/* if there is ringback or ring tone, change state to ringing */
2008-08-05 17:33:14 +00:00
if ( isSignal ( " rg " , pi - > signalReq ) | | isSignal ( " rt " , pi - > signalReq ) ) {
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_RINGING ;
2005-02-20 15:53:11 +00:00
}
/* if there is a Busy or ReorderTone, and the call was Ringing or Setup the call is Rejected */
2011-01-31 18:58:38 +00:00
if ( ( isSignal ( " ro " , pi - > signalReq ) | | isSignal ( " bz " , pi - > signalReq ) ) & & ( ( callsinfo - > call_state = = VOIP_CALL_SETUP ) | | ( callsinfo - > call_state = = VOIP_RINGING ) ) ) {
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_REJECTED ;
2005-02-20 15:53:11 +00:00
}
if ( pi - > signalReq ! = NULL )
2005-02-21 22:53:01 +00:00
frame_label = g_strdup_printf ( " %s%sSigReq:%s " , pi - > code , ( pi - > hasDigitMap = = TRUE ) ? " DigitMap " : " " , pi - > signalReq ) ;
2005-02-20 15:53:11 +00:00
else
2005-02-21 22:53:01 +00:00
frame_label = g_strdup_printf ( " %s%s " , pi - > code , ( pi - > hasDigitMap = = TRUE ) ? " DigitMap " : " " ) ;
2008-08-05 17:33:14 +00:00
2005-02-20 15:53:11 +00:00
/* use the CallerID info to fill the "From" for the call */
2008-01-09 08:34:58 +00:00
if ( ! tmp_mgcpinfo - > fromEndpoint ) mgcpCallerID ( pi - > signalReq , & ( callsinfo - > from_identity ) ) ;
2005-02-20 15:53:11 +00:00
} else if ( strcmp ( pi - > code , " DLCX " ) = = 0 ) {
/*
if there is a DLCX in a call To an Endpoint and the call was not connected , we use
the DLCX as the end of the call
*/
2012-04-04 16:55:14 +00:00
if ( ! tmp_mgcpinfo - > fromEndpoint ) {
if ( ( callsinfo - > call_state = = VOIP_CALL_SETUP ) | | ( callsinfo - > call_state = = VOIP_RINGING ) ) {
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_CANCELLED ;
2008-08-05 17:33:14 +00:00
}
}
2005-02-20 15:53:11 +00:00
}
2009-03-12 07:56:42 +00:00
if ( frame_label = = NULL ) frame_label = g_strdup ( pi - > code ) ;
2005-02-20 15:53:11 +00:00
break ;
case MGCP_RESPONSE :
2006-06-23 15:22:12 +00:00
frame_label = g_strdup_printf ( " %u (%s) " , pi - > rspcode , pi - > code ) ;
2005-02-20 15:53:11 +00:00
break ;
2005-02-21 02:36:55 +00:00
case MGCP_OTHERS :
/* XXX what to do? */
break ;
2005-02-20 15:53:11 +00:00
}
comment = g_strdup_printf ( " MGCP %s %s%s " , tmp_mgcpinfo - > endpointId , ( pi - > mgcp_type = = MGCP_REQUEST ) ? " Request " : " Response " , pi - > is_duplicate ? " Duplicate " : " " ) ;
2011-09-13 05:29:56 +00:00
callsinfo - > stop_fd = pinfo - > fd ;
2008-01-09 08:34:58 +00:00
+ + ( callsinfo - > npackets ) ;
2005-02-20 15:53:11 +00:00
/* increment the packets counter of all calls */
+ + ( tapinfo - > npackets ) ;
/* add to the graph */
2008-08-05 17:33:14 +00:00
add_to_graph ( tapinfo , pinfo , frame_label , comment , callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
2005-02-20 15:53:11 +00:00
g_free ( comment ) ;
g_free ( frame_label ) ;
/* add SDP info if apply */
2012-04-04 16:55:14 +00:00
if ( ( sdp_summary ! = NULL ) & & ( sdp_frame_num = = pinfo - > fd - > num ) ) {
2005-02-20 15:53:11 +00:00
append_to_frame_graph ( tapinfo , pinfo - > fd - > num , sdp_summary , NULL ) ;
g_free ( sdp_summary ) ;
sdp_summary = NULL ;
}
From Alejandro Vaquero
- avoid the clist of the calls dlg to be refreshed multiple times when
first appear.
- destroy the Graph window when the data is not valid anymore.
- fixes an H245 packet count error
- resizing the Graph windows when is displayed (up to 5 columns).
With a change to leave static voip_calls_tapinfo_t the_tapinfo_struct =
{0, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0};
alone.
svn path=/trunk/; revision=14852
2005-07-05 05:16:28 +00:00
tapinfo - > redraw = TRUE ;
2005-02-20 15:53:11 +00:00
return 1 ; /* refresh output */
}
/****************************************************************************/
/* TAP INTERFACE */
/****************************************************************************/
static gboolean have_MGCP_tap_listener = FALSE ;
/****************************************************************************/
void
mgcp_calls_init_tap ( void )
{
GString * error_string ;
if ( have_MGCP_tap_listener = = FALSE )
{
2010-09-01 17:49:27 +00:00
/*
* Don ' t register the tap listener if we have it already .
* We set TL_REQUIRES_PROTO_TREE to force a non - null " tree "
* in the MGCP dissector ; otherwise , the dissector
* doesn ' t fill in the info passed to the tap ' s packet
* routine .
*/
2010-09-01 12:39:29 +00:00
error_string = register_tap_listener ( " mgcp " ,
& ( the_tapinfo_struct . mgcp_dummy ) ,
NULL ,
TL_REQUIRES_PROTO_TREE ,
2008-08-05 17:33:14 +00:00
voip_calls_dlg_reset ,
MGCPcalls_packet ,
2005-02-20 15:53:11 +00:00
voip_calls_dlg_draw
) ;
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2005-02-20 15:53:11 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_MGCP_tap_listener = TRUE ;
}
}
/****************************************************************************/
void
remove_tap_listener_mgcp_calls ( void )
{
remove_tap_listener ( & ( the_tapinfo_struct . mgcp_dummy ) ) ;
have_MGCP_tap_listener = FALSE ;
}
2005-02-01 12:12:35 +00:00
2005-06-27 06:20:23 +00:00
/****************************************************************************/
/****************************TAP for ACTRACE (AudioCodes trace)**************/
/****************************************************************************/
/* whenever a ACTRACE packet is seen by the tap listener */
2008-08-05 17:33:14 +00:00
static int
2005-06-27 06:20:23 +00:00
ACTRACEcalls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * ACTRACEinfo )
{
voip_calls_tapinfo_t * tapinfo = & the_tapinfo_struct ;
2013-03-21 02:58:59 +00:00
const actrace_info_t * pi = ( const actrace_info_t * ) ACTRACEinfo ;
2005-06-27 06:20:23 +00:00
GList * list ;
actrace_cas_calls_info_t * tmp_actrace_cas_info ;
voip_calls_info_t * tmp_listinfo ;
2008-01-09 08:34:58 +00:00
voip_calls_info_t * callsinfo = NULL ;
2005-06-27 06:20:23 +00:00
actrace_frame_num = pinfo - > fd - > num ;
actrace_trunk = pi - > trunk ;
actrace_direction = pi - > direction ;
2012-04-04 16:55:14 +00:00
if ( pi - > type = = 1 ) { /* is CAS protocol */
2005-06-27 06:20:23 +00:00
address pstn_add ;
gchar * comment = NULL ;
2008-01-09 08:34:58 +00:00
callsinfo = NULL ;
list = g_list_first ( tapinfo - > callsinfo_list ) ;
2005-06-27 06:20:23 +00:00
while ( list )
{
2013-03-21 02:58:59 +00:00
tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2012-04-04 16:55:14 +00:00
if ( tmp_listinfo - > protocol = = VOIP_AC_CAS ) {
2013-03-21 02:58:59 +00:00
tmp_actrace_cas_info = ( actrace_cas_calls_info_t * ) tmp_listinfo - > prot_info ;
2005-06-27 06:20:23 +00:00
/* TODO: Also check the IP of the Blade, and if the call is complete (no active) */
if ( ( tmp_actrace_cas_info - > bchannel = = pi - > cas_bchannel ) & & ( tmp_actrace_cas_info - > trunk = = actrace_trunk ) ) {
2008-01-09 08:34:58 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
2005-06-27 06:20:23 +00:00
break ;
}
}
list = g_list_next ( list ) ;
}
2008-11-25 08:21:53 +00:00
SET_ADDRESS ( & pstn_add , AT_STRINGZ , 5 , " PSTN " ) ;
2005-06-27 06:20:23 +00:00
/* if it is a new call, add it to the list */
2008-01-09 08:34:58 +00:00
if ( ! callsinfo ) {
2013-03-21 02:58:59 +00:00
callsinfo = ( voip_calls_info_t * ) g_malloc0 ( sizeof ( voip_calls_info_t ) ) ;
2008-01-09 08:34:58 +00:00
callsinfo - > call_active_state = VOIP_ACTIVE ;
callsinfo - > call_state = VOIP_CALL_SETUP ;
callsinfo - > from_identity = g_strdup ( " N/A " ) ;
callsinfo - > to_identity = g_strdup ( " N/A " ) ;
COPY_ADDRESS ( & ( callsinfo - > initial_speaker ) , actrace_direction ? & pstn_add : & ( pinfo - > src ) ) ;
callsinfo - > selected = FALSE ;
2011-09-13 05:29:56 +00:00
callsinfo - > start_fd = pinfo - > fd ;
2008-01-09 08:34:58 +00:00
callsinfo - > protocol = VOIP_AC_CAS ;
callsinfo - > prot_info = g_malloc ( sizeof ( actrace_cas_calls_info_t ) ) ;
callsinfo - > free_prot_info = g_free ;
2008-08-05 17:33:14 +00:00
2013-03-21 02:58:59 +00:00
tmp_actrace_cas_info = ( actrace_cas_calls_info_t * ) callsinfo - > prot_info ;
2005-06-27 06:20:23 +00:00
tmp_actrace_cas_info - > bchannel = pi - > cas_bchannel ;
tmp_actrace_cas_info - > trunk = actrace_trunk ;
2008-01-09 08:34:58 +00:00
callsinfo - > npackets = 0 ;
callsinfo - > call_num = tapinfo - > ncalls + + ;
2012-02-07 06:56:45 +00:00
tapinfo - > callsinfo_list = g_list_prepend ( tapinfo - > callsinfo_list , callsinfo ) ;
2005-06-27 06:20:23 +00:00
}
2011-09-13 05:29:56 +00:00
callsinfo - > stop_fd = pinfo - > fd ;
2008-01-09 08:34:58 +00:00
+ + ( callsinfo - > npackets ) ;
2005-06-27 06:20:23 +00:00
/* increment the packets counter of all calls */
+ + ( tapinfo - > npackets ) ;
2008-11-25 08:21:53 +00:00
comment = g_strdup_printf ( " AC_CAS trunk:%u " , actrace_trunk ) ;
2005-06-27 06:20:23 +00:00
2008-12-19 11:30:50 +00:00
add_to_graph ( tapinfo , pinfo , pi - > cas_frame_label , comment , callsinfo - > call_num ,
2005-06-27 06:20:23 +00:00
actrace_direction ? & pstn_add : & ( pinfo - > src ) ,
2006-01-15 15:01:14 +00:00
actrace_direction ? & ( pinfo - > src ) : & pstn_add ,
1 ) ;
2005-06-27 06:20:23 +00:00
g_free ( comment ) ;
}
From Alejandro Vaquero
- avoid the clist of the calls dlg to be refreshed multiple times when
first appear.
- destroy the Graph window when the data is not valid anymore.
- fixes an H245 packet count error
- resizing the Graph windows when is displayed (up to 5 columns).
With a change to leave static voip_calls_tapinfo_t the_tapinfo_struct =
{0, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0};
alone.
svn path=/trunk/; revision=14852
2005-07-05 05:16:28 +00:00
tapinfo - > redraw = TRUE ;
2005-06-27 06:20:23 +00:00
return 1 ; /* refresh output */
}
/****************************************************************************/
/* TAP INTERFACE */
/****************************************************************************/
static gboolean have_actrace_tap_listener = FALSE ;
/****************************************************************************/
void
actrace_calls_init_tap ( void )
{
GString * error_string ;
if ( have_actrace_tap_listener = = FALSE )
{
/* don't register tap listener, if we have it already */
error_string = register_tap_listener ( " actrace " , & ( the_tapinfo_struct . actrace_dummy ) , NULL ,
2009-06-05 22:42:47 +00:00
0 ,
2008-08-05 17:33:14 +00:00
voip_calls_dlg_reset ,
ACTRACEcalls_packet ,
2005-06-27 06:20:23 +00:00
voip_calls_dlg_draw
) ;
2008-08-05 17:33:14 +00:00
2005-06-27 06:20:23 +00:00
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2005-06-27 06:20:23 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_actrace_tap_listener = TRUE ;
}
}
/****************************************************************************/
void
remove_tap_listener_actrace_calls ( void )
{
remove_tap_listener ( & ( the_tapinfo_struct . actrace_dummy ) ) ;
have_actrace_tap_listener = FALSE ;
}
2005-02-01 12:12:35 +00:00
2007-03-18 22:14:12 +00:00
2008-11-25 08:21:53 +00:00
/****************************************************************************/
2007-03-25 21:56:08 +00:00
/**************************** TAP for H248/MEGACO **********************************/
2008-11-25 08:21:53 +00:00
/****************************************************************************/
2007-03-18 22:14:12 +00:00
static gboolean have_h248_tap_listener = FALSE ;
2007-03-26 21:12:24 +00:00
static gboolean have_megaco_tap_listener = FALSE ;
2007-03-18 22:14:12 +00:00
2007-03-25 21:56:08 +00:00
# define gcp_is_req(type) ( type == GCP_CMD_ADD_REQ || type == GCP_CMD_MOVE_REQ || type == GCP_CMD_MOD_REQ || \
type = = GCP_CMD_SUB_REQ | | type = = GCP_CMD_AUDITCAP_REQ | | type = = GCP_CMD_AUDITVAL_REQ | | \
type = = GCP_CMD_NOTIFY_REQ | | type = = GCP_CMD_SVCCHG_REQ | | type = = GCP_CMD_TOPOLOGY_REQ | | \
type = = GCP_CMD_CTX_ATTR_AUDIT_REQ )
2007-03-18 22:14:12 +00:00
static int h248_calls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * prot_info ) {
voip_calls_tapinfo_t * tapinfo = & the_tapinfo_struct ;
2013-03-21 02:58:59 +00:00
const gcp_cmd_t * cmd = ( gcp_cmd_t * ) prot_info ;
2008-12-19 11:30:50 +00:00
GList * list ;
2008-01-09 08:34:58 +00:00
voip_calls_info_t * callsinfo = NULL ;
2008-12-19 11:30:50 +00:00
address * mgw ;
address * mgc ;
2007-03-18 22:14:12 +00:00
gchar mgw_addr [ 128 ] ;
2008-08-05 17:33:14 +00:00
2007-03-18 22:14:12 +00:00
if ( cmd - > ctx - > id = = NULL_CONTEXT | | cmd - > ctx - > id = = ALL_CONTEXTS ) {
return 0 ;
}
2008-08-05 17:33:14 +00:00
2007-03-25 21:56:08 +00:00
if ( gcp_is_req ( cmd - > type ) ) {
2007-03-18 22:14:12 +00:00
mgw = & ( pinfo - > dst ) ;
mgc = & ( pinfo - > src ) ;
} else {
mgc = & ( pinfo - > dst ) ;
mgw = & ( pinfo - > src ) ;
}
2008-08-05 17:33:14 +00:00
2007-03-18 22:14:12 +00:00
address_to_str_buf ( mgw , mgw_addr , 128 ) ;
2008-08-05 17:33:14 +00:00
2007-03-18 22:14:12 +00:00
/* check whether we already have this context in the list */
2008-01-09 08:34:58 +00:00
list = g_list_first ( tapinfo - > callsinfo_list ) ;
2007-03-18 22:14:12 +00:00
while ( list )
{
2013-03-21 02:58:59 +00:00
voip_calls_info_t * tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2008-08-05 17:33:14 +00:00
2012-04-04 16:55:14 +00:00
if ( tmp_listinfo - > protocol = = TEL_H248 ) {
if ( tmp_listinfo - > prot_info = = cmd - > ctx ) {
2008-01-09 08:34:58 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
2007-03-18 22:14:12 +00:00
break ;
}
}
list = g_list_next ( list ) ;
}
2008-08-05 17:33:14 +00:00
2012-04-04 16:55:14 +00:00
if ( callsinfo = = NULL ) {
2008-08-05 17:33:14 +00:00
2013-03-21 02:58:59 +00:00
callsinfo = ( voip_calls_info_t * ) g_malloc0 ( sizeof ( voip_calls_info_t ) ) ;
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_NO_STATE ;
callsinfo - > call_active_state = VOIP_ACTIVE ;
callsinfo - > from_identity = g_strdup_printf ( " %s : %.8x " , mgw_addr , cmd - > ctx - > id ) ;
callsinfo - > to_identity = g_strdup ( " " ) ;
callsinfo - > prot_info = cmd - > ctx ;
callsinfo - > free_prot_info = NULL ;
2008-08-05 17:33:14 +00:00
2008-01-09 08:34:58 +00:00
callsinfo - > npackets = 1 ;
2007-03-18 22:14:12 +00:00
2008-01-09 08:34:58 +00:00
COPY_ADDRESS ( & ( callsinfo - > initial_speaker ) , mgc ) ;
2008-08-05 17:33:14 +00:00
2008-01-09 08:34:58 +00:00
callsinfo - > protocol = TEL_H248 ;
callsinfo - > call_num = tapinfo - > ncalls + + ;
2011-09-13 05:29:56 +00:00
callsinfo - > start_fd = pinfo - > fd ;
callsinfo - > stop_fd = pinfo - > fd ;
2008-01-09 08:34:58 +00:00
callsinfo - > selected = FALSE ;
2008-08-05 17:33:14 +00:00
2012-02-07 06:56:45 +00:00
tapinfo - > callsinfo_list = g_list_prepend ( tapinfo - > callsinfo_list , callsinfo ) ;
2007-03-18 22:14:12 +00:00
} else {
2008-12-19 11:30:50 +00:00
GString * s = g_string_new ( " " ) ;
2007-03-25 21:56:08 +00:00
gcp_terms_t * ctx_term ;
2007-03-18 22:14:12 +00:00
2008-01-09 08:34:58 +00:00
g_free ( callsinfo - > from_identity ) ;
callsinfo - > from_identity = g_strdup_printf ( " %s : %.8x " , mgw_addr , ( ( gcp_ctx_t * ) callsinfo - > prot_info ) - > id ) ;
2007-03-18 22:14:12 +00:00
2008-01-09 08:34:58 +00:00
g_free ( callsinfo - > to_identity ) ;
2007-03-18 22:14:12 +00:00
2008-01-09 08:34:58 +00:00
for ( ctx_term = ( ( gcp_ctx_t * ) callsinfo - > prot_info ) - > terms . next ;
2007-03-18 22:14:12 +00:00
ctx_term ;
ctx_term = ctx_term - > next ) {
if ( ctx_term - > term & & ctx_term - > term - > str ) {
2008-05-06 05:50:31 +00:00
g_string_append_printf ( s , " %s " , ctx_term - > term - > str ) ;
2007-03-18 22:14:12 +00:00
}
}
2008-08-05 17:33:14 +00:00
2008-01-09 08:34:58 +00:00
callsinfo - > to_identity = s - > str ;
2007-03-18 22:14:12 +00:00
g_string_free ( s , FALSE ) ;
2008-08-05 17:33:14 +00:00
2011-09-13 05:29:56 +00:00
callsinfo - > stop_fd = pinfo - > fd ;
2008-01-09 08:34:58 +00:00
+ + ( callsinfo - > npackets ) ;
2007-03-18 22:14:12 +00:00
}
2008-08-05 17:33:14 +00:00
2007-03-28 19:31:54 +00:00
add_to_graph ( tapinfo , pinfo , cmd - > str ? cmd - > str : " unknown Msg " ,
2007-03-21 00:59:00 +00:00
ep_strdup_printf ( " TrxId = %u, CtxId = %.8x " , cmd - > trx - > id , cmd - > ctx - > id ) ,
2008-01-09 08:34:58 +00:00
callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
2008-08-05 17:33:14 +00:00
2007-03-21 00:59:00 +00:00
+ + ( tapinfo - > npackets ) ;
2007-03-18 22:14:12 +00:00
tapinfo - > redraw = TRUE ;
2008-08-05 17:33:14 +00:00
2007-03-18 22:14:12 +00:00
return 1 ;
}
void h248_calls_init_tap ( void )
{
GString * error_string ;
2008-08-05 17:33:14 +00:00
2007-03-26 21:12:24 +00:00
if ( have_megaco_tap_listener = = FALSE )
{
error_string = register_tap_listener ( " megaco " , & ( the_tapinfo_struct . megaco_dummy ) ,
2009-06-05 22:42:47 +00:00
NULL ,
0 ,
voip_calls_dlg_reset ,
h248_calls_packet ,
voip_calls_dlg_draw ) ;
2008-08-05 17:33:14 +00:00
2007-03-26 21:12:24 +00:00
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2007-03-26 21:12:24 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
2008-08-05 17:33:14 +00:00
2007-03-26 21:12:24 +00:00
have_megaco_tap_listener = TRUE ;
}
2008-08-05 17:33:14 +00:00
2007-03-18 22:14:12 +00:00
if ( have_h248_tap_listener = = FALSE )
{
error_string = register_tap_listener ( " h248 " , & ( the_tapinfo_struct . h248_dummy ) ,
2009-06-05 22:42:47 +00:00
NULL ,
0 ,
voip_calls_dlg_reset ,
h248_calls_packet ,
voip_calls_dlg_draw ) ;
2008-08-05 17:33:14 +00:00
2007-03-18 22:14:12 +00:00
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2007-03-18 22:14:12 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
2008-08-05 17:33:14 +00:00
2007-03-18 22:14:12 +00:00
have_h248_tap_listener = TRUE ;
}
}
void
remove_tap_listener_h248_calls ( void )
{
remove_tap_listener ( & ( the_tapinfo_struct . h248_dummy ) ) ;
2007-03-26 21:12:24 +00:00
remove_tap_listener ( & ( the_tapinfo_struct . megaco_dummy ) ) ;
2008-08-05 17:33:14 +00:00
2007-03-26 21:12:24 +00:00
have_megaco_tap_listener = FALSE ;
2007-03-18 22:14:12 +00:00
have_h248_tap_listener = FALSE ;
}
2008-11-25 08:21:53 +00:00
/****************************************************************************/
2007-03-22 22:59:20 +00:00
/**************************** TAP for SCCP and SUA **********************************/
/**************************** ( RANAP and BSSAP ) **********************************/
2008-11-25 08:21:53 +00:00
/****************************************************************************/
2007-03-21 00:59:00 +00:00
static gboolean have_sccp_tap_listener = FALSE ;
2007-03-22 22:59:20 +00:00
static gboolean have_sua_tap_listener = FALSE ;
2007-03-21 00:59:00 +00:00
static const voip_protocol sccp_proto_map [ ] = {
TEL_SCCP ,
TEL_BSSMAP ,
TEL_RANAP
} ;
# define SP2VP(ap) ((ap) < SCCP_PLOAD_NUM_PLOADS ? sccp_proto_map[(ap)] : TEL_SCCP)
2007-03-22 22:59:20 +00:00
const value_string * sccp_payload_values ;
2007-03-21 00:59:00 +00:00
2007-03-22 22:59:20 +00:00
static int sccp_calls ( packet_info * pinfo , const void * prot_info ) {
2007-03-21 00:59:00 +00:00
voip_calls_tapinfo_t * tapinfo = & the_tapinfo_struct ;
2013-03-21 02:58:59 +00:00
const sccp_msg_info_t * msg = ( const sccp_msg_info_t * ) prot_info ;
2007-03-27 23:00:55 +00:00
sccp_assoc_info_t * assoc = msg - > data . co . assoc ;
2008-12-19 11:30:50 +00:00
GList * list ;
2008-01-09 08:34:58 +00:00
voip_calls_info_t * callsinfo = NULL ;
2008-12-19 11:30:50 +00:00
const gchar * label = NULL ;
const gchar * comment = NULL ;
2007-03-21 00:59:00 +00:00
/* check whether we already have this assoc in the list */
2008-01-09 08:34:58 +00:00
for ( list = g_list_first ( tapinfo - > callsinfo_list ) ; list ; list = g_list_next ( list ) ) {
2012-04-04 16:55:14 +00:00
if ( ( ( voip_calls_info_t * ) ( list - > data ) ) - > prot_info = = assoc ) {
2008-01-09 08:34:58 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
2007-03-21 00:59:00 +00:00
break ;
}
}
2008-08-05 17:33:14 +00:00
2012-04-04 16:55:14 +00:00
if ( callsinfo = = NULL ) {
2013-03-21 02:58:59 +00:00
callsinfo = ( voip_calls_info_t * ) g_malloc0 ( sizeof ( voip_calls_info_t ) ) ;
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_CALL_SETUP ;
callsinfo - > call_active_state = VOIP_ACTIVE ;
2007-03-21 00:59:00 +00:00
if ( assoc - > calling_party ) {
2008-01-09 08:34:58 +00:00
callsinfo - > from_identity = g_strdup ( assoc - > calling_party ) ;
2007-03-21 00:59:00 +00:00
} else {
2008-01-09 08:34:58 +00:00
callsinfo - > from_identity = g_strdup ( " Unknown " ) ;
2007-03-21 00:59:00 +00:00
}
2008-08-05 17:33:14 +00:00
2007-03-21 00:59:00 +00:00
if ( assoc - > called_party ) {
2008-01-09 08:34:58 +00:00
callsinfo - > to_identity = g_strdup ( assoc - > called_party ) ;
2007-03-21 00:59:00 +00:00
} else {
2008-01-09 08:34:58 +00:00
callsinfo - > to_identity = g_strdup ( " Unknown " ) ;
2007-03-21 00:59:00 +00:00
}
2008-08-05 17:33:14 +00:00
2008-01-09 08:34:58 +00:00
callsinfo - > prot_info = ( void * ) assoc ;
callsinfo - > free_prot_info = NULL ;
2008-08-05 17:33:14 +00:00
2008-01-09 08:34:58 +00:00
callsinfo - > npackets = 1 ;
2008-08-05 17:33:14 +00:00
2008-01-09 08:34:58 +00:00
COPY_ADDRESS ( & ( callsinfo - > initial_speaker ) , & ( pinfo - > src ) ) ;
2008-08-05 17:33:14 +00:00
2008-01-09 08:34:58 +00:00
callsinfo - > protocol = SP2VP ( assoc - > payload ) ;
2011-09-13 05:29:56 +00:00
/* Store frame data which holds time and frame number */
callsinfo - > start_fd = pinfo - > fd ;
callsinfo - > stop_fd = pinfo - > fd ;
2008-08-05 17:33:14 +00:00
2008-01-09 08:34:58 +00:00
callsinfo - > selected = FALSE ;
callsinfo - > call_num = tapinfo - > ncalls + + ;
2008-08-05 17:33:14 +00:00
2012-02-07 06:56:45 +00:00
tapinfo - > callsinfo_list = g_list_prepend ( tapinfo - > callsinfo_list , callsinfo ) ;
2007-03-21 00:59:00 +00:00
} else {
2008-08-05 17:33:14 +00:00
2007-03-21 00:59:00 +00:00
if ( assoc - > calling_party ) {
2009-03-13 22:06:48 +00:00
g_free ( callsinfo - > from_identity ) ;
2008-01-09 08:34:58 +00:00
callsinfo - > from_identity = g_strdup ( assoc - > calling_party ) ;
2007-03-21 00:59:00 +00:00
}
2008-08-05 17:33:14 +00:00
2007-03-21 00:59:00 +00:00
if ( assoc - > called_party ) {
2009-03-13 22:06:48 +00:00
g_free ( callsinfo - > to_identity ) ;
2008-01-09 08:34:58 +00:00
callsinfo - > to_identity = g_strdup ( assoc - > called_party ) ;
2007-03-21 00:59:00 +00:00
}
2008-08-05 17:33:14 +00:00
2008-01-09 08:34:58 +00:00
callsinfo - > protocol = SP2VP ( assoc - > payload ) ;
2011-09-13 05:29:56 +00:00
/* Store frame data which holds stop time and frame number */
callsinfo - > stop_fd = pinfo - > fd ;
2008-01-09 08:34:58 +00:00
+ + ( callsinfo - > npackets ) ;
2008-08-05 17:33:14 +00:00
2007-03-21 00:59:00 +00:00
switch ( msg - > type ) {
case SCCP_MSG_TYPE_CC :
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_IN_CALL ;
2007-03-21 00:59:00 +00:00
break ;
case SCCP_MSG_TYPE_RLC :
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_COMPLETED ;
callsinfo - > call_active_state = VOIP_INACTIVE ;
2007-03-21 00:59:00 +00:00
break ;
default :
break ;
}
}
2008-08-05 17:33:14 +00:00
2007-03-27 23:00:55 +00:00
if ( msg - > data . co . label ) {
label = msg - > data . co . label ;
2007-03-21 00:59:00 +00:00
} else {
2007-03-22 22:59:20 +00:00
label = val_to_str ( msg - > type , sccp_payload_values , " Unknown(%d) " ) ;
2007-03-21 00:59:00 +00:00
}
2008-08-05 17:33:14 +00:00
2007-03-27 23:00:55 +00:00
if ( msg - > data . co . comment ) {
comment = msg - > data . co . comment ;
2007-03-21 00:59:00 +00:00
} else {
2008-11-25 08:21:53 +00:00
comment = NULL ;
2007-03-21 00:59:00 +00:00
}
2008-08-05 17:33:14 +00:00
2008-11-25 08:21:53 +00:00
add_to_graph ( tapinfo , pinfo , label , comment , callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
2008-08-05 17:33:14 +00:00
2007-03-21 00:59:00 +00:00
+ + ( tapinfo - > npackets ) ;
tapinfo - > redraw = TRUE ;
2008-08-05 17:33:14 +00:00
2007-03-21 00:59:00 +00:00
return 1 ;
}
2007-03-22 22:59:20 +00:00
static int sccp_calls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * prot_info ) {
sccp_payload_values = sccp_message_type_acro_values ;
return sccp_calls ( pinfo , prot_info ) ;
}
static int sua_calls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * prot_info ) {
sccp_payload_values = sua_co_class_type_acro_values ;
return sccp_calls ( pinfo , prot_info ) ;
}
2007-03-21 00:59:00 +00:00
void sccp_calls_init_tap ( void )
{
GString * error_string ;
2008-08-05 17:33:14 +00:00
2007-03-21 00:59:00 +00:00
if ( have_sccp_tap_listener = = FALSE )
{
error_string = register_tap_listener ( " sccp " , & ( the_tapinfo_struct . sccp_dummy ) ,
2009-06-05 22:42:47 +00:00
NULL ,
0 ,
voip_calls_dlg_reset ,
sccp_calls_packet ,
voip_calls_dlg_draw ) ;
2008-08-05 17:33:14 +00:00
2007-03-21 00:59:00 +00:00
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2007-03-21 00:59:00 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
2008-08-05 17:33:14 +00:00
2007-03-21 00:59:00 +00:00
have_sccp_tap_listener = TRUE ;
}
2007-03-22 22:59:20 +00:00
if ( have_sua_tap_listener = = FALSE )
{
error_string = register_tap_listener ( " sua " , & ( the_tapinfo_struct . sua_dummy ) ,
2009-06-05 22:42:47 +00:00
NULL ,
0 ,
voip_calls_dlg_reset ,
sua_calls_packet ,
voip_calls_dlg_draw ) ;
2008-08-05 17:33:14 +00:00
2007-03-22 22:59:20 +00:00
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2007-03-22 22:59:20 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
2008-08-05 17:33:14 +00:00
2007-03-22 22:59:20 +00:00
have_sua_tap_listener = TRUE ;
}
2008-08-05 17:33:14 +00:00
2007-03-21 00:59:00 +00:00
}
void
remove_tap_listener_sccp_calls ( void )
{
remove_tap_listener ( & ( the_tapinfo_struct . sccp_dummy ) ) ;
2008-08-05 17:33:14 +00:00
2007-03-21 00:59:00 +00:00
have_sccp_tap_listener = FALSE ;
2007-03-22 22:59:20 +00:00
have_sua_tap_listener = FALSE ;
2007-03-21 00:59:00 +00:00
}
2007-03-18 22:14:12 +00:00
2007-09-10 07:21:27 +00:00
/****************************************************************************/
/****************************TAP for UNISTIM ********************************/
/****************************************************************************/
2008-08-05 17:33:14 +00:00
static int
2007-09-10 07:21:27 +00:00
unistim_calls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * unistim_info )
{
voip_calls_tapinfo_t * tapinfo = & the_tapinfo_struct ;
voip_calls_info_t * tmp_listinfo ;
2008-01-09 08:34:58 +00:00
voip_calls_info_t * callsinfo = NULL ;
2007-09-10 07:21:27 +00:00
unistim_info_t * tmp_unistim_info = NULL ;
GList * list = NULL ;
GString * g_tmp = NULL ;
2012-04-09 17:53:04 +00:00
const gchar * frame_label = NULL ;
2007-09-10 07:21:27 +00:00
gchar * comment = NULL ;
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
/* Fetch specific packet infos */
2013-03-21 02:58:59 +00:00
const unistim_info_t * pi = ( const unistim_info_t * ) unistim_info ;
2007-09-10 07:21:27 +00:00
/* Init gstring */
g_tmp = g_string_new ( NULL ) ;
/* Check to see if this is a dup */
2008-01-09 08:34:58 +00:00
list = g_list_first ( tapinfo - > callsinfo_list ) ;
2007-09-10 07:21:27 +00:00
while ( list )
{
2013-03-21 02:58:59 +00:00
tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2007-09-10 07:21:27 +00:00
2012-04-04 16:55:14 +00:00
if ( tmp_listinfo - > protocol = = VOIP_UNISTIM ) {
2007-09-10 07:21:27 +00:00
2013-03-21 02:58:59 +00:00
tmp_unistim_info = ( unistim_info_t * ) tmp_listinfo - > prot_info ;
2007-09-10 07:21:27 +00:00
/* Search by termid if possible, otherwise use ni/it ip + port.. */
2012-04-04 16:55:14 +00:00
if ( pi - > termid ! = 0 ) {
if ( tmp_unistim_info - > termid = = pi - > termid ) {
2007-09-10 07:21:27 +00:00
/* If the call has ended, then we can reuse it.. */
2012-04-04 16:55:14 +00:00
if ( tmp_listinfo - > call_state = = VOIP_COMPLETED | | tmp_listinfo - > call_state = = VOIP_UNKNOWN ) {
2007-09-10 07:21:27 +00:00
/* Do nothing */
} else {
2008-01-09 08:34:58 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
2007-09-10 07:21:27 +00:00
break ;
}
}
} else {
/* If no term id use ips / port to find entry */
2012-04-04 16:55:14 +00:00
if ( ADDRESSES_EQUAL ( & tmp_unistim_info - > it_ip , & pinfo - > dst ) & & ADDRESSES_EQUAL ( & tmp_unistim_info - > ni_ip , & pinfo - > src ) & & ( tmp_unistim_info - > it_port = = pinfo - > destport ) ) {
if ( tmp_listinfo - > call_state = = VOIP_COMPLETED | | tmp_listinfo - > call_state = = VOIP_UNKNOWN ) {
2007-09-10 07:21:27 +00:00
/* Do nothing previous call */
} else {
2008-01-09 08:34:58 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
2007-09-10 07:21:27 +00:00
break ;
}
2008-08-05 17:33:14 +00:00
}
2007-09-10 07:21:27 +00:00
else if ( ADDRESSES_EQUAL ( & tmp_unistim_info - > it_ip , & pinfo - > src ) & & ADDRESSES_EQUAL ( & tmp_unistim_info - > ni_ip , & pinfo - > dst ) & & ( tmp_unistim_info - > it_port = = pinfo - > srcport ) ) {
2012-04-04 16:55:14 +00:00
if ( tmp_listinfo - > call_state = = VOIP_COMPLETED | | tmp_listinfo - > call_state = = VOIP_UNKNOWN ) {
2007-09-10 07:21:27 +00:00
/* Do nothing, it ain't our call.. */
} else {
2008-01-09 08:34:58 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
2007-09-10 07:21:27 +00:00
break ;
}
}
}
}
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
/* Otherwise, go to the next one.. */
list = g_list_next ( list ) ;
}
2012-04-04 16:55:14 +00:00
if ( pi - > payload_type = = 2 | | pi - > payload_type = = 1 ) {
2007-09-10 07:21:27 +00:00
2012-04-04 16:55:14 +00:00
if ( pi - > key_state = = 1 | | pi - > hook_state = = 1 ) {
2007-09-10 07:21:27 +00:00
2008-08-05 17:33:14 +00:00
/* If the user hits a button,
2007-09-10 07:21:27 +00:00
Session will be SETUP */
/* If new add to list */
2012-04-04 16:55:14 +00:00
if ( callsinfo = = NULL ) {
2008-01-09 08:34:58 +00:00
2013-03-21 02:58:59 +00:00
callsinfo = ( voip_calls_info_t * ) g_malloc0 ( sizeof ( voip_calls_info_t ) ) ;
2008-01-09 08:34:58 +00:00
callsinfo - > call_active_state = VOIP_ACTIVE ;
callsinfo - > call_state = VOIP_CALL_SETUP ;
callsinfo - > from_identity = g_strdup_printf ( " %x " , pi - > termid ) ;
2009-03-12 07:56:42 +00:00
callsinfo - > to_identity = g_strdup ( " UNKNOWN " ) ;
2008-01-09 08:34:58 +00:00
COPY_ADDRESS ( & ( callsinfo - > initial_speaker ) , & ( pinfo - > src ) ) ;
callsinfo - > selected = FALSE ;
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
/* Set this on init of struct so in case the call doesn't complete, we'll have a ref. */
/* Otherwise if the call is completed we'll have the open/close streams to ref actual call duration */
2011-09-13 05:29:56 +00:00
/* Store frame data which holds time and frame number */
callsinfo - > start_fd = pinfo - > fd ;
2008-08-05 17:33:14 +00:00
2008-01-09 08:34:58 +00:00
callsinfo - > protocol = VOIP_UNISTIM ;
callsinfo - > prot_info = g_malloc ( sizeof ( unistim_info_t ) ) ;
2008-08-05 17:33:14 +00:00
2013-03-21 02:58:59 +00:00
tmp_unistim_info = ( unistim_info_t * ) callsinfo - > prot_info ;
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
/* Clear tap struct */
tmp_unistim_info - > rudp_type = 0 ;
tmp_unistim_info - > payload_type = 0 ;
tmp_unistim_info - > sequence = pi - > sequence ;
tmp_unistim_info - > termid = pi - > termid ;
tmp_unistim_info - > key_val = - 1 ;
tmp_unistim_info - > key_state = - 1 ;
tmp_unistim_info - > hook_state = - 1 ;
tmp_unistim_info - > stream_connect = - 1 ;
tmp_unistim_info - > trans_connect = - 1 ;
tmp_unistim_info - > set_termid = - 1 ;
tmp_unistim_info - > string_data = NULL ;
tmp_unistim_info - > key_buffer = NULL ;
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
COPY_ADDRESS ( & ( tmp_unistim_info - > it_ip ) , & ( pi - > it_ip ) ) ;
COPY_ADDRESS ( & ( tmp_unistim_info - > ni_ip ) , & ( pi - > ni_ip ) ) ;
tmp_unistim_info - > it_port = pi - > it_port ;
2008-01-09 08:34:58 +00:00
callsinfo - > free_prot_info = g_free ;
callsinfo - > npackets = 0 ;
callsinfo - > call_num = tapinfo - > ncalls + + ;
2012-02-07 06:56:45 +00:00
tapinfo - > callsinfo_list = g_list_prepend ( tapinfo - > callsinfo_list , callsinfo ) ;
2007-09-10 07:21:27 +00:00
} else {
/* Set up call wide info struct */
2013-03-21 02:58:59 +00:00
tmp_unistim_info = ( unistim_info_t * ) callsinfo - > prot_info ;
2007-09-10 07:21:27 +00:00
tmp_unistim_info - > sequence = pi - > sequence ;
}
/* Each packet COULD BE OUR LAST!!!! */
2011-09-13 05:29:56 +00:00
/* Store frame data which holds time and frame number */
callsinfo - > stop_fd = pinfo - > fd ;
2007-09-10 07:21:27 +00:00
/* This is a valid packet so increment counter */
2008-01-09 08:34:58 +00:00
+ + ( callsinfo - > npackets ) ;
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
/* increment the packets counter of all calls */
+ + ( tapinfo - > npackets ) ;
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
/* Key was depressed.. update key buffer.. */
2012-04-04 16:55:14 +00:00
if ( pi - > key_val > = 0 & & pi - > key_val < = 11 ) {
2007-09-10 07:21:27 +00:00
2012-04-04 16:55:14 +00:00
if ( tmp_unistim_info - > key_buffer ! = NULL ) {
2007-09-10 07:21:27 +00:00
/* assign to temp variable */
g_string_assign ( g_tmp , tmp_unistim_info - > key_buffer ) ;
/* Manipulate the data */
if ( pi - > key_val = = 10 ) {
tmp_unistim_info - > key_buffer = g_strdup_printf ( " %s* " , g_tmp - > str ) ;
} else if ( pi - > key_val = = 11 ) {
tmp_unistim_info - > key_buffer = g_strdup_printf ( " %s# " , g_tmp - > str ) ;
} else {
tmp_unistim_info - > key_buffer = g_strdup_printf ( " %s%d " , g_tmp - > str , pi - > key_val ) ;
}
} else {
/* Create new string */
if ( pi - > key_val = = 10 ) {
2009-03-12 07:56:42 +00:00
tmp_unistim_info - > key_buffer = g_strdup ( " * " ) ;
2007-09-10 07:21:27 +00:00
} else if ( pi - > key_val = = 11 ) {
2009-03-12 07:56:42 +00:00
tmp_unistim_info - > key_buffer = g_strdup ( " # " ) ;
2007-09-10 07:21:27 +00:00
} else {
tmp_unistim_info - > key_buffer = g_strdup_printf ( " %d " , pi - > key_val ) ;
}
}
/* Select for non-digit characters */
if ( pi - > key_val = = 10 ) {
comment = g_strdup_printf ( " Key Input Sent: * (%d) " , pi - > sequence ) ;
} else if ( pi - > key_val = = 11 ) {
comment = g_strdup_printf ( " Key Input Sent: # (%d) " , pi - > sequence ) ;
} else {
comment = g_strdup_printf ( " Key Input Sent: %d (%d) " , pi - > key_val , pi - > sequence ) ;
}
} else if ( pi - > key_val = = 12 ) {
/* Set label and comment for graph */
comment = g_strdup_printf ( " Key Input Sent: UP (%d) " , pi - > sequence ) ;
} else if ( pi - > key_val = = 13 ) {
/* Set label and comment for graph */
comment = g_strdup_printf ( " Key Input Sent: DOWN (%d) " , pi - > sequence ) ;
} else if ( pi - > key_val = = 14 ) {
/* Set label and comment for graph */
comment = g_strdup_printf ( " Key Input Sent: RIGHT (%d) " , pi - > sequence ) ;
} else if ( pi - > key_val = = 15 ) {
2012-04-04 16:55:14 +00:00
if ( pi - > key_buffer ! = NULL ) {
2007-09-10 07:21:27 +00:00
/* Get data */
g_string_assign ( g_tmp , pi - > key_buffer ) ;
/* Manipulate the data */
g_string_truncate ( g_tmp , g_tmp - > len - 1 ) ;
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
/* Insert new data */
2009-03-12 07:56:42 +00:00
tmp_unistim_info - > key_buffer = g_strdup ( g_tmp - > str ) ;
2007-09-10 07:21:27 +00:00
}
/* Set label and comment for graph */
comment = g_strdup_printf ( " Key Input Sent: LEFT (%d) " , pi - > sequence ) ;
} else if ( pi - > key_val = = 20 ) {
/* User pressed the soft key 0 probably dial */
comment = g_strdup_printf ( " Key Input Sent: S0 (%d) " , pi - > sequence ) ;
} else if ( pi - > key_val = = 21 ) {
/* User pressed the soft key 1 */
comment = g_strdup_printf ( " Key Input Sent: S1 (%d) " , pi - > sequence ) ;
} else if ( pi - > key_val = = 22 ) {
/* User pressed the soft key 2 */
/* On cs2k phones, soft key 2 is backspace. */
if ( pi - > key_buffer ! = NULL ) {
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
/* Get data */
g_string_assign ( g_tmp , pi - > key_buffer ) ;
/* Manipulate the data */
g_string_truncate ( g_tmp , g_tmp - > len - 1 ) ;
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
/* Insert new data */
2009-03-12 07:56:42 +00:00
tmp_unistim_info - > key_buffer = g_strdup ( g_tmp - > str ) ;
2007-09-10 07:21:27 +00:00
}
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
/* add label and comment */
comment = g_strdup_printf ( " Key Input Sent: S2 (%d) " , pi - > sequence ) ;
} else if ( pi - > key_val = = 28 ) {
/* User pressed something */
comment = g_strdup_printf ( " Key Input Sent: Release (%d) " , pi - > sequence ) ;
} else if ( pi - > key_val = = 23 ) {
/* User pressed the soft key 3 */
/* Cancel on cs2k so clear buffer */
2013-02-25 23:35:13 +00:00
/* On mcs it's config which will clear the buffer too */
2009-03-12 07:56:42 +00:00
tmp_unistim_info - > key_buffer = g_strdup ( " \n " ) ;
2007-09-10 07:21:27 +00:00
/* User pressed something, set labels*/
comment = g_strdup_printf ( " Key Input Sent: S3 (%d) " , pi - > sequence ) ;
} else if ( pi - > key_val = = 27 ) {
/* User pressed something */
comment = g_strdup_printf ( " Key Input Sent: Hold (%d) " , pi - > sequence ) ;
} else if ( pi - > key_val = = 29 ) {
/* User pressed something */
comment = g_strdup_printf ( " Key Input Sent: Mute (%d) " , pi - > sequence ) ;
} else if ( pi - > key_val = = 30 ) {
/* User pressed something */
comment = g_strdup_printf ( " Key Input Sent: Headset (%d) " , pi - > sequence ) ;
} else if ( pi - > key_val = = 31 ) {
/* Handsfree button */
comment = g_strdup_printf ( " Key Input Sent: Handsfree (%d) " , pi - > sequence ) ;
} else if ( pi - > key_val > = 32 & & pi - > key_val < = 56 ) {
/* Prog. Key X */
comment = g_strdup_printf ( " Key Input Sent: Prog%d (%d) " , ( pi - > key_val & 31 ) , pi - > sequence ) ;
}
if ( pi - > key_val ! = - 1 ) {
2008-11-25 08:21:53 +00:00
frame_label = " KEY INPUT " ;
2007-09-10 07:21:27 +00:00
if ( comment = = NULL )
/* Ouch! What do you do!? */
/* User pressed something */
comment = g_strdup_printf ( " Key Input Sent: UNKNOWN - %d (%d) " , pi - > key_val , pi - > sequence ) ;
/* add to the graph */
2008-01-09 08:34:58 +00:00
add_to_graph ( tapinfo , pinfo , frame_label , comment , callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
2007-09-10 07:21:27 +00:00
2008-11-25 08:21:53 +00:00
g_free ( comment ) ;
2007-09-10 07:21:27 +00:00
}
if ( pi - > hook_state = = 1 ) {
/* Phone is off hook */
2008-11-25 08:21:53 +00:00
frame_label = " OFF HOOK " ;
2007-09-10 07:21:27 +00:00
comment = g_strdup_printf ( " Off Hook (%d) " , pi - > sequence ) ;
/* add to the graph */
2008-08-05 17:33:14 +00:00
add_to_graph ( tapinfo , pinfo , frame_label , comment , callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
2008-11-25 08:21:53 +00:00
g_free ( comment ) ;
2007-09-10 07:21:27 +00:00
} else if ( pi - > hook_state = = 0 ) {
/* Phone is on hook */
2008-11-25 08:21:53 +00:00
frame_label = " ON HOOK " ;
2007-09-10 07:21:27 +00:00
comment = g_strdup_printf ( " On Hook (%d) " , pi - > sequence ) ;
/* add to the graph */
2008-08-05 17:33:14 +00:00
add_to_graph ( tapinfo , pinfo , frame_label , comment , callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
2007-09-10 07:21:27 +00:00
2008-11-25 08:21:53 +00:00
g_free ( comment ) ;
}
2007-09-10 07:21:27 +00:00
}
/* Open stream was sent from server */
2008-01-09 08:34:58 +00:00
if ( pi - > stream_connect = = 1 & & callsinfo ! = NULL ) {
2007-09-10 07:21:27 +00:00
2008-08-05 17:33:14 +00:00
/* Open stream */
2007-09-10 07:21:27 +00:00
/* Signifies the start of the call so set start_sec & start_usec */
2011-09-13 05:29:56 +00:00
/* Frame data holds the time info */
callsinfo - > start_fd = pinfo - > fd ;
2012-09-17 14:51:08 +00:00
/* Each packet COULD BE OUR LAST!!!! */
/* Store frame data which holds time and frame number */
callsinfo - > stop_fd = pinfo - > fd ;
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
/* Local packets too */
2008-01-09 08:34:58 +00:00
+ + ( callsinfo - > npackets ) ;
2007-09-10 07:21:27 +00:00
/* increment the packets counter of all calls */
+ + ( tapinfo - > npackets ) ;
/* ?? means we're not quite sure if this is accurate. Since Unistim isn't a true
2008-08-05 17:33:14 +00:00
Call control protocol , we can only guess at the destination by messing with
2007-09-10 07:21:27 +00:00
key buffers . */
2012-04-04 16:55:14 +00:00
if ( tmp_unistim_info - > key_buffer ! = NULL ) {
2008-01-09 08:34:58 +00:00
callsinfo - > to_identity = g_strdup_printf ( " ?? %s " , tmp_unistim_info - > key_buffer ) ;
2007-09-10 07:21:27 +00:00
}
/* change sequence number for ACK detection */
tmp_unistim_info - > sequence = pi - > sequence ;
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
/* State changes too */
2008-01-09 08:34:58 +00:00
callsinfo - > call_active_state = VOIP_ACTIVE ;
callsinfo - > call_state = VOIP_IN_CALL ;
2007-09-10 07:21:27 +00:00
/* Add graph data */
2008-11-25 08:21:53 +00:00
frame_label = " STREAM OPENED " ;
2007-09-10 07:21:27 +00:00
comment = g_strdup_printf ( " Stream Opened (%d) " , pi - > sequence ) ;
/* add to the graph */
2008-08-05 17:33:14 +00:00
add_to_graph ( tapinfo , pinfo , frame_label , comment , callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
2007-09-10 07:21:27 +00:00
2008-01-09 08:34:58 +00:00
} else if ( pi - > stream_connect = = 1 & & callsinfo = = NULL ) {
2008-08-05 17:33:14 +00:00
2007-09-24 06:19:56 +00:00
/* Research indicates some nortel products initiate stream first
2008-08-05 17:33:14 +00:00
* without keypresses . therefore creating this solely on a keypress is
2007-09-24 06:19:56 +00:00
* ineffective .
* Sometimes calls start immediately with open stream .
*/
2013-03-21 02:58:59 +00:00
callsinfo = ( voip_calls_info_t * ) g_malloc0 ( sizeof ( voip_calls_info_t ) ) ;
2008-01-09 08:34:58 +00:00
callsinfo - > call_active_state = VOIP_ACTIVE ;
callsinfo - > call_state = VOIP_CALL_SETUP ;
2009-03-12 07:56:42 +00:00
callsinfo - > from_identity = g_strdup ( " UNKNOWN " ) ;
callsinfo - > to_identity = g_strdup ( " UNKNOWN " ) ;
2008-01-09 08:34:58 +00:00
COPY_ADDRESS ( & ( callsinfo - > initial_speaker ) , & ( pinfo - > src ) ) ;
callsinfo - > selected = FALSE ;
2008-08-05 17:33:14 +00:00
2007-09-24 06:19:56 +00:00
/* Set this on init of struct so in case the call doesn't complete, we'll have a ref. */
/* Otherwise if the call is completed we'll have the open/close streams to ref actual call duration */
2011-09-13 05:29:56 +00:00
callsinfo - > start_fd = pinfo - > fd ;
2008-08-05 17:33:14 +00:00
2008-01-09 08:34:58 +00:00
callsinfo - > protocol = VOIP_UNISTIM ;
callsinfo - > prot_info = g_malloc ( sizeof ( unistim_info_t ) ) ;
2008-08-05 17:33:14 +00:00
2013-03-21 02:58:59 +00:00
tmp_unistim_info = ( unistim_info_t * ) callsinfo - > prot_info ;
2008-08-05 17:33:14 +00:00
2007-09-24 06:19:56 +00:00
/* Clear tap struct */
tmp_unistim_info - > rudp_type = 0 ;
tmp_unistim_info - > payload_type = 0 ;
tmp_unistim_info - > sequence = pi - > sequence ;
2007-09-24 06:42:59 +00:00
tmp_unistim_info - > termid = 0 ;
2007-09-24 06:19:56 +00:00
tmp_unistim_info - > key_val = - 1 ;
tmp_unistim_info - > key_state = - 1 ;
tmp_unistim_info - > hook_state = - 1 ;
tmp_unistim_info - > stream_connect = - 1 ;
tmp_unistim_info - > trans_connect = - 1 ;
tmp_unistim_info - > set_termid = - 1 ;
tmp_unistim_info - > string_data = NULL ;
tmp_unistim_info - > key_buffer = NULL ;
2008-08-05 17:33:14 +00:00
2007-09-24 06:19:56 +00:00
COPY_ADDRESS ( & ( tmp_unistim_info - > it_ip ) , & ( pi - > it_ip ) ) ;
COPY_ADDRESS ( & ( tmp_unistim_info - > ni_ip ) , & ( pi - > ni_ip ) ) ;
tmp_unistim_info - > it_port = pi - > it_port ;
2008-01-09 08:34:58 +00:00
callsinfo - > free_prot_info = g_free ;
callsinfo - > npackets = 0 ;
callsinfo - > call_num = tapinfo - > ncalls + + ;
2012-02-07 06:56:45 +00:00
tapinfo - > callsinfo_list = g_list_prepend ( tapinfo - > callsinfo_list , callsinfo ) ;
2007-09-24 06:19:56 +00:00
2012-09-17 14:51:08 +00:00
/* Open stream */
/* Each packet COULD BE OUR LAST!!!! */
/* Store frame data which holds time and frame number */
callsinfo - > stop_fd = pinfo - > fd ;
2007-09-24 06:19:56 +00:00
/* Local packets too */
2008-01-09 08:34:58 +00:00
+ + ( callsinfo - > npackets ) ;
2007-09-24 06:19:56 +00:00
/* increment the packets counter of all calls */
+ + ( tapinfo - > npackets ) ;
/* ?? means we're not quite sure if this is accurate. Since Unistim isn't a true
2008-08-05 17:33:14 +00:00
Call control protocol , we can only guess at the destination by messing with
2007-09-24 06:19:56 +00:00
key buffers . */
2012-04-04 16:55:14 +00:00
if ( tmp_unistim_info - > key_buffer ! = NULL ) {
2008-01-09 08:34:58 +00:00
callsinfo - > to_identity = g_strdup_printf ( " ?? %s " , tmp_unistim_info - > key_buffer ) ;
2007-09-24 06:19:56 +00:00
}
/* change sequence number for ACK detection */
tmp_unistim_info - > sequence = pi - > sequence ;
2008-08-05 17:33:14 +00:00
2007-09-24 06:19:56 +00:00
/* State changes too */
2008-01-09 08:34:58 +00:00
callsinfo - > call_active_state = VOIP_ACTIVE ;
callsinfo - > call_state = VOIP_IN_CALL ;
2007-09-24 06:19:56 +00:00
/* Add graph data */
2008-11-25 08:21:53 +00:00
frame_label = " STREAM OPENED " ;
2007-09-24 06:19:56 +00:00
comment = g_strdup_printf ( " Stream Opened (%d) " , pi - > sequence ) ;
/* add to the graph */
2008-01-09 08:34:58 +00:00
add_to_graph ( tapinfo , pinfo , frame_label , comment , callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
2007-09-24 06:19:56 +00:00
2008-01-09 08:34:58 +00:00
} else if ( pi - > stream_connect = = 0 & & callsinfo ! = NULL ) {
2007-09-10 07:21:27 +00:00
/* Close Stream */
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
/* Set stop seconds + usec */
2011-09-13 05:29:56 +00:00
/* frame_data holds the time info */
callsinfo - > stop_fd = pinfo - > fd ;
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
tmp_unistim_info - > sequence = pi - > sequence ;
2008-08-05 17:33:14 +00:00
2012-04-04 16:55:14 +00:00
if ( callsinfo - > call_state = = VOIP_IN_CALL ) {
2008-01-09 08:34:58 +00:00
callsinfo - > call_active_state = VOIP_INACTIVE ;
callsinfo - > call_state = VOIP_COMPLETED ;
2007-09-10 07:21:27 +00:00
} else {
2008-01-09 08:34:58 +00:00
callsinfo - > call_state = VOIP_UNKNOWN ;
callsinfo - > call_active_state = VOIP_INACTIVE ;
2007-09-10 07:21:27 +00:00
}
2008-08-05 17:33:14 +00:00
2008-11-25 08:21:53 +00:00
frame_label = " STREAM CLOSED " ;
2007-09-10 07:21:27 +00:00
comment = g_strdup_printf ( " Stream Closed (%d) " , pi - > sequence ) ;
/* add to the graph */
2008-01-09 08:34:58 +00:00
add_to_graph ( tapinfo , pinfo , frame_label , comment , callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
2007-09-10 07:21:27 +00:00
2008-11-25 08:21:53 +00:00
} else
comment = NULL ;
2007-09-10 07:21:27 +00:00
2008-01-09 08:34:58 +00:00
} else if ( pi - > rudp_type = = 1 & & callsinfo ! = NULL ) {
2007-09-10 07:21:27 +00:00
/* ACK */
/* Only show acks for processed seq #s */
if ( tmp_unistim_info - > sequence = = pi - > sequence ) {
2008-11-25 08:21:53 +00:00
frame_label = " ACK " ;
2007-09-10 07:21:27 +00:00
comment = g_strdup_printf ( " ACK for sequence %d " , pi - > sequence ) ;
/* add to the graph */
2008-01-09 08:34:58 +00:00
add_to_graph ( tapinfo , pinfo , frame_label , comment , callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
2007-09-10 07:21:27 +00:00
}
2008-01-09 08:34:58 +00:00
} else if ( pi - > rudp_type = = 0 & & callsinfo ! = NULL ) {
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
/* NAK */
2008-11-25 08:21:53 +00:00
frame_label = " NAK " ;
2007-09-10 07:21:27 +00:00
comment = g_strdup_printf ( " NAK for sequence %d " , pi - > sequence ) ;
/* add to the graph */
2008-01-09 08:34:58 +00:00
add_to_graph ( tapinfo , pinfo , frame_label , comment , callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
2007-09-10 07:21:27 +00:00
}
2008-08-05 17:33:14 +00:00
2008-11-25 08:21:53 +00:00
/* free data */
2007-09-10 07:21:27 +00:00
g_free ( comment ) ;
2008-08-05 17:33:14 +00:00
2007-09-10 07:21:27 +00:00
tapinfo - > redraw = TRUE ;
return 1 ;
}
/****************************************************************************/
/* TAP INTERFACE */
/****************************************************************************/
static gboolean have_unistim_tap_listener = FALSE ;
/****************************************************************************/
void
2012-04-04 16:55:14 +00:00
unistim_calls_init_tap ( void ) {
2007-09-10 07:21:27 +00:00
GString * error_string ;
if ( have_unistim_tap_listener = = FALSE ) {
error_string = register_tap_listener ( " unistim " , & ( the_tapinfo_struct . unistim_dummy ) ,
NULL ,
2009-06-05 22:42:47 +00:00
0 ,
2007-09-10 07:21:27 +00:00
voip_calls_dlg_reset ,
2008-08-05 17:33:14 +00:00
unistim_calls_packet ,
2007-09-10 07:21:27 +00:00
voip_calls_dlg_draw
) ;
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2007-09-10 07:21:27 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_unistim_tap_listener = TRUE ;
}
}
/****************************************************************************/
void
remove_tap_listener_unistim_calls ( void )
{
remove_tap_listener ( & ( the_tapinfo_struct . unistim_dummy ) ) ;
have_unistim_tap_listener = FALSE ;
}
2009-01-30 21:25:52 +00:00
/****************************************************************************/
/* ***************************TAP for SKINNY **********************************/
/****************************************************************************/
/* Telecaster to tap-voip call state mapping */
static const voip_call_state skinny_tap_voip_state [ ] = {
VOIP_NO_STATE ,
VOIP_CALL_SETUP ,
VOIP_COMPLETED ,
VOIP_RINGING ,
VOIP_RINGING ,
VOIP_IN_CALL ,
VOIP_REJECTED ,
VOIP_REJECTED ,
VOIP_IN_CALL ,
VOIP_IN_CALL ,
VOIP_COMPLETED ,
VOIP_COMPLETED ,
VOIP_CALL_SETUP ,
VOIP_UNKNOWN ,
VOIP_REJECTED
} ;
static int
skinny_calls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * skinny_info )
{
voip_calls_tapinfo_t * tapinfo = & the_tapinfo_struct ;
GList * list ;
voip_calls_info_t * callsinfo = NULL ;
address * phone ;
2013-03-21 02:58:59 +00:00
const skinny_info_t * si = ( skinny_info_t * ) skinny_info ;
2009-01-30 21:25:52 +00:00
skinny_calls_info_t * tmp_skinnyinfo ;
gchar * comment ;
if ( si = = NULL | | ( si - > callId = = 0 & & si - > passThruId = = 0 ) )
return 0 ;
/* check whether we already have this context in the list */
list = g_list_first ( tapinfo - > callsinfo_list ) ;
while ( list )
{
2013-03-21 02:58:59 +00:00
voip_calls_info_t * tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2012-04-04 16:55:14 +00:00
if ( tmp_listinfo - > protocol = = VOIP_SKINNY ) {
2013-03-21 02:58:59 +00:00
tmp_skinnyinfo = ( skinny_calls_info_t * ) tmp_listinfo - > prot_info ;
2009-01-30 21:25:52 +00:00
if ( tmp_skinnyinfo - > callId = = si - > callId | |
2012-04-04 16:55:14 +00:00
tmp_skinnyinfo - > callId = = si - > passThruId ) {
2009-01-30 21:25:52 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
break ;
}
}
list = g_list_next ( list ) ;
}
2010-08-30 16:10:01 +00:00
2009-01-30 21:25:52 +00:00
if ( si - > messId > = 256 )
phone = & ( pinfo - > dst ) ;
2010-08-30 16:10:01 +00:00
else
2009-01-30 21:25:52 +00:00
phone = & ( pinfo - > src ) ;
2012-04-04 16:55:14 +00:00
if ( callsinfo = = NULL ) {
2013-03-21 02:58:59 +00:00
callsinfo = ( voip_calls_info_t * ) g_malloc0 ( sizeof ( voip_calls_info_t ) ) ;
2009-01-30 21:25:52 +00:00
callsinfo - > call_state = VOIP_NO_STATE ;
callsinfo - > call_active_state = VOIP_ACTIVE ;
/* callsinfo->from_identity = g_strdup_printf("%s : %.8x", "Skinny", 1); */
callsinfo - > from_identity = g_strdup ( " " ) ;
callsinfo - > to_identity = g_strdup ( " " ) ;
callsinfo - > prot_info = g_malloc ( sizeof ( skinny_calls_info_t ) ) ;
callsinfo - > free_prot_info = g_free ;
2013-03-21 02:58:59 +00:00
tmp_skinnyinfo = ( skinny_calls_info_t * ) callsinfo - > prot_info ;
2009-01-30 21:25:52 +00:00
tmp_skinnyinfo - > callId = si - > callId ? si - > callId : si - > passThruId ;
callsinfo - > npackets = 1 ;
COPY_ADDRESS ( & ( callsinfo - > initial_speaker ) , phone ) ;
callsinfo - > protocol = VOIP_SKINNY ;
callsinfo - > call_num = tapinfo - > ncalls + + ;
2011-09-13 05:29:56 +00:00
callsinfo - > start_fd = pinfo - > fd ;
callsinfo - > stop_fd = pinfo - > fd ;
2009-01-30 21:25:52 +00:00
callsinfo - > selected = FALSE ;
2012-02-07 06:56:45 +00:00
tapinfo - > callsinfo_list = g_list_prepend ( tapinfo - > callsinfo_list , callsinfo ) ;
2009-01-30 21:25:52 +00:00
} else {
if ( si - > callingParty ) {
g_free ( callsinfo - > from_identity ) ;
callsinfo - > from_identity = g_strdup ( si - > callingParty ) ;
}
if ( si - > calledParty ) {
g_free ( callsinfo - > to_identity ) ;
callsinfo - > to_identity = g_strdup ( si - > calledParty ) ;
}
if ( ( si - > callState > 0 ) & & ( si - > callState < ( sizeof ( skinny_tap_voip_state ) / sizeof ( skinny_tap_voip_state [ 0 ] ) ) ) )
callsinfo - > call_state = skinny_tap_voip_state [ si - > callState ] ;
2011-09-13 05:29:56 +00:00
callsinfo - > stop_fd = pinfo - > fd ;
2009-01-30 21:25:52 +00:00
+ + ( callsinfo - > npackets ) ;
}
if ( si - > callId ) {
2010-08-30 16:10:01 +00:00
if ( si - > passThruId )
2009-01-30 21:25:52 +00:00
comment = g_strdup_printf ( " CallId = %u, PTId = %u " , si - > callId , si - > passThruId ) ;
else
comment = g_strdup_printf ( " CallId = %u, LineId = %u " , si - > callId , si - > lineId ) ;
} else {
2010-08-30 16:10:01 +00:00
if ( si - > passThruId )
2009-01-30 21:25:52 +00:00
comment = g_strdup_printf ( " PTId = %u " , si - > passThruId ) ;
else
comment = NULL ;
}
2010-08-30 16:10:01 +00:00
2009-01-30 21:25:52 +00:00
add_to_graph ( tapinfo , pinfo , si - > messageName , comment ,
callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
g_free ( comment ) ;
return 1 ;
}
/****************************************************************************/
/* TAP INTERFACE */
/****************************************************************************/
static gboolean have_skinny_tap_listener = FALSE ;
/****************************************************************************/
void
skinny_calls_init_tap ( void )
{
GString * error_string ;
2010-08-30 16:10:01 +00:00
2009-01-30 21:25:52 +00:00
if ( have_skinny_tap_listener = = FALSE )
{
2010-09-01 17:49:27 +00:00
/*
* Don ' t register the tap listener if we have it already .
* We set TL_REQUIRES_PROTO_TREE to force a non - null " tree "
* in the SKINNY dissector ; otherwise , the dissector
* doesn ' t fill in the info passed to the tap ' s packet
* routine .
*/
2012-03-14 17:26:49 +00:00
error_string = register_tap_listener ( " skinny " ,
& ( the_tapinfo_struct . skinny_dummy ) ,
2010-09-01 12:39:29 +00:00
NULL ,
TL_REQUIRES_PROTO_TREE ,
2009-01-30 21:25:52 +00:00
voip_calls_dlg_reset ,
skinny_calls_packet ,
voip_calls_dlg_draw
) ;
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
" %s " , error_string - > str ) ;
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_skinny_tap_listener = TRUE ;
}
}
/****************************************************************************/
void
remove_tap_listener_skinny_calls ( void )
{
remove_tap_listener ( & ( the_tapinfo_struct . skinny_dummy ) ) ;
have_skinny_tap_listener = FALSE ;
}
2009-03-11 06:43:46 +00:00
/****************************************************************************/
/* ***************************TAP for IAX2 **********************************/
/****************************************************************************/
/* IAX2 to tap-voip call state mapping */
static const voip_call_state tap_iax_voip_state [ ] = {
VOIP_NO_STATE ,
VOIP_CALL_SETUP , /*NEW*/
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_COMPLETED , /*HANGUP*/
VOIP_REJECTED , /*REJECT*/
VOIP_RINGING , /*ACCEPT*/
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_CALL_SETUP , /*DIAL*/
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE ,
VOIP_NO_STATE
} ;
static void free_iax2_info ( gpointer p ) {
2013-03-21 02:58:59 +00:00
iax2_info_t * ii = ( iax2_info_t * ) p ;
2009-03-11 06:43:46 +00:00
g_free ( ii ) ;
}
/****************************************************************************/
/* whenever a IAX2 packet is seen by the tap listener */
static int
iax2_calls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * iax2_info )
{
voip_calls_tapinfo_t * tapinfo = & the_tapinfo_struct ;
GList * list ;
voip_calls_info_t * callsinfo = NULL ;
address * phone ;
2013-03-21 02:58:59 +00:00
const iax2_info_t * ii = ( iax2_info_t * ) iax2_info ;
2009-03-11 06:43:46 +00:00
iax2_info_t * tmp_iax2info ;
if ( ii = = NULL | | ii - > ptype ! = IAX2_FULL_PACKET | | ( ii - > scallno = = 0 & & ii - > dcallno = = 0 ) )
return 0 ;
/* check whether we already have this context in the list */
list = g_list_first ( tapinfo - > callsinfo_list ) ;
while ( list )
{
2013-03-21 02:58:59 +00:00
voip_calls_info_t * tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2012-04-04 16:55:14 +00:00
if ( tmp_listinfo - > protocol = = VOIP_IAX2 ) {
2013-03-21 02:58:59 +00:00
tmp_iax2info = ( iax2_info_t * ) tmp_listinfo - > prot_info ;
2009-03-11 06:43:46 +00:00
if ( tmp_iax2info - > scallno = = ii - > scallno | |
2012-04-04 16:55:14 +00:00
tmp_iax2info - > scallno = = ii - > dcallno ) {
2009-03-11 06:43:46 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
break ;
}
}
list = g_list_next ( list ) ;
}
phone = & ( pinfo - > src ) ;
2010-08-30 16:10:01 +00:00
2009-03-11 06:43:46 +00:00
2012-04-04 16:55:14 +00:00
if ( callsinfo = = NULL ) {
2009-03-11 06:43:46 +00:00
/* We only care about real calls, i.e., no registration stuff */
if ( ii - > ftype ! = AST_FRAME_IAX | | ii - > csub ! = IAX_COMMAND_NEW )
2010-08-30 16:10:01 +00:00
return 0 ;
2013-03-21 02:58:59 +00:00
callsinfo = ( voip_calls_info_t * ) g_malloc0 ( sizeof ( voip_calls_info_t ) ) ;
2009-03-11 06:43:46 +00:00
callsinfo - > call_state = VOIP_NO_STATE ;
callsinfo - > call_active_state = VOIP_ACTIVE ;
callsinfo - > prot_info = g_malloc ( sizeof ( iax2_info_t ) ) ;
callsinfo - > free_prot_info = free_iax2_info ;
2013-03-21 02:58:59 +00:00
tmp_iax2info = ( iax2_info_t * ) callsinfo - > prot_info ;
2010-08-30 16:10:01 +00:00
2009-03-11 06:43:46 +00:00
tmp_iax2info - > scallno = ii - > scallno ;
if ( tmp_iax2info - > scallno = = 0 ) tmp_iax2info - > scallno = ii - > dcallno ;
tmp_iax2info - > callState = tap_iax_voip_state [ ii - > callState ] ;
2010-08-30 16:10:01 +00:00
2009-03-11 06:43:46 +00:00
callsinfo - > npackets = 1 ;
COPY_ADDRESS ( & ( callsinfo - > initial_speaker ) , phone ) ;
2010-08-30 16:10:01 +00:00
callsinfo - > from_identity = g_strdup ( ii - > callingParty ) ;
callsinfo - > to_identity = g_strdup ( ii - > calledParty ) ;
2009-03-11 06:43:46 +00:00
callsinfo - > protocol = VOIP_IAX2 ;
callsinfo - > call_num = tapinfo - > ncalls + + ;
2011-09-13 05:29:56 +00:00
callsinfo - > start_fd = pinfo - > fd ;
callsinfo - > stop_fd = pinfo - > fd ;
2009-03-11 06:43:46 +00:00
callsinfo - > selected = FALSE ;
2012-02-07 06:56:45 +00:00
tapinfo - > callsinfo_list = g_list_prepend ( tapinfo - > callsinfo_list , callsinfo ) ;
2009-03-11 06:43:46 +00:00
} else {
if ( ( ii - > callState > 0 ) & & ( ii - > callState < ( sizeof ( tap_iax_voip_state ) / sizeof ( tap_iax_voip_state [ 0 ] ) ) ) )
callsinfo - > call_state = tap_iax_voip_state [ ii - > callState ] ;
2010-08-30 16:10:01 +00:00
2011-09-13 05:29:56 +00:00
callsinfo - > stop_fd = pinfo - > fd ;
2009-03-11 06:43:46 +00:00
+ + ( callsinfo - > npackets ) ;
}
2012-12-26 05:57:06 +00:00
add_to_graph ( tapinfo , pinfo , ii - > messageName , " " ,
2009-03-11 06:43:46 +00:00
callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
return 1 ;
}
/****************************************************************************/
/* TAP INTERFACE */
/****************************************************************************/
static gboolean have_iax2_tap_listener = FALSE ;
/****************************************************************************/
void
iax2_calls_init_tap ( void )
{
GString * error_string ;
2010-08-30 16:10:01 +00:00
2009-03-11 06:43:46 +00:00
if ( have_iax2_tap_listener = = FALSE )
{
2010-09-01 17:49:27 +00:00
/*
* Don ' t register the tap listener if we have it already .
* We set TL_REQUIRES_PROTO_TREE to force a non - null " tree "
* in the IAX2 dissector ; otherwise , the dissector
* doesn ' t fill in the info passed to the tap ' s packet
* routine .
* XXX - that appears to be true of the MGCP and SKINNY
* dissectors , but , unless I ' ve missed something , it doesn ' t
* appear to be true of the IAX2 dissector .
*/
2012-03-14 17:26:49 +00:00
error_string = register_tap_listener ( " IAX2 " ,
& ( the_tapinfo_struct . iax2_dummy ) ,
2010-09-01 12:39:29 +00:00
NULL ,
TL_REQUIRES_PROTO_TREE ,
2009-03-11 06:43:46 +00:00
voip_calls_dlg_reset ,
iax2_calls_packet ,
voip_calls_dlg_draw
) ;
if ( error_string ! = NULL ) {
2009-03-11 07:35:43 +00:00
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK , " %s " ,
2009-03-11 06:43:46 +00:00
error_string - > str ) ;
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_iax2_tap_listener = TRUE ;
}
}
/****************************************************************************/
void
remove_tap_listener_iax2_calls ( void )
{
remove_tap_listener ( & ( the_tapinfo_struct . iax2_dummy ) ) ;
have_iax2_tap_listener = FALSE ;
}
2007-10-24 08:30:46 +00:00
/****************************************************************************/
/* ***************************TAP for OTHER PROTOCOL **********************************/
/****************************************************************************/
2008-08-05 17:33:14 +00:00
static int
2008-11-25 08:21:53 +00:00
VoIPcalls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * VoIPinfo )
2007-10-24 08:30:46 +00:00
{
voip_calls_tapinfo_t * tapinfo = & the_tapinfo_struct ;
2008-01-09 08:34:58 +00:00
voip_calls_info_t * callsinfo = NULL ;
2007-10-24 08:30:46 +00:00
voip_calls_info_t * tmp_listinfo ;
GList * list = NULL ;
2013-03-21 02:58:59 +00:00
const voip_packet_info_t * pi = ( voip_packet_info_t * ) VoIPinfo ;
2007-10-24 08:30:46 +00:00
if ( pi - > call_id )
2008-01-09 08:34:58 +00:00
list = g_list_first ( tapinfo - > callsinfo_list ) ;
2007-10-24 08:30:46 +00:00
while ( list ) {
2013-03-21 02:58:59 +00:00
tmp_listinfo = ( voip_calls_info_t * ) list - > data ;
2007-10-24 08:30:46 +00:00
if ( tmp_listinfo - > protocol = = VOIP_COMMON ) {
if ( ! strcmp ( pi - > call_id , tmp_listinfo - > call_id ) ) {
2008-01-09 08:34:58 +00:00
callsinfo = ( voip_calls_info_t * ) ( list - > data ) ;
2007-10-24 08:30:46 +00:00
break ;
}
}
list = g_list_next ( list ) ;
}
2008-01-09 08:34:58 +00:00
if ( callsinfo = = NULL ) {
2013-03-21 02:58:59 +00:00
callsinfo = ( voip_calls_info_t * ) g_malloc0 ( sizeof ( voip_calls_info_t ) ) ;
2008-01-09 08:34:58 +00:00
callsinfo - > call_active_state = pi - > call_active_state ;
callsinfo - > call_state = pi - > call_state ;
callsinfo - > call_id = g_strdup ( ( pi - > call_id ) ? pi - > call_id : " " ) ;
callsinfo - > from_identity = g_strdup ( ( pi - > from_identity ) ? pi - > from_identity : " " ) ;
callsinfo - > to_identity = g_strdup ( ( pi - > to_identity ) ? pi - > to_identity : " " ) ;
COPY_ADDRESS ( & ( callsinfo - > initial_speaker ) , & ( pinfo - > src ) ) ;
callsinfo - > selected = FALSE ;
2011-09-13 05:29:56 +00:00
callsinfo - > start_fd = pinfo - > fd ;
2008-01-09 08:34:58 +00:00
callsinfo - > protocol = VOIP_COMMON ;
callsinfo - > protocol_name = g_strdup ( ( pi - > protocol_name ) ? pi - > protocol_name : " " ) ;
callsinfo - > call_comment = g_strdup ( ( pi - > call_comment ) ? pi - > call_comment : " " ) ;
callsinfo - > prot_info = NULL ;
callsinfo - > free_prot_info = NULL ;
2008-08-05 17:33:14 +00:00
2008-01-09 08:34:58 +00:00
callsinfo - > call_num = tapinfo - > ncalls + + ;
callsinfo - > npackets = 0 ;
2008-08-05 17:33:14 +00:00
2012-02-07 06:56:45 +00:00
tapinfo - > callsinfo_list = g_list_prepend ( tapinfo - > callsinfo_list , callsinfo ) ;
2007-10-24 08:30:46 +00:00
}
2012-04-04 16:52:18 +00:00
callsinfo - > call_active_state = pi - > call_active_state ;
if ( ( callsinfo - > call_state ! = VOIP_COMPLETED ) & & ( pi - > call_state = = VOIP_COMPLETED ) )
tapinfo - > completed_calls + + ;
2007-10-25 12:24:01 +00:00
if ( pi - > call_state ! = VOIP_NO_STATE )
2012-04-04 16:52:18 +00:00
callsinfo - > call_state = pi - > call_state ;
if ( pi - > call_comment ) {
g_free ( callsinfo - > call_comment ) ;
callsinfo - > call_comment = g_strdup ( pi - > call_comment ) ;
2007-10-24 08:30:46 +00:00
}
2012-04-04 16:52:18 +00:00
callsinfo - > stop_fd = pinfo - > fd ;
+ + ( callsinfo - > npackets ) ;
+ + ( tapinfo - > npackets ) ;
2007-10-24 08:30:46 +00:00
/* add to the graph */
2008-11-25 08:21:53 +00:00
add_to_graph ( tapinfo , pinfo , ( pi - > frame_label ) ? pi - > frame_label : " VoIP msg " , pi - > frame_comment , callsinfo - > call_num , & ( pinfo - > src ) , & ( pinfo - > dst ) , 1 ) ;
2007-10-24 08:30:46 +00:00
tapinfo - > redraw = TRUE ;
return 1 ;
}
/****************************************************************************/
static gboolean have_voip_tap_listener = FALSE ;
void
VoIPcalls_init_tap ( void )
{
GString * error_string ;
if ( have_voip_tap_listener = = FALSE )
{
error_string = register_tap_listener ( " voip " , & ( the_tapinfo_struct . voip_dummy ) ,
NULL ,
2009-06-05 22:42:47 +00:00
0 ,
2007-10-24 08:30:46 +00:00
voip_calls_dlg_reset ,
2008-08-05 17:33:14 +00:00
VoIPcalls_packet ,
2007-10-24 08:30:46 +00:00
voip_calls_dlg_draw
) ;
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2007-10-24 08:30:46 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_voip_tap_listener = TRUE ;
}
}
/****************************************************************************/
void
remove_tap_listener_voip_calls ( void )
{
remove_tap_listener ( & ( the_tapinfo_struct . voip_dummy ) ) ;
have_voip_tap_listener = FALSE ;
}
2005-02-01 12:12:35 +00:00
/****************************************************************************/
/* ***************************TAP for OTHER PROTOCOL **********************************/
/****************************************************************************/
/****************************************************************************/
/* whenever a prot_ packet is seen by the tap listener */
2005-02-02 01:02:09 +00:00
/*
2008-08-05 17:33:14 +00:00
static int
2005-02-02 01:02:09 +00:00
prot_calls_packet ( void * ptr _U_ , packet_info * pinfo , epan_dissect_t * edt _U_ , const void * prot_info _U_ )
2005-02-01 12:12:35 +00:00
{
2005-02-02 01:02:09 +00:00
voip_calls_tapinfo_t * tapinfo = & the_tapinfo_struct ;
2012-04-04 16:55:14 +00:00
if ( callsinfo ! = NULL ) {
2010-03-03 20:35:50 +00:00
callsinfo - > stop_abs = pinfo - > fd - > abs_ts ;
callsinfo - > stop_rel = pinfo - > fd - > rel_ts ;
2008-01-09 08:34:58 +00:00
callsinfo - > last_frame_num = pinfo - > fd - > num ;
+ + ( callsinfo - > npackets ) ;
2005-02-01 12:12:35 +00:00
+ + ( tapinfo - > npackets ) ;
}
From Alejandro Vaquero
- avoid the clist of the calls dlg to be refreshed multiple times when
first appear.
- destroy the Graph window when the data is not valid anymore.
- fixes an H245 packet count error
- resizing the Graph windows when is displayed (up to 5 columns).
With a change to leave static voip_calls_tapinfo_t the_tapinfo_struct =
{0, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0};
alone.
svn path=/trunk/; revision=14852
2005-07-05 05:16:28 +00:00
tapinfo - > redraw = TRUE ;
2005-02-01 12:12:35 +00:00
return 1 ;
}
*/
/****************************************************************************/
/*
static gboolean have_prot__tap_listener = FALSE ;
void
prot_calls_init_tap ( void )
{
GString * error_string ;
if ( have_prot__tap_listener = = FALSE )
{
2005-02-02 01:02:09 +00:00
error_string = register_tap_listener ( " prot_ " , & ( the_tapinfo_struct . prot__dummy ) ,
2005-02-01 12:12:35 +00:00
NULL ,
2009-06-05 22:42:47 +00:00
0 ,
2005-02-02 01:02:09 +00:00
voip_calls_dlg_reset ,
2008-08-05 17:33:14 +00:00
prot__calls_packet ,
2005-02-02 01:02:09 +00:00
voip_calls_dlg_draw
) ;
2005-02-01 12:12:35 +00:00
if ( error_string ! = NULL ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK ,
2008-10-31 09:53:56 +00:00
" %s " , error_string - > str ) ;
2005-02-01 12:12:35 +00:00
g_string_free ( error_string , TRUE ) ;
exit ( 1 ) ;
}
have_prot__tap_listener = TRUE ;
}
}
*/
/****************************************************************************/
/*
void
remove_tap_listener_prot__calls ( void )
{
2005-02-02 01:02:09 +00:00
remove_tap_listener ( & ( the_tapinfo_struct . prot__dummy ) ) ;
2005-02-01 12:12:35 +00:00
have_prot__tap_listener = FALSE ;
}
*/
2012-09-01 23:33:54 +00:00
/*
* Editor modelines - http : //www.wireshark.org/tools/modelines.html
*
* Local variables :
* c - basic - offset : 8
* tab - width : 8
* indent - tabs - mode : t
* End :
*
* vi : set shiftwidth = 8 tabstop = 8 noexpandtab :
* : indentSize = 8 : tabSize = 8 : noTabs = false :
*/