Files
wlan-lanforge-scripts/wifi-roaming-times.pl
Ben Greear 72712ff548 Add scripts from the tools directory in the private Candela repo.
These scripts will now be publicly available in a git repo for
easier shared development and change tracking.
2017-10-06 13:41:50 -07:00

132 lines
3.5 KiB
Perl
Executable File

#!/usr/bin/perl
#
use strict;
use warnings;
use diagnostics;
use Carp;
$SIG{__DIE__} = sub{Carp::confess(@_)};
use Getopt::Long;
use Time::HiRes qw(usleep);
use List::Util qw(sum min max);
$| = 1;
package main;
our @file_lines;
our $success_counter = 0;
our $fail_counter = 0;
our %station_names = ();
our @association_times = ();
die "Want a wpa_supplicant_log.wiphyX file please, bye.\n"
unless(defined $ARGV[0]);
die "I can't find $ARGV[0], sorry."
unless(-f $ARGV[0]);
die $!
unless open(my $fh, "<", $ARGV[0]);
@file_lines = <$fh>;
close $fh;
chomp(@file_lines);
# survey for all the station names
#
for (@file_lines) {
next unless /: (sta\d+): /;
$station_names{ $1 } = 0
unless(defined $station_names{ $1 } );
}
print "Found these stations: ";
while( my($k, $v)= each %station_names) {
print "$k, ";
}
print "\n";
# for each station, find the BSS of the thing it's attempting to roam for
while( my($sta, $v)= each %station_names) {
my @lines_by_station = grep {/: $sta: /} @file_lines;
#print "lines for $sta: ".@lines_by_station."\n";
my $is_roam_attempt = 0;
my $target_bss = "";
my $prev_bss = "";
my $time_roam_start = 0;
my $time_roam_stop = 0;
my $time_roam_delta = 0;
my @roam_lines = ();
usleep(50000);
for (@lines_by_station) {
#print "$sta : $is_roam_attempt, $target_bss, $prev_bss, $fail_counter, $success_counter\n";
if (/ SME: Trying to authenticate with ([^ ]+) /) {
if ($is_roam_attempt == 1) {
$fail_counter ++ ;
$prev_bss = $target_bss;
}
#print "$sta trying bss $1\n";
$is_roam_attempt = 1;
$target_bss = $1;
($time_roam_start) = /^(\d+\.\d+): /;
next;
}
push(@roam_lines, $_);
# else we're in the middle of a roaming attemt
if (/: CTRL-EVENT-CONNECTED - Connection to ([0-9A-Fa-f:]+) completed/) {
#print "connected bss $1\n";
die "aaaa!"
if ($target_bss eq "");
if ($prev_bss eq $1) {
#print "Roam to self? $prev_bss\n";
#print join("\n", @roam_lines)."\n";
}
$is_roam_attempt = 0;
if ($target_bss eq $1) {
$success_counter ++ ;
$prev_bss = $target_bss;
}
($time_roam_stop) = $_ =~ /^(\d+\.\d+): /;
$time_roam_delta = $time_roam_stop - $time_roam_start;
die ("What an unlikely roam time you have my dear: $time_roam_delta")
if ($time_roam_delta <= 0);
#print "$sta roam to $target_bss in $time_roam_delta\n";
push(@association_times, $time_roam_delta);
@roam_lines = ();
$time_roam_start = 0;
$time_roam_stop = 0;
$time_roam_delta = 0;
}
#usleep(5000);
} # ~for
#my $ave = sum(@association_times)/@association_times
# unless (@association_times < 1);
#
# print "$sta +$success_counter -$fail_counter > $ave\n"
} # ~while
my $ave = sum(@association_times)/@association_times
unless (@association_times < 1);
my $min = min(@association_times);
my $max = max(@association_times);
my $i = 0;
for (sort {$a <=> $b} @association_times) {
print "$_ " if ($i <= 9);
print "$_ " if ($i >= @association_times -9);
$i++;
}
print "\n";
print "Roam Successes: $success_counter\n";
print "Roam Failures: $fail_counter\n";
print "Min/Ave/Max: $min $ave $max\n";
# find CTRL-EVENT-CONNECTED and if we connect to that BSS we're good
# compute a time factor, and record it