mirror of
				https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
				synced 2025-10-30 18:27:53 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			276 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			276 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/perl -w
 | |
| 
 | |
| # This program is used to stress test the LANforge system, and may be used as
 | |
| # an example for others who wish to automate LANforge tests.
 | |
| 
 | |
| # Written by Candela Technologies Inc.
 | |
| #  Updated by: greearb@candelatech.com
 | |
| #
 | |
| #
 | |
| 
 | |
| use strict;
 | |
| use warnings;
 | |
| use diagnostics;
 | |
| use Carp;
 | |
| $SIG{ __DIE__ } = sub { Carp::confess( @_ ) };
 | |
| $SIG{ __WARN__ } = sub { Carp::confess( @_ ) };
 | |
| our $q = q(');
 | |
| our $Q = q(");
 | |
| # Un-buffer output
 | |
| $| = 1;
 | |
| 
 | |
| # use lib prepends to @INC, so put lower priority first
 | |
| # This is before run-time, so cannot condition this with normal 'if' logic.
 | |
| use lib '/home/lanforge/scripts';
 | |
| use lib "./";
 | |
| 
 | |
| use LANforge::Endpoint;
 | |
| use LANforge::Port;
 | |
| use LANforge::Utils;
 | |
| use Net::Telnet ();
 | |
| use Getopt::Long;
 | |
| 
 | |
| my $shelf_num = 1;
 | |
| my $lfmgr_host = "localhost";
 | |
| my $lfmgr_port = 4001;
 | |
| my $report_timer = 1000; # XX/1000 seconds
 | |
| 
 | |
| # Default values for ye ole cmd-line args.
 | |
| my $port = "";
 | |
| my $endp_name = "";
 | |
| my $speed = "";
 | |
| my $latency = "";
 | |
| my $max_jitter = "";
 | |
| my $reorder_freq = "";
 | |
| my $extra_buffer = "";
 | |
| my $drop_pm = "";
 | |
| my $dup_pm = "";
 | |
| my $jitter_freq = "";
 | |
| my $min_drop_amt = "";
 | |
| my $max_drop_amt = "";
 | |
| my $min_reorder_amt = "";
 | |
| my $max_reorder_amt = "";
 | |
| my $max_lateness = "";
 | |
| my $switch = "";
 | |
| my $pcap = "";
 | |
| my $load = "";
 | |
| my $state = "";
 | |
| my $cx = "";
 | |
| our $quiet = 0;
 | |
| my $description = "";
 | |
| my $fail_msg = "";
 | |
| my $manual_check = 0;
 | |
| my $cpu_id = "NA";
 | |
| my $wle_flags = 0;
 | |
| 
 | |
| ########################################################################
 | |
| # Nothing to configure below here, most likely.
 | |
| ########################################################################
 | |
| 
 | |
| my $usage = qq($0  [--manager { hostname or address of LANforge manager } ]
 | |
|                  [--resource { resource number } ]
 | |
|                  [--port {port name} ]
 | |
|                  [--endp_name { name } ]
 | |
|                  [--description { ${Q}stuff in quotes${Q} } ]
 | |
|                  [--cx { name } ]
 | |
|                  [--speed { speed in bps } ]
 | |
|                  [--latency { 0 - 1000000 }        # in milliseconds ]
 | |
|                  [--max_jitter { 0 - 1000000 }     # in milliseconds ]
 | |
|                  [--reorder_freq { 0 - 1000000 }   # packets per million ]
 | |
|                  [--extra_buffer { -1 - 1000000 }  # extra bytes to buffer, -1: AUTO, units of 1024 ]
 | |
|                  [--drop_pm { 0 - 1000000 }        # drop packets per million ]
 | |
|                  [--dup_pm { 0 - 1000000 }         # duplication packets per million ]
 | |
|                  [--jitter_freq { 0 - 10000000 }   # jitter these many packets per million ]
 | |
|                  [--min_drop_amt { 1 - 1000 }     # drop at least this many packets in a row, default 1
 | |
|                  [--max_drop_amt { 1 - 1000 }     # drop at most this many packets in a row, default 1
 | |
|                  [--min_reorder_amt { 1 - 1000 }   # reorder at least this many packets, default 1
 | |
|                  [--max_reorder_amt { 1 - 1000 }   # reorder at most this many packets, default 10
 | |
|                  [--max_lateness { -1 - 1000000 }  # maximum amount of unintentional delay before pkt is dropped -1=AUTO
 | |
|                  [--switch new_cx_to_run ]         # activate named CX
 | |
|                  [--pcap { dir-name | off } ]      # specify a packet capture to replay
 | |
|                  [--load { db-name } ]             # load a database
 | |
|                  [--state { running | switch | quiesce | stopped | deleted } ]
 | |
| 
 | |
| Example:
 | |
|  lf_icemod.pl --manager lanforge1 --new_endp t1-A --speed 256000 --drop_pm 100 --latency 35 --description ${Q}link one${Q}
 | |
|  lf_icemod.pl --mgr lanforge1 --new_cx "t1" --endps t1-A,t1-B
 | |
|  lf_icemod.pl --mgr lanforge1 --endp_name t1-A --speed 154000 --drop_pm 10000 --latency 35
 | |
|  lf_icemod.pl --mgr 192.168.100.223 --switch t3
 | |
|  lf_icemod.pl --state running --cx t3
 | |
|  lf_icemod.pl --pcap /tmp/endp-a --endp_name t1-A
 | |
|  lf_icemod.pl --load my_db
 | |
| );
 | |
| 
 | |
| if (@ARGV < 2) {
 | |
|    print "$usage\n";
 | |
|    exit 0;
 | |
| }
 | |
| 
 | |
| my $i = 0;
 | |
| my $show_help;
 | |
| my $resource = 1;
 | |
| my $new_endp = "";
 | |
| my $new_cx = "";
 | |
| my $endps = "";
 | |
| 
 | |
| GetOptions (
 | |
|    'help|h'                => \$show_help,
 | |
|    'manager|mgr|m=s'       => \$lfmgr_host,
 | |
|    'card|resource|r=i'     => \$resource,
 | |
|    'endp_name|e=s'         => \$endp_name,
 | |
|    'desc|description=s'    => \$description,
 | |
|    'cx|c=s'                => \$cx,
 | |
|    'speed|s=i'             => \$speed,
 | |
|    'latency|l=i'           => \$latency,
 | |
|    'max_jitter=i'          => \$max_jitter,
 | |
|    'reorder_freq=i'        => \$reorder_freq,
 | |
|    'extra_buffer=i'        => \$extra_buffer,
 | |
|    'drop_pm|d=i'           => \$drop_pm,
 | |
|    'dup_pm=i'              => \$dup_pm,
 | |
|    'jitter_freq|j=i'       => \$jitter_freq,
 | |
|    'min_drop_amt=i'        => \$min_drop_amt,
 | |
|    'max_drop_amt=i'        => \$max_drop_amt,
 | |
|    'min_reorder_amt=i'     => \$min_reorder_amt,
 | |
|    'max_reorder_amt=i'     => \$max_reorder_amt,
 | |
|    'max_lateness=i'        => \$max_lateness,
 | |
|    'switch|w=s'            => \$switch,
 | |
|    'new_endp=s'            => \$new_endp,
 | |
|    'new_cx=s'              => \$new_cx,
 | |
|    'endps=s'               => \$endps,
 | |
|    'port=s'                => \$port,
 | |
|    'pcap|p=s'              => \$pcap,
 | |
|    'load|o=s'              => \$load,
 | |
|    'state|a=s'             => \$state,
 | |
|    'wle_flags=i'           => \$wle_flags,
 | |
|    'quiet|q=i'             => \$quiet,
 | |
| ) || die("$usage");
 | |
| 
 | |
| if ($show_help) {
 | |
|    print $usage;
 | |
|    exit 0;
 | |
| }
 | |
| 
 | |
| # Open connection to the LANforge server.
 | |
| my $t = new Net::Telnet(Prompt => '/default\@btbits\>\>/',
 | |
|          Timeout => 20);
 | |
| 
 | |
| $t->open( Host    => $lfmgr_host,
 | |
|           Port    => $lfmgr_port,
 | |
|           Timeout => 10);
 | |
| 
 | |
| $t->waitfor("/btbits\>\>/");
 | |
| 
 | |
| my $dt = "";
 | |
| 
 | |
| my $utils = new LANforge::Utils();
 | |
| $utils->connect($lfmgr_host, $lfmgr_port);
 | |
| 
 | |
| my $cmd;
 | |
| 
 | |
| $speed = "NA" if ($speed eq "");
 | |
| $latency = "NA" if ($latency eq "");
 | |
| $max_jitter = "NA" if ($max_jitter eq "");
 | |
| $reorder_freq = "NA" if ($reorder_freq eq "");
 | |
| $extra_buffer = "NA" if ($extra_buffer eq "");
 | |
| $drop_pm = "NA" if ($drop_pm eq "");
 | |
| $dup_pm = "NA" if ($dup_pm eq "");
 | |
| $pcap = "NA" if ($pcap eq "");
 | |
| $jitter_freq = "NA" if ($jitter_freq eq "");
 | |
| $min_drop_amt = "NA" if ($min_drop_amt eq "");
 | |
| $max_drop_amt = "NA" if ($max_drop_amt eq "");
 | |
| $min_reorder_amt = "NA" if ($min_reorder_amt eq "");
 | |
| $max_reorder_amt = "NA" if ($max_reorder_amt eq "");
 | |
| $max_lateness = "NA" if ($max_lateness eq "");
 | |
| 
 | |
| 
 | |
| 
 | |
| if (($load ne "") && ($load ne "NA")) {
 | |
|   $cmd = "load $load overwrite";
 | |
|   $utils->doCmd($cmd);
 | |
|   my @rslt = $t->waitfor("/LOAD-DB:  Load attempt has been completed./");
 | |
|   if (!($quiet & 0x1)) {
 | |
|     print @rslt;
 | |
|     print "\n";
 | |
|   }
 | |
|   exit(0);
 | |
| }
 | |
| 
 | |
| if (($new_cx ne "") && ($new_cx ne "NA")) {
 | |
|    die("please set the endpoints for new wanlink cx; $usage")
 | |
|       unless ((defined $endps) && ($endps ne ""));
 | |
| 
 | |
|    die("please specify two endpoints joined by a comma: end1-A,end1-B; $usage")
 | |
|       unless ($endps =~ /^\S+,\S+$/);
 | |
|    my @ends= split(',', $endps);
 | |
|    $cmd = $utils->fmt_cmd("add_cx", $new_cx, "default_tm", $ends[0], $ends[1]);
 | |
|    $utils->doCmd($cmd);
 | |
|    exit(0);
 | |
| }
 | |
| 
 | |
| if (($new_endp ne "") && ($new_endp ne "NA")) {
 | |
|    die("please set the resource for new wanlink endpoint; $usage")
 | |
|       unless ((defined $resource) && ($resource ne ""));
 | |
|    die("please set latency for new wanlink endpoint; $usage")
 | |
|       unless ((defined $latency) && ($latency ne ""));
 | |
|    die("please set drop_pm for new wanlink endpoint; $usage")
 | |
|       unless ((defined $drop_pm) && ($drop_pm ne ""));
 | |
|    die("please set port for new wanlink endpoint; $usage")
 | |
|       unless ((defined $port) && ($port ne ""));
 | |
| 
 | |
|    $wle_flags = "NA" if (($wle_flags == 0) || ($wle_flags eq ""));
 | |
|    $cpu_id = "NA" if ($cpu_id eq "");
 | |
|    $description = "NA" if ($description eq "");
 | |
| 
 | |
|    $cmd = $utils->fmt_cmd("add_wl_endp", $new_endp, 1, $resource, $port,
 | |
|       $latency, $speed, $description, $cpu_id, $wle_flags);
 | |
|    $utils->doCmd($cmd);
 | |
| 
 | |
|    $cmd = $utils->fmt_cmd("set_wanlink_info", $new_endp, $speed, $latency,
 | |
|       $max_jitter, $reorder_freq, $extra_buffer, $drop_pm, $dup_pm, $pcap,
 | |
|       $jitter_freq, $min_drop_amt, $max_drop_amt, $min_reorder_amt,
 | |
|       $max_reorder_amt, $max_lateness );
 | |
|    $utils->doCmd($cmd);
 | |
|    exit(0);
 | |
| }
 | |
| 
 | |
| if (($switch ne "") && ($switch ne "NA")) {
 | |
|   $cmd = "set_cx_state all $switch SWITCH";
 | |
|   $utils->doCmd($cmd);
 | |
|   exit(0);
 | |
| }
 | |
| 
 | |
| if ((length($endp_name) == 0) && (length($cx) == 0)) {
 | |
|   print "ERROR:  Must specify endp or cx name.\n";
 | |
|   die("$usage");
 | |
| }
 | |
| 
 | |
| if ((defined $pcap) && ($pcap ne "")&& ($pcap ne "NA")) {
 | |
|    print STDERR "pcap has value??? [$pcap]\n";
 | |
|   if ($pcap =~ /^OFF$/i) {
 | |
|     $cmd = "set_wanlink_pcap $endp_name off";
 | |
|   }
 | |
|   else {
 | |
|     $cmd = "set_wanlink_pcap $endp_name ON $pcap";
 | |
|   }
 | |
|   $utils->doCmd($cmd);
 | |
|   exit(0);
 | |
| }
 | |
| 
 | |
| if (($state ne "") || ($state ne "NA")){
 | |
|   $cmd = "set_cx_state all $cx $state";
 | |
|   $utils->doCmd($cmd);
 | |
|   exit(0);
 | |
| }
 | |
| 
 | |
| 
 | |
| die ("requires endp_name to be set")
 | |
|    unless ((defined $endp_name) && ($endp_name ne ""));
 | |
| # Assumes that the endpoint already exists.
 | |
| $cmd = Utils::fmt_cmd("set_wanlink_info", $endp_name, $speed, $latency,
 | |
|    $max_jitter, $reorder_freq, $extra_buffer, $drop_pm, $dup_pm, $pcap,
 | |
|    $jitter_freq, $min_drop_amt, $max_drop_amt, $min_reorder_amt,
 | |
|    $max_reorder_amt, $max_lateness );
 | |
| $utils->doCmd($cmd);
 | |
| 
 | |
| exit(0);
 | 
