#!/usr/bin/perl

# =============================================================================

if( $#ARGV < 1 || $#ARGV > 3 ) { usage(); }

open( FILE, $ARGV[0] ) || die "file $ARGV[0] not found.\n";

# .. variabledeclarations .....................................................
$totRcvd = 0;   # total received packets
$totLost = 0;   # total lost packets
$curQLen = 0;   # current queue length
$totQLen = 0;   # total queue length
$counter = 0;   # counts the number of intervals
$interval = 1;  # size of an measure-interval
$oldTStamp = 0; # last time-stamp
# .............................................................................

while( $line = <FILE> )
{
  @word = split( '\s+', $line ); # split columns of a line and save into array
  # word[0]: event ('r': receive, '+': enqueue, '-': dequeue, 'd': drop)
  # word[1]: actual time (timestamp)
  # word[4]: packet type
  # word[5]: packet size

  if( $#ARGV < 2 || $word[3] eq $ARGV[2] )
  {
    if( $#ARGV < 3 || $word[2] eq $ARGV[3] )
    {
      # accumulate received and dropped packets
      if( $word[4] eq $ARGV[1] && $word[0] eq "r" ) { $totRcvd += $word[5]; }
      if( $word[4] eq $ARGV[1] && $word[0] eq "d" ) { $totLost += $word[5]; }

      # count enqued and dequeued packets
      if( $word[0] eq "+" ) { $curQLen++; }
      if( $word[0] eq "-" || $word[0] eq "d" ) { $curQLen--; }

      $newTStamp = $word[1];
      if( ( $newTStamp - $oldTStamp ) >= $interval )
      {
        $totQLen += $curQLen;    # accumulate total queue length
        $counter++;              # increase counter
        $oldTStamp = $newTStamp; # save actual time-stamp as last time-stamp
      }
    }
  }
}

$avgQLen = $totQLen / $counter; # calculate avarage length of the queue

# print statistics
print "Total Received:\t\t$totRcvd\n";
print "Total Lost:\t\t$totLost\n";
print "Average Queue Length:\t$avgQLen\n";

exit;

# -----------------------------------------------------------------------------

sub usage
{
  print STDERR "Stats:\t\tprint statistis of a nam-tracefile\n";
  print STDERR "Usage:\t\tjava Stats file.tr type [dst [scr]]\n";
  print STDERR "Example types:\ttcp, ack, udp, cbr\n";
  exit;
}

# =============================================================================