mirror of
				https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
				synced 2025-10-31 02:38:03 +00:00 
			
		
		
		
	 c812f3b146
			
		
	
	c812f3b146
	
	
	
		
			
			And update lf_auto_wifi_cap to support that as well. This keeps us from over-driving the LANforge so bad in the WCT test case, and gives more reliable stats.
		
			
				
	
	
		
			341 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Prolog
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			341 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Prolog
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/perl -w
 | |
| 
 | |
| # This program is used to automatically run LANforge-GUI WiFi Capacity tests.
 | |
| 
 | |
| # Written by Candela Technologies Inc.
 | |
| #  Udated by:
 | |
| #
 | |
| #
 | |
| 
 | |
| use strict;
 | |
| use warnings;
 | |
| use Carp;
 | |
| 
 | |
| # Un-buffer output
 | |
| $| = 1;
 | |
| use lib '/home/lanforge/scripts';
 | |
| use LANforge::Endpoint;
 | |
| use LANforge::Port;
 | |
| use LANforge::Utils;
 | |
| use Net::Telnet ();
 | |
| use Getopt::Long;
 | |
| use Cwd;
 | |
| 
 | |
| use constant      NA          => "NA";
 | |
| use constant      NL          => "\n";
 | |
| use constant      shelf_num   => 1;
 | |
| 
 | |
| # Default values for ye ole cmd-line args.
 | |
| our $use_existing_sta = 0;
 | |
| our $use_existing_cfg = 0;
 | |
| our $resource         = 1;
 | |
| our $upstream_resource = -1;
 | |
| our $quiet            = "yes";
 | |
| our $radio            = "";  # wiphy0
 | |
| our $ssid             = "my-ssid";
 | |
| our $num_sta          = 64;
 | |
| our $speed_ul         = 0;
 | |
| our $ul_ps_rate       = 0;
 | |
| our $speed_dl         = 100000000;
 | |
| our $dl_ps_rate       = 0;
 | |
| our $endp_type        = "mix";
 | |
| our $percent_tcp      = 50;
 | |
| our $first_ip         = "DHCP";
 | |
| our $upstream         = "eth1";
 | |
| our $increment        = 5;
 | |
| our $duration         = 30;
 | |
| our $test_name        = "lanforge-wifi-capacity-test";
 | |
| our $rpt_timer        = 1000;
 | |
| our $settle_timer     = 10000; # 10 seconds
 | |
| 
 | |
| our $fail_msg         = "";
 | |
| our $manual_check     = 0;
 | |
| our $gui_host         = "127.0.0.1";
 | |
| our $gui_port         = 7777;
 | |
| our $lfmgr_host       = "127.0.0.1";
 | |
| our $lfmgr_port       = 4001;
 | |
| our @test_text        = ();
 | |
| our $use_pdu_mix      = "false";
 | |
| our $pdu_percent      = "pps";
 | |
| our @pdu_mix          = ();
 | |
| our $use_stations     = "";
 | |
| our @user_stations    = ();
 | |
| our $multicon         = -1;
 | |
| 
 | |
| ########################################################################
 | |
| # Nothing to configure below here, most likely.
 | |
| ########################################################################
 | |
| 
 | |
| our $usage = "$0
 | |
|   [--mgr       {host-name | IP}]
 | |
|   [--mgr_port  {ip port}]
 | |
|   [--resource  {number}]
 | |
|   [--upstream_resource  {number}]
 | |
|   [--gui_host  {LANforge gui_host (127.0.0.1)}]
 | |
|   [--gui_port  {LANforge gui_port (7777)}]
 | |
|   [--radio {name,name2,..}] example:  wiphy0,wiphy1
 | |
|   [--speed_dl  {speed in bps}]
 | |
|   [--dl_ps_rate {(0) total download rate, 1 download rate per station}]
 | |
|   [--speed_ul  {speed in bps}]
 | |
|   [--ul_ps_rate {(0) total upload rate, 1 upload rate per station}]
 | |
|   [--ssid      {ssid}]
 | |
|   [--num_sta   {num-stations-per-radio}]  # For each radio.
 | |
|   [--use_existing_sta ]  # Assume stations are already properly created and do not re-create.
 | |
|   [--use_existing_cfg ]  # Use existing station config
 | |
|   [--upstream  {upstream-port-name (eth1)}]
 | |
|   [--first_ip  {first-ip-addr | DHCP}]
 | |
|   [--percent_tcp {percent_tcp for mixed traffic type}]
 | |
|   [--increment {station-bringup-increment (5)}]
 | |
|   [--duration  {bringup-step-duration (30)}]
 | |
