#!/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 ); }