#!/usr/bin/perl # This program is used to verify LANforge configuration sub-systems. # It uses the LANforge::Endpoint perl module to parse output from # the CLI. # This script sets up connections of types: # lf, lf_udp, lf_tcp, custom_ether, custom_udp, and custom_tcp # across 3 ports on 2 machines. # It then changes values and checks to see if the values set correctly. # 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 $lfmgr_host = "localhost"; my $lfmgr_port = 4001; my $shelf_num = 1; # This sets up connections between 2 LANforge machines my $lf1 = 1; my $lf2 = 2; # Port pairs. These are the ports that should be talking to each other. # Ie, the third column in lf1_ports talks to the third column in lf2_ports. my @lf1_ports = ("wlan0"); my @lf2_ports = ("vap0000"); my $ports_are_connected = 0; # Connected to each other. If true, we can test some # ethernet driver settings more precisely. my $manual_check = 0; # If this is true, then user input will be asked for each time # there is a test failure. Good for manually checking the script, etc. my $ip_base = "172.1"; # Set up one CX of each of these types on each port pair. my @cx_types = ("lf", "lf_udp", "lf_tcp", "custom_udp", "custom_tcp"); my @min_pkt_szs = (64, 20, 20, 1, 1); my @max_pkt_szs = (1514, 65507, 65535, 2048, 2048); my $min_rate = 0; my $max_rate = 1024000; my $test_mgr = "ben_tm"; my $report_timer = 3000; # 3 seconds ######################################################################## # Nothing to configure below here, most likely. ######################################################################## my $usage = "$0 [--host {lanforge-mgr-host}] Example: $0 --host localhost\n"; my $i = 0; GetOptions ( 'host|h=s' => \$lfmgr_host, ) || die("$usage"); my @endpoint_names = (); #will be added to as they are created my @cx_names = (); my $fail_msg = ""; # Configure our utils. our $utils = new LANforge::Utils(); $::utils->connect($lfmgr_host, $lfmgr_port); $utils->cli_send_silent(0); # Do show input to CLI $utils->cli_rcv_silent(0); # Repress output from CLI ?? my $dt = ""; # Do discovery to make sure the server knows about all servers. Good for when # you just restarted all the servers and want to run the test real fast now! $utils->doCmd("discover"); sleep(2); $utils->doCmd("discover"); sleep(2); initToDefaults(); print "Sleeping 3 seconds to let port initialization complete.\n"; sleep(3); # Let everything settle down a bit... # Now, add back the test manager we will be using $utils->doCmd("add_tm $test_mgr"); $utils->doCmd("tm_register $test_mgr default"); #Add default user $utils->doCmd("tm_register $test_mgr default_gui"); #Add default GUI user # $utils->doCmd("log_level 63"); # Change all kinds of things on the ports, they should end up configured # and ready for endpoints to be added. testPortModification(); testCxModification(); $dt = `date`; chomp($dt); print "\n\n\nCompleted at: $dt\n\n"; if (length($fail_msg) > 0) { print "Some sub-tests failed:\n$fail_msg\n"; } else { print "All tests passed successfully.\n"; } exit(0); sub initToDefaults { # Clean up database if stuff exists $utils->doCmd("rm_cx $test_mgr all"); $utils->doCmd("rm_endp YES_ALL"); $utils->doCmd("rm_test_mgr $test_mgr"); initPortsToDefault(); }#initToDefaults sub initPortsToDefault { # 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]; my $tmp2 = $lf2_ports[$i]; $utils->doCmd("set_port $shelf_num $lf1 $tmp 0.0.0.0 0.0.0.0 0.0.0.0 NA NA NA"); $utils->doCmd("set_port $shelf_num $lf2 $tmp2 0.0.0.0 0.0.0.0 0.0.0.0 NA NA NA"); } } sub testFailed { my $msg = shift; my $should_fail = shift; if (defined($should_fail) && ($should_fail eq "YES")) { print "\nGOOD: SUB-TEST FAILED correctly: $msg\n"; $fail_msg .= "GOOD (should fail): $msg"; } else { print "\nSUB-TEST FAILED: $msg\n"; $fail_msg .= $msg; if ($manual_check) { #$utils->doCmd("log_level 7"); print "Press enter to continue with test: "; ; } } }#testFailed sub testPortModification { # 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]; my $tmp2 = $lf2_ports[$i]; my $tmp_ip = $i + 2; my $tmp_ip2 = $i + 102; my $cmd = "set_port $shelf_num $lf1 $tmp $ip_base.1.$tmp_ip 255.255.255.0 $ip_base.1.1 NA NA NA"; $utils->doCmd($cmd); sleep(1); my $p1 = new LANforge::Port(); # Tell the port what it is so it decodes the right one.. $utils->updatePort($p1, $shelf_num, $lf1, $tmp); verifyPortAttributes($p1, $shelf_num, $lf1, $tmp, "$ip_base.1.$tmp_ip", "255.255.255.0", "$ip_base.1.1"); testMacSettability($p1); testMtuSettability($p1); testQlenSettability($p1); $cmd = "set_port $shelf_num $lf2 $tmp2 $ip_base.1.$tmp_ip2 255.255.255.0 $ip_base.1.1 NA NA NA"; $utils->doCmd($cmd); my $p2 = new LANforge::Port(); # Tell the port what it is so it decodes the right one.. $utils->updatePort($p2, $shelf_num, $lf2, $tmp2); verifyPortAttributes($p2, $shelf_num, $lf2, $tmp2, "$ip_base.1.$tmp_ip2", "255.255.255.0", "$ip_base.1.1"); testMacSettability($p2); testMtuSettability($p2); testQlenSettability($p2); testRateSettability($p1, $p2); } }#testPortModification sub testCxModification { my $ep = 0; my $cx = 0; my $i = 0; for ($i = 0; $i<@cx_types; $i++) { my $j = 0; for ($j = 0; $j<@lf1_ports; $j++) { my $burst = "NO"; if ($min_rate != $max_rate) { $burst = "YES"; } my $szrnd = "NO"; if ($min_pkt_szs[$i] != $max_pkt_szs[$i]) { $szrnd = "YES"; } my $pattern = "INCREASING"; if ($cx_types[$i] =~ /custom/) { $pattern = "CUSTOM"; } my $ep1 = "endp-${ep}-TX"; $ep++; my $ep2 = "endp-${ep}-RX"; $ep++; @endpoint_names = (@endpoint_names, $ep1, $ep2); my $cmd = "add_endp $ep1 $shelf_num $lf1 " . $lf1_ports[$j] . " " . $cx_types[$i] . " -1 $burst $min_rate $max_rate $szrnd " . $min_pkt_szs[$i] . " " . $max_pkt_szs[$i] . " $pattern NO"; $utils->doCmd($cmd); my $endp1 = new LANforge::Endpoint(); $utils->updateEndpoint($endp1, $ep1); verifyEndpointAttributes($endp1, $ep1, $shelf_num, $lf1, $lf1_ports[$j], $cx_types[$i], -1, $burst, $min_rate, $max_rate, $szrnd, $min_pkt_szs[$i], $max_pkt_szs[$i], $pattern, "NO"); # last is use_checksum testEndpointSettability($endp1); $cmd = "add_endp $ep2 $shelf_num $lf2 " . $lf2_ports[$j] . " " . @cx_types[$i] . " -1 $burst $min_rate $max_rate $szrnd " . $min_pkt_szs[$i] . " " . $max_pkt_szs[$i] . " $pattern NO"; $utils->doCmd($cmd); my $endp2 = new LANforge::Endpoint(); $utils->updateEndpoint($endp2, $ep2); verifyEndpointAttributes($endp2, $ep2, $shelf_num, $lf2, $lf2_ports[$j], $cx_types[$i], -1, $burst, $min_rate, $max_rate, $szrnd, $min_pkt_szs[$i], $max_pkt_szs[$i], $pattern, "NO"); # last is use_checksum testEndpointSettability($endp2); # Now, add the cross-connects my $cx_name = "cx-${cx}"; $cmd = "add_cx $cx_name $test_mgr $ep1 $ep2"; $utils->doCmd($cmd); $utils->doCmd("set_cx_report_timer $test_mgr $cx_name $report_timer"); $cx++; @cx_names = (@cx_names, $cx_name); }#for all ports }#for all endpoint types }#addCrossConnects sub testQlenSettability { my $p1 = shift; testQlenSettabilityHelper($p1, "100"); testQlenSettabilityHelper($p1, "800"); testQlenSettabilityHelper($p1, "400"); }#testQlenSettability sub testMtuSettability { my $p1 = shift; testMtuSettabilityHelper($p1, "1500"); testMtuSettabilityHelper($p1, "1400"); testMtuSettabilityHelper($p1, "1496"); # It is not un-usual for these to fail testMtuSettabilityHelper($p1, "1504"); testMtuSettabilityHelper($p1, "4096"); testMtuSettabilityHelper($p1, "8192"); # This should work, set it back to defaults. testMtuSettabilityHelper($p1, "1500"); }#testMtuSettability sub testMtuSettabilityHelper { my $p1 = shift; my $mtu = shift; $p1->mtu($mtu); my $cmd = $p1->getSetMtuCmd(); $utils->doCmd($cmd); $utils->updatePort($p1); my $p = $p1->toStringBrief(); if ($p1->mtu() ne $mtu) { # Give one more chance for things to be right, maybe the driver is slow... print (" *** WARNING: $p: Failed to set MTU correctly, tried: $mtu got: " . $p1->mtu() . "\n Going to wait 2 seconds and update the port again..\n"); sleep(2); $utils->updatePort($p1); } ($p1->mtu() eq $mtu) or testFailed("$p: Failed to set MTU correctly, tried: $mtu got: " . $p1->mtu() . "\n"); }#testMtuSettability sub testQlenSettabilityHelper { my $p1 = shift; my $val = shift; $p1->tx_q_len($val); my $cmd = $p1->getSetTxQueueLenCmd(); $utils->doCmd($cmd); $utils->updatePort($p1); my $p = $p1->toStringBrief(); if ($p1->tx_q_len() ne $val) { # Give one more chance for things to be right, maybe the driver is slow... print (" *** WARNING: $p: Failed to set Tx-Queue-Length correctly, tried: $val got: " . $p1->tx_q_len() . "\n Going to wait 2 seconds and update the port again..\n"); sleep(2); $utils->updatePort($p1); } $p1->tx_q_len() eq $val or testFailed("$p: Failed to set Tx-Queue-Length correctly, tried: $val got: " . $p1->tx_q_len() . "\n"); } sub testRateSettability { my $p1 = shift; my $p2 = shift; testSolitaryPortSettability($p1); testSolitaryPortSettability($p2); if ($ports_are_connected) { # TODO: Test partner flags } }#testRateSettability sub testSolitaryPortSettability { my $p1 = shift; my $gbfd = ""; my $gbhd = ""; my $fc = ""; if ($p1->supported_flags() =~ /1000bt/) { $gbfd = " 1000bt-FD"; $gbhd = " 1000bt-HD"; } if ($p1->supported_flags() =~ /FLOW-CONTROL/) { $fc = " FLOW-CONTROL"; } advertTestHelper($p1, "10bt-HD 10bt-FD 100bt-HD 100bt-FD" . $gbhd . $gbfd . $fc); advertTestHelper($p1, "10bt-HD 10bt-FD 100bt-HD 100bt-FD" . $fc); advertTestHelper($p1, "10bt-HD 10bt-FD 100bt-HD 100bt-FD"); advertTestHelper($p1, "10bt-HD 10bt-FD 100bt-HD"); advertTestHelper($p1, "10bt-HD 10bt-FD"); advertTestHelper($p1, "10bt-HD"); advertTestHelper($p1, "100bt-FD"); advertTestHelper($p1, "100bt-HD"); advertTestHelper($p1, "10bt-FD"); advertTestHelper($p1, "10bt-HD"); advertTestHelper($p1, "10bt-HD 10bt-FD 100bt-HD 100bt-FD" . $gbhd . $gbfd . $fc); if ($gbfd ne "") { fixedTestHelper($p1, "1000bt-FD"); fixedTestHelper($p1, "1000bt-HD"); } fixedTestHelper($p1, "100bt-FD"); fixedTestHelper($p1, "100bt-HD"); fixedTestHelper($p1, "10bt-FD"); fixedTestHelper($p1, "10bt-HD"); advertTestHelper($p1, "10bt-HD 10bt-FD 100bt-HD 100bt-FD" . $gbhd . $gbfd . $fc); }#testSolitaryPortSettability sub fixedTestHelper { my $p1 = shift; my $adv = shift; $p1->setRate($adv); my $cmd = $p1->getSetRateCmd(); $utils->doCmd($cmd); sleep(2); # Give the hardware a chance to do what it needs. $utils->updatePort($p1); if (!$p1->isCurrent($adv)) { # Give one more chance for things to be right, maybe the driver is slow... print (" *** WARNING: $p: Failed to set fixed rate correctly, tried: $adv got: " . $p1->cur_flags() . "\n Going to wait 2 seconds and update the port again..\n"); sleep(2); $utils->updatePort($p1); } my $p = $p1->toStringBrief(); $p1->isCurrent($adv) or testFailed("$p: Failed to set fixed rate correctly, tried: $adv got: " . $p1->cur_flags() . "\n"); }#fixedTestHelper sub advertTestHelper { my $p1 = shift; my $adv = shift; $p1->setRate("auto"); $p1->advert_flags("$adv"); my $cmd = $p1->getSetRateCmd(); $utils->doCmd($cmd); $utils->updatePort($p1); my $p = $p1->toStringBrief(); $p1->isAdvertising($adv) or testFailed("$p: Failed to set advertise rates correctly, tried: $adv got: " . $p1->advert_flags() . "\n"); }#advertTestHelper sub testMacSettability { my $port = shift; # Get & save the original MAC my $mac = $port->mac_addr(); my $sn = $port->shelf_id(); my $cn = $port->card_id(); my $pn = $port->port_id(); my $new_mac = "00:11:22:$sn$sn:$cn$cn:$pn$pn"; $port->mac_addr($new_mac); $cmd = $port->getSetCmd(); $utils->doCmd($cmd); $utils->updatePort($port); my $p = $port->toStringBrief(); $port->mac_addr() eq $new_mac or testFailed("$p: Could not set MAC addr, current: " . $port->mac_addr() . " desired: $new_mac\n"); # Set it back to original value $port->mac_addr($mac); $cmd = $port->getSetCmd(); $utils->doCmd($cmd); $utils->updatePort($port); $p = $port->toStringBrief(); $port->mac_addr() eq $mac or testFailed("$p: Could not set MAC addr, current: " . $port->mac_addr() . " desired: $mac\n"); print "Setting MAC for Port $sn.$cn.$pn verified as correct!\n"; }#testMacSettability sub verifyPortAttributes { my $port = shift; my $sn = shift; my $cn = shift; my $pn = shift; my $ip = shift; my $msk = shift; my $gw = shift; my $_sn = $port->shelf_id(); my $_cn = $port->card_id(); my $_pn = $port->port_id(); my $_ipa = $port->ip_addr(); my $p = $port->toStringBrief(); $_sn eq $sn or testFailed("$p: Shelf id: $_sn does not match: $sn\n"); $_cn eq $cn or testFailed("$p: Card id: $_cn does not match: $cn\n"); $_pn eq $pn or testFailed("$p: Port id: $_pn does not match: $pn\n"); $_ipa eq $ip or testFailed("$p: IP Address: $_ipa does not match: $ip\n"); $port->ip_mask() eq $msk or testFailed("$p: IP Mask: " . $port->ip_mask() . " does not match: $msk\n"); $port->ip_gw() eq $gw or testFailed("$p: IP Gateway: " . $port->ip_gw() . " does not match: $gw\n"); print "$p verified as correct!\n"; }#verifyPortAttributes sub verifyEndpointAttributes { my $endp = shift; my $name = shift; my $sn = shift; my $cn = shift; my $pn = shift; my $type = shift; my $ip_port = shift; my $bursty = shift; my $min_rate = shift; my $max_rate = shift; my $szrnd = shift; my $min_pkt_sz = shift; my $max_pkt_sz = shift; my $pattern = shift; my $using_csum = shift; my $tos = shift; my $should_fail = shift; my $_sn = $endp->shelf_id(); my $_cn = $endp->card_id(); my $_pn = $endp->port_id(); my $p = $endp->toStringBrief(); $_sn eq $sn or testFailed("$p: Shelf id: $_sn does not match: $sn\n", $should_fail); $_cn eq $cn or testFailed("$p: Card id: $_cn does not match: $cn\n", $should_fail); $_pn eq $pn or testFailed("$p: Port id: $_pn does not match: $pn\n", $should_fail); $endp->isOfType($type) or testFailed("$p: Type: " . $endp->ep_type() . " does not match: $type\n", $should_fail); if ($ip_port ne -1) { $endp->ip_port() eq $ip_port or testFailed("$p: IP-Port: " . $endp->ip_port() . " does not match: $ip_port\n", $should_fail); } $endp->getBursty() eq $bursty or testFailed("$p: Bursty: " . $endp->getBursty() . " does not match: $bursty\n", $should_fail); $endp->min_tx_rate() eq $min_rate or testFailed("$p: Min-Tx-Rate: " . $endp->min_tx_rate() . " does not match: $min_rate\n", $should_fail); $endp->max_tx_rate() eq $max_rate or testFailed("$p: Max-Tx-Rate: " . $endp->max_tx_rate() . " does not match: $max_rate\n", $should_fail); if ($endp->isCustom()) { ($endp->size_random() eq "NO") or testFailed("$p: Size-Random: " . $endp->size_random() . " but we are CUSTOM!!\n", $should_fail); } else { $endp->size_random() eq $szrnd or testFailed("$p: Size-Random: " . $endp->size_random() . " does not match: $szrnd\n", $should_fail); } if (! $endp->isCustom()) { $endp->min_pkt_size() eq $min_pkt_sz or testFailed("$p: Min-Packet-Size: " . $endp->min_pkt_size() . " does not match: $min_pkt_sz\n", $should_fail); $endp->max_pkt_size() eq $max_pkt_sz or testFailed("$p: Max-Packet-Size: " . $endp->max_pkt_size() . " does not match: $max_pkt_sz\n", $should_fail); } $endp->pattern() eq $pattern or testFailed("$p: Pattern: " . $endp->pattern() . " does not match: $pattern\n", $should_fail); $endp->checksum() eq $using_csum or testFailed("$p: Using-Checksum: " . $endp->checksum() . " does not match: $using_csum\n", $should_fail); if (defined($tos)) { $endp->ip_tos() eq $tos or testFailed("$p: ToS: " . $endp->ip_tos() . " does not match: $tos\n", $should_fail); } }#verifyEndpointAttributes sub testEndpointSettability { my $endp = shift; print "\n*****\n >>Testing " . $endp->toStringBrief() . " rate settability.\n"; # Test setting the rates testEndpRateSet($endp, 0, 0, "NO"); testEndpRateSet($endp, 2000, 2000, "NO"); testEndpRateSet($endp, 0, 10000000, "YES"); testEndpRateSet($endp, 65000, 128000, "YES"); testEndpRateSet($endp, 512000, 1024000, "YES"); testEndpRateSet($endp, 1024000, 512000, "NO", "YES"); # Should fail testEndpRateSet($endp, 512000, 1024000, "YES"); if ($endp->usesIP()) { testEndpTosSet($endp, 0x01, "YES"); testEndpTosSet($endp, 0x02, "NO"); testEndpTosSet($endp, 0x04, "YES"); testEndpTosSet($endp, 0x06, "NO"); testEndpTosSet($endp, 0x0a, "NO"); testEndpTosSet($endp, 0x12, "NO"); testEndpTosSet($endp, 0x02, "NO"); testEndpTosSet($endp, "DONT-SET", "NO"); } # Test payload & payload size changes if ($endp->isCustom()) { testEndpPldSet($endp); } else { testEndpPldSizeSet($endp, 67, 1457, "YES"); testEndpPldSizeSet($endp, 500, 457, "YES", "YES"); # should fail testEndpPldSizeSet($endp, 500, 500, "NO"); testEndpPldSizeSet($endp, -1, 70000000, "YES", "YES"); #should fail testEndpPldSizeSet($endp, 128, 1500, "YES"); } # TODO: Change & check stuff }#testEndpointSettability sub testEndpPldSet { my $endp = shift; my $pld = "00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff"; testEndpPldSetHelper($endp, $pld); $pld = genRandomHex(2048); if ($endp->ep_type() =~ /CUSTOM_ETHER/) { testEndpPldSetHelper($endp, $pld, "YES"); # Should fail } else { testEndpPldSetHelper($endp, $pld, "NO"); #Shouldn't fail } $pld = genRandomHex(17); if ($endp->ep_type() =~ /CUSTOM_ETHER/) { # Too short for ethernet, should fail. testEndpPldSetHelper($endp, $pld, "YES"); } else { testEndpPldSetHelper($endp, $pld, "NO"); } $pld = genRandomHex(1000); testEndpPldSetHelper($endp, $pld); $pld = genRandomHex(2049); testEndpPldSetHelper($endp, $pld, "YES"); # Payload is too long, only support 2000 bytes at this time. $pld = "00 11 22 gg 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff"; testEndpPldSetHelper($endp, $pld, "YES"); # Should fail, has 'gg' in it, which is not hex! $pld = "zz 11 22 gg 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff"; testEndpPldSetHelper($endp, $pld, "YES"); # Should fail, has 'zz' in it, which is not hex! $pld = "00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee zz"; testEndpPldSetHelper($endp, $pld, "YES"); # Should fail, has 'zz' in it, which is not hex! $pld = genRandomHex(1000); testEndpPldSetHelper($endp, $pld); }#testEndpPldSet sub testEndpPldSetHelper { my $endp = shift; my $pld = shift; my $should_fail = shift; $endp->payload($pld); my $cmd = $endp->getSetPayloadCmd(); $utils->doCmd($cmd); $utils->updateEndpoint($endp); my $p = $endp->toStringBrief(); if ($endp->payload() ne $pld) { if (defined($should_fail) && ($should_fail eq "YES")) { # This is very verbose if the payload is printed out, so not going to print it all here, # but just the lengths instead. This is also expected behaviour (notice the should_fail == YES). testFailed("$p: Payload does not match, lengths: " . length($endp->payload()) . " " . length($pld) . "\n", $should_fail); } else { testFailed("$p: Payload:\n-:" . $endp->payload() . ":- does not match:\n-:$pld:-\n", $should_fail); } } else { if (defined($should_fail) && ($should_fail eq "YES")) { testFailed("$p: Payload:\n-:" . $endp->payload() . ":- does match (and should have failed)\n"); } } }#testEndpPldSetHelper sub testEndpPldSizeSet { my $endp = shift; my $min = shift; my $max = shift; my $rand = shift; my $should_fail = shift; my $en = $endp->name(); my $sn = $endp->shelf_id(); my $cn = $endp->card_id(); my $pn = $endp->port_id(); my $et = $endp->ep_type(); my $ipp = $endp->ip_port(); my $minrt = $endp->min_tx_rate(); my $mxrt = $endp->max_tx_rate(); my $pt = $endp->pattern(); my $cs = $endp->checksum(); my $burst = $endp->getBursty(); my $tos = $endp->ip_tos(); $endp->min_pkt_size($min); $endp->max_pkt_size($max); $endp->setRandom($rand); my @cmds = $endp->getSetCmds(); my $i; for ($i = 0; $i<@cmds; $i++) { $utils->doCmd($cmds[$i]); } $utils->updateEndpoint($endp); verifyEndpointAttributes($endp, $en, $sn, $cn, $pn, $et, $ipp, $burst, $minrt, $mxrt, $rand, $min, $max, $pt, $cs, $tos, $should_fail); }#testEndpPldSizeSet sub testEndpRateSet { my $endp = shift; my $min = shift; my $max = shift; my $burst = shift; my $should_fail = shift; my $en = $endp->name(); my $sn = $endp->shelf_id(); my $cn = $endp->card_id(); my $pn = $endp->port_id(); my $et = $endp->ep_type(); my $ipp = $endp->ip_port(); my $tos = $endp->ip_tos(); my $sr = $endp->size_random(); my $minpkt = $endp->min_pkt_size(); my $mxpkt = $endp->max_pkt_size(); my $pt = $endp->pattern(); my $cs = $endp->checksum(); $endp->min_tx_rate($min); $endp->max_tx_rate($max); $endp->setBursty($burst); my @cmds = $endp->getSetCmds(); my $i; for ($i = 0; $i<@cmds; $i++) { $utils->doCmd($cmds[$i]); } $utils->updateEndpoint($endp); verifyEndpointAttributes($endp, $en, $sn, $cn, $pn, $et, $ipp, $burst, $min, $max, $sr, $minpkt, $mxpkt, $pt, $cs, $tos, $should_fail); }#testEndpRateSet sub testEndpTosSet { my $endp = shift; my $tos = shift; my $should_fail = shift; my $en = $endp->name(); my $sn = $endp->shelf_id(); my $cn = $endp->card_id(); my $pn = $endp->port_id(); my $et = $endp->ep_type(); my $ipp = $endp->ip_port(); my $sr = $endp->size_random(); my $minpkt = $endp->min_pkt_size(); my $mxpkt = $endp->max_pkt_size(); my $pt = $endp->pattern(); my $cs = $endp->checksum(); $endp->ip_tos($tos); my @cmds = $endp->getSetCmds(); my $i; for ($i = 0; $i<@cmds; $i++) { $utils->doCmd($cmds[$i]); } $utils->updateEndpoint($endp); verifyEndpointAttributes($endp, $en, $sn, $cn, $pn, $et, $ipp, $burst, $min, $max, $sr, $minpkt, $mxpkt, $pt, $cs, $tos, $should_fail); }#testEndpTosSet sub genRandomHex { my $bytes = shift; my @tbl = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"); my $i; my $pld = ""; for ($i = 0; $i<$bytes; $i++) { $pld .= $tbl[(rand() * 1000.0) % 16] . $tbl[(rand() * 1000.0) % 16]; #Generate some hex the hard way! if ($i != ($bytes - 1)) { $pld .= " "; } } return $pld; }#genRandomHex