|   [--report_timer  {milisecond report timer for created the endpoints (1000)}]
 | |
|   [--endp_type { udp, tcp, mix }
 | |
|   [--use_pdu_mix { true | (false) }]
 | |
|   [--pdu_percent { bps | (pps) }]
 | |
|   [--pdu_mix   { pdu-size:%, pdu-size:%, ... }]
 | |
|   [--use_station   { sta1,sta2, ... }]  # Specify which stations to use.
 | |
|   [--test_name { my-test-name}]
 | |
|   [--test_text { 'my-test<br>over the air<br>funky-hardware-x<br>OS z'}]
 | |
|   [--multicon  { -1: auto, 0 none, 1 new process, 2+ new process + multiple streams}
 | |
|   [--quiet     { yes | no }]
 | |
| 
 | |
| Example:
 | |
| 
 | |
| ./lf_auto_wifi_cap.pl --mgr ben-ota-1 --resource 2 --radio wiphy0 --speed_dl 500000000 --ssid Lede-ventana --num_sta 64 --upstream eth1 --first_ip DHCP --percent_tcp 50 --increment 1,5,10,20,30,40,50,64 --duration 15 --report_timer 3000 --endp_type mix --test_name ventana-mix-dl --test_text 'Ventana LEDE, WLE900VX<br>over-the-air to LANforge station system 5 feet away<br>LAN to WiFi traffic path' --multicon 1
 | |
| 
 | |
| ";
 | |
| 
 | |
| my $i = 0;
 | |
| my $help = 0;
 | |
| 
 | |
| GetOptions
 | |
| (
 | |
|         'mgr|m=s'       => \$::lfmgr_host,
 | |
|         'mgr_port=i'    => \$::lfmgr_port,
 | |
|         'gui_host=s'    => \$::gui_host,
 | |
|         'gui_port=i'    => \$::gui_port,
 | |
|         'resource=i'    => \$::resource,
 | |
|         'upstream_resource=i'    => \$::upstream_resource,
 | |
|         'radio=s'       => \$::radio,
 | |
|         'speed_ul=i'    => \$::speed_ul,
 | |
|         'ul_ps_rate=i'  => \$::ul_ps_rate,
 | |
|         'speed_dl=i'    => \$::speed_dl,
 | |
|         'dl_ps_rate=i'  => \$::dl_ps_rate,
 | |
|         'ssid=s'        => \$::ssid,
 | |
|         'num_sta=i'     => \$::num_sta,
 | |
|         'use_existing_sta' => \$::use_existing_sta,
 | |
|         'use_existing_cfg' => \$::use_existing_cfg,
 | |
|         'upstream=s'    => \$::upstream,
 | |
|         'first_ip=s'    => \$::first_ip,
 | |
|         'percent_tcp=i' => \$::percent_tcp,
 | |
|         'increment=s'   => \$::increment,
 | |
|         'duration=i'    => \$::duration,
 | |
|         'report_timer=i' => \$::rpt_timer,
 | |
|         'settle_timer=i' => \$::settle_timer,
 | |
|         'endp_type=s'   => \$::endp_type,
 | |
|         'test_name=s'   => \$::test_name,
 | |
|         'multicon=i'    => \$::multicon,
 | |
|         'test_text=s'   => \$::test_text,
 | |
|         'use_pdu_mix=s' => \$::use_pdu_mix,
 | |
|         'pdu_percent=s' => \$::pdu_percent,
 | |
|         'pdu_mix=s'     => \@::pdu_mix,
 | |
|         'use_station=s' => \$::use_stations,
 | |
|         'quiet|q=s'     => \$::quiet,
 | |
|         'help'          => \$::help,
 | |
| ) || die("$::usage");
 | |
| 
 | |
| if ($::help) {
 | |
|   print $::usage;
 | |
|   exit(0);
 | |
| }
 | |
| 
 | |
| if ($use_stations ne "") {
 | |
|   @user_stations = split(",", $use_stations);
 | |
| }
 | |
| 
 | |
| if ($upstream_resource == -1) {
 | |
|   $upstream_resource = $resource;
 | |
| }
 | |
| 
 | |
| our $mgr_telnet = new Net::Telnet(Prompt => '/default\@btbits\>\>/',
 | |
|           Timeout => 20);
 | |
| $::mgr_telnet->open(Host    => $lfmgr_host,
 | |
|          Port    => $lfmgr_port,
 | |
|          Timeout => 10);
 | |
| $::mgr_telnet->waitfor("/btbits\>\>/");
 | |
| 
 | |
| # Configure our utils.
 | |
| our $utils = new LANforge::Utils();
 | |
| $utils->telnet($::mgr_telnet);         # Set our telnet object.
 | |
| if ($utils->isQuiet()) {
 | |
|   if (defined $ENV{'LOG_CLI'} && $ENV{'LOG_CLI'} ne "") {
 | |
|     $utils->cli_send_silent(0);
 | |
|   }
 | |
|   else {
 | |
|     $utils->cli_send_silent(1); # Do not show input to telnet
 | |
|   }
 | |
|   $utils->cli_rcv_silent(1);  # Repress output from telnet
 | |
| }
 | |
| else {
 | |
|   $utils->cli_send_silent(0); # Show input to telnet
 | |
|   $utils->cli_rcv_silent(0);  # Show output from telnet
 | |
| }
 | |
| $utils->log_cli("# $0 ".`date "+%Y-%m-%d %H:%M:%S"`);
 | |
| 
 | |
| my @radios = split(/,/, $::radio);
 | |
| my $starting_sta = 500;
 | |
| my $first_sta = $starting_sta;
 | |
| 
 | |
| if (@radios == 0) {
 | |
|   print ("No radios specified, doing nothing.\n");
 | |
|   exit(1);
 | |
| }
 | |
| 
 | |
| if (!$::use_existing_sta) {
 | |
|   # Clean ports on these radios.
 | |
|   for ($i = 0; $i<@radios; $i++) {
 | |
|     my $r = $radios[$i];
 | |
|     print "Deleting virtual devices on resource $::resource radio: $r\n";
 | |
|     system("./lf_associate_ap.pl  --mgr $::lfmgr_host --mgr_port $::lfmgr_port --resource $::resource --action del_all_phy --port_del $r");
 | |
|   }
 | |
| }
 | |
| 
 | |
| if (!$::use_existing_cfg) {
 | |
|   # Create/Set stations on these radios.
 | |
|   for ($i = 0; $i<@radios; $i++) {
 | |
|     my $r = $radios[$i];
 | |
| 
 | |
|     print "Creating/Setting $::num_sta virtual stations on resource $::resource radio: $r\n";
 | |
|     system("./lf_associate_ap.pl --mgr $::lfmgr_host --mgr_port $::lfmgr_port --resource $::resource "
 | |
| 	   ." --action add --radio $r --ssid $::ssid "
 | |
| 	   ." --first_sta sta$first_sta --first_ip $::first_ip "
 | |
| 	   ." --num_stations $::num_sta --admin_down_on_add");
 | |
|     $first_sta += $::num_sta;
 | |
|   }
 | |
| }
 | |
| 
 | |
| my $cwd = cwd();
 | |
| my $wifi_cap_fname = "wifi_auto_cap_" . $$ . ".txt";
 | |
| 
 | |
| # Create temporary wifi capacity config file.
 | |
| open(CAP, ">$wifi_cap_fname") or die ("Can't open $wifi_cap_fname for writing.\n");
 | |
| 
 | |
| print CAP "__CFG VERSION 1\n";
 | |
| print CAP "__CFG SEL_PORT 1 $::upstream_resource $::upstream\n";
 | |
| 
 | |
| our @sta_list = ();
 | |
| if (@user_stations) {
 | |
|   # Use all existing stations on the specified radio
 | |
|   for ($i = 0; $i<@user_stations; $i++) {
 | |
|     my $sta_name = $user_stations[$i];
 | |
|     print CAP "__CFG SEL_PORT 1 $::resource $sta_name\n";
 | |
|     push(@sta_list, "$sta_name");
 | |
|   }
 | |
| }
 | |
| else {
 | |
|   for ($i = $starting_sta; $i<$first_sta; $i++) {
 | |
|     print CAP "__CFG SEL_PORT 1 $::resource sta$i\n";
 | |
|     push(@sta_list, "sta$i");
 | |
|   }
 | |
| }
 | |
| 
 | |
| print CAP "__CFG STA_INCREMENT $::increment\n";
 | |
| print CAP "__CFG DURATION " . ($::duration * 1000) . "\n";
 | |
| print CAP "__CFG RPT_TIMER " . ($::rpt_timer) . "\n";
 | |
| print CAP "__CFG BEFORE_CLEAR " . ($::settle_timer) . "\n";
 | |
| 
 | |
| my $proto = 0;
 | |
| if ($endp_type eq "tcp") {
 | |
|   $proto = 1;
 | |
| }
 | |
| # 2 is layer-4, this script does not support that currently.
 | |
| elsif ($endp_type eq "mix") {
 | |
|   $proto = 3;
 | |
| }
 | |
| print CAP "__CFG PROTOCOL $proto\n";
 | |
| print CAP "__CFG DL_RATE_SEL $::dl_ps_rate\n";
 | |
| print CAP "__CFG DL_RATE $::speed_dl\n";
 | |
| print CAP "__CFG UL_RATE_SEL $::ul_ps_rate\n";
 | |
| print CAP "__CFG UL_RATE $::speed_ul\n";
 | |
| print CAP "__CFG PRCNT_TCP " . ($::percent_tcp * 10000) . "\n";
 | |
| print CAP "__CFG MULTI_CONN $::multicon\n";
 | |
| print CAP "__CFG USE_MIX_PDU $::use_pdu_mix\n";
 | |
| 
 | |
| my $pps = "false";
 | |
| my $bps = "false";
 | |
| if ($pdu_percent eq "pps") {
 | |
|   $pps = "true";
 | |
| }
 | |
| elsif ($pdu_percent eq "bps") {
 | |
|   $bps = "true";
 | |
| }
 | |
| print CAP "__CFG PDU_PRCNT_PPS $pps\n";
 | |
| print CAP "__CFG PDU_PRCNT_BPS $bps\n";
 | |
| 
 | |
| #my @pdu_mix_ln = split(/,/, $::pdu_mix);
 | |
| for ($i = 0; $i < @::pdu_mix; $i++) {
 | |
|   print CAP "__CFG PDU_MIX_LN " . $::pdu_mix[$i] . "\n";
 | |
| }
 | |
| 
 | |
| my @test_texts = split(/<br>/, $::test_text);
 | |
| for ($i = 0; $i < @test_texts; $i++) {
 | |
|   print CAP "__CFG NOTES_TEXT_LN " . $test_texts[$i] . "\n";
 | |
| }
 | |
| 
 | |
| # Things not specified will be left at defaults.
 | |
| 
 | |
| close(CAP);
 | |
| my $accounted_for = 0;
 | |
| while ($accounted_for < $::num_sta) {
 | |
|    my @show_lines = split("\n", $::utils->doAsyncCmd("nc_show_ports 1 $::resource ALL"));
 | |
|    sleep 2;
 | |
|    $accounted_for = 0;
 | |
|    for my $sta_name (@sta_list) {
 | |
|       my @sta_matches = grep { / $sta_name /} @show_lines;
 | |
|       if (@sta_matches > 0) {
 | |
|          #print "  found: ".join("\n", @sta_matches)."\n";
 | |
|          $accounted_for++;
 | |
|       }
 | |
|    } # ~for each station
 | |
|    print " $accounted_for/$::num_sta up\n";
 | |
| }
 | |
| # sleep 2s extra because one station might not be quite done setting up whereas
 | |
| # 10 station will overall less time per station
 | |
| sleep 2;
 | |
| 
 | |
| #  Send command to GUI to start this test.
 | |
| # Something like:  wifi_cap run "ventana-mix-dl" "/tmp/ventana-dl-0003"
 | |
| our $gui_telnet = new Net::Telnet(Prompt => '/#/',
 | |
|                                   Timeout => 60);
 | |
| $::gui_telnet->open(Host    => $::gui_host,
 | |
|                     Port    => $::gui_port,
 | |
|                     Timeout => 10);
 | |
| $::gui_telnet->waitfor("/#/");
 | |
| 
 | |
| my $output_dname = "$::test_name" . "_" . time();
 | |
| my $output_fname = "$cwd/$output_dname";
 | |
| my $cmd = "wifi_cap run \"$cwd/$wifi_cap_fname\" \"$output_fname\"\n";
 | |
| print "Sending GUI command to start the capacity test -:$cmd:-\n";
 | |
| my @rslt = $::gui_telnet->cmd($cmd);
 | |
| $::gui_telnet->close();
 | |
| 
 | |
| print "GUI result: " . join(@rslt, "\n");
 | |
| print "Waiting for test to complete...\n";
 | |
| # Wait until test is done.
 | |
| while (1) {
 | |
|   if (-f "$output_fname/index.html") {
 | |
|     print "Found $output_fname/index.html, wait one more minute to be sure images are written.\n";
 | |
|     last;
 | |
|   }
 | |
|   sleep(10);
 | |
| }
 | |
| 
 | |
| # Could still take a bit to complete writing out the images...
 | |
| sleep(60);
 | |
| 
 | |
| print "Finished, see report at: $output_fname/index.html\n";
 | |
| 
 | |
| system("tar -cvzf $output_dname.tar.gz $output_dname");
 | |
| 
 | |
| # Notes on possible LEDE/OpenWRT DUT cleanup
 | |
| # rm /etc/dhcp.leases and reboot to clean leases.
 |