|
|
#!/usr/bin/perl
|
|
|
|
|
|
use warnings;
|
|
|
use strict;
|
|
|
use Socket;
|
|
|
|
|
|
$| = 1;
|
|
|
|
|
|
my $local_ip = '192.168.1.90';
|
|
|
|
|
|
sub brk {
|
|
|
sleep(1);
|
|
|
}
|
|
|
|
|
|
sub mp_msg {
|
|
|
my ($cmd) = @_;
|
|
|
|
|
|
my $fd;
|
|
|
socket($fd, AF_INET, SOCK_STREAM, 0) or die;
|
|
|
connect($fd, sockaddr_in(25060, inet_aton('127.0.0.1'))) or die;
|
|
|
my $old = select($fd);
|
|
|
$| = 1;
|
|
|
print("$cmd\n");
|
|
|
my $ret = <$fd>;
|
|
|
select($old);
|
|
|
close($fd);
|
|
|
chomp($ret);
|
|
|
return $ret;
|
|
|
}
|
|
|
|
|
|
sub udp_sock {
|
|
|
while (1) {
|
|
|
my $fd;
|
|
|
socket($fd, AF_INET, SOCK_DGRAM, 0) or die;
|
|
|
bind($fd, sockaddr_in(0, inet_aton('0.0.0.0'))) or die;
|
|
|
my $sa = getsockname($fd);
|
|
|
my ($port, $addr) = sockaddr_in($sa);
|
|
|
(($port % 2) == 0) or next;
|
|
|
return ($fd, $port);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
sub send_rcv {
|
|
|
my ($sendfd, $sendtoip, $sendtoport, $recvfd) = @_;
|
|
|
print("sending to $sendtoip:$sendtoport... ");
|
|
|
my $pkt = join('',map(rand,1..10));
|
|
|
send($sendfd, $pkt, 0, sockaddr_in($sendtoport, inet_aton($sendtoip))) or die;
|
|
|
my $inc;
|
|
|
alarm(5);
|
|
|
recv($recvfd, $inc, length($pkt), 0);
|
|
|
alarm(0);
|
|
|
$inc eq $pkt or die;
|
|
|
print("received packet ok\n");
|
|
|
}
|
|
|
|
|
|
sub send_rcv4 {
|
|
|
send_rcv(@_[0,1,2,3]);
|
|
|
sleep(1);
|
|
|
send_rcv(@_[3,4,5,0]);
|
|
|
sleep(1);
|
|
|
send_rcv(@_[0,1,2,3]);
|
|
|
sleep(1);
|
|
|
send_rcv(@_[3,4,5,0]);
|
|
|
}
|
|
|
|
|
|
my $callid1 = join('',map(rand,1..2));
|
|
|
my $fromtag1 = join('',map(rand,1..4));
|
|
|
my $totag1 = join('',map(rand,1..4));
|
|
|
my $callid2 = join('',map(rand,1..2));
|
|
|
my $fromtag2 = join('',map(rand,1..4));
|
|
|
my $totag2 = join('',map(rand,1..4));
|
|
|
|
|
|
my ($client1, $lp1) = udp_sock();
|
|
|
my ($client2, $lp2) = udp_sock();
|
|
|
my ($client3, $lp3) = udp_sock();
|
|
|
my ($client4, $lp4) = udp_sock();
|
|
|
|
|
|
print("call-ids: $callid1 & $callid2\n");
|
|
|
print("opened ports $lp1 [A->B], $lp2 [B->A], $lp3 [B->C], $lp4 [C->B] as RTP clients\n");
|
|
|
brk();
|
|
|
|
|
|
print("CALL 1: A calling B\n");
|
|
|
print("A tells B: send RTP to $lp1\n");
|
|
|
brk();
|
|
|
|
|
|
my ($mpip1, $mpport1) = split(/ /, mp_msg("request $callid1 $local_ip:$lp1:audio 192.168.101.11 80.110.1.48 remote 212.41.253.181 remote CS2000_NGSS/9.0 info=domain:voip.sipwise.local,from:431960681661\@80.110.1.48:5060,totag:,to:43720890289\@77.244.249.84:5060,fromtag:$fromtag1"));
|
|
|
print("mediaproxy: tell B to send to $mpport1 instead of $lp1\n");
|
|
|
brk();
|
|
|
|
|
|
print("B tells A: send RTP to $lp2\n");
|
|
|
brk();
|
|
|
|
|
|
my ($mpip2, $mpport2) = split(/ /, mp_msg("lookup $callid1 $local_ip:$lp2:audio 192.168.101.11 80.110.1.48 remote 212.41.253.181 remote CS2000_NGSS/9.0 info=domain:voip.sipwise.local,from:431960681661\@80.110.1.48:5060,totag:$totag1,to:43720890289\@77.244.249.84:5060,fromtag:$fromtag1"));
|
|
|
print("mediaproxy: tell A to send to $mpport2 instead of $lp2\n");
|
|
|
brk();
|
|
|
|
|
|
send_rcv4($client2, $mpip1, $mpport1, $client1, $mpip2, $mpport2);
|
|
|
|
|
|
brk();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print("B puts A on hold\n");
|
|
|
print("B tells A: send RTP to 0.0.0.0\n");
|
|
|
|
|
|
brk();
|
|
|
|
|
|
my ($mpip3, $mpport3) = split(/ /, mp_msg("request $callid1 0.0.0.0:$lp2:audio 192.168.101.11 80.110.1.48 remote 212.41.253.181 remote CS2000_NGSS/9.0 info=domain:voip.sipwise.local,from:431960681661\@80.110.1.48:5060,totag:$fromtag1,to:43720890289\@77.244.249.84:5060,fromtag:$totag1"));
|
|
|
print("mediaproxy: tell A to send to $mpip3:$mpport3 instead of 0.0.0.0:$lp2\n");
|
|
|
brk();
|
|
|
|
|
|
print("A tells B: send RTP to 0.0.0.0\n");
|
|
|
brk();
|
|
|
|
|
|
my ($mpip4, $mpport4) = split(/ /, mp_msg("lookup $callid1 0.0.0.0:$lp1:audio 192.168.101.11 80.110.1.48 remote 212.41.253.181 remote CS2000_NGSS/9.0 info=domain:voip.sipwise.local,from:431960681661\@80.110.1.48:5060,totag:$fromtag1,to:43720890289\@77.244.249.84:5060,fromtag:$totag1"));
|
|
|
print("mediaproxy: tell B to send to $mpip4:$mpport4 instead of 0.0.0.0:$lp1\n");
|
|
|
brk();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print("CALL 2: B calling C\n");
|
|
|
print("B tells C: send RTP to $lp3\n");
|
|
|
|
|
|
brk();
|
|
|
|
|
|
my ($mpip5, $mpport5) = split(/ /, mp_msg("request $callid2 $local_ip:$lp3:audio 192.168.101.11 80.110.1.48 remote 212.41.253.181 remote CS2000_NGSS/9.0 info=domain:voip.sipwise.local,from:431960681661\@80.110.1.48:5060,totag:,to:43720890289\@77.244.249.84:5060,fromtag:$fromtag2"));
|
|
|
print("mediaproxy: tell C to send to $mpport5 instead of $lp3\n");
|
|
|
brk();
|
|
|
|
|
|
print("C tells B: send RTP to $lp4\n");
|
|
|
brk();
|
|
|
|
|
|
my ($mpip6, $mpport6) = split(/ /, mp_msg("lookup $callid2 $local_ip:$lp4:audio 192.168.101.11 80.110.1.48 remote 212.41.253.181 remote CS2000_NGSS/9.0 info=domain:voip.sipwise.local,from:431960681661\@80.110.1.48:5060,totag:$totag2,to:43720890289\@77.244.249.84:5060,fromtag:$fromtag2"));
|
|
|
print("mediaproxy: tell B to send to $mpport6 instead of $lp4\n");
|
|
|
brk();
|
|
|
|
|
|
send_rcv4($client4, $mpip5, $mpport5, $client3, $mpip6, $mpport6);
|
|
|
|
|
|
brk();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print("B un-holds A\n");
|
|
|
print("B tells A: send RTP to $lp2\n");
|
|
|
|
|
|
brk();
|
|
|
|
|
|
my ($mpip7, $mpport7) = split(/ /, mp_msg("request $callid1 $local_ip:$lp2:audio 192.168.101.11 80.110.1.48 remote 212.41.253.181 remote CS2000_NGSS/9.0 info=domain:voip.sipwise.local,from:431960681661\@80.110.1.48:5060,totag:$fromtag1,to:43720890289\@77.244.249.84:5060,fromtag:$totag1"));
|
|
|
print("mediaproxy: tell A to send to $mpport7 instead of $lp2\n");
|
|
|
brk();
|
|
|
|
|
|
print("A tells B: send RTP to $lp1\n");
|
|
|
brk();
|
|
|
|
|
|
my ($mpip8, $mpport8) = split(/ /, mp_msg("lookup $callid1 $local_ip:$lp1:audio 192.168.101.11 80.110.1.48 remote 212.41.253.181 remote CS2000_NGSS/9.0 info=domain:voip.sipwise.local,from:431960681661\@80.110.1.48:5060,totag:$fromtag1,to:43720890289\@77.244.249.84:5060,fromtag:$totag1"));
|
|
|
print("mediaproxy: tell B to send to $mpport8 instead of $lp1\n");
|
|
|
brk();
|
|
|
|
|
|
send_rcv4($client2, $mpip1, $mpport1, $client1, $mpip2, $mpport2);
|
|
|
|
|
|
brk();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print("CONNECT: B connects A to C\n");
|
|
|
print("B tells C [call 2]: send RTP to $mpip8:$mpport8\n");
|
|
|
|
|
|
brk();
|
|
|
|
|
|
my ($mpip9, $mpport9) = split(/ /, mp_msg("request $callid2 $mpip8:$mpport8:audio 192.168.101.11 80.110.1.48 remote 212.41.253.181 remote CS2000_NGSS/9.0 info=domain:voip.sipwise.local,from:431960681661\@80.110.1.48:5060,totag:$totag2,to:43720890289\@77.244.249.84:5060,fromtag:$fromtag2"));
|
|
|
print("mediaproxy: tell C to send to $mpport9 instead of $mpip8:$mpport8\n");
|
|
|
brk();
|
|
|
|
|
|
print("C tells B: send RTP to $lp4\n");
|
|
|
my ($mpip10, $mpport10) = split(/ /, mp_msg("lookup $callid2 $local_ip:$lp4:audio 192.168.101.11 80.110.1.48 remote 212.41.253.181 remote CS2000_NGSS/9.0 info=domain:voip.sipwise.local,from:431960681661\@80.110.1.48:5060,totag:$totag2,to:43720890289\@77.244.249.84:5060,fromtag:$fromtag2"));
|
|
|
print("mediaproxy: tell B to send to $mpport10 instead of $lp4\n");
|
|
|
brk();
|
|
|
|
|
|
|
|
|
print("B tells A [call 1]: send RTP to $mpip10:$mpport10\n");
|
|
|
|
|
|
my ($mpip11, $mpport11) = split(/ /, mp_msg("request $callid1 $mpip10:$mpport10:audio 192.168.101.11 80.110.1.48 remote 212.41.253.181 remote CS2000_NGSS/9.0 info=domain:voip.sipwise.local,from:431960681661\@80.110.1.48:5060,totag:$fromtag1,to:43720890289\@77.244.249.84:5060,fromtag:$totag1"));
|
|
|
print("mediaproxy: tell A to send to $mpport11 instead of $mpip10:$mpport10\n");
|
|
|
brk();
|
|
|
|
|
|
send_rcv($client1, $mpip11, $mpport11, $client4); ###### <<<<<< error trigger
|
|
|
|
|
|
print("A tells B: send RTP to $lp1\n");
|
|
|
my ($mpip12, $mpport12) = split(/ /, mp_msg("lookup $callid1 $local_ip:$lp1:audio 192.168.101.11 80.110.1.48 remote 212.41.253.181 remote CS2000_NGSS/9.0 info=domain:voip.sipwise.local,from:431960681661\@80.110.1.48:5060,totag:$fromtag1,to:43720890289\@77.244.249.84:5060,fromtag:$totag1"));
|
|
|
print("mediaproxy: tell B to send to $mpport12 instead of $lp1\n");
|
|
|
brk();
|
|
|
|
|
|
send_rcv4($client4, $mpip9, $mpport9, $client1, $mpip11, $mpport11);
|