diff --git a/tests/simulator-udp.pl b/tests/simulator-udp.pl index 1ffebfc7a..fc99aeb38 100755 --- a/tests/simulator-udp.pl +++ b/tests/simulator-udp.pl @@ -5,6 +5,15 @@ use warnings; use Socket; use UUID; use BSD::Resource; +use Getopt::Long; + +my ($NUM, $IP) = (1000, '127.0.0.1'), +my ($NODEL); +GetOptions( + 'no-delete' => \$NODEL, + 'num-calls=i' => \$NUM, + 'local-ip=s' => \$IP, +) or die; $SIG{ALRM} = sub { print "alarm!\n"; }; setrlimit(RLIMIT_NOFILE, 8000, 8000); @@ -41,8 +50,28 @@ connect($fd, sockaddr_in(12222, inet_aton("127.0.0.1"))) or die $!; msg('V') eq '20040107' or die; my @calls; -for my $iter (1 .. 1000) { - ($iter % 10 == 0) and print("$iter\n"); + +sub do_rtp { + print("sending rtp\n"); + for my $c (@calls) { + $c or next; + my ($fds,$outputs) = @$c[0,4]; + for my $i ([0,1],[1,0]) { + my ($a, $b) = @$i; + send($$fds[$a], 'rtp', 0, sockaddr_in($$outputs[$b][0], inet_aton($$outputs[$b][1]))) or die $!; + my $x; + my $err = ''; + alarm(1); + recv($$fds[$b], $x, 0xffff, 0) or $err = "$!"; + alarm(0); + $err && $err !~ /interrupt/i and die $err; + $x eq 'rtp' or warn "no rtp reply received, ports $$outputs[$b][0] and $$outputs[$a][0]", undef($c); + } + } +} + +for my $iter (1 .. $NUM) { + ($iter % 10 == 0) and print("$iter\n"), do_rtp(); my $callid = rand_str(50); @@ -50,39 +79,35 @@ for my $iter (1 .. 1000) { my (@fds,@ports,@ips,@tags,@outputs); for my $i (0,1) { socket($fds[$i], AF_INET, SOCK_DGRAM, 0) or die $!; - bind($fds[$i], sockaddr_in(0, INADDR_ANY)) or die $!; + while (1) { + my $port = rand(0x7000) << 1 + 1024; + bind($fds[$i], sockaddr_in($port, inet_aton($IP))) and last; + } my $addr = getsockname($fds[$i]); ($ports[$i]) = sockaddr_in($addr); - $ips[$i] = '127.0.0.1'; + $ips[$i] = $IP; $tags[$i] = rand_str(15); my $tagstr = ($i == 1 ? "$tags[0];1 " : '') . "$tags[$i];1"; my $o = msg("$prefixes[$i] $callid $ips[$i] $ports[$i] $tagstr"); $o =~ /^(\d+) ([\d.]+) 4[\r\n]*$/s or die $o; + $1 == 0 and die "mediaproxy ran out of ports"; $outputs[$i] = [$1,$2]; } push(@calls, [\(@fds,@ports,@ips,@tags,@outputs), $callid]); - - for my $c (@calls) { - my ($fds,$outputs) = @$c[0,4]; - for my $i ([0,1],[1,0]) { - my ($a, $b) = @$i; - send($$fds[$a], 'rtp', 0, sockaddr_in($$outputs[$b][0], inet_aton($$outputs[$b][1]))) or die $!; - my $x; - my $err = ''; - alarm(1); - recv($$fds[$b], $x, 0xffff, 0) or $err = "$!"; - alarm(0); - $err && $err !~ /interrupt/i and die $err; - $x eq 'rtp' or warn $x; - } - } } -sleep(30); +for (1 .. 30) { + sleep(1); + do_rtp(); +} -@calls = sort {rand() < .5} @calls; -for my $c (@calls) { - my ($tags, $callid) = @$c[3,5]; - msg("D $callid $$tags[0] $$tags[1]"); +if (!$NODEL) { + print("deleting\n"); + @calls = sort {rand() < .5} @calls; + for my $c (@calls) { + my ($tags, $callid) = @$c[3,5]; + msg("D $callid $$tags[0] $$tags[1]"); + } } +print("done\n");