wifi-diag: Parse newer tshark output properly, retransmit improvements.

Newer tshark had a different text output, so needed to modify the script to
parse that properly.

Report big vs all retransmits (big frames are likely Data, small ones may
just be null-data frames or similar).
This commit is contained in:
Ben Greear
2019-01-04 15:43:21 -08:00
parent 4075b122e9
commit d41cc2f3ca
4 changed files with 123 additions and 24 deletions

View File

@@ -15,6 +15,7 @@ sub new {
wmm_info => "",
raw_pkt => "",
seqno => -1, # block-ack will not have a seqno
bytes_on_wire => 0,
acked_by => -1,
block_acked_by => -1,
retrans => 0,
@@ -24,6 +25,7 @@ sub new {
dummy_rx_pkts => 0,
is_last_ampdu => 0,
is_ampdu => 0,
is_msdu => 0,
is_malformed => 0,
type_subtype => "UNKNOWN",
receiver => "UNKNOWN",
@@ -67,16 +69,21 @@ sub append {
elsif ($ln =~ /^.* = Payload Type: A-MSDU/) {
$self->{is_ampdu} = 1;
}
elsif ($ln =~ /^.* = Payload Type: MSDU/) {
$self->{is_msdu} = 1;
}
elsif ($ln =~ /^\s*\[Time delta from previous captured frame:\s+(\S+)/) {
$self->{timedelta} = $1;
}
elsif ($ln =~ /^\s*Receiver address: .*\((\S+)\)/) {
$self->{receiver} = $1;
}
elsif ($ln =~ /^\s*Fragment number: (\d+)/) {
elsif (($ln =~ /^\s*Fragment number: (\d+)/) ||
($ln =~ /^.*\s+=\s+Fragment number: (\d+)/)) {
$self->{fragno} = $1;
}
elsif ($ln =~ /^\s*Sequence number: (\d+)/) {
elsif (($ln =~ /^\s*Sequence number: (\d+)/) ||
($ln =~ /^.*\s+=\s+Sequence number: (\d+)/)) {
$self->{seqno} = $1;
}
elsif ($ln =~ /^\s*Type\/Subtype: (.*)/) {
@@ -128,7 +135,8 @@ sub append {
$self->{datarate} = 0;
}
}
elsif ($ln =~ /^\s*SSI Signal: (.*)/) {
elsif (($ln =~ /^\s*SSI Signal: (.*)/) ||
($ln =~ /^\s*Antenna signal: (.*)/)) {
if ($self->{ssi_sig_found} == 0) {
$self->{ssi_combined} = $1;
$self->{ssi_sig_found}++;

View File

@@ -81,6 +81,42 @@ sub find_or_create_tid {
return $tid;
}
sub tx_no_ack_found {
my $self = shift;
my $tid_count = @{$self->{tids}};
my $rv = 0;
my $i;
for ($i = 0; $i < $tid_count; $i++) {
#print "Checking tid: $i\n";
if (exists $self->{tids}[$i]) {
#print "Printing tid: $i\n";
$rv += $self->{tids}[$i]->tx_no_ack_found();
#print "Done printing tid: $i\n";
}
}
return $rv;
}
sub rx_no_ack_found {
my $self = shift;
my $tid_count = @{$self->{tids}};
my $rv = 0;
my $i;
for ($i = 0; $i < $tid_count; $i++) {
#print "Checking tid: $i\n";
if (exists $self->{tids}[$i]) {
#print "Printing tid: $i\n";
$rv += $self->{tids}[$i]->rx_no_ack_found();
#print "Done printing tid: $i\n";
}
}
return $rv;
}
sub printme {
my $self = shift;
my $tid_count = @{$self->{tids}};

View File

@@ -15,6 +15,8 @@ sub new {
my $self = {
pkts => [],
rx_no_ack_found => 0,
tx_no_ack_found => 0,
tx_retrans_pkts => 0,
rx_retrans_pkts => 0,
tx_amsdu_retrans_pkts => 0,
@@ -129,7 +131,7 @@ sub add_pkt {
for ($i = 0; $i<$pkt_count; $i++) {
my $tmp = $self->{pkts}[$i];
#print "checking tmp-pkt: " . $tmp->seqno();
#print "checking tmp-pkt frame: " . $tmp->{frame_num} . " seqno: " . $tmp->seqno();
#print " transmitter: " . $tmp->transmitter();
#print " pkt-rcvr: " . $pkt->receiver() . "\n";
if ($tmp->transmitter() eq $pkt->receiver()) {
@@ -228,6 +230,12 @@ sub add_pkt {
if (! $tmp->was_acked()) {
if ($tmp->wants_ack()) {
print "WARNING: did not find ack for frame: " . $tmp->frame_num() . ", removing after processing frame: " . $pkt->frame_num() . "\n";
if ($tmp->transmitter() eq $self->{addr_a}) {
$self->{tx_no_ack_found}++;
}
else {
$self->{rx_no_ack_found}++;
}
}
}
$pkt_count--;
@@ -305,11 +313,23 @@ sub get_pkts {
return @{$self->{pkts}};
}
sub tx_no_ack_found {
my $self = shift;
return $self->{tx_no_ack_found};
}
sub rx_no_ack_found {
my $self = shift;
return $self->{rx_no_ack_found};
}
sub printme {
my $self = shift;
print " tidno: " . $self->tidno() . " pkt-count: " . $self->get_pkts()
. " tx-pkts: " . $self->{tx_pkts} . " tx-retrans: " . $self->{tx_retrans_pkts}
. " rx-pkts: " . $self->{rx_pkts} . " rx-retrans: " . $self->{rx_retrans_pkts} . "\n";
. " rx-pkts: " . $self->{rx_pkts} . " rx-retrans: " . $self->{rx_retrans_pkts}
. " tx-no-acks: " . $self->{tx_no_ack_found} . " rx-no-acks: " . $self->{rx_no_ack_found}
. "\n";
}
1;

View File

@@ -52,6 +52,9 @@ my $glb_fh_mcs_rx;
my $glb_fh_rtx_tx;
my $glb_fh_rtx_rx;
my $tx_no_ack_found = 0;
my $rx_no_ack_found = 0;
my %glb_mcs_tx_hash = ();
my %glb_mcs_rx_hash = ();
my %glb_pkt_type_tx_hash = ();
@@ -153,35 +156,38 @@ my $last_ps_timestamp = 0;
my $tot_pkts = 0;
my $rx_pkts = 0;
my $rx_amsdu_pkts = 0;
my $rx_retrans_pkts = 0;
my $rx_retrans_pkts_all = 0;
my $rx_retrans_pkts_big = 0;
my $rx_amsdu_retrans_pkts = 0;
my $dummy_rx_pkts = 0;
my $tx_pkts = 0;
my $tx_amsdu_pkts = 0;
my $tx_retrans_pkts = 0;
my $tx_retrans_pkts_all = 0;
my $tx_retrans_pkts_big = 0;
my $tx_amsdu_retrans_pkts = 0;
my $dummy_tx_pkts = 0;
my $last_tot_pkts = 0;
my $last_rx_pkts = 0;
my $last_rx_amsdu_pkts = 0;
my $last_rx_retrans_pkts = 0;
my $last_rx_retrans_pkts_all = 0;
my $last_rx_amsdu_retrans_pkts = 0;
my $last_dummy_rx_pkts = 0;
my $last_tx_pkts = 0;
my $last_tx_amsdu_pkts = 0;
my $last_tx_retrans_pkts = 0;
my $last_tx_retrans_pkts_all = 0;
my $last_tx_amsdu_retrans_pkts = 0;
my $last_dummy_tx_pkts = 0;
while (<>) {
my $ln = $_;
$input_line_count++;
if ($ln =~ /^Frame (\d+):/) {
if ($ln =~ /^Frame (\d+):\s+(\d+) bytes on wire/) {
if ($cur_pkt->raw_pkt() ne "") {
processPkt($cur_pkt);
}
$cur_pkt = Packet->new(frame_num => $1,
bytes_on_write => $2,
raw_pkt => $ln);
} else {
$cur_pkt->append($ln);
@@ -194,6 +200,12 @@ if ($cur_pkt->raw_pkt() ne "") {
printProgress();
# Sum up some stats
for my $conn (values %peer_conns) {
$tx_no_ack_found += $conn->tx_no_ack_found();
$rx_no_ack_found += $conn->rx_no_ack_found();
}
$report_html .= genGlobalReports();
# Print out all peer-conns we found
@@ -317,15 +329,20 @@ sub htmlMcsHistogram {
my $html = "";
if ($rx_pkts) {
$html .= "RX Retransmit percentage: $rx_retrans_pkts/$rx_pkts == " . ($rx_retrans_pkts * 100.0) / $rx_pkts . "<br>\n";
$html .= "RX (All) Retransmit percentage: $rx_retrans_pkts_all/$rx_pkts == " . ($rx_retrans_pkts_all * 100.0) / $rx_pkts . "<br>\n";
} else {
$html .= "RX Retransmit percentage: $rx_retrans_pkts/$rx_pkts == 0<br>\n";
$html .= "RX (All) Retransmit percentage: $rx_retrans_pkts_all/$rx_pkts == 0<br>\n";
}
$html .= "RX (Big) Retransmit count: $rx_retrans_pkts_big<br>\n";
if ($tx_pkts) {
$html .= "TX Retransmit percentage: $tx_retrans_pkts/$tx_pkts == " . ($tx_retrans_pkts * 100.0) / $tx_pkts . "<br>\n";
$html .= "TX (All) Retransmit percentage: $tx_retrans_pkts_all/$tx_pkts == " . ($tx_retrans_pkts_all * 100.0) / $tx_pkts . "<br>\n";
} else {
$html .= "TX Retransmit percentage: $tx_retrans_pkts/$tx_pkts == 0<br>\n";
$html .= "TX (All) Retransmit percentage: $tx_retrans_pkts_all/$tx_pkts == 0<br>\n";
}
$html .= "TX (Big) Retransmit count: $tx_retrans_pkts_big<br>\n";
$html .= "RX no-ack-found: $rx_no_ack_found<br>\n";
$html .= "TX no-ack-found: $tx_no_ack_found<br>\n";
if ($delta_time_tx_count) {
$html .= "TX average gap between AMPDU frames (ms): " . (($delta_time_tx * 1000.0) / $delta_time_tx_count) . "<br>\n";
@@ -470,6 +487,9 @@ sub processPkt {
return;
}
#print "processPkt, frame: " . $pkt->{frame_num} . " seqno: " . $pkt->seqno() . " transmitter: " . $pkt->transmitter()
# . " receiver: " . $pkt->receiver() . "\n";
$pkts_sofar++;
if (($pkts_sofar % 10000) == 0) {
printProgress();
@@ -561,8 +581,8 @@ sub processPkt {
my $this_ampdu_pkt_count;
my $ampdu_chain_time;
my $is_last_ampdu = 0;
if ($pkt->{is_ampdu}) {
if ($last_pkt->frame_num() != -1 && (!$last_pkt->{is_ampdu})) {
if ($pkt->{is_ampdu} || $pkt->{is_msdu}) {
if ($last_pkt->frame_num() != -1 && (!($last_pkt->{is_ampdu} || $last_pkt->{is_msdu}))) {
# This is first ampdu since a non-ampdu frame. Calculate diff between that and last BA
if ($pkt->{is_rx} && ($last_ba_tx_pkt->frame_num() != -1)) {
my $diff = $pkt->timestamp() - $last_ba_tx_pkt->timestamp();
@@ -675,7 +695,15 @@ sub processPkt {
$rx_pkts++;
$rx_amsdu_pkts += $pkt->{amsdu_frame_count};
if ($pkt->retrans()) {
$rx_retrans_pkts++;
$rx_retrans_pkts_all++;
if ($pkt->{bytes_on_wire} > 1000) {
print "Frame " . $pkt->{frame_num} . " is a BIG RX retransmit frame.\n";
$rx_retrans_pkts_big++;
}
else {
print "Frame " . $pkt->{frame_num} . " is an RX retransmit frame.\n";
}
$rx_amsdu_retrans_pkts += $pkt->{amsdu_frame_count};
}
my $ln = "" . $pkt->timestamp() . "\t" . $pkt->datarate() . "\n";
@@ -716,7 +744,14 @@ sub processPkt {
$tx_pkts++;
$tx_amsdu_pkts += $pkt->{amsdu_frame_count};
if ($pkt->retrans()) {
$tx_retrans_pkts++;
$tx_retrans_pkts_all++;
if ($pkt->{bytes_on_wire} > 1000) {
print "Frame " . $pkt->{frame_num} . " is a BIG TX retransmit frame.\n";
$tx_retrans_pkts_big++;
}
else {
print "Frame " . $pkt->{frame_num} . " is a TX retransmit frame.\n";
}
$tx_amsdu_retrans_pkts += $pkt->{amsdu_frame_count};
}
my $ln = "" . $pkt->timestamp() . "\t" . $pkt->datarate() . "\n";
@@ -736,11 +771,11 @@ sub processPkt {
my $period_tot_pkts = $tot_pkts - $last_tot_pkts;
my $period_rx_pkts = $rx_pkts - $last_rx_pkts;
my $period_rx_amsdu_pkts = $rx_amsdu_pkts - $last_rx_amsdu_pkts;
my $period_rx_retrans_pkts = $rx_retrans_pkts - $last_rx_retrans_pkts;
my $period_rx_retrans_pkts_all = $rx_retrans_pkts_all - $last_rx_retrans_pkts_all;
my $period_rx_retrans_amsdu_pkts = $rx_amsdu_retrans_pkts - $last_rx_amsdu_retrans_pkts;
my $period_tx_pkts = $tx_pkts - $last_tx_pkts;
my $period_tx_amsdu_pkts = $tx_amsdu_pkts - $last_tx_amsdu_pkts;
my $period_tx_retrans_pkts = $tx_retrans_pkts - $last_tx_retrans_pkts;
my $period_tx_retrans_pkts_all = $tx_retrans_pkts_all - $last_tx_retrans_pkts_all;
my $period_tx_retrans_amsdu_pkts = $tx_amsdu_retrans_pkts - $last_tx_amsdu_retrans_pkts;
my $period_dummy_rx_pkts = $dummy_rx_pkts - $last_dummy_rx_pkts;
my $period_dummy_tx_pkts = $dummy_tx_pkts - $last_dummy_tx_pkts;
@@ -748,11 +783,11 @@ sub processPkt {
my $period_tot_pkts_ps = ($period_tot_pkts + $period_dummy_tx_pkts + $period_dummy_rx_pkts) / $diff;
my $period_rx_pkts_ps = ($period_rx_pkts + $period_dummy_rx_pkts) / $diff;
my $period_rx_amsdu_pkts_ps = $period_rx_amsdu_pkts / $diff;
my $period_rx_retrans_pkts_ps = $period_rx_retrans_pkts / $diff;
my $period_rx_retrans_pkts_ps = $period_rx_retrans_pkts_all / $diff;
my $period_rx_retrans_amsdu_pkts_ps = $period_rx_retrans_amsdu_pkts / $diff;
my $period_tx_pkts_ps = ($period_tx_pkts + $period_dummy_tx_pkts) / $diff;
my $period_tx_amsdu_pkts_ps = $period_tx_amsdu_pkts / $diff;
my $period_tx_retrans_pkts_ps = $period_tx_retrans_pkts / $diff;
my $period_tx_retrans_pkts_ps = $period_tx_retrans_pkts_all / $diff;
my $period_tx_retrans_amsdu_pkts_ps = $period_tx_retrans_amsdu_pkts / $diff;
my $period_dummy_rx_pkts_ps = $period_dummy_rx_pkts / $diff;
my $period_dummy_tx_pkts_ps = $period_dummy_tx_pkts / $diff;
@@ -761,11 +796,11 @@ sub processPkt {
$last_tot_pkts = $tot_pkts;
$last_rx_pkts = $rx_pkts;
$last_rx_amsdu_pkts = $rx_amsdu_pkts;
$last_rx_retrans_pkts = $rx_retrans_pkts;
$last_rx_retrans_pkts_all = $rx_retrans_pkts_all;
$last_rx_amsdu_retrans_pkts = $rx_amsdu_retrans_pkts;
$last_tx_pkts = $tx_pkts;
$last_tx_amsdu_pkts = $tx_amsdu_pkts;
$last_tx_retrans_pkts = $tx_retrans_pkts;
$last_tx_retrans_pkts_all = $tx_retrans_pkts_all;
$last_tx_amsdu_retrans_pkts = $tx_amsdu_retrans_pkts;
$last_dummy_rx_pkts = $dummy_rx_pkts;
$last_dummy_tx_pkts = $dummy_tx_pkts;