2015-06-20 16:22:22 +00:00
/* tap-rtd.c
*
* Based on tap - srt . c
*
* Wireshark - Network traffic analyzer
* By Gerald Combs < gerald @ wireshark . org >
* Copyright 1998 Gerald Combs
*
2018-04-30 07:47:58 +00:00
* SPDX - License - Identifier : GPL - 2.0 - or - later
*/
2015-06-20 16:22:22 +00:00
# include "config.h"
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <epan/packet.h>
# include <epan/rtd_table.h>
# include <epan/timestamp.h>
# include <epan/stat_tap_ui.h>
2019-01-01 00:55:23 +00:00
# include <ui/cmdarg_err.h>
2015-06-20 16:22:22 +00:00
# include <ui/cli/tshark-tap.h>
typedef struct _rtd_t {
const char * type ;
const char * filter ;
const value_string * vs_type ;
rtd_data_t rtd ;
} rtd_t ;
static void
rtd_draw ( void * arg )
{
rtd_data_t * rtd_data = ( rtd_data_t * ) arg ;
rtd_t * rtd = ( rtd_t * ) rtd_data - > user_data ;
gchar * tmp_str ;
guint i , j ;
/* printing results */
printf ( " \n " ) ;
printf ( " ===================================================================================================== \n " ) ;
printf ( " %s Response Time Delay (RTD) Statistics: \n " , rtd - > type ) ;
printf ( " Filter for statistics: %s \n " , rtd - > filter ? rtd - > filter : " " ) ;
if ( rtd_data - > stat_table . num_rtds = = 1 )
{
printf ( " Duplicate requests: %u \n " , rtd_data - > stat_table . time_stats [ 0 ] . req_dup_num ) ;
printf ( " Duplicate responses: %u \n " , rtd_data - > stat_table . time_stats [ 0 ] . rsp_dup_num ) ;
printf ( " Open requests: %u \n " , rtd_data - > stat_table . time_stats [ 0 ] . open_req_num ) ;
printf ( " Discarded responses: %u \n " , rtd_data - > stat_table . time_stats [ 0 ] . disc_rsp_num ) ;
printf ( " Type | Messages | Min RTD | Max RTD | Avg RTD | Min in Frame | Max in Frame | \n " ) ;
for ( i = 0 ; i < rtd_data - > stat_table . time_stats [ 0 ] . num_timestat ; i + + ) {
if ( rtd_data - > stat_table . time_stats [ 0 ] . rtd [ i ] . num ) {
tmp_str = val_to_str_wmem ( NULL , i , rtd - > vs_type , " Other (%d) " ) ;
printf ( " %s | %7u | %8.2f msec | %8.2f msec | %8.2f msec | %10u | %10u | \n " ,
tmp_str , rtd_data - > stat_table . time_stats [ 0 ] . rtd [ i ] . num ,
nstime_to_msec ( & ( rtd_data - > stat_table . time_stats [ 0 ] . rtd [ i ] . min ) ) , nstime_to_msec ( & ( rtd_data - > stat_table . time_stats [ 0 ] . rtd [ i ] . max ) ) ,
get_average ( & ( rtd_data - > stat_table . time_stats [ 0 ] . rtd [ i ] . tot ) , rtd_data - > stat_table . time_stats [ 0 ] . rtd [ i ] . num ) ,
rtd_data - > stat_table . time_stats [ 0 ] . rtd [ i ] . min_num , rtd_data - > stat_table . time_stats [ 0 ] . rtd [ i ] . max_num
) ;
wmem_free ( NULL , tmp_str ) ;
}
}
}
else
{
printf ( " Type | Messages | Min RTD | Max RTD | Avg RTD | Min in Frame | Max in Frame | Open Requests | Discarded responses | Duplicate requests | Duplicate responses \n " ) ;
for ( i = 0 ; i < rtd_data - > stat_table . num_rtds ; i + + ) {
for ( j = 0 ; j < rtd_data - > stat_table . time_stats [ i ] . num_timestat ; j + + ) {
if ( rtd_data - > stat_table . time_stats [ i ] . rtd [ j ] . num ) {
tmp_str = val_to_str_wmem ( NULL , i , rtd - > vs_type , " Other (%d) " ) ;
printf ( " %s | %7u | %8.2f msec | %8.2f msec | %8.2f msec | %10u | %10u | %10u | %10u | %4u (%4.2f%%) | %4u (%4.2f%%) | \n " ,
tmp_str , rtd_data - > stat_table . time_stats [ i ] . rtd [ j ] . num ,
nstime_to_msec ( & ( rtd_data - > stat_table . time_stats [ i ] . rtd [ j ] . min ) ) , nstime_to_msec ( & ( rtd_data - > stat_table . time_stats [ i ] . rtd [ j ] . max ) ) ,
get_average ( & ( rtd_data - > stat_table . time_stats [ i ] . rtd [ j ] . tot ) , rtd_data - > stat_table . time_stats [ i ] . rtd [ j ] . num ) ,
rtd_data - > stat_table . time_stats [ i ] . rtd [ j ] . min_num , rtd_data - > stat_table . time_stats [ i ] . rtd [ j ] . max_num ,
rtd_data - > stat_table . time_stats [ i ] . open_req_num , rtd_data - > stat_table . time_stats [ i ] . disc_rsp_num ,
rtd_data - > stat_table . time_stats [ i ] . req_dup_num ,
rtd_data - > stat_table . time_stats [ i ] . rtd [ j ] . num ? ( ( double ) rtd_data - > stat_table . time_stats [ i ] . req_dup_num * 100 ) / ( double ) rtd_data - > stat_table . time_stats [ i ] . rtd [ j ] . num : 0 ,
rtd_data - > stat_table . time_stats [ i ] . rsp_dup_num ,
rtd_data - > stat_table . time_stats [ i ] . rtd [ j ] . num ? ( ( double ) rtd_data - > stat_table . time_stats [ i ] . rsp_dup_num * 100 ) / ( double ) rtd_data - > stat_table . time_stats [ i ] . rtd [ j ] . num : 0
) ;
wmem_free ( NULL , tmp_str ) ;
}
}
}
}
printf ( " ===================================================================================================== \n " ) ;
}
static void
init_rtd_tables ( register_rtd_t * rtd , const char * filter )
{
2016-06-19 09:01:56 +00:00
GString * error_string ;
2015-06-20 16:22:22 +00:00
rtd_t * ui ;
ui = g_new0 ( rtd_t , 1 ) ;
ui - > type = proto_get_protocol_short_name ( find_protocol_by_id ( get_rtd_proto_id ( rtd ) ) ) ;
ui - > filter = g_strdup ( filter ) ;
ui - > vs_type = get_rtd_value_string ( rtd ) ;
ui - > rtd . user_data = ui ;
rtd_table_dissector_init ( rtd , & ui - > rtd . stat_table , NULL , NULL ) ;
2018-07-21 00:07:19 +00:00
error_string = register_tap_listener ( get_rtd_tap_listener_name ( rtd ) , & ui - > rtd , filter , 0 , NULL , get_rtd_packet_func ( rtd ) , rtd_draw , NULL ) ;
2015-06-20 16:22:22 +00:00
if ( error_string ) {
2018-05-12 23:00:36 +00:00
free_rtd_table ( & ui - > rtd . stat_table ) ;
2018-12-30 02:24:56 +00:00
cmdarg_err ( " Couldn't register srt tap: %s " , error_string - > str ) ;
2016-06-19 09:01:56 +00:00
g_string_free ( error_string , TRUE ) ;
2015-06-20 16:22:22 +00:00
exit ( 1 ) ;
}
}
static void
dissector_rtd_init ( const char * opt_arg , void * userdata )
{
register_rtd_t * rtd = ( register_rtd_t * ) userdata ;
const char * filter = NULL ;
char * err = NULL ;
rtd_table_get_filter ( rtd , opt_arg , & filter , & err ) ;
if ( err ! = NULL )
{
2018-12-30 02:24:56 +00:00
cmdarg_err ( " %s " , err ) ;
2015-06-20 16:22:22 +00:00
g_free ( err ) ;
exit ( 1 ) ;
}
init_rtd_tables ( rtd , filter ) ;
}
/* Set GUI fields for register_rtd list */
2017-02-08 01:18:33 +00:00
gboolean
register_rtd_tables ( const void * key _U_ , void * value , void * userdata _U_ )
2015-06-20 16:22:22 +00:00
{
2017-02-08 01:18:33 +00:00
register_rtd_t * rtd = ( register_rtd_t * ) value ;
2015-06-20 16:22:22 +00:00
stat_tap_ui ui_info ;
2018-02-20 22:41:34 +00:00
gchar * cli_string ;
2015-06-20 16:22:22 +00:00
2018-02-20 22:41:34 +00:00
cli_string = rtd_table_get_tap_string ( rtd ) ;
2015-06-20 16:22:22 +00:00
ui_info . group = REGISTER_STAT_GROUP_RESPONSE_TIME ;
ui_info . title = NULL ; /* construct this from the protocol info? */
2018-02-20 22:41:34 +00:00
ui_info . cli_string = cli_string ;
2015-06-20 16:22:22 +00:00
ui_info . tap_init_cb = dissector_rtd_init ;
ui_info . nparams = 0 ;
ui_info . params = NULL ;
register_stat_tap_ui ( & ui_info , rtd ) ;
2018-02-20 22:41:34 +00:00
g_free ( cli_string ) ;
2017-02-08 01:18:33 +00:00
return FALSE ;
2015-06-20 16:22:22 +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 :
*/