snifftrace.pl
#!/usr/bin/perl
my $snoopfile = "arcachds03-20060510/arcachds03-20060510.txt";
my $rowcount = 0;
my $fh;
# the data structure i'm storing packet information in.
#my @packetlog = (
# {
# 'source:port' => [ type( fin, syn, rst, ack ), seq, length ],
# 'packet' => [ $frame, $src, $dest, $deltaT, $abs, $rel, $cum, $byt ],
# }
# );
open( $fh, ,$snoopfile ) or die "can't open snoop file $snoopfile - $!\n";
while( my $line = <$fh> ){
$rowcount++;
next unless $rowcount > 1050001;
#last if $rowcount > 1050000;
chomp $line;
my( $FIN, $SYN, $ACK, $RST, $SEQ, $LEN );
#my ( $fram, $src, $dest, $deltaT, $sum, $abs, $rel, $cum, $byt )
# = ( split( /,/, $line ) )[ 1 .. 9 ];
my( undef, $fram, $date, $abs, $src, $dest, $proto, $srcP, undef, $destP, @rest )
= split /\s+/, $line;
#my( $proto, $destP, $srcP, @rest ) = split( /\s+/, $sum );
next if $proto =~ /ISODE/;
#$destP =~ s/D=//;
#$srcP =~ s/S=//;
#map { s/^\s*\[?(\S+?)]?\s*$/$1/ } ( $fram, $src, $dest, $deltaT, $sum, $abs, $rel, $cum, $byt );
for my $entry( @rest ){
$entry =~ /(FIN)/ && { $FIN = $1 };
$entry =~ /(SYN)/ && { $SYN = $1 };
$entry =~ /(RST)/ && { $RST = $1 };
$entry =~ /Ack=(\d+)/ && { $ACK = $1 };
$entry =~ /Seq=(\d+)/ && { $SEQ = $1 };
$entry =~ /Len=(\d+)/ && { $LEN = $1 };
}
#print "frame: $fram S: $src D: $dest time: $abs\n";
# print "frame:$fram S: $src D: $dest delt: $deltaT time: $abs byte: $byt\n";
#print " Sp: $srcP Dp: $destP :: $FIN $SYN $RST (A:$ACK S:$SEQ L:$LEN)\n\n";
$TYPE = $FIN || $SYN || $RST || 'ACK';
$KEY = "$src:$srcP:$dest:$destP";
if( $packettrack{$KEY} ){
#$packetlog->{$KEY}[2] += $LEN;
$packettrack{$KEY}++;
push @packetlog, { $KEY => [ $TYPE, $SEQ, $LEN ], 'packet' => [ $fram, $deltaT, $abs, $rel, $cum, $byt ] };
}
else {
$packettrack{$KEY}++;
push @packetlog, { $KEY => [ $TYPE, $SEQ, $LEN ], 'packet' => [ $fram, $deltaT, $abs, $rel, $cum, $byt ] };
}
}
close( $fh ) or die "can't close snoop file $snoopfile - $!\n";
for my $packet(
map {
$_->[2]
}
sort {
$a->[0] cmp $b->[0]
||
$b->[1] <=> $a->[1]
}
map {
my ( $v, $k ) = keys %$_;
my $val = $v =~ /pack/ ? $k : $v;
my( $src, $srcP, $dst, $dstP ) = split /:/, $val;
my( $low, $high ) = sort { $a cmp $b } ( "$src:$srcP", "$dst:$dstP" );
my $key = $high . '-' . $low;
[ $key, $srcP, $_ ]
}
@packetlog ){
for my $key( keys %{$packet} ){
if( $key =~ /packet/ ){
( $fram, $deltaT, $abs, $rel, $cum, $byt ) = @{$packet->{$key}};
}
else {
( $src, $srcP, $dst, $dstP ) = split /:/, $key;
$type = $packet->{$key}[0] || q{};
$sequence = $packet->{$key}[1] || 0;
$length = $packet->{$key}[2] || 0;
}
}
$thispack = $type;
$thisdest = $dst;
$thisdstp = $dstP;
if( $thisdstp == $lastdstp ){
$counter++;
$totallength += $length;
$lastlength = $totallength;
$SEENFINRST++ if $thispack =~ m/FIN|RST/;
}
else {
if( ! $SEENFINRST ){
print " ^^^ did not see a fin or rst\n";
}
if( ! $lastlength && $counter ){
print " ^^^ issue?\n";
}
$totallength = 0;
$counter = 0;
}
print "$src:$srcP -> $dst:$dstP\t";
print "frame: $fram delt: $deltaT time: $abs byte: $byt";
print " :-: $type (seq: $sequence len: $length)\n";
$lastpack = $thispack;
$lastdest = $thisdest;
$lastdstp = $thisdstp;
}