blob: 9ba715f11961aacb702a99b1340eab9ffabf5af0 [file] [log] [blame]
#!/usr/bin/perl
#
# Author: Franklin Meng <fmeng2002@yahoo.com>
# Parser for USB snoops captured from SniffUSB 2.0.
#
use strict;
use warnings;
use Data::Dumper;
my $urbhash;
foreach my $curfile (@ARGV) {
parsefile($curfile);
#we can only process 1 file
exit;
}
sub parsefile {
my $curfile = shift;
my $s1 = 0;
my $t1 = 0;
my $tmp1 = "";
my $printurb = 0;
my $cururb = 0;
open(FD, $curfile) || die("Error: $!\n");
while(<FD>) {
chomp;
if (/URB\s+(\d+)\s+going\s+down/) {
# print previous urb if available
if($printurb != 0 && exists($urbhash->{$printurb}->{'SetupPacket'})) {
print "$urbhash->{$printurb}->{'SetupPacket'} $urbhash->{$printurb}->{'Direction'} $urbhash->{$printurb}->{'TransferBufferMDL'}\n";
# # delete urb information
# delete($urbhash->{$printurb});
}
# delete urb information
delete($urbhash->{$printurb});
$printurb = 0; #reset here
$tmp1 = "";
$s1 = 0;
$t1 = 0;
# store next urb info here
$cururb = $1;
$urbhash->{$1} = undef;
next;
} elsif (/URB\s+(\d+)\s+coming\s+back/) {
# print previous urb if available
if($printurb != 0 && exists($urbhash->{$printurb}->{'SetupPacket'})) {
print "$urbhash->{$printurb}->{'SetupPacket'} $urbhash->{$printurb}->{'Direction'} $urbhash->{$printurb}->{'TransferBufferMDL'}\n";
# # delete urb information
# delete($urbhash->{$printurb});
}
# delete urb information
delete($urbhash->{$printurb});
$printurb = 0; #reset here
$tmp1 = "";
$s1 = 0;
$t1 = 0;
# flag next urb for print out
if(exists($urbhash->{$1})) {
$printurb = $1;
} else {
warn "Error: cannot match urb!!\n";
}
$cururb = $1;
next;
} elsif (/\-{2}\s+(URB_FUN.+)\:/) { # store urb function (used for debugging)
if(!exists($urbhash->{$cururb}->{'Function'})) {
$urbhash->{$cururb}->{'Function'} = $1;
}
next;
} elsif (/USBD_TRANSFER_DIRECTION_IN/) { #store in direction
#check if we already stored a value
if(!exists($urbhash->{$cururb}->{'Direction'})) {
$urbhash->{$cururb}->{'Direction'} = "<<<";
}
next;
} elsif (/USBD_TRANSFER_DIRECTION_OUT/) { #store out direction
#check if we already stored a value
if(!exists($urbhash->{$cururb}->{'Direction'})) {
$urbhash->{$cururb}->{'Direction'} = ">>>";
}
next;
} elsif (/TransferBufferMDL\s+=\s+/) { #flag data packet
$t1 = 1;
next;
} elsif (/SetupPacket\s+=/) { #flag setup packet
$s1 = 1;
next;
} elsif (/(.+\s+\=|ms\])/ && ($s1 || $t1)) { #save data packet and reset
if($s1 && ($tmp1 ne "")) {
$tmp1 =~ s/^\s+//;
$urbhash->{$cururb}->{'SetupPacket'} = $tmp1;
} elsif($t1 && ($tmp1 ne "")) {
$tmp1 =~ s/^\s+//;
$urbhash->{$cururb}->{'TransferBufferMDL'} = $tmp1
}
$tmp1 = "";
$s1 = 0;
$t1 = 0;
next;
} elsif (/^\s+\d+\:(.+)/ && ($s1 || $t1)) { #capture packet
$tmp1 = $tmp1 . $1;
}
}
# print remaining URB
if($printurb != 0 && exists($urbhash->{$printurb}->{'SetupPacket'})) {
print "$urbhash->{$printurb}->{'SetupPacket'} $urbhash->{$printurb}->{'Direction'} $urbhash->{$printurb}->{'TransferBufferMDL'}\n";
# # delete urb information
# delete($urbhash->{$printurb});
}
# delete urb information
delete($urbhash->{$printurb});
# Maybe we should warn for the URB's that did not have matches?
# print out stuff remaining in the hash for debugging
#print Dumper($urbhash);
}