#!/usr/bin/perl -w
#
# Copyright (C) 2001 by USC/ISI
# All rights reserved.
#
# Redistribution and use in source and binary forms are permitted
# provided that the above copyright notice and this paragraph are
# duplicated in all such forms and that any documentation, advertising
# materials, and other materials related to such distribution and use
# acknowledge that the software was developed by the University of
# Southern California, Information Sciences Institute. The name of the
# University may not be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
# This work is supported by DARPA through SAMAN Project
# (http://www.isi.edu/saman/), administered by the Space and Naval
# Warfare System Center San Diego under Contract No. N66001-00-C-8066
#
sub usage {
print STDERR <<END;
usage: $0 [-w FilenameExtention]
Options:
-w string specify the filename extention
END
exit 1;
}
BEGIN {
$dblibdir = "./";
push(@INC, $dblibdir);
}
use DbGetopt;
require "dblib.pl";
my(@orig_argv) = @ARGV;
&usage if ($#ARGV < 0);
my($prog) = &progname;
my($dbopts) = new DbGetopt("w:?", \@ARGV);
my($ch);
while ($dbopts->getopt) {
$ch = $dbopts->opt;
if ($ch eq 'w') {
$fext = $dbopts->optarg;
} else {
&usage;
};
};
$foutbw=join(".",$fext,"outbound.BW");
$foutdelay=join(".",$fext,"outbound.delay");
$oldc="";
$olds="";
$c="";
$s="";
$c1="";
$s1="";
$d=0;
$a=0;
$oldq=0;
$i=0;
$j=0;
local(@datan);
local(@n);
local(@dataq);
local(@q);
#estimate delay and bottleneck bandwidth for outbound traffic
open(OUTBW,"> $foutbw") || die("cannot open $foutbw\n");
open(OUTDELAY,"> $foutdelay") || die("cannot open $foutdelay\n");
while (<>) {
($client,$server,$timed,$timea,$seq) = split(' ',$_);
$gap=$seq - $oldq;
#the gap between two back-to-back packets should be less than 1ms
$thresh=$d + 0.001;
#estimate delay between ISI server and remote clients
$delay=$timea - $timed;
#extra check: RTT should be at least 1ms
if ($delay > 0.001) {
if (($c1 ne $client ) || ($s1 ne $server)) {
if ( $j gt 0 ) {
@dataq = sort numerically @q;
$m=int($j/2);
# print OUTDELAY "$c1 $s1 $dataq[$m]\n";
$onewayD=$dataq[$m]/2.0;
print OUTDELAY "$onewayD\n";
}
$#q=0;
$q[0]=$delay;
$j=1;
} else {
$q[$j]=$delay;
$j=$j + 1;
}
}
$c1=$client;
$s1=$server;
#estimate bottleneck bandwidth between ISI server and remote clients
# if ( ($gap eq 1460) && ($client eq $oldc) && ($server eq $olds) && ($timed lt $thresh)) {
if ( ($client eq $oldc) && ($server eq $olds) && ($timed lt $thresh)) {
$gap1=$timed - $d;
$gap2=$timea - $a;
if ( $gap2 gt $gap1) {
if (($c ne $client) || ($s ne $server)) {
#at least 3 samples to take the medium
if ($i gt 3 ) {
@datan = sort numerically @n;
$m=int($i/2);
# $bw=0.01168/$datan[$m];
#take the minimum instead of medium
# $bw=0.01168/$datan[$#n];
$bw=$datan[$#n];
if ( $bw lt 100) {
# print OUTBW "$c $s $bw\n";
print OUTBW "$bw\n";
}
}
$#n=0;
# $n[0]=$gap2;
$n[0]=($gap*8)/($gap2*1000000);
$i=1;
} else {
# $n[$i]=$gap2;
$n[$i]=($gap*8)/($gap2*1000000);
$i=$i + 1;
}
$c=$client;
$s=$server;
}
}
$oldc=$client;
$olds=$server;
$d=$timed;
$a=$timea;
$oldq=$seq;
}
close(OUTBW);
close(OUTDELAY);
sub numerically { $a <=> $b; }
syntax highlighted by Code2HTML, v. 0.9.1