#!/usr/bin/perl
use strict;
use Getopt::Long;
my $malwareOpt=undef;
my $inputFileOpt='';
my $help='';
my $extraTiming=undef;
GetOptions(
'malware=i' => \$malwareOpt,
'file=s' => \$inputFileOpt,
'help!' => \$help,
'timing', => \$extraTiming,
) or die "incorrect options --file --malware \n";
my $myFile = '';
my $malware = 0;
## we assume we are only interested in the output trace file from the simulator
if ( -e $inputFileOpt ) {
$myFile = $inputFileOpt;
} else {
print "simulator trace file does not exist";
exit(0);
}
my %malPeer=();
if ( defined( $malwareOpt ) ) {
$malware = 1;
%malPeer=&loadMalwarePopulation();
}
my $numRequests = './numRequests';
my $plotFile = './plotter';
my $timingFile = './timing';
my $avgRTTFile = './avgRTT';
open(IN, "<" . $myFile);
if ( defined($malwareOpt) ) {
open(REQ, ">" . $numRequests . "_" . $malwareOpt);
open(PLOT, ">" . $plotFile . "_" . $malwareOpt);
open(TIMING, ">" . $timingFile . "_" . $malwareOpt);
open(AVGRTT, ">" . $avgRTTFile . "_" . $malwareOpt);
} else {
open(REQ, ">" . $numRequests);
open(PLOT, ">" . $plotFile);
open(TIMING, ">" . $timingFile);
open(AVGRTT, ">" . $avgRTTFile );
}
my %myTargetHash = ();
my %myDestHash = ();
my %myRTTHash = ();
my $hopCount=0;
my $timeCount=0;
my $valLine='';
my $fromVal='';
my $messageId='';
my $destVal='';
my $uniqueNumber=0;
my $targetNode='';
my $messageCount=0;
while( ) {
## we need to parse
# 681: 5197 8FA2 DB7A 93E3: recv GetMessage(2395) from 23F5 FA29 9858 2F84 for 50E0 A3F3 E77B C109 2 hops, 676 ms, 0 resents, 40 size
if ( $malware == 1 ) {
if (/^(\d+): (\w+ \w+ \w+ \w+): recv GetMessage\((\d+)\) from (\w+ \w+ \w+ \w+) for (\w+ \w+ \w+ \w+) (\d+) hops, (\d+) ms, (\d+) resents, (\d+) size (\d+)/) {
$hopCount=0;
$timeCount=0;
$valLine='';
$fromVal='';
$messageId='';
$destVal='';
$uniqueNumber=0;
$targetNode='';
$messageCount=0;
#print "GetMessage\t" . $1 . " " . $2 . " " . $3 . " " . $4 . " " . $5 . " " . $6 . " " . $7 . "\n";
$uniqueNumber=$1;
$targetNode=$2;
$messageId=$3;
$hopCount=$6;
$timeCount=$7;
$fromVal=$4;
$destVal=$5;
$valLine= $3 . "|" . $4 . "|" . $5 . "|tempHops|tempTime|" . $8 . "|" . $9;
if ( $malware==1 ) {
if ( exists( $malPeer{ $fromVal } ) ) {
$myDestHash{ ${ messageId } } = $destVal;
}
} else {
$myDestHash{ ${ messageId } } = $destVal;
}
$messageCount=$10;
}
} else {
if (/^(\d+): (\w+ \w+ \w+ \w+): recv GetMessage\((\d+)\) from (\w+ \w+ \w+ \w+) for (\w+ \w+ \w+ \w+) (\d+) hops, (\d+) ms, (\d+) resents, (\d+) size (\d+)/) {
$hopCount=0;
$timeCount=0;
$valLine='';
$fromVal='';
$messageId='';
$destVal='';
$uniqueNumber=0;
$targetNode='';
#print "GetMessage\t" . $1 . " " . $2 . " " . $3 . " " . $4 . " " . $5 . " " . $6 . " " . $7 . "\n";
$uniqueNumber=$1;
$targetNode=$2;
$messageId=$3;
$hopCount=$6;
$timeCount=$7;
$fromVal=$4;
$destVal=$5;
$valLine= $3 . "|" . $4 . "|" . $5 . "|tempHops|tempTime|" . $8 . "|" . $9;
$myDestHash{ ${ messageId } } = $destVal;
$messageCount=$10;
}
}
## we need to parse this line
# recv GetReplyMessage(3596) from 5197 8FA2 DB7A 93E3 for 23F5 FA29 9858 2F84 1 hops, 352 ms, 0 resents, 44 size
if (/recv GetReplyMessage\((\d+)\) from (\w+ \w+ \w+ \w+) for (\w+ \w+ \w+ \w+) (\d+) hops, (\d+) ms, (\d+) resents, (\d+) size/) {
#print "GetReplyMessage\t" . $1 . " " . $2 . " " . $3 . " " . $4 . " " . $5 . " " . $6 . " " . $7 . "\n";
## we now need to match the reply with the associated message request
# could have just assumed that it would follow - but that's not great
if ( $fromVal eq $3 ) {
$hopCount=$hopCount + $4;
$timeCount=$timeCount + $5;
if ( defined( $extraTiming ) ) {
if ( $messageCount > 60 ) {
$timeCount=$timeCount + 500;
}
}
$valLine=~ s/tempHops/$hopCount/;
$valLine=~ s/tempTime/$timeCount/;
if ( $malware==1 ) {
if ( exists( $malPeer{ $fromVal } ) ) {
$myTargetHash{ $destVal }{ $messageId } = $valLine;
$myRTTHash{ $destVal }{ $messageId } = $timeCount;
}
} else {
$myTargetHash{ $destVal }{ $messageId } = $valLine;
$myRTTHash{ $destVal }{ $messageId } = $timeCount;
}
$fromVal = '';
}
}
## We are going to count the number of requests which each node gets
}
my $counter;
my %plotInfo=();
my $plotCounter=0;
my $totalTime=0;
my $minTime=1500;
my $maxTime=0;
my $level='';
my $nextLevel='';
my %avgRTT = ();
$counter=0;
for $level ( keys %myTargetHash ) {
my $avgRTT=0;
#print $level . "\n";
for $nextLevel ( keys %{ $myTargetHash{$level} } ) {
## we count out how many requests each node has received
print REQ "\t" . $nextLevel . " >>> " . $myDestHash{ ${ nextLevel } } . "\n";
$avgRTT = ( $avgRTT + $myRTTHash{ $level }{ $nextLevel} );
$counter=$counter+1;
}
print AVGRTT $avgRTT . " " . $counter . "\t" . $level . "\t" . ( $avgRTT / $counter ) . "\n";
$avgRTT{ $level } = ( $avgRTT / $counter );
print REQ "\tnumRequests=" . $counter . "\n";
$plotInfo{ $level } = $counter;
print "\t" . $level . ">>>" . $counter . "\n";
$counter=0;
}
$counter=0;
for $level ( keys %myTargetHash ) {
print $level . "\n";
for $nextLevel ( keys %{ $myTargetHash{$level} } ) {
## we are dumping the modified valLine with total RTT hops and time
$_ = $myTargetHash{ $level}{ $nextLevel};
/\d+\|\w+ \w+ \w+ \w+\|\w+ \w+ \w+ \w+\|\d+\|(\d+)/;
if ($1 > $maxTime) {
$maxTime = $1;
}
if ( $1 < $minTime ) {
$minTime = $1;
}
$totalTime = ( $totalTime + $1 );
print TIMING "\t" . $nextLevel . " >>> " . $myTargetHash{ $level}{ $nextLevel} . "\n";
$counter++;
}
}
print "Average RTT Time = " . $totalTime / $counter . "\n";
print "Min RTT Time = " . $minTime . "\n";
print "Max RTT Time = " . $maxTime . "\n";
my @keys = sort {
$plotInfo{$b} <=> $plotInfo{$a}
||
length($b) <=> length($a)
||
$a cmp $b
} keys %plotInfo;
$plotCounter=0;
$counter=0;
my $avgLoadCounter =0;
my $myAlpha=0.5;
my $myBeta=0.1;
foreach my $member ( @keys ) {
$counter++;
if ( $counter == 1 ) {
$avgLoadCounter = $plotInfo{ ${member} };
}
if ( $avgRTT{ ${member} } > 0 && $plotInfo{ ${member} } > 0) {
####my $loadVal = 1 / ( ( $avgRTT{ ${member} } / 1000 ) * $plotInfo{ ${member} } * 100 );
## milesd suggestion
my $loadVal = ( $plotInfo{ ${member} } / $avgRTT{ ${member} } ) ;
#my $loadVal = ( ( $avgRTT{ ${member} } / 1000 ) * $plotInfo{ ${member} } );
#my $loadVal = 1 / ( ( $avgRTT{ ${member} } * $myAlpha ) + ( $plotInfo{ ${member} } * $myBeta ) );
print PLOT $counter . "\t" . $plotInfo{ ${member} } . "\t" . $avgRTT{ ${member} } . "\t" . $loadVal . "\t" . $member . "\n";
$plotCounter = ($plotCounter + $plotInfo{ ${member} });
} else {
print "zero hops not interested " . $member . $avgRTT{ ${member} } . " " . $plotInfo{ ${member} } . "\n";
}
}
print "Total >>> " . $plotCounter . "\n";
print "Highest >>> " . $avgLoadCounter . "\n";
print "Percentage >>> " . ( $avgLoadCounter / $plotCounter ) * 100;
close(IN);
close(REQ);
close(TIMING);
sub loadMalwarePopulation() {
my %malwarePopulation=();
my $malwareSrcFile = './malwareFile';
open(MAL, "<" . $malwareSrcFile);
while( ) {
if ( /(\w+ \w+ \w+ \w+)/ ) {
$malwarePopulation{ $1 } = $1;
}
}
return ( %malwarePopulation );
}