You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rtpengine/t/auto-daemon-tests-kernel-ap...

683 lines
20 KiB

#!/usr/bin/perl
use strict;
use warnings;
use NGCP::Rtpengine::Test;
use NGCP::Rtpclient::SRTP;
use NGCP::Rtpengine::AutoTest;
use Test::More;
use Test2::Tools::Compare qw();
use NGCP::Rtpclient::ICE;
use POSIX;
use Socket;
use IO::Socket::UNIX;
use Data::Dumper;
use Errno;
$ENV{RTPENGINE_EXTENDED_TESTS} or exit(); # tests only valid on amd64
local $ENV{MOCK_PEER} = ($ENV{TEST_SOCKET_PATH} || '.') . '/intf.sock';
my $kintf = IO::Socket::UNIX->new(Type => SOCK_DGRAM(), Local => $ENV{MOCK_PEER});
local $ENV{MOCK_0} = '/proc/rtpengine/control';
local $ENV{MOCK_1} = '/proc/rtpengine/42/control';
$NGCP::Rtpengine::AutoTest::launch_cb = sub {
my $buf;
my ($addr) = $kintf->recv($buf, 1024);
my ($msg, $text) = unpack("i! Z*", $buf);
is($msg, 1, "open message");
is($text, "/proc/rtpengine/control", "open control");
$kintf->send(pack('ii', 1, 0), 0, $addr);
($addr) = $kintf->recv($buf, 1024);
($msg, $text) = unpack("i! a*", $buf);
is($msg, 3, "write message");
is($text, "del 42\n", "del msg");
$kintf->send(pack('ii', 3, -Errno::ENOENT), 0, $addr);
($addr) = $kintf->recv($buf, 1024);
($msg, $text) = unpack("i!", $buf);
is($msg, 4, "close message");
($addr) = $kintf->recv($buf, 1024);
($msg, $text) = unpack("i! Z*", $buf);
is($msg, 1, "open message");
is($text, "/proc/rtpengine/42/control", "open table control");
$kintf->send(pack('ii', 1, 0), 0, $addr);
($addr) = $kintf->recv($buf, 1024);
($msg, $text) = unpack("i! a*", $buf);
is($msg, 3, "write message");
my ($code, $a, $l) = unpack('i! x![L!] L!L!', $text);
is($code, 16, "pin memory msg");
is($l, 16777216, "pin memory size");
$kintf->send(pack('ii', 3, length($text)), 0, $addr);
($addr) = $kintf->recv($buf, 1024);
($msg, $text) = unpack("i! a*", $buf);
is($msg, 3, "write message");
($code, $l) = unpack('i! x![L!] i! x![L!] L![18] L!', $text);
is($code, 1, "init msg");
is($l, 18, "last msg code");
# skip verify msg lengths
$kintf->send(pack('ii', 3, length($text)), 0, $addr);
};
autotest_start(qw(--config-file=none -t 42 -i 203.0.113.1 -i 2001:db8:4321::1
-n 2223 -f -L 7 -E --log-level-internals=7 --no-fallback
--nftables-chain=))
or die;
my $extended_tests = $ENV{RTPENGINE_EXTENDED_TESTS};
my ($sock_a, $sock_b, $sock_c, $sock_d, $port_a, $port_b, $ssrc, $ssrc_b, $resp,
$sock_ax, $sock_bx, $port_ax, $port_bx, $t_a, $t_b, $t_c, $t_d,
$sock_cx, $sock_dx, $port_c, $port_d, $port_cx, $port_dx,
$srtp_ctx_a, $srtp_ctx_b, $srtp_ctx_a_rev, $srtp_ctx_b_rev, $ufrag_a, $ufrag_b,
@ret1, @ret2, @ret3, @ret4, $srtp_key_a, $srtp_key_b, $ts, $seq, $has_recv, $tmp_blob,
$pwd_a, $pwd_b, $packet, $tid, $buf, $addr, $msg, $text,
$code, $lfam, $laddr, $lport, $efam, $eaddr, $eport, $mismatch, $numdest,
$intcp, @g, @decr, @ssrc, @ssrcst, @ssrci, @ptst, @ptmi, $npts, $midmap,
@mid, $iface, $stats, @rbuf, $flags, $idx, $sfam, $saddr, $sport, $dfam, $daddr,
$dport, $midx, @encr, @seqs, @pto, $nexf, $exmid, $exmidlen, $exmids, $tos, %dict);
undef $NGCP::Rtpengine::AutoTest::launch_cb;
sub add_target {
my $buf;
my ($addr) = $kintf->recv($buf, 4096);
my ($msg, $text) = unpack("i! a*", $buf);
is($msg, 3, "write message");
my (%ret, $code);
($code,
$ret{lfam}, $ret{laddr}, $ret{lport},
$ret{efam}, $ret{eaddr}, $ret{eport},
$ret{mismatch}, $ret{numdest}, $ret{intcp},
@{$ret{g}}[0..31],
@{$ret{decr}}[0..11],
@{$ret{ssrc}}[0..3], @{$ret{ssrcst}}[0..3], @{$ret{ssrci}}[0..3],
@{$ret{ptst}}[0..31],
@{$ret{ptmi}}[0..31],
$ret{npts}, $ret{midmap},
@{$ret{mid}}[0..15],
$ret{iface}, $ret{stats},
@{$ret{rbuf}}[0..3], $ret{flags})
= unpack('i! x![L!] (i! L x12 S x[S])[2] i! i! i! (i! i! i! i!)[8] (i! i! a32 i! a14 x![i!] i! i! i! a256 i! i! i!) N4 Q4 i!4 Q32 i!32 i! C (a255 x![L!] L!)[8] Q Q (i! i! Q Q) s', $text);
is($code, 2, "add target msg");
$kintf->send(pack('ii', 3, length($text)), 0, $addr);
return %ret;
}
sub add_destination {
my $buf;
my ($addr) = $kintf->recv($buf, 4096);
my ($msg, $text) = unpack("i! a*", $buf);
is($msg, 3, "write message");
my (%ret, $code);
($code,
$ret{lfam}, $ret{laddr}, $ret{lport},
$ret{idx},
$ret{sfam}, $ret{saddr}, $ret{sport},
$ret{dfam}, $ret{daddr}, $ret{dport},
$ret{midx},
@{$ret{encr}}[0..11],
@{$ret{ssrc}}[0..3], @{$ret{seqs}}[0..3], @{$ret{pto}}[0..127],
$ret{nexf},
$ret{exmid}, $ret{exmidlen}, $ret{exmids},
$ret{iface}, $ret{stats}, @{$ret{ssrcst}}[0..3],
$ret{tos}, $ret{flags})
= unpack('i! x![L!] (i! L x12 S x[S]) i! x![L!] (i! L x12 S x[S])[2] i! (i! i! a32 i! a14 x![i!] i! i! i! a256 i! i! i!) L4 L4 (i! a16 c i!)[32] i! c c a255 x![L!] Q Q Q4 c i!', $text);
is($code, 3, "add destination msg");
$kintf->send(pack('ii', 3, length($text)), 0, $addr);
return %ret;
}
my $del_targets = sub {
my ($addr) = $kintf->recv($buf, 4096);
my ($msg, $text) = unpack("i! a*", $buf);
is($msg, 3, "write message");
my ($code) = unpack('i!', $text);
is($code, 9, "del target msg");
$kintf->send(pack('ii', 3, length($text)), 0, $addr);
($addr) = $kintf->recv($buf, 4096);
($msg, $text) = unpack("i! a*", $buf);
is($msg, 3, "write message");
($code) = unpack('i!', $text);
is($code, 9, "del target msg");
$kintf->send(pack('ii', 3, length($text)), 0, $addr);
};
($sock_a, $sock_ax, $sock_b, $sock_bx) = new_call([qw(198.51.100.23 3000)], [qw(198.51.100.23 3001)],
[qw(198.51.100.23 3002)], [qw(198.51.100.23 3003)]);
$NGCP::Rtpengine::req_cb = sub {
my $buf;
my ($addr) = $kintf->recv($buf, 1024);
my ($msg, $text) = unpack("i! a*", $buf);
is($msg, 3, "write message");
my ($code, $a, $l) = unpack('i! x![L!] L!L!', $text);
is($code, 16, "pin memory msg");
is($l, 16777216, "pin memory size");
$kintf->send(pack('ii', 3, length($text)), 0, $addr);
};
($port_a, $port_ax) = offer('basic', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3000 RTP/AVP 9 8 0
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 9 8 0
c=IN IP4 203.0.113.1
a=rtpmap:9 G722/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
undef $NGCP::Rtpengine::req_cb;
($port_b, $port_bx) = answer('basic', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3002 RTP/AVP 9 8 0
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 9 8 0
c=IN IP4 203.0.113.1
a=rtpmap:9 G722/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
snd($sock_a, $port_b, rtp(0, 1000, 3000, 0x1234567, "\x00" x 160));
rcv($sock_b, $port_a, rtpm(0, 1000, 3000, 0x1234567, "\x00" x 160));
snd($sock_b, $port_a, rtp(0, 2000, 4000, 0x7654321, "\x00" x 160));
%dict = add_target();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_b, "lport");
is($dict{mismatch}, 0, "mismatch ignore");
is($dict{numdest}, 2, "num dests");
is($dict{g}[0], 0, "rtp start idx 0");
is($dict{g}[1], 1, "rtp end idx 0");
is($dict{g}[2], 1, "rtcp start idx 0");
is($dict{g}[3], 2, "rtcp end idx 0");
is($dict{decr}[0], 1, "null cipher");
is($dict{decr}[1], 1, "null hmac");
is($dict{ssrc}[0], 0x1234567, "ssrc 0");
is($dict{ssrci}[0], -1, "ssrc index 0");
is($dict{flags}, 344, "flags");
%dict = add_destination();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_b, "lport");
is($dict{idx}, 0, "dest idx");
is($dict{sfam}, 2, "saddr fam");
is($dict{saddr}, 24182987, "saddr");
is($dict{sport}, $port_a, "sport");
is($dict{dfam}, 2, "daddr fam");
is($dict{daddr}, 392442822, "daddr");
is($dict{dport}, 3002, "dport");
is($dict{encr}[0], 1, "null cipher");
is($dict{encr}[1], 1, "null hmac");
is($dict{flags}, 0, "flags");
%dict = add_destination();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_b, "lport");
is($dict{idx}, 1, "dest idx");
is($dict{sfam}, 2, "saddr fam");
is($dict{saddr}, 24182987, "saddr");
is($dict{sport}, $port_ax, "sport");
is($dict{dfam}, 2, "daddr fam");
is($dict{daddr}, 392442822, "daddr");
is($dict{dport}, 3003, "dport");
is($dict{encr}[0], 1, "null cipher");
is($dict{encr}[1], 1, "null hmac");
is($dict{flags}, 4, "flags");
%dict = add_target();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_a, "lport");
is($dict{mismatch}, 0, "mismatch ignore");
is($dict{numdest}, 2, "num dests");
is($dict{g}[0], 0, "rtp start idx 0");
is($dict{g}[1], 1, "rtp end idx 0");
is($dict{g}[2], 1, "rtcp start idx 0");
is($dict{g}[3], 2, "rtcp end idx 0");
is($dict{decr}[0], 1, "null cipher");
is($dict{decr}[1], 1, "null hmac");
is($dict{ssrc}[0], 0x7654321, "ssrc 0");
is($dict{ssrci}[0], -1, "ssrc index 0");
is($dict{flags}, 344, "flags");
%dict = add_destination();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_a, "lport");
is($dict{idx}, 0, "dest idx");
is($dict{sfam}, 2, "saddr fam");
is($dict{saddr}, 24182987, "saddr");
is($dict{sport}, $port_b, "sport");
is($dict{dfam}, 2, "daddr fam");
is($dict{daddr}, 392442822, "daddr");
is($dict{dport}, 3000, "dport");
is($dict{encr}[0], 1, "null cipher");
is($dict{encr}[1], 1, "null hmac");
is($dict{flags}, 0, "flags");
%dict = add_destination();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_a, "lport");
is($dict{idx}, 1, "dest idx");
is($dict{sfam}, 2, "saddr fam");
is($dict{saddr}, 24182987, "saddr");
is($dict{sport}, $port_bx, "sport");
is($dict{dfam}, 2, "daddr fam");
is($dict{daddr}, 392442822, "daddr");
is($dict{dport}, 3001, "dport");
is($dict{encr}[0], 1, "null cipher");
is($dict{encr}[1], 1, "null hmac");
is($dict{flags}, 4, "flags");
rcv($sock_a, $port_b, rtpm(0, 2000, 4000, 0x7654321, "\x00" x 160));
$NGCP::Rtpengine::req_cb = $del_targets;
rtpe_req('delete', 'basic', { 'delete-delay' => 0 });
undef $NGCP::Rtpengine::req_cb;
($sock_a, $sock_ax, $sock_b, $sock_bx) = new_call([qw(198.51.100.23 3004)], [qw(198.51.100.23 3005)],
[qw(198.51.100.23 3006)], [qw(198.51.100.23 3007)]);
($port_a, $port_ax) = offer('SRTP in', { 'transport-protocol' => 'RTP/AVP' }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3004 RTP/SAVP 9 8 0
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:QjnnaukLn7iwASAs0YLzPUplJkjOhTZK2dvOwo6c
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 9 8 0
c=IN IP4 203.0.113.1
a=rtpmap:9 G722/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
($port_b, $port_bx, $srtp_key_b) = answer('SRTP in', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3006 RTP/AVP 9 8 0
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/SAVP 9 8 0
c=IN IP4 203.0.113.1
a=rtpmap:9 G722/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:CRYPTO128
SDP
$srtp_ctx_a = {
cs => $NGCP::Rtpclient::SRTP::crypto_suites{AES_CM_128_HMAC_SHA1_80},
key => 'QjnnaukLn7iwASAs0YLzPUplJkjOhTZK2dvOwo6c',
};
$srtp_ctx_b = {
cs => $NGCP::Rtpclient::SRTP::crypto_suites{AES_CM_128_HMAC_SHA1_80},
key => $srtp_key_b,
};
srtp_snd($sock_a, $port_b, rtp(0, 1000, 3000, 0x1234567, "\x00" x 160), $srtp_ctx_a);
rcv($sock_b, $port_a, rtpm(0, 1000, 3000, 0x1234567, "\x00" x 160));
snd($sock_b, $port_a, rtp(0, 2000, 4000, 0x7654321, "\x00" x 160));
%dict = add_target();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_b, "lport");
is($dict{mismatch}, 0, "mismatch ignore");
is($dict{numdest}, 2, "num dests");
is($dict{g}[0], 0, "rtp start idx 0");
is($dict{g}[1], 1, "rtp end idx 0");
is($dict{g}[2], 1, "rtcp start idx 0");
is($dict{g}[3], 2, "rtcp end idx 0");
is($dict{decr}[0], 2, "cipher");
is($dict{decr}[1], 2, "hmac");
is($dict{ssrc}[0], 0x1234567, "ssrc 0");
is($dict{ssrci}[0], -1, "ssrc index 0");
is($dict{flags}, 344, "flags");
%dict = add_destination();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_b, "lport");
is($dict{idx}, 0, "dest idx");
is($dict{sfam}, 2, "saddr fam");
is($dict{saddr}, 24182987, "saddr");
is($dict{sport}, $port_a, "sport");
is($dict{dfam}, 2, "daddr fam");
is($dict{daddr}, 392442822, "daddr");
is($dict{dport}, 3006, "dport");
is($dict{encr}[0], 1, "null cipher");
is($dict{encr}[1], 1, "null hmac");
is($dict{flags}, 0, "flags");
%dict = add_destination();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_b, "lport");
is($dict{idx}, 1, "dest idx");
is($dict{sfam}, 2, "saddr fam");
is($dict{saddr}, 24182987, "saddr");
is($dict{sport}, $port_ax, "sport");
is($dict{dfam}, 2, "daddr fam");
is($dict{daddr}, 392442822, "daddr");
is($dict{dport}, 3007, "dport");
is($dict{encr}[0], 1, "null cipher");
is($dict{encr}[1], 1, "null hmac");
is($dict{flags}, 4, "flags");
%dict = add_target();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_a, "lport");
is($dict{mismatch}, 0, "mismatch ignore");
is($dict{numdest}, 2, "num dests");
is($dict{g}[0], 0, "rtp start idx 0");
is($dict{g}[1], 1, "rtp end idx 0");
is($dict{g}[2], 1, "rtcp start idx 0");
is($dict{g}[3], 2, "rtcp end idx 0");
is($dict{decr}[0], 1, "null cipher");
is($dict{decr}[1], 1, "null hmac");
is($dict{ssrc}[0], 0x7654321, "ssrc 0");
is($dict{ssrci}[0], -1, "ssrc index 0");
is($dict{flags}, 344, "flags");
%dict = add_destination();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_a, "lport");
is($dict{idx}, 0, "dest idx");
is($dict{sfam}, 2, "saddr fam");
is($dict{saddr}, 24182987, "saddr");
is($dict{sport}, $port_b, "sport");
is($dict{dfam}, 2, "daddr fam");
is($dict{daddr}, 392442822, "daddr");
is($dict{dport}, 3004, "dport");
is($dict{encr}[0], 2, "cipher");
is($dict{encr}[1], 2, "hmac");
is($dict{flags}, 0, "flags");
%dict = add_destination();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_a, "lport");
is($dict{idx}, 1, "dest idx");
is($dict{sfam}, 2, "saddr fam");
is($dict{saddr}, 24182987, "saddr");
is($dict{sport}, $port_bx, "sport");
is($dict{dfam}, 2, "daddr fam");
is($dict{daddr}, 392442822, "daddr");
is($dict{dport}, 3005, "dport");
is($dict{encr}[0], 2, "cipher");
is($dict{encr}[1], 2, "hmac");
is($dict{flags}, 4, "flags");
srtp_rcv($sock_a, $port_b, rtpm(0, 2000, 4000, 0x7654321, "\x00" x 160), $srtp_ctx_b);
$NGCP::Rtpengine::req_cb = $del_targets;
rtpe_req('delete', 'basic', { 'delete-delay' => 0 });
undef $NGCP::Rtpengine::req_cb;
($sock_a, $sock_b, $sock_bx) = new_call([qw(198.51.100.23 3012)],
[qw(198.51.100.23 3014)], [qw(198.51.100.23 3015)]);
($port_a, $port_ax) = offer('rtcp-mux', { 'rtcp-mux' => 'demux' }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3012 RTP/AVP 9 8 0
a=rtcp-mux
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 9 8 0
c=IN IP4 203.0.113.1
a=rtpmap:9 G722/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
($port_b, $port_bx) = answer('rtcp-mux', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3014 RTP/AVP 9 8 0
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 9 8 0
c=IN IP4 203.0.113.1
a=rtpmap:9 G722/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
a=rtcp-mux
SDP
is($port_b, $port_bx, 'same port');
snd($sock_a, $port_b, rtp(0, 1000, 3000, 0x1234567, "\x00" x 160));
rcv($sock_b, $port_a, rtpm(0, 1000, 3000, 0x1234567, "\x00" x 160));
snd($sock_b, $port_a, rtp(0, 2000, 4000, 0x7654321, "\x00" x 160));
%dict = add_target();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_b, "lport");
is($dict{mismatch}, 0, "mismatch ignore");
is($dict{numdest}, 2, "num dests");
is($dict{g}[0], 0, "rtp start idx 0");
is($dict{g}[1], 1, "rtp end idx 0");
is($dict{g}[2], 1, "rtcp start idx 0");
is($dict{g}[3], 2, "rtcp end idx 0");
is($dict{decr}[0], 1, "null cipher");
is($dict{decr}[1], 1, "null hmac");
is($dict{ssrc}[0], 0x1234567, "ssrc 0");
is($dict{ssrci}[0], -1, "ssrc index 0");
is($dict{flags}, 472, "flags");
%dict = add_destination();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_b, "lport");
is($dict{idx}, 0, "dest idx");
is($dict{sfam}, 2, "saddr fam");
is($dict{saddr}, 24182987, "saddr");
is($dict{sport}, $port_a, "sport");
is($dict{dfam}, 2, "daddr fam");
is($dict{daddr}, 392442822, "daddr");
is($dict{dport}, 3014, "dport");
is($dict{encr}[0], 1, "null cipher");
is($dict{encr}[1], 1, "null hmac");
is($dict{flags}, 0, "flags");
%dict = add_destination();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_b, "lport");
is($dict{idx}, 1, "dest idx");
is($dict{sfam}, 2, "saddr fam");
is($dict{saddr}, 24182987, "saddr");
is($dict{sport}, $port_ax, "sport");
is($dict{dfam}, 2, "daddr fam");
is($dict{daddr}, 392442822, "daddr");
is($dict{dport}, 3015, "dport");
is($dict{encr}[0], 1, "null cipher");
is($dict{encr}[1], 1, "null hmac");
is($dict{flags}, 4, "flags");
%dict = add_target();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_a, "lport");
is($dict{mismatch}, 0, "mismatch ignore");
is($dict{numdest}, 2, "num dests");
is($dict{g}[0], 0, "rtp start idx 0");
is($dict{g}[1], 1, "rtp end idx 0");
is($dict{g}[2], 1, "rtcp start idx 0");
is($dict{g}[3], 2, "rtcp end idx 0");
is($dict{decr}[0], 1, "null cipher");
is($dict{decr}[1], 1, "null hmac");
is($dict{ssrc}[0], 0x7654321, "ssrc 0");
is($dict{ssrci}[0], -1, "ssrc index 0");
is($dict{flags}, 344, "flags");
%dict = add_destination();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_a, "lport");
is($dict{idx}, 0, "dest idx");
is($dict{sfam}, 2, "saddr fam");
is($dict{saddr}, 24182987, "saddr");
is($dict{sport}, $port_b, "sport");
is($dict{dfam}, 2, "daddr fam");
is($dict{daddr}, 392442822, "daddr");
is($dict{dport}, 3012, "dport");
is($dict{encr}[0], 1, "null cipher");
is($dict{encr}[1], 1, "null hmac");
is($dict{flags}, 0, "flags");
%dict = add_destination();
is($dict{lfam}, 2, "laddr fam");
is($dict{laddr}, 24182987, "laddr");
is($dict{lport}, $port_a, "lport");
is($dict{idx}, 1, "dest idx");
is($dict{sfam}, 2, "saddr fam");
is($dict{saddr}, 24182987, "saddr");
is($dict{sport}, $port_bx, "sport");
is($dict{dfam}, 2, "daddr fam");
is($dict{daddr}, 392442822, "daddr");
is($dict{dport}, 3012, "dport");
is($dict{encr}[0], 1, "null cipher");
is($dict{encr}[1], 1, "null hmac");
is($dict{flags}, 4, "flags");
rcv($sock_a, $port_b, rtpm(0, 2000, 4000, 0x7654321, "\x00" x 160));
$NGCP::Rtpengine::req_cb = $del_targets;
rtpe_req('delete', 'basic', { 'delete-delay' => 0 });
undef $NGCP::Rtpengine::req_cb;
my $cb = sub {
# close table control
# XXX check fd/address?
my ($addr) = $kintf->recv($buf, 1024);
my ($msg, $text) = unpack("i!", $buf);
is($msg, 4, "close message");
($addr) = $kintf->recv($buf, 1024);
($msg, $text) = unpack("i! Z*", $buf);
is($msg, 1, "open message");
is($text, "/proc/rtpengine/control", "open control");
$kintf->send(pack('ii', 1, 0), 0, $addr);
($addr) = $kintf->recv($buf, 1024);
($msg, $text) = unpack("i! a*", $buf);
is($msg, 3, "write message");
is($text, "del 42\n", "del msg");
$kintf->send(pack('ii', 3, -Errno::ENOENT), 0, $addr);
($addr) = $kintf->recv($buf, 1024);
($msg, $text) = unpack("i!", $buf);
is($msg, 4, "close message");
};
NGCP::Rtpengine::AutoTest::shut_rtpe($cb);
undef $kintf;
unlink($ENV{MOCK_PEER});
#done_testing;NGCP::Rtpengine::AutoTest::terminate('f00');exit;
done_testing();