|
|
|
@ -13,7 +13,8 @@ use Crypt::Rijndael; |
|
|
|
use Digest::SHA qw(hmac_sha1); |
|
|
|
use MIME::Base64; |
|
|
|
|
|
|
|
my ($NUM, $RUNTIME, $STREAMS) = (1000, 30, 1); |
|
|
|
my ($NUM, $RUNTIME, $STREAMS, $PAYLOAD, $INTERVAL, $RTCP_INTERVAL, $STATS_INTERVAL) |
|
|
|
= (1000, 30, 1, 160, 20, 5, 5); |
|
|
|
my ($NODEL, $IP, $IPV6, $KEEPGOING, $REINVITES, $BRANCHES, $PROTOS, $DEST); |
|
|
|
GetOptions( |
|
|
|
'no-delete' => \$NODEL, |
|
|
|
@ -27,6 +28,10 @@ GetOptions( |
|
|
|
'max-streams=i' => \$STREAMS, |
|
|
|
'protocols=s' => \$PROTOS, # "RTP/AVP,RTP/SAVP" |
|
|
|
'destination=s' => \$DEST, |
|
|
|
'payload-size=i'=> \$PAYLOAD, |
|
|
|
'rtp-interval=i'=> \$INTERVAL, # in ms |
|
|
|
'rtcp-interval=i'=>\$RTCP_INTERVAL, # in seconds |
|
|
|
'stats-interval=i'=>\$STATS_INTERVAL, |
|
|
|
) or die; |
|
|
|
|
|
|
|
($IP || $IPV6) or die("at least one of --local-ip or --local-ipv6 must be given"); |
|
|
|
@ -306,7 +311,7 @@ sub rtp { |
|
|
|
my ($ctx) = @_; |
|
|
|
my $seq = $$ctx{rtp_seqnum} || (int(rand(0xfffff)) + 1); |
|
|
|
my $hdr = pack("CCnNN", 0x80, 0x00, $seq, rand(2**32), rand(2**32)); |
|
|
|
my $pack = $hdr . rand_str(100); |
|
|
|
my $pack = $hdr . rand_str($PAYLOAD); |
|
|
|
$$ctx{rtp_seqnum} = (++$seq & 0xffff); |
|
|
|
return $pack; |
|
|
|
} |
|
|
|
@ -350,8 +355,10 @@ sub hexdump { |
|
|
|
return $o; |
|
|
|
} |
|
|
|
|
|
|
|
my $RTP_COUNT = 0; |
|
|
|
|
|
|
|
sub do_rtp { |
|
|
|
print("sending rtp\n"); |
|
|
|
my ($rtcp) = @_; |
|
|
|
for my $c (@calls) { |
|
|
|
$c or next; |
|
|
|
my ($fds,$outputs,$protos,$cfds,$trans,$tctxs) |
|
|
|
@ -366,12 +373,14 @@ sub do_rtp { |
|
|
|
my ($payload, $expect) = $$trans[$a]{rtp_func}($$trans[$b], $tcx, $tcx_o); |
|
|
|
my $dst = $$pr{sockaddr}($$outputs[$b][$j][0], $addr); |
|
|
|
my $repl = send_receive($$fds[$a][$j], $$fds[$b][$j], $payload, $dst); |
|
|
|
$RTP_COUNT++; |
|
|
|
if ($repl eq '') { |
|
|
|
warn("no rtp reply received, ports $$outputs[$b][$j][0] and $$outputs[$a][$j][0]"); |
|
|
|
$KEEPGOING or undef($c); |
|
|
|
} |
|
|
|
$repl eq $expect or die hexdump($repl, $expect) . " $$trans[$a]{name} > $$trans[$b]{name}"; |
|
|
|
|
|
|
|
$rtcp or next; |
|
|
|
($payload, $expect) = $$trans[$a]{rtcp_func}($$trans[$b], $tcx, $tcx_o); |
|
|
|
$dst = $$pr{sockaddr}($$outputs[$b][$j][0] + 1, $addr); |
|
|
|
$repl = send_receive($$cfds[$a][$j], $$cfds[$b][$j], $payload, $dst); |
|
|
|
@ -447,6 +456,7 @@ sub callid { |
|
|
|
return [$i, $b]; |
|
|
|
} |
|
|
|
|
|
|
|
my $NUM_STREAMS = 0; |
|
|
|
sub update_lookup { |
|
|
|
my ($c, $i) = @_; |
|
|
|
my $j = $i ^ 1; |
|
|
|
@ -488,6 +498,7 @@ sub update_lookup { |
|
|
|
($fds_o && @$fds_o) and $num_streams = $#$fds_o; |
|
|
|
for my $j (0 .. $num_streams) { |
|
|
|
if (!$$fds_t[$j]) { |
|
|
|
$NUM_STREAMS++; |
|
|
|
while (1) { |
|
|
|
undef($$fds_t[$j]); |
|
|
|
undef($$cfds_t[$j]); |
|
|
|
@ -555,7 +566,7 @@ a=rtcp:$cp |
|
|
|
} |
|
|
|
|
|
|
|
for my $iter (1 .. $NUM) { |
|
|
|
($iter % 10 == 0) and print("$iter\n"), do_rtp(); |
|
|
|
($iter % 10 == 0) and print("$iter calls established\n"), do_rtp(); |
|
|
|
|
|
|
|
my $c = {}; |
|
|
|
update_lookup($c, 0); |
|
|
|
@ -563,14 +574,39 @@ for my $iter (1 .. $NUM) { |
|
|
|
push(@calls, $c); |
|
|
|
} |
|
|
|
|
|
|
|
print("all calls established\n"); |
|
|
|
|
|
|
|
my $end = time() + $RUNTIME; |
|
|
|
my $rtptime = Time::HiRes::gettimeofday(); |
|
|
|
my $rtcptime = $rtptime; |
|
|
|
my $countstart = $rtptime; |
|
|
|
my $countstop = $countstart + $STATS_INTERVAL; |
|
|
|
while (time() < $end) { |
|
|
|
sleep(1); |
|
|
|
do_rtp(); |
|
|
|
my $now = Time::HiRes::gettimeofday(); |
|
|
|
$now <= $rtptime and Time::HiRes::sleep($rtptime - $now); |
|
|
|
$rtptime += $INTERVAL / 1000.0; |
|
|
|
|
|
|
|
my $rtcp = 0; |
|
|
|
if ($now >= $rtcptime) { |
|
|
|
$rtcp = 1; |
|
|
|
$rtcptime += $RTCP_INTERVAL; |
|
|
|
} |
|
|
|
|
|
|
|
if ($now >= $countstop) { |
|
|
|
my $span = $now - $countstart; |
|
|
|
printf("%d RTP packets sent in %.1f seconds = %.1f packets per stream per second\n", |
|
|
|
$RTP_COUNT, $span, |
|
|
|
$RTP_COUNT / $span / $NUM_STREAMS); |
|
|
|
$RTP_COUNT = 0; |
|
|
|
$countstart = $now; |
|
|
|
$countstop = $countstart + $STATS_INTERVAL; |
|
|
|
} |
|
|
|
|
|
|
|
do_rtp($rtcp); |
|
|
|
|
|
|
|
@calls = sort {rand() < .5} grep(defined, @calls); |
|
|
|
|
|
|
|
if ($REINVITES) { |
|
|
|
if ($REINVITES && int($now) % 5 == 0) { |
|
|
|
my $c = $calls[rand(@calls)]; |
|
|
|
print("simulating re-invite on $$c{callid_viabranch}[0]"); |
|
|
|
for my $i (0,1) { |
|
|
|
|