diff --git a/wifi_diag/Packet.pm b/wifi_diag/Packet.pm index dc1f2e9c..f89313ea 100644 --- a/wifi_diag/Packet.pm +++ b/wifi_diag/Packet.pm @@ -8,6 +8,9 @@ sub new { my %options = @_; my $self = { + retrans => 0, + timestamp => 0, + datarate => 0, type_subtype => "UNKNOWN", receiver => "UNKNOWN", transmitter => "UNKNOWN", @@ -32,19 +35,25 @@ sub append { $self->{raw_pkt} .= $ln; - if ($ln =~ /\s*Transmitter address: .*\((\S+)\)/) { + #print "ln: $ln\n"; + + if ($ln =~ /^\s*Transmitter address: .*\((\S+)\)/) { $self->{transmitter} = $1; } - elsif ($ln =~ /\s*Receiver address: .*\((\S+)\)/) { + elsif ($ln =~ /^\s*Epoch Time:\s+(\S+)/) { + #print "timestamp: $1\n"; + $self->{timestamp} = $1; + } + elsif ($ln =~ /^\s*Receiver address: .*\((\S+)\)/) { $self->{receiver} = $1; } - elsif ($ln =~ /\s*Fragment number: (\d+)/) { + elsif ($ln =~ /^\s*Fragment number: (\d+)/) { $self->{fragno} = $1; } - elsif ($ln =~ /\s*Sequence number: (\d+)/) { + elsif ($ln =~ /^\s*Sequence number: (\d+)/) { $self->{seqno} = $1; } - elsif ($ln =~ /\s*Type\/Subtype: (.*)/) { + elsif ($ln =~ /^\s*Type\/Subtype: (.*)/) { $self->{type_subtype} = $1; } elsif ($ln =~ /.* = Starting Sequence Number: (\d+)/) { @@ -53,19 +62,19 @@ sub append { elsif ($ln =~ /.* = TID for which a Basic BlockAck frame is requested: (\S+)/) { $self->{ba_tid} = $1; } - elsif ($ln =~ /.*Block Ack Bitmap: (\S+)/) { + elsif ($ln =~ /^\s*Block Ack Bitmap: (\S+)/) { $self->{ba_bitmap} = $1; } - elsif ($ln =~ /\s*Data Rate: (.*)/) { - $self->{datarate} = $1; + elsif ($ln =~ /.* = Retry: Frame is being retransmitted/) { + $self->{retrans} = 1; } - elsif ($ln =~ /\s*VHT information/) { + elsif ($ln =~ /^\s*VHT information/) { $self->{is_vht} = 1; } - elsif ($ln =~ /\s*Bandwidth: (.*)/) { + elsif ($ln =~ /^\s*Bandwidth: (.*)/) { $self->{bandwidth} = $1; } - elsif ($ln =~ /\s*User 0: MCS (.*)/) { + elsif ($ln =~ /^\s*User 0: MCS (.*)/) { $self->{mcs} = $1; } elsif ($ln =~ /.* = Spatial streams 0: (.*)/) { @@ -77,10 +86,18 @@ sub append { elsif ($ln =~ /.* = Payload Type: (.*)/) { $self->{payload_type} = $1; } - elsif ($ln =~ /\s+\[Data Rate: (.*)\]/) { - $self->{datarate} = $1; + elsif (($ln =~ /^\s+\[Data Rate: (.*)\]/) || + ($ln =~ /^\s*Data Rate: (.*)/)) { + my $dr = $1; + if ($dr =~ /(\S+) Mb/) { + $self->{datarate} = $1 * 1000000; + } + else { + print "ERROR: Unknown datarate: $dr for frame: " . $self->frame_num() . "\n"; + $self->{datarate} = 0; + } } - elsif ($ln =~ /\s*SSI Signal: (.*)/) { + elsif ($ln =~ /^\s*SSI Signal: (.*)/) { if ($self->{ssi_sig_found} == 0) { $self->{ssi_combined} = $1; $self->{ssi_sig_found}++; @@ -103,7 +120,7 @@ sub append { } } # AMPDU and such... - elsif ($ln =~ /\s*A-MSDU Subframe #(\d+)/) { + elsif ($ln =~ /^\s*A-MSDU Subframe #(\d+)/) { if ($1 > $self->{amsdu_frame_count}) { $self->{amsdu_frame_count} = $1; } @@ -125,6 +142,21 @@ sub transmitter { return $self->{transmitter}; } +sub datarate { + my $self = shift; + return $self->{datarate}; +} + +sub retrans { + my $self = shift; + return $self->{retrans}; +} + +sub timestamp { + my $self = shift; + return $self->{timestamp}; +} + sub receiver { my $self = shift; return $self->{receiver}; diff --git a/wifi_diag/PeerConn.pm b/wifi_diag/PeerConn.pm index 57b6010f..03ae772c 100644 --- a/wifi_diag/PeerConn.pm +++ b/wifi_diag/PeerConn.pm @@ -15,7 +15,12 @@ sub new { }; bless($self, $class); - return($self); + + my $mcs_fname = $self->hash_str() . "-rpt.txt"; + open(my $MCS, ">", $mcs_fname) or die("Can't open $mcs_fname for writing: $!\n"); + $self->{mcs_fh} = $MCS; + + return $self; } sub hash_str { @@ -41,6 +46,10 @@ sub add_pkt { my $tid = $self->find_or_create_tid($tidno); $tid->add_pkt($pkt); + + # Generate reporting data for this pkt + my $fh = $self->{mcs_fh}; + print $fh "" . $pkt->timestamp() . "\t$tidno\t" . $pkt->datarate() . "\t" . $pkt->retrans() . "\n"; } sub find_or_create_tid { @@ -53,7 +62,10 @@ sub find_or_create_tid { $tid = $self->{tids}[$tidno]; } else { - $tid = Tid->new(tidno => $tidno); + $tid = Tid->new(tidno => $tidno, + addr_a => $self->local_addr(), + addr_b => $self->peer_addr(), + ); $self->{tids}[$tidno] = $tid; } return $tid; @@ -77,4 +89,22 @@ sub printme { return; } +sub gen_graphs { + my $self = shift; + my $tid_count = @{$self->{tids}}; + + my $i; + for ($i = 0; $i < $tid_count; $i++) { + #print "Checking tid: $i\n"; + if (exists $self->{tids}[$i]) { + #print "Printing tid: $i\n"; + $self->{tids}[$i]->printme(); + #print "Done printing tid: $i\n"; + } + } + #print "Done peer-conn printme\n"; + return; + +} + 1; diff --git a/wifi_diag/Tid.pm b/wifi_diag/Tid.pm index 5db3159c..5ca05b17 100644 --- a/wifi_diag/Tid.pm +++ b/wifi_diag/Tid.pm @@ -9,11 +9,21 @@ sub new { my $self = { pkts => [], + tx_retrans => 0, + rx_retrans => 0, + rx_pkts => 0, + tx_pkts => 0, + tot_pkts => 0, %options, }; bless($self, $class); - return($self); + + my $rpt_fname = $self->{addr_a} . "." . $self->{addr_b} . "-" . $self->tidno() . "-" . "rpt.txt"; + open(my $MCS, ">", $rpt_fname) or die("Can't open $rpt_fname for writing: $!\n"); + $self->{mcs_fh} = $MCS; + + return $self; } sub tidno { @@ -25,6 +35,22 @@ sub add_pkt { my $self = shift; my $pkt = shift; + $self->{tot_pkts}++; + if ($pkt->receiver() eq $self->{addr_a}) { + $self->{rx_pkts}++; + if ($pkt->retrans()) { + $self->{rx_retrans}++; + } + } + else { + $self->{tx_pkts}++; + $self->{tx_retrans}++; + } + + # Generate reporting data for this pkt + my $fh = $self->{mcs_fh}; + print $fh "" . $pkt->timestamp() . "\t" . $self->tidno() . "\t" . $pkt->datarate() . "\t" . $pkt->retrans() . "\n"; + push(@{$self->{pkts}}, $pkt); } @@ -35,8 +61,9 @@ sub get_pkts { sub printme { my $self = shift; - print " tidno: " . $self->tidno() . "\n"; - print " pkt-count: " . $self->get_pkts() . "\n"; + print " tidno: " . $self->tidno() . " pkt-count: " . $self->get_pkts() + . " tx-pkts: " . $self->{tx_pkts} . " tx-retrans: " . $self->{tx_retrans} + . " rx-pkts: " . $self->{rx_pkts} . " rx-retrans: " . $self->{rx_retrans} . "\n"; } 1; diff --git a/wifi_diag/wifi_pcap_diag.pl b/wifi_diag/wifi_pcap_diag.pl index d1a9982a..de79221e 100755 --- a/wifi_diag/wifi_pcap_diag.pl +++ b/wifi_diag/wifi_pcap_diag.pl @@ -37,6 +37,7 @@ if ($cur_pkt->raw_pkt() ne "") { # Print out all peer-conns we found for my $conn (values %peer_conns) { $conn->printme(); + $conn->gen_graphs(); } exit 0;