aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/tethereal.pod.template10
-rw-r--r--tap-iostat.c34
2 files changed, 31 insertions, 13 deletions
diff --git a/doc/tethereal.pod.template b/doc/tethereal.pod.template
index c9828bbdc7..a5e459ad91 100644
--- a/doc/tethereal.pod.template
+++ b/doc/tethereal.pod.template
@@ -348,7 +348,9 @@ This option can be used multiple times on the command line.
B<-z> io,stat,I<interval>[,I<filter>][,I<filter>][,I<filter>]...
Collect frame/bytes statistics for the capture in intervals of I<interval>
-seconds.
+seconds. I<Intervals> can be specified either as whole or fractional seconds.
+Interval can be specified in ms resolution.
+
If no I<filter> is specified the statistics will be calculated for all frames.
If one or more I<filters> are specified statistics will be calculated for
all filters and presented with one column of statistics for each filter.
@@ -356,6 +358,12 @@ all filters and presented with one column of statistics for each filter.
This option can be used multiple times on the command line.
+Example: -z io,stat,1,ip.addr==1.2.3.4 to generate 1 second statistics for
+all traffic to/from host 1.2.3.4
+
+Example: -z "io,stat,0.001,smb&&ip.addr==1.2.3.4" to generate 1ms statistics for all SMB frames to/from host 1.2.3.4.
+
+
B<-z> io,users,I<type>[,I<filter>]
Create a table that lists all conversations that could be seen in the capture.
diff --git a/tap-iostat.c b/tap-iostat.c
index c1b350b177..5e6602ac3a 100644
--- a/tap-iostat.c
+++ b/tap-iostat.c
@@ -1,7 +1,7 @@
/* tap-iostat.c
* iostat 2002 Ronnie Sahlberg
*
- * $Id: tap-iostat.c,v 1.3 2002/11/15 10:55:15 sahlberg Exp $
+ * $Id: tap-iostat.c,v 1.4 2003/04/22 09:02:47 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -39,7 +39,7 @@
typedef struct _io_stat_t {
- gint32 interval;
+ gint32 interval; /* unit is ms */
guint32 num_items;
struct _io_stat_item_t *items;
char **filters;
@@ -49,7 +49,7 @@ typedef struct _io_stat_item_t {
io_stat_t *parent;
struct _io_stat_item_t *next;
struct _io_stat_item_t *prev;
- gint32 time;
+ gint32 time; /* unit is ms since start of capture */
guint32 frames;
guint32 bytes;
} io_stat_item_t;
@@ -102,25 +102,28 @@ static int
iostat_packet(io_stat_item_t *mit, packet_info *pinfo, epan_dissect_t *edt _U_, void *dummy _U_)
{
io_stat_item_t *it;
+ gint32 current_time;
+
+ current_time=((pinfo->fd->rel_secs*1000)+(pinfo->fd->rel_usecs/1000));
/* the prev item before the main one is always the last interval we saw packets for */
it=mit->prev;
/* XXX for the time being, just ignore all frames that are in the past.
should be fixed in the future but hopefully it is uncommon */
- if(pinfo->fd->rel_secs<it->time){
+ if(current_time<it->time){
return FALSE;
}
/* we have moved into a new interval, we need to create a new struct */
- if(pinfo->fd->rel_secs>=(it->time+mit->parent->interval)){
+ if(current_time>=(it->time+mit->parent->interval)){
it->next=g_malloc(sizeof(io_stat_item_t));
it->next->prev=it;
it->next->next=NULL;
it=it->next;
mit->prev=it;
- it->time=(pinfo->fd->rel_secs / mit->parent->interval) * mit->parent->interval;
+ it->time=(current_time / mit->parent->interval) * mit->parent->interval;
it->frames=0;
it->bytes=0;
}
@@ -151,12 +154,12 @@ iostat_draw(io_stat_item_t *mit)
for(i=0;i<iot->num_items;i++){
printf("Column #%d: %s\n",i,iot->filters[i]?iot->filters[i]:"");
}
- printf(" ");
+ printf(" ");
for(i=0;i<iot->num_items;i++){
printf("| Column #%-2d ",i);
}
printf("\n");
- printf("Time ");
+ printf("Time ");
for(i=0;i<iot->num_items;i++){
printf("|frames| bytes ");
}
@@ -194,7 +197,9 @@ iostat_draw(io_stat_item_t *mit)
}
if(more_items){
- printf("%5d-%5d ",t,t+iot->interval);
+ printf("%03d.%03d-%03d.%03d ",
+ t/1000,t%1000,
+ (t+iot->interval)/1000,(t+iot->interval)%1000);
for(i=0;i<iot->num_items;i++){
printf("%6d %9d ",frames[i],bytes[i]);
}
@@ -234,11 +239,13 @@ register_io_tap(io_stat_t *io, int i, char *filter)
void
iostat_init(char *optarg)
{
- int interval, pos=0;
+ float interval_float;
+ gint32 interval;
+ int pos=0;
io_stat_t *io;
char *filter=NULL;
- if(sscanf(optarg,"io,stat,%d,%n",&interval,&pos)==1){
+ if(sscanf(optarg,"io,stat,%f,%n",&interval_float,&pos)==1){
if(pos){
filter=optarg+pos;
} else {
@@ -249,8 +256,11 @@ iostat_init(char *optarg)
exit(1);
}
+
+ /* make interval be number of ms */
+ interval=interval_float*1000;
if(interval<1){
- fprintf(stderr, "tethereal:iostat_init() interval must be >0 seconds\n");
+ fprintf(stderr, "tethereal:iostat_init() interval must be >=0.001 seconds\n");
exit(10);
}