mirror of
https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
synced 2025-10-28 17:32:35 +00:00
These scripts will now be publicly available in a git repo for easier shared development and change tracking.
763 lines
18 KiB
Perl
Executable File
763 lines
18 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
# 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.
|
|
|
|
# This script sets up connections to load-test pairs of ports.
|
|
# The user does not need to give many details..the script attempts
|
|
# to configure connections with optimal values for maximum throughput.
|
|
|
|
# Un-buffer output
|
|
$| = 1;
|
|
|
|
# This breaks Net::Telnet...gah!
|
|
#use bigint;
|
|
|
|
use strict;
|
|
#use Switch;
|
|
|
|
use Net::Telnet ();
|
|
use LANforge::Port;
|
|
use LANforge::Utils;
|
|
|
|
my @cx_types = ();
|
|
|
|
my $test_mgr = "netoptics_tm";
|
|
my $report_timer = 1000; # Set report timer for all tests created in ms, i.e. 8 seconds
|
|
|
|
my $lfmgr_host = "127.0.0.1";
|
|
my $lfmgr_port = 4001;
|
|
|
|
my $shelf = 1;
|
|
|
|
# This sets up connections.
|
|
my $lf1 = 1; # Minor Resource EID of first LANforge resource.
|
|
|
|
my @lf1_ports = ();
|
|
|
|
my $num_vlans = 3; # .1q vlans per physical port
|
|
my $vid = "RANDOM";
|
|
my $vlan_mac = "RANDOM";
|
|
my $num_mvlans = 3; # mac-vlans per .1q vlan
|
|
my $mvlan_mac = "RANDOM";
|
|
my $num_cxs = 5; # CXs per MVL pair (or endpoints per MVL)
|
|
my $ipaddr = "DHCP";
|
|
my $mask = "255.255.0.0";
|
|
my $subnet_per_vl = 1;
|
|
|
|
my $multicon = "AUTO";
|
|
my $duration = 10 * 60 * 1000; # 10 minutes by default
|
|
my $max_rate = 10000000000;
|
|
my $max_pkt_sz = "AUTO";
|
|
my $dbname = "netoptics-scr";
|
|
my $clear_port_on_start = 1;
|
|
my $group_prefix = "L3";
|
|
|
|
########################################################################
|
|
# Nothing to configure below here, most likely.
|
|
########################################################################
|
|
|
|
my $ports_rpt = "Interface VID MAC IP\n";
|
|
|
|
# Parse cmd-line args
|
|
my $i;
|
|
for ($i = 0; $i<@ARGV; $i++) {
|
|
my $var = $ARGV[$i];
|
|
if ($var =~ m/(\S+)=(.*)/) {
|
|
my $arg = $1;
|
|
my $val = $2;
|
|
handleCmdLineArg($arg, $val);
|
|
}
|
|
else {
|
|
handleCmdLineArg($var);
|
|
}
|
|
}
|
|
|
|
if (@cx_types == 0) {
|
|
@cx_types = ("lf_tcp");
|
|
}
|
|
|
|
if (@lf1_ports < 2) {
|
|
print("ERROR: Must specify two base ports, ie: --portA=eth1 --portB=eth2\n");
|
|
exit(1);
|
|
}
|
|
|
|
if ($lfmgr_host eq undef) {
|
|
print "\nYou must define a LANforge Manager!!!\n\n"
|
|
. "For example:\n"
|
|
. "./lf_netoptics.pl --mgr=localhost\n"
|
|
. "OR\n"
|
|
. "./lf_netoptics.pl --mgr=192.168.1.101\n\n";
|
|
printHelp();
|
|
exit (1);
|
|
}
|
|
|
|
print
|
|
"\nStarting script with the following arguments:"
|
|
. "\nmanager: $lfmgr_host:$lfmgr_port"
|
|
. "\nlf1: $lf1"
|
|
. "\nlf1_ports: " . join(" ", @lf1_ports)
|
|
. "\nipaddr: $ipaddr"
|
|
. "\nsubnet-per-vlan: $subnet_per_vl"
|
|
. "\nnum_mvlans: $num_mvlans"
|
|
. "\nmax_rate: $max_rate"
|
|
. "\nmax_pkt_size: $max_pkt_sz"
|
|
. "\ncx_types: " . join(" ", @cx_types)
|
|
. "\nnum_cxs: $num_cxs\n\n";
|
|
|
|
# Run some logic tests.
|
|
if (1) {
|
|
my $tst_ip = "99.99.99.2";
|
|
my $tsti = toIpString($tst_ip);
|
|
my $tips = toStringIp($tsti);
|
|
if ($tst_ip ne $tips) {
|
|
print ("tst-ip: $tst_ip as-integer: $tsti as-string-again: $tips\n");
|
|
die("bug");
|
|
}
|
|
}
|
|
|
|
# Open connection to the LANforge server.
|
|
my $t = new Net::Telnet(Timeout => 15,
|
|
#Dump_Log => "lf_netoptics.log",
|
|
Prompt => '/default\@btbits\>\>/');
|
|
|
|
$t->telnetmode(0); # Not true telnet protocol
|
|
$t->max_buffer_length(1024 * 1024 * 10); # 10M buffer
|
|
|
|
$t->open(Host => $lfmgr_host,
|
|
Port => $lfmgr_port,
|
|
Timeout => 45);
|
|
|
|
$t->waitfor('/.*btbits\>\>.*/');
|
|
|
|
# Configure our utils.
|
|
my $utils = new LANforge::Utils();
|
|
$utils->telnet($t); # Set our telnet object.
|
|
$utils->cli_send_silent(0); # Do show input to CLI
|
|
$utils->cli_rcv_silent(0); # Repress output from CLI ??
|
|
|
|
my $dt = getDate();
|
|
my $dt_start = $dt;
|
|
|
|
|
|
initToDefaults();
|
|
|
|
doCmd("add_tm $test_mgr");
|
|
doCmd("tm_register $test_mgr default"); # Add default user
|
|
doCmd("tm_register $test_mgr default_gui"); # Add default GUI user
|
|
doCmd("tm_register $test_mgr Admin");
|
|
|
|
my $i;
|
|
my $p;
|
|
my $q;
|
|
my $m;
|
|
my $ip;
|
|
|
|
# For each port, add .1q vlans.
|
|
# For each .1q vlan, add mac-vlans
|
|
|
|
# Create list of IP addresses, one for each mac-vlan.
|
|
if ($ipaddr eq "RANDOM") {
|
|
# basically, just randomize the middle two octets
|
|
$ip = (10 << 24) + int(rand(1<<23));
|
|
$ip &= 0xffffff00;
|
|
$ip |= 2;
|
|
}
|
|
else {
|
|
if ($ipaddr eq "DHCP") {
|
|
$ip = 0;
|
|
}
|
|
else {
|
|
$ip = toIpString($ipaddr);
|
|
print "IP-addr: $ipaddr (as int: $ip)\n";
|
|
}
|
|
}
|
|
my @vl_ips = ();
|
|
for ($q = 0; $q<$num_vlans; $q++) {
|
|
@vl_ips = (@vl_ips, $ip);
|
|
if ($subnet_per_vl) {
|
|
if ($ipaddr eq "RANDOM") {
|
|
# basically, just randomize the middle two octets
|
|
$ip = (10 << 24) + int(rand(1<<23));
|
|
$ip &= 0xffffff00;
|
|
$ip |= 2;
|
|
}
|
|
else {
|
|
if ($ipaddr eq "DHCP") {
|
|
$ip = 0;
|
|
}
|
|
else {
|
|
my $maski = toIpString($mask);
|
|
print "maski: $maski ip: $ip\n";
|
|
$ip += ~$maski;
|
|
$ip &= $maski;
|
|
$ip |= 2;
|
|
print "after: ip: $ip\n";
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
$ip++;
|
|
}
|
|
}
|
|
|
|
my @ips = ();
|
|
for ($p = 0; $p<@lf1_ports; $p++) {
|
|
for ($q = 0; $q<$num_vlans; $q++) {
|
|
for ($m = 0; $m<$num_mvlans; $m++) {
|
|
if ($subnet_per_vl) {
|
|
my $ip = $vl_ips[$q];
|
|
@ips = (@ips, $ip);
|
|
$ip++;
|
|
$vl_ips[$q] = $ip;
|
|
}
|
|
else {
|
|
@ips = (@ips, $ip);
|
|
$ip++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
my $total_mvlans = @lf1_ports * $num_vlans * $num_mvlans;
|
|
|
|
# Build list of VIDs, we want same VID on each different
|
|
# physical/base port.
|
|
my $myvid;
|
|
if ($vid eq "RANDOM") {
|
|
$myvid = int(rand(4094));
|
|
if ($myvid <= 0) {
|
|
$myvid = 1;
|
|
}
|
|
}
|
|
else {
|
|
$myvid = $vid;
|
|
}
|
|
|
|
my @vids = ($myvid);
|
|
for ($q = 0; $q < ($num_vlans - 1); $q++) {
|
|
my $myvid;
|
|
if ($vid eq "RANDOM") {
|
|
$myvid = int(rand(4094));
|
|
if ($myvid <= 0) {
|
|
$myvid = 1;
|
|
}
|
|
}
|
|
else {
|
|
$vid++;
|
|
$myvid = $vid;
|
|
}
|
|
@vids = (@vids, $myvid);
|
|
}
|
|
|
|
|
|
my $do_simple_names = (@lf1_ports == 2);
|
|
|
|
my $ip_idx = 0;
|
|
for ($p = 0; $p<@lf1_ports; $p++) {
|
|
for ($q = 0; $q<$num_vlans; $q++) {
|
|
# Create .1q vlan
|
|
my $myvid = $vids[$q];
|
|
my $vname = $lf1_ports[$p] . ".$myvid";
|
|
doCmd("add_vlan $shelf $lf1 $lf1_ports[$p] $myvid $vname 8000");
|
|
|
|
if ($vlan_mac ne "PARENT") {
|
|
my $mac_addr;
|
|
if ($vlan_mac eq "RANDOM") {
|
|
$mac_addr = getNextMac($vlan_mac);
|
|
}
|
|
else {
|
|
$mac_addr = $vlan_mac;
|
|
}
|
|
doCmd("set_port $shelf $lf1 $vname NA NA NA NA NA $mac_addr");
|
|
if ($vlan_mac ne "RANDOM") {
|
|
$vlan_mac = getNextMac($vlan_mac);
|
|
}
|
|
}
|
|
|
|
# Create mac-vlans
|
|
for ($m = 0; $m<$num_mvlans; $m++) {
|
|
|
|
my $mac_addr;
|
|
if ($mvlan_mac eq "RANDOM") {
|
|
$mac_addr = getNextMac($mvlan_mac);
|
|
}
|
|
else {
|
|
$mac_addr = $mvlan_mac;
|
|
}
|
|
|
|
my $mvname = "$vname#$m";
|
|
doCmd("add_mvlan $shelf $lf1 $vname $mac_addr $m $mvname");
|
|
|
|
my $ips = toStringIp($ips[$ip_idx]);
|
|
$ip_idx++;
|
|
my $masks = $mask;
|
|
my $interest_flags = 0x4000 | 0x4 | 0x8 ; # dhcp, IP, Mask
|
|
my $cur_flags = 0;
|
|
if ($ipaddr eq "DHCP") {
|
|
$masks = "0.0.0.0";
|
|
$cur_flags = 0x80000000; # use-dhcp
|
|
}
|
|
|
|
# Set up IP addressing on the mac-vlan
|
|
doCmd("set_port $shelf $lf1 $mvname $ips $masks NA NA $cur_flags NA NA NA NA $interest_flags");
|
|
|
|
$ports_rpt .= "$mvname $myvid $mac_addr $ips\n";
|
|
|
|
# Now, create endpoints on this port.
|
|
my $e;
|
|
for ($e = 0; $e < $num_cxs; $e++) {
|
|
my $burst = "NO";
|
|
my $szrnd = "NO";
|
|
my $pattern = "increasing";
|
|
my $ep1 = "$group_prefix-$p.$q#$m-$e";
|
|
my $etype = $cx_types[$e % @cx_types];
|
|
my $rate = int($max_rate / $num_cxs);
|
|
my $pdu_sz = getPduSize($etype, $max_rate);
|
|
my $mcon = $multicon;
|
|
if ($mcon eq "AUTO") {
|
|
if ($max_rate > 1000000000) {
|
|
$mcon = 1;
|
|
}
|
|
else {
|
|
$mcon = 0;
|
|
}
|
|
}
|
|
my $cmd = "add_endp $ep1 $shelf $lf1 $mvname $etype -1 $burst $rate $rate $szrnd $pdu_sz $pdu_sz $pattern NO NA NA $mcon";
|
|
doCmd($cmd);
|
|
if ($clear_port_on_start) {
|
|
doCmd("set_endp_flag $ep1 ClearPortOnStart 1");
|
|
}
|
|
}
|
|
|
|
if ($mvlan_mac ne "RANDOM") {
|
|
$mvlan_mac = getNextMac($mvlan_mac);
|
|
}
|
|
}
|
|
}
|
|
}#for all ports
|
|
|
|
my $pdu_sz = getPduSize($cx_types[0], $max_rate);
|
|
my $flags = 4; # symmetric
|
|
my $script_body = "my-script $flags Script2544 '$duration 5000 bps,$max_rate $pdu_sz 50000,100000,500000,100000,0 bps,$max_rate $pdu_sz 0 NONE' ALL 0";
|
|
|
|
# Add cross-connects between the endpoints on port-pairs.
|
|
for ($p = 0; $p<@lf1_ports; $p += 2) {
|
|
# Add test-group for this port-pair
|
|
my $pgname = "$group_prefix-$p";
|
|
if ($do_simple_names) {
|
|
$pgname = "$group_prefix-all";
|
|
}
|
|
doCmd("add_group $pgname 4 4");
|
|
doCmd("set_script $pgname $script_body");
|
|
|
|
for ($q = 0; $q<$num_vlans; $q++) {
|
|
my $myvid = $vids[$q];
|
|
|
|
# Add test-group for this vlan-pair
|
|
my $vgname = "$group_prefix-$p.v$myvid";
|
|
if ($do_simple_names) {
|
|
$vgname = "$group_prefix-all-v$myvid";
|
|
}
|
|
|
|
doCmd("add_group $vgname 4 4");
|
|
doCmd("set_script $vgname $script_body");
|
|
|
|
for ($m = 0; $m<$num_mvlans; $m++) {
|
|
|
|
# Add test-group for this mvlan pair
|
|
my $gname = "$group_prefix-$p.$q#$m";
|
|
if ($do_simple_names) {
|
|
$gname = "$group_prefix-v$myvid#$m";
|
|
}
|
|
doCmd("add_group $gname 4 4");
|
|
doCmd("set_script $gname $script_body");
|
|
|
|
my $e;
|
|
for ($e = 0; $e < $num_cxs; $e++) {
|
|
# Now, add the cross-connects
|
|
my $pp = int($p / 2);
|
|
my $p2 = $p+1;
|
|
my $ep1 = "$group_prefix-$p.$q#$m-$e";
|
|
my $ep2 = "$group_prefix-$p2.$q#$m-$e";
|
|
my $cx_name = "$group_prefix-$pp.$q.$m-$e";
|
|
if ($do_simple_names) {
|
|
$cx_name = "$group_prefix-$myvid#$m-$e";
|
|
}
|
|
|
|
my $cmd = "add_cx $cx_name $test_mgr $ep1 $ep2";
|
|
doCmd($cmd);
|
|
doCmd("set_cx_report_timer $test_mgr $cx_name $report_timer");
|
|
|
|
# Add to groups
|
|
doCmd("add_tgcx $gname $cx_name");
|
|
doCmd("add_tgcx $vgname $cx_name");
|
|
doCmd("add_tgcx $pgname $cx_name");
|
|
|
|
# TODO: Add 2544 scripts to test-groups
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
# Save this in a database for later retrieval.
|
|
doCmd("save $dbname");
|
|
|
|
# Print some reporting on what was configured.
|
|
print "<PORTS_CREATED>\n$ports_rpt</PORTS_CREATED>\n";
|
|
|
|
|
|
$dt = getDate();
|
|
print "Started lf_netoptics.pl script at : $dt_start\n";
|
|
print "Completed lf_netoptics.pl script at: $dt\n\n";
|
|
exit(0);
|
|
#####################
|
|
# END lf_macvlan.pl #
|
|
#####################
|
|
|
|
|
|
|
|
sub initToDefaults {
|
|
# Clean up database if stuff exists
|
|
doCmd("rm_cx $test_mgr all");
|
|
doCmd("rm_endp YES_ALL");
|
|
doCmd("rm_test_mgr $test_mgr");
|
|
my $rslt = doCmd("show_group");
|
|
my @rslts = split(/\n/, $rslt);
|
|
my $i;
|
|
my $pat = ".*TestGroup name: (${group_prefix}-\\S+)\\s+";
|
|
#print "pattern -:$pat:-\n";
|
|
for ($i = 0; $i<@rslts; $i++) {
|
|
my $ln = $rslts[$i];
|
|
chomp($ln);
|
|
#print "test-group-rslt-line -:$ln:-\n";
|
|
if ($ln =~ /$pat/) {
|
|
doCmd("rm_group $1");
|
|
}
|
|
}
|
|
|
|
initPortsToDefault();
|
|
}#initToDefaults
|
|
|
|
sub getNextMac {
|
|
my $last = shift;
|
|
if ($last eq "RANDOM") {
|
|
my $msb = int(rand(255)) & 0xfe; # make sure odd bit (mcast) isn't set.
|
|
return sprintf("%02x:%02x:%02x:%02x:%02x:%02x", $msb, int(rand(255)), int(rand(255)), int(rand(255)),
|
|
int(rand(255)), int(rand(255)));
|
|
}
|
|
else {
|
|
# Parse last, and increment.
|
|
if ($last =~ /(\S+):(\S+):(\S+):(\S+):(\S+):(\S+)/) {
|
|
my $dl = hex($6);
|
|
$dl |= (hex($5) << 8);
|
|
$dl |= (hex($4) << 16);
|
|
$dl |= (hex($3) << 24);
|
|
|
|
my $dh |= hex($2);
|
|
$dh |= (hex($1) << 8);
|
|
|
|
$dl++; # Increment mac by one.
|
|
if ($dl == 0) {
|
|
# Wrapped, how unlucky.
|
|
$dh++;
|
|
}
|
|
return sprintf("%02x:%02x:%02x:%02x:%02x:%02x",
|
|
($dh & 0xff00) >> 8,
|
|
($dh & 0xff),
|
|
($dl & 0xff000000) >> 24,
|
|
($dl & 0xff0000) >> 16,
|
|
($dl & 0xff00) >> 8,
|
|
($dl & 0xff));
|
|
}
|
|
}
|
|
} # getNextMac
|
|
|
|
|
|
sub toIpString {
|
|
my $ips = shift;
|
|
if ($ips =~ /(\S+)\.(\S+)\.(\S+)\.(\S+)/) {
|
|
my $d = int($4);
|
|
$d += ((int($3) << 8) & 0xff00);
|
|
$d += ((int($2) << 16) & 0xff0000);
|
|
$d += ((int($1) << 24) & 0xff000000);
|
|
return $d;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
sub toStringIp {
|
|
my $ip = shift;
|
|
return sprintf("%d.%d.%d.%d",
|
|
($ip >> 24),
|
|
($ip & 0xff0000) >> 16,
|
|
($ip & 0xff00) >> 8,
|
|
($ip & 0xff));
|
|
}
|
|
|
|
# Wait until the system can update a port..
|
|
sub throttleCard {
|
|
my $s = shift;
|
|
my $c = shift;
|
|
my $p1 = new LANforge::Port();
|
|
$utils->updatePort($p1, $s, $c, 1);
|
|
}#throttle
|
|
|
|
sub initPortsToDefault {
|
|
clearVlanPorts($shelf, $lf1);
|
|
|
|
throttleCard($shelf, $lf1);
|
|
|
|
# Set all ports we are messing with to known state.
|
|
my $i = 0;
|
|
for ($i = 0; $i<@lf1_ports; $i++) {
|
|
my $tmp = $lf1_ports[$i];
|
|
doCmd("set_port $shelf $lf1 $tmp 0.0.0.0 0.0.0.0 0.0.0.0 NA NA NA");
|
|
}
|
|
}
|
|
|
|
sub clearVlanPorts {
|
|
my $s = shift;
|
|
my $c = shift;
|
|
|
|
my $i;
|
|
my $found_one = 1;
|
|
my @ports = ();
|
|
while ($found_one) {
|
|
$found_one = 0;
|
|
doCmd("probe_ports");
|
|
# Clear out any existing VLAN ports.
|
|
$utils->error("");
|
|
@ports = $utils->getPortListing($s, $c);
|
|
my $mx = @ports;
|
|
print "Found $mx ports for resource: $shelf.$lf1\n";
|
|
|
|
if (($mx == 0) || ($utils->error() =~ /Timed out/g)) {
|
|
# System is too backlogged to answer, wait a bit
|
|
print " Will try listing ports again in a few seconds...system is backlogged now!\n";
|
|
sleep(5);
|
|
$found_one = 1;
|
|
next;
|
|
}
|
|
|
|
my $throttle = 0;
|
|
for ($i = 0; $i<$mx; $i++) {
|
|
if (($ports[$i]->isMacVlan()) || ($ports[$i]->is8021qVlan())) {
|
|
# See if it belongs to any of our interfaces
|
|
my $par = $ports[$i]->parent();
|
|
if ($par ne "") {
|
|
my $base;
|
|
if ($par =~ /(\S+)\#.*/) {
|
|
$base = $1; # mac-vlan
|
|
}
|
|
elsif ($par =~ /(\S+)\..*/) {
|
|
$base = $1; # .1q vlan
|
|
}
|
|
else {
|
|
$base = $par;
|
|
}
|
|
|
|
my $p;
|
|
for ($p = 0; $p < @lf1_ports; $p++) {
|
|
if ($lf1_ports[$p] eq $base) {
|
|
doCmd($ports[$i]->getDeleteCmd());
|
|
$found_one = 1;
|
|
last;
|
|
}
|
|
}# for all physical/base ports
|
|
}# if found port has parent device
|
|
}# Found a vlan device
|
|
}# for all found ports
|
|
}# while we found something to delete
|
|
}#clearVlanPorts
|
|
|
|
# Returns string, might want to split it to get line-by-line option
|
|
sub doCmd {
|
|
my $cmd = shift;
|
|
|
|
if ($cmd) {
|
|
print ">>> $cmd\n";
|
|
$t->print($cmd);
|
|
my @rslt = $t->waitfor('/ \>\>RSLT:(.*)/');
|
|
print "**************\n @rslt ................\n\n";
|
|
return join("\n", @rslt);
|
|
} else {
|
|
print "\n***** doCmd (): NULL COMMAND !!! *****";
|
|
print "\n$cmd\n\n";
|
|
exit (1);
|
|
}
|
|
}
|
|
|
|
sub getDate {
|
|
my $date = `date`;
|
|
chomp($date);
|
|
return $date
|
|
}
|
|
|
|
sub printArgs {
|
|
print
|
|
. "\nModified arguments:"
|
|
. "\nmanager: $lfmgr_host\n"
|
|
. "\nlf1: $lf1\n"
|
|
. "\nlf1_ports: " . join(" ", @lf1_ports)
|
|
. "\nnum_mvlans: $num_mvlans"
|
|
. "\nmax_rate: $max_rate"
|
|
. "\ncx_types: " . join(" ", @cx_types)
|
|
. "\n\n";
|
|
}
|
|
|
|
sub printHelp {
|
|
print
|
|
. "USAGE: --mgr=[ip-of-mgr]\n"
|
|
. " --testMgrName=\"ben_tm\"\n"
|
|
. " --resourceId=[1|n]\n"
|
|
. " --protocolFlags=[n]: tcp4:1, udp4:2, tcp6:4 udp6:8\n"
|
|
. " --portA=\"eth1\"\n"
|
|
. " --portB=\"eth2\"\n"
|
|
. " --vlanAmt=[3|n]\n"
|
|
. " --macVlanAmt=[3|n]\n"
|
|
. " --clearPortOnStart=[0|1]\n"
|
|
. " --cxPerMacVlanAmt=[5|n]\n"
|
|
. " --vlanID=[RANDOM|n]\n"
|
|
. " --ip=\"DHCP|RANDOM|192.168.7.2\"\n"
|
|
. " --mask=\"255.255.0.0\"\n"
|
|
. " --subnetPerMacVlan=[0|1]\n"
|
|
. " --dbName=\"my_db_name\"\n"
|
|
. " --desiredTotalTxRate=[n] (in bits-per-second)\n"
|
|
. " --pduSize=[AUTO|n] (in bytes, payload size)\n"
|
|
. " --duration=[n] (duration of script run, in miliseconds)\n"
|
|
. " --multicon=[AUTO|0|1|n] (Enable multi-conn feature, or not)\n"
|
|
. "\n";
|
|
|
|
}
|
|
|
|
sub getPduSize {
|
|
my $etype = shift;
|
|
my $rate = shift;
|
|
|
|
if ($max_pkt_sz ne "AUTO") {
|
|
return $max_pkt_sz;
|
|
}
|
|
|
|
my $rv;
|
|
if ($rate > 1000000000) {
|
|
# Use big pkts for > 1Gbps
|
|
if ($etype =~ /.*udp.*/i) {
|
|
return 64000;
|
|
}
|
|
else {
|
|
return 200000;
|
|
}
|
|
}
|
|
else {
|
|
# Attempt to fit into 1500 byte MTU pkt
|
|
if ($etype eq "lf_udp") {
|
|
return 1472;
|
|
}
|
|
elsif ($etype eq "lf_tcp") {
|
|
return 1460;
|
|
}
|
|
elsif ($etype eq "lf_udp6") {
|
|
return 1452;
|
|
}
|
|
elsif ($etype eq "lf_tcp6") {
|
|
return 1440;
|
|
}
|
|
else {
|
|
print "Unknown cx type: $etype in PDU auto-cal method, returning 4000\n";
|
|
return 4000;
|
|
}
|
|
}
|
|
}
|
|
|
|
sub handleCmdLineArg {
|
|
my $arg = $_[0];
|
|
my $val = $_[1];
|
|
|
|
if ($arg eq "help" || $arg eq "--help" || $arg eq "-h" || $arg eq "-help" || $arg eq "-h" ) {
|
|
printHelp();
|
|
exit(0);
|
|
}
|
|
elsif ($arg eq "--mgr") {
|
|
$lfmgr_host = $val;
|
|
}
|
|
elsif ($arg eq "--testMgrName") {
|
|
$test_mgr = $val;
|
|
}
|
|
elsif ($arg eq "--resourceId") {
|
|
$lf1 = $val;
|
|
}
|
|
elsif ($arg eq "--protocolFlags") {
|
|
my $vi = int($val);
|
|
if ($vi & 0x1) {
|
|
@cx_types = (@cx_types, "lf_tcp");
|
|
}
|
|
if ($vi & 0x2) {
|
|
@cx_types = (@cx_types, "lf_udp");
|
|
}
|
|
if ($vi & 0x4) {
|
|
@cx_types = (@cx_types, "lf_tcp6");
|
|
}
|
|
if ($vi & 0x8) {
|
|
@cx_types = (@cx_types, "lf_udp6");
|
|
}
|
|
}
|
|
elsif ($arg eq "--portA") {
|
|
@lf1_ports = (@lf1_ports, $val);
|
|
}
|
|
elsif ($arg eq "--portB") {
|
|
@lf1_ports = (@lf1_ports, $val);
|
|
}
|
|
elsif ($arg eq "--vlanAmt") {
|
|
$num_vlans = $val;
|
|
}
|
|
elsif ($arg eq "--macVlanAmt") {
|
|
$num_mvlans = $val;
|
|
}
|
|
elsif ($arg eq "--vlanID") {
|
|
$vid = $val;
|
|
}
|
|
elsif ($arg eq "--vlanMAC") {
|
|
$vlan_mac = $val;
|
|
}
|
|
elsif ($arg eq "--macVlanMAC") {
|
|
$mvlan_mac = $val;
|
|
}
|
|
elsif ($arg eq "--ip") {
|
|
$ipaddr = $val;
|
|
}
|
|
elsif ($arg eq "--mask") {
|
|
$mask = $val;
|
|
}
|
|
elsif ($arg eq "--subnetPerMacVlan") {
|
|
$subnet_per_vl = $val;
|
|
}
|
|
elsif ($arg eq "--dbName") {
|
|
$dbname = $val;
|
|
}
|
|
elsif ($arg eq "--cxPerMacVlanAmt") {
|
|
$num_cxs = $val;
|
|
}
|
|
elsif ($arg eq "--clearPortOnStart") {
|
|
$clear_port_on_start = int($val);
|
|
}
|
|
elsif ($arg eq "--desiredTotalTxRate") {
|
|
$max_rate = $val;
|
|
}
|
|
elsif ($arg eq "--pduSize") {
|
|
$max_pkt_sz = $val;
|
|
}
|
|
elsif ($arg eq "--duration") {
|
|
$duration = int($val);
|
|
}
|
|
elsif ($arg eq "--multicon") {
|
|
$multicon = $val;
|
|
}
|
|
else {
|
|
print "\n\nCould not parse one or more of the arguments !!!\n"
|
|
. "First rejected argument: $arg\n";
|
|
printHelp();
|
|
exit(1);
|
|
}
|
|
}
|