Files
wlan-lanforge-scripts/test_refcnt.pl
2017-10-06 13:55:23 -07:00

124 lines
3.0 KiB
Perl
Executable File

#!/usr/bin/perl
# Un-buffer output
$| = 1;
use strict;
my $sleep_time = 30;
my $vlans = 100;
my $ip_base = "192.168.10";
my $gw = "192.168.10.1";
my $lsb_start = 10;
my $eth_dev = "eth0";
my $vid_base = 1000;
my $i;
my $vid;
my @pids = ();
my $peer = 0;
if ($ARGV[0] eq "p") {
# when running on peer machine...
print "Running in peer mode..\n";
$peer = 1;
$lsb_start += $vlans;
$gw = "192.168.10.250";
}
#`rmmod 8021q`;
#`modprobe 8021q`;
my $loop = 0;
while (1) {
print "Creating and configuring vlans..loop: $loop\n";
for ($i = 0; $i<$vlans; $i++) {
$vid = $vid_base + $i;
my $v = "$eth_dev.$vid";
my $lsb = $lsb_start + $i;
#print "Creating & configuring VLAN: $eth_dev.$vid\n";
`vconfig add $eth_dev $vid`;
#my $cmd = "ifconfig $v $ip_base.$lsb netmask 255.255.255.0 up";
#print "Configuring with command -:$cmd:-\n";
#`$cmd`;
my $tbl = $i + 1;
printAndExec("ip link set $v down");
printAndExec("ip link set $v up");
printAndExec("ip addr flush dev $v > /dev/null 2>&1");
printAndExec("ip address add $ip_base.$lsb/24 broadcast $ip_base.255 dev $v");
printAndExec("ip link set dev $v up");
printAndExec("ip ru add from $ip_base.$lsb/32 table $tbl");
printAndExec("ip route add $ip_base.0/24 via $ip_base.$lsb table $tbl");
printAndExec("ip route add 0/0 via $gw dev $v table $tbl");
printAndExec("echo 1 > /proc/sys/net/ipv4/conf/$v/arp_filter");
# Start traffic on interface
my $kidpid;
if (!defined($kidpid = fork())) {
# fork returned undef, so failed
die "Cannot fork: $!";
} elsif ($kidpid == 0) {
# fork returned 0, so this branch is child
while (1) {
my $url;
if ($peer) {
my $mip = $lsb - $vlans;
$url = "http://$ip_base.$mip/index.html";
}
else {
my $mip = $lsb + $vlans;
$url = "http://$ip_base.$mip/index.html";
#print "url: $url\n";
}
my $curl_cmd = "curl --interface $eth_dev.$vid --url $url -o $eth_dev.$vid.index.html > /dev/null 2>&1";
#print "Child process running: $curl_cmd\n";
system("$curl_cmd");
sleep(5);
}
} else {
# fork returned 0 nor undef
# so this branch is parent
@pids = (@pids, $kidpid);
# waitpid($kidpid, 0);
}
}
my $slp = (rand() * 1000000) % $sleep_time;
if ($slp < 3) {
$slp = 3;
}
print " Done creating vlans and starting curl processes, sleeping $slp seconds.\n";
# Sleep a while to wait for curl to do it's thing
sleep($slp);
print " Removing all VLANs.\n";
for ($i = 0; $i<$vlans; $i++) {
$vid = $vid_base + $i;
#print "Removing vlan: $eth_dev.$vid\n";
`vconfig rem $eth_dev.$vid`;
}#for
print " Killing all curl instances.\n";
for ($i = 0; $i<@pids; $i++) {
`kill -9 $pids[$i]`;
}
print " Done with loop: $loop\n";
$loop++;
}# while
sub printAndExec {
my $cmd = $_[0];
#print "$cmd\n";
# NOTE: If you use the single back-ticks here, it will hang, probably some
# signal problem...never figured out why really (ERESTARTSYS) was the error
# that perl hung on... --Ben
system("$cmd");
}