diff --git a/wifi_diag/Packet.pm b/wifi_diag/Packet.pm index a0d2db9e..0e506ae8 100644 --- a/wifi_diag/Packet.pm +++ b/wifi_diag/Packet.pm @@ -3,6 +3,9 @@ package Packet; use warnings; use strict; +use bignum; +use bigint; + sub new { my $class = shift; my %options = @_; @@ -96,7 +99,7 @@ sub append { ($ln =~ /^\s*Data Rate: (.*)/)) { my $dr = $1; if ($dr =~ /(\S+) Mb/) { - $self->{datarate} = $1 * 1000000; + $self->{datarate} = $1; } else { print "ERROR: Unknown datarate: $dr for frame: " . $self->frame_num() . "\n"; diff --git a/wifi_diag/PeerConn.pm b/wifi_diag/PeerConn.pm index 85223fcd..5760b2f2 100644 --- a/wifi_diag/PeerConn.pm +++ b/wifi_diag/PeerConn.pm @@ -48,8 +48,9 @@ sub add_pkt { $tid->add_pkt($pkt); # Generate reporting data for this pkt + my $ln = "" . $pkt->timestamp() . "\t$tidno\t" . $pkt->datarate() . "\t" . $pkt->retrans() . "\n"; my $fh = $self->{mcs_fh}; - print $fh "" . $pkt->timestamp() . "\t$tidno\t" . $pkt->datarate() . "\t" . $pkt->retrans() . "\n"; + print $fh $ln; } sub find_or_create_tid { @@ -64,6 +65,9 @@ sub find_or_create_tid { else { $tid = Tid->new(glb_fh_ba_tx => $self->{glb_fh_ba_tx}, glb_fh_ba_rx => $self->{glb_fh_ba_rx}, + glb_fh_mcs_ps => $self->{glb_fh_mcs_ps}, + glb_fh_mcs_tx => $self->{glb_fh_mcs_tx}, + glb_fh_mcs_rx => $self->{glb_fh_mcs_rx}, tidno => $tidno, report_prefix => $self->{report_prefix}, addr_a => $self->local_addr(), diff --git a/wifi_diag/Tid.pm b/wifi_diag/Tid.pm index 6075dc35..161de156 100644 --- a/wifi_diag/Tid.pm +++ b/wifi_diag/Tid.pm @@ -4,6 +4,7 @@ use warnings; use strict; use bigint; +use bignum; my $warn_dup_ba_once = 1; my $max_pkt_store = 250; @@ -25,13 +26,13 @@ sub new { dummy_rx_pkts => 0, dummy_tx_pkts => 0, tot_pkts => 0, - last_tot_pks => 0, - last_rx_pks => 0, - last_tx_pks => 0, - last_rx_retrans_pks => 0, - last_tx_retrans_pks => 0, - last_dummy_rx_pks => 0, - last_dummy_tx_pks => 0, + last_tot_pkts => 0, + last_rx_pkts => 0, + last_tx_pkts => 0, + last_rx_retrans_pkts => 0, + last_tx_retrans_pkts => 0, + last_dummy_rx_pkts => 0, + last_dummy_tx_pkts => 0, last_ps_timestamp => 0, last_rx_amsdu_pkts => 0, last_tx_amsdu_pkts => 0, @@ -68,9 +69,11 @@ sub tidno { sub add_pkt { my $self = shift; my $pkt = shift; + my $fhg; $self->{tot_pkts}++; if ($pkt->receiver() eq $self->{addr_a}) { + $fhg = $self->{glb_fh_mcs_rx}; $self->{rx_pkts}++; $self->{rx_amsdu_pkts} += $pkt->{amsdu_frame_count}; if ($pkt->retrans()) { @@ -79,6 +82,7 @@ sub add_pkt { } } else { + $fhg = $self->{glb_fh_mcs_tx}; $self->{tx_pkts}++; $self->{tx_amsdu_pkts} += $pkt->{amsdu_frame_count}; if ($pkt->retrans()) { @@ -228,17 +232,21 @@ sub add_pkt { last; } - if ($self->{last_ps_timestamp} + 1.0 < $pkt->{timestamp}) { + my $tsp1 = $self->{last_ps_timestamp} + 1.0; + my $gen_ps = $tsp1 < $pkt->{timestamp}; + #print STDERR "last-ps-timestamp: " . $self->{last_ps_timestamp} . " tsp1: $tsp1 gen-ps: $gen_ps " + # . $self->{last_ps_timestamp} . " pkt-ts: " . $pkt->{timestamp} . "\n"; + if ($gen_ps) { my $diff = $pkt->{timestamp} - $self->{last_ps_timestamp}; my $period_tot_pkts = $self->{tot_pkts} - $self->{last_tot_pkts}; my $period_rx_pkts = $self->{rx_pkts} - $self->{last_rx_pkts}; my $period_rx_amsdu_pkts = $self->{rx_amsdu_pkts} - $self->{last_rx_amsdu_pkts}; my $period_rx_retrans_pkts = $self->{rx_retrans_pkts} - $self->{last_rx_retrans_pkts}; - my $period_rx_retrans_amsdu_pkts = $self->{rx_retrans_amsdu_pkts} - $self->{last_rx_retrans_amsdu_pkts}; + my $period_rx_retrans_amsdu_pkts = $self->{rx_amsdu_retrans_pkts} - $self->{last_rx_amsdu_retrans_pkts}; my $period_tx_pkts = $self->{tx_pkts} - $self->{last_tx_pkts}; my $period_tx_amsdu_pkts = $self->{tx_amsdu_pkts} - $self->{last_tx_amsdu_pkts}; my $period_tx_retrans_pkts = $self->{tx_retrans_pkts} - $self->{last_tx_retrans_pkts}; - my $period_tx_retrans_amsdu_pkts = $self->{tx_retrans_amsdu_pkts} - $self->{last_tx_retrans_amsdu_pkts}; + my $period_tx_retrans_amsdu_pkts = $self->{tx_amsdu_retrans_pkts} - $self->{last_tx_amsdu_retrans_pkts}; my $period_dummy_rx_pkts = $self->{dummy_rx_pkts} - $self->{last_dummy_rx_pkts}; my $period_dummy_tx_pkts = $self->{dummy_tx_pkts} - $self->{last_dummy_tx_pkts}; @@ -259,23 +267,30 @@ sub add_pkt { $self->{last_rx_pkts} = $self->{rx_pkts}; $self->{last_rx_amsdu_pkts} = $self->{rx_amsdu_pkts}; $self->{last_rx_retrans_pkts} = $self->{rx_retrans_pkts}; - $self->{last_rx_retrans_amsdu_pkts} = $self->{rx_retrans_amsdu_pkts}; + $self->{last_rx_amsdu_retrans_pkts} = $self->{rx_amsdu_retrans_pkts}; $self->{last_tx_pkts} = $self->{tx_pkts}; $self->{last_tx_amsdu_pkts} = $self->{tx_amsdu_pkts}; $self->{last_tx_retrans_pkts} = $self->{tx_retrans_pkts}; - $self->{last_tx_retrans_amsdu_pkts} = $self->{tx_retrans_amsdu_pkts}; + $self->{last_tx_amsdu_retrans_pkts} = $self->{tx_amsdu_retrans_pkts}; $self->{last_dummy_rx_pkts} = $self->{dummy_rx_pkts}; $self->{last_dummy_tx_pkts} = $self->{dummy_tx_pkts}; my $fh_ps = $self->{mcs_fh_ps}; - print $fh_ps "" . $pkt->timestamp() . "\t" . $self->tidno() . "\t$diff\t$period_tot_pkts_ps\t" . + my $glb_mcs_ps = $self->{glb_fh_mcs_ps}; + + my $ln = "" . $pkt->timestamp() . "\t" . $self->tidno() . "\t$diff\t$period_tot_pkts_ps\t" . "$period_rx_pkts_ps\t$period_rx_retrans_pkts_ps\t$period_rx_amsdu_pkts_ps\t$period_rx_retrans_amsdu_pkts_ps\t$period_dummy_rx_pkts_ps\t" . "$period_tx_pkts_ps\t$period_tx_retrans_pkts_ps\t$period_tx_amsdu_pkts_ps\t$period_tx_retrans_amsdu_pkts_ps\t$period_dummy_tx_pkts_ps\n"; + print $fh_ps $ln; + print $glb_mcs_ps $ln; } # 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"; + my $ln = "" . $pkt->timestamp() . "\t" . $self->tidno() . "\t" . $pkt->datarate() . "\t" . $pkt->retrans() . "\n"; + + print $fh $ln; + print $fhg $ln; push(@{$self->{pkts}}, $pkt); } diff --git a/wifi_diag/wifi_pcap_diag.pl b/wifi_diag/wifi_pcap_diag.pl index 298dbc5a..374f49ec 100755 --- a/wifi_diag/wifi_pcap_diag.pl +++ b/wifi_diag/wifi_pcap_diag.pl @@ -21,6 +21,9 @@ my $cur_pkt = Packet->new(raw_pkt => ""); my $last_pkt = Packet->new(raw_pkt => ""); my $glb_fh_ba_tx; my $glb_fh_ba_rx; +my $glb_fh_mcs_ps; +my $glb_fh_mcs_tx; +my $glb_fh_mcs_rx; my $dut = ""; my $report_prefix = "wifi-diag-"; @@ -53,6 +56,9 @@ if ($show_help) { my $glb_ba_tx_fname = $report_prefix . "glb-ba-tx-rpt.txt"; my $glb_ba_rx_fname = $report_prefix . "glb-ba-rx-rpt.txt"; +my $glb_mcs_ps_fname = $report_prefix . "glb-mcs-ps-rpt.txt"; +my $glb_mcs_tx_fname = $report_prefix . "glb-mcs-tx-rpt.txt"; +my $glb_mcs_rx_fname = $report_prefix . "glb-mcs-rx-rpt.txt"; if ($gen_report) { $report_html .= genGlobalReports(); @@ -60,8 +66,11 @@ if ($gen_report) { exit 0; } -open($glb_fh_ba_tx, ">", $glb_ba_tx_fname) or die("Can't open $glb_ba_tx_fname for writing: $!\n"); -open($glb_fh_ba_rx, ">", $glb_ba_rx_fname) or die("Can't open $glb_ba_rx_fname for writing: $!\n"); +open($glb_fh_ba_tx, ">", $glb_ba_tx_fname) or die("Can't open $glb_ba_tx_fname for writing: $!\n"); +open($glb_fh_ba_rx, ">", $glb_ba_rx_fname) or die("Can't open $glb_ba_rx_fname for writing: $!\n"); +open($glb_fh_mcs_ps, ">", $glb_mcs_ps_fname) or die("Can't open $glb_mcs_ps_fname for writing: $!\n"); +open($glb_fh_mcs_tx, ">", $glb_mcs_tx_fname) or die("Can't open $glb_mcs_tx_fname for writing: $!\n"); +open($glb_fh_mcs_rx, ">", $glb_mcs_rx_fname) or die("Can't open $glb_mcs_rx_fname for writing: $!\n"); while (<>) { my $ln = $_; @@ -178,15 +187,21 @@ sub genGlobalReports { my $html = ""; # General idea is to write out gnumeric scripts and run them. - # First, block-ack response time graphs. + + $html .= "\n\n
MCS/Encoding Rates over time
\n"; + $html .= doTimeGraph("Encoding Rate", "TX Packet encoding rate over time", "1:3", $glb_mcs_tx_fname, "glb-mcs-tx.png"); + $html .= doTimeGraph("Encoding Rate", "RX Packet encoding rate over time", "1:3", $glb_mcs_rx_fname, "glb-mcs-rx.png"); + $html .= doTimeGraph("Retransmits", "TX Packet Retransmits over time", "1:4", $glb_mcs_tx_fname, "glb-mcs-tx-retrans.png"); + $html .= doTimeGraph("Retransmits", "RX Packet Retransmits over time", "1:4", $glb_mcs_rx_fname, "glb-mcs-rx-retrans.png"); + # Local peer sending BA back to DUT - $html .= "
Block-Acks sent from all local endpoints to DUT.
"; + $html .= "\n\n
Block-Acks sent from all local endpoints to DUT.
\n"; $html .= doTimeGraph("BA Latency", "Block-Ack latency from last known frame", "1:6", $glb_ba_tx_fname, "glb-ba-tx-latency.png"); $html .= doTimeGraph("Packets Acked", "Block-Ack packets Acked per Pkt", "1:3", $glb_ba_tx_fname, "glb-ba-tx-pkts-per-ack.png"); $html .= doTimeGraph("Duplicate Packets Acked", "Block-Ack packets DUP-Acked per Pkt", "1:4", $glb_ba_tx_fname, "glb-ba-tx-pkts-dup-per-ack.png"); # DUT sending BA to local peer - $html .= "
Block-Acks sent from DUT to all local endpoints.
"; + $html .= "\n\n
Block-Acks sent from DUT to all local endpoints.
\n"; $html .= doTimeGraph("BA Latency", "Block-Ack latency from last known frame", "1:6", $glb_ba_rx_fname, "glb-ba-rx-latency.png"); $html .= doTimeGraph("Packets Acked", "Block-Ack packets Acked per Pkt", "1:3", $glb_ba_rx_fname, "glb-ba-rx-pkts-per-ack.png"); $html .= doTimeGraph("Duplicate Packets Acked", "Block-Ack packets DUP-Acked per Pkt", "1:4", $glb_ba_rx_fname, "glb-ba-rx-pkts-dup-per-ack.png"); @@ -265,6 +280,9 @@ sub processPkt { if ($dut eq $pkt->receiver()) { $peer_conn = PeerConn->new(glb_fh_ba_tx => $glb_fh_ba_tx, glb_fh_ba_rx => $glb_fh_ba_rx, + glb_fh_mcs_ps => $glb_fh_mcs_ps, + glb_fh_mcs_tx => $glb_fh_mcs_tx, + glb_fh_mcs_rx => $glb_fh_mcs_rx, report_prefix => $report_prefix, local_addr => $pkt->transmitter(), peer_addr => $pkt->receiver()); @@ -272,6 +290,9 @@ sub processPkt { else { $peer_conn = PeerConn->new(glb_fh_ba_tx => $glb_fh_ba_tx, glb_fh_ba_rx => $glb_fh_ba_rx, + glb_fh_mcs_ps => $glb_fh_mcs_ps, + glb_fh_mcs_tx => $glb_fh_mcs_tx, + glb_fh_mcs_rx => $glb_fh_mcs_rx, report_prefix => $report_prefix, local_addr => $pkt->receiver(), peer_addr => $pkt->transmitter());