aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2023-09-27 14:47:45 +0200
committerpespin <pespin@sysmocom.de>2023-09-28 14:36:12 +0000
commite6d095ca9818c73d27d38a7c740a1c6b27884ac2 (patch)
tree7ae8d1800c8abf2364ac413ee44bfbe90f2bc736
parent74d75b19cffbc9b8b4d13f70e9c2c39f9afd0e0a (diff)
mgw: Introduce tests TC_two_crcx_mdcx_and_iuup_(rtp_)mdcx_recvonly
-rw-r--r--mgw/MGCP_Test.ttcn157
-rw-r--r--mgw/expected-results.xml2
2 files changed, 159 insertions, 0 deletions
diff --git a/mgw/MGCP_Test.ttcn b/mgw/MGCP_Test.ttcn
index ad564c1a..b75fd690 100644
--- a/mgw/MGCP_Test.ttcn
+++ b/mgw/MGCP_Test.ttcn
@@ -10,6 +10,7 @@
*/
module MGCP_Test {
+ import from Misc_Helpers all;
import from Osmocom_Types all;
import from MGCP_Types all;
import from MGCP_Templates all;
@@ -2955,6 +2956,80 @@ module MGCP_Test {
mp_local_ipv4, mp_remote_ipv4);
}
+ /* Test that once IuUP->RTP has been set up, if the RTP/IuUP conn is set
+ * as "recvonly", no more RTP/IuUP packets get out of the MGW. */
+ function f_tc_two_crcx_mdcx_and_iuup_mdcx_recvonly(charstring local_ip_a, charstring remote_ip_a,
+ IuUP_RabFlowCombinationList rfcl_a,
+ charstring local_ip_b, charstring remote_ip_b) runs on dummy_CT {
+ var RtpFlowData flow[2];
+ var MgcpEndpoint ep := c_mgw_ep_rtpbridge & "2@" & c_mgw_domain;
+ var MgcpCallId call_id := '1227'H;
+ var RtpemStats stats[2];
+
+ f_init(ep);
+
+ /* Create the first connection in receive only mode (RNC side, IuUP-Init active) */
+ flow[0] := valueof(t_RtpFlow(local_ip_a, remote_ip_a, 96, "VND.3GPP.IUFP/16000"));
+ flow[0].em.portnr := 10000;
+ flow[0].rtp_cfg := c_RtpemDefaultCfg;
+ flow[0].rtp_cfg.rx_payloads[0].payload_type := flow[0].codec_descr[0].pt;
+ flow[0].rtp_cfg.tx_payloads[0].payload_type := flow[0].codec_descr[0].pt;
+ flow[0].rtp_cfg.iuup_mode := true;
+ flow[0].rtp_cfg.iuup_cfg.active_init := true;
+ flow[0].rtp_cfg.iuup_cfg.rab_flow_combs := rfcl_a;
+
+ /* Create the second connection. This connection will be also
+ * in receive only mode (CN side, IuUP-Init passive) */
+ flow[1] := valueof(t_RtpFlow(local_ip_b, remote_ip_b, 96, "VND.3GPP.IUFP/16000"));
+ flow[1].em.portnr := 20000;
+ flow[1].rtp_cfg := c_RtpemDefaultCfg;
+ flow[1].rtp_cfg.rx_payloads[0].payload_type := flow[1].codec_descr[0].pt;
+ flow[1].rtp_cfg.tx_payloads[0].payload_type := flow[1].codec_descr[0].pt;
+ flow[1].rtp_cfg.iuup_mode := true;
+ flow[1].rtp_cfg.iuup_cfg.active_init := false;
+
+ f_two_crcx_mdcx_data_transfer(ep, call_id, flow[0], flow[1], false);
+
+ /* Now validate we don't receive more RTP packets after setting it to recvonly: */
+ f_rtpem_mode(RTPEM[1], RTPEM_MODE_RXONLY);
+ f_flow_modify(RTPEM[1], ep, call_id, "recvonly", flow[1]);
+ f_sleep(0.5);
+ stats[0] := f_rtpem_stats_get(RTPEM[1]);
+ f_sleep(0.5);
+ stats[1] := f_rtpem_stats_get(RTPEM[1]);
+ if (stats[1].num_pkts_rx > stats[0].num_pkts_rx) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ log2str("received ", stats[1].num_pkts_rx - stats[0].num_pkts_rx, " RTP packets from MGW on recvonly connection 1"));
+ }
+
+ /* Now do the same on the IuUP port: */
+ f_rtpem_mode(RTPEM[0], RTPEM_MODE_RXONLY);
+ f_rtpem_mode(RTPEM[1], RTPEM_MODE_TXONLY);
+ f_flow_modify(RTPEM[0], ep, call_id, "recvonly", flow[0]);
+ f_sleep(0.5);
+ stats[0] := f_rtpem_stats_get(RTPEM[0]);
+ f_sleep(0.5);
+ stats[1] := f_rtpem_stats_get(RTPEM[0]);
+ if (stats[1].num_pkts_rx > stats[0].num_pkts_rx) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ log2str("received ", stats[1].num_pkts_rx - stats[0].num_pkts_rx, " IuUP packets from MGW on recvonly connection 1"));
+ }
+
+ /* Tear down */
+ f_flow_delete(RTPEM[0]);
+ f_flow_delete(RTPEM[1], ep, call_id);
+ setverdict(pass);
+ }
+ testcase TC_two_crcx_mdcx_and_iuup_mdcx_recvonly() runs on dummy_CT {
+ var template (value) IuUP_RabFlowCombinationList rfcl := {
+ t_IuUP_RFC_AMR_12_2(0),
+ t_IuUP_RFC_AMR_SID(1),
+ t_IuUP_RFC_AMR_NO_DATA(2)
+ };
+ f_tc_two_crcx_mdcx_and_iuup_mdcx_recvonly(mp_local_ipv4, mp_remote_ipv4, valueof(rfcl),
+ mp_local_ipv4, mp_remote_ipv4);
+ }
+
/* create two local emulations (1 RTP, 1 RTP+IuUP) and pass data in both directions */
function f_tc_two_crcx_mdcx_and_iuup_rtp(charstring local_ip_a, charstring remote_ip_a,
IuUP_RabFlowCombinationList rfcl_a,
@@ -3013,6 +3088,86 @@ module MGCP_Test {
mp_local_ipv4, mp_remote_ipv4);
}
+ /* Test that once IuUP->RTP has been set up, if the RTP/IuUP conn is set
+ * as "recvonly", no more RTP/IuUP packets get out of the MGW. */
+ function f_tc_two_crcx_mdcx_and_iuup_rtp_mdcx_recvonly(charstring local_ip_a, charstring remote_ip_a,
+ IuUP_RabFlowCombinationList rfcl_a,
+ charstring local_ip_b, charstring remote_ip_b) runs on dummy_CT {
+ var RtpFlowData flow[2];
+ var MgcpEndpoint ep := c_mgw_ep_rtpbridge & "2@" & c_mgw_domain;
+ var MgcpCallId call_id := '1227'H;
+ var RtpemStats stats[2];
+
+ f_init(ep);
+
+ /* Create the first connection in receive only mode (RNC side, IuUP-Init active) */
+ flow[0] := valueof(t_RtpFlow(local_ip_a, remote_ip_a, 96, "VND.3GPP.IUFP/16000"));
+ flow[0].em.portnr := 10000;
+ flow[0].rtp_cfg := c_RtpemDefaultCfg;
+ flow[0].rtp_cfg.tx_payloads[0].payload_type := flow[0].codec_descr[0].pt;
+ flow[0].rtp_cfg.rx_payloads[0].payload_type := flow[0].codec_descr[0].pt;
+ flow[0].rtp_cfg.tx_payloads[0].fixed_payload := '4f28959ffeb80181f5c4e83d176c897b4a4e333298333419a493ca63ded6e0'O;
+ /* flow[1].rtp_cfg.rx_payloads[0].fixed_payload converted AMR-BE-RTP->AMR-IUUP*/
+ flow[0].rtp_cfg.rx_payloads[0].fixed_payload := '08556d944c71a1a081e7ead204244480000ecd82b81118000097c4794e7740'O;
+ flow[0].rtp_cfg.iuup_mode := true;
+ flow[0].rtp_cfg.iuup_cfg.active_init := true;
+ flow[0].rtp_cfg.iuup_cfg.rab_flow_combs := rfcl_a;
+
+ /* Create the second connection. This connection will be also
+ * in receive only mode (CN side, regular RTP) */
+ flow[1] := valueof(t_RtpFlow(local_ip_b, remote_ip_b, 112, "AMR/8000"));
+ flow[1].em.portnr := 20000;
+ flow[1].rtp_cfg := c_RtpemDefaultCfg;
+ flow[1].rtp_cfg.tx_payloads[0].payload_type := flow[1].codec_descr[0].pt;
+ flow[1].rtp_cfg.rx_payloads[0].payload_type := flow[1].codec_descr[0].pt;
+ flow[1].rtp_cfg.tx_payloads[0].fixed_payload := '0382155b65131c68682079fab4810911200003b360ae0446000025f11e539dd0'O;
+ /* flow[0].rtp_cfg.rx_payloads[0].fixed_payload converted AMR-IuUP->AMR-BE-RTP*/
+ flow[1].rtp_cfg.rx_payloads[0].fixed_payload := 'f3d3ca2567ffae00607d713a0f45db225ed2938ccca60ccd066924f298f7b5b8'O;
+ flow[1].rtp_cfg.iuup_mode := false;
+
+ f_two_crcx_mdcx_data_transfer(ep, call_id, flow[0], flow[1], false);
+
+ /* Now validate we don't receive more RTP packets after setting it to recvonly: */
+ f_rtpem_mode(RTPEM[1], RTPEM_MODE_RXONLY);
+ f_flow_modify(RTPEM[1], ep, call_id, "recvonly", flow[1]);
+ f_sleep(0.5);
+ stats[0] := f_rtpem_stats_get(RTPEM[1]);
+ f_sleep(0.5);
+ stats[1] := f_rtpem_stats_get(RTPEM[1]);
+ if (stats[1].num_pkts_rx > stats[0].num_pkts_rx) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ log2str("received ", stats[1].num_pkts_rx - stats[0].num_pkts_rx, " RTP packets from MGW on recvonly connection 1"));
+ }
+
+ /* Now do the same on the IuUP port: */
+ f_rtpem_mode(RTPEM[0], RTPEM_MODE_RXONLY);
+ f_flow_modify(RTPEM[0], ep, call_id, "recvonly", flow[0]);
+ f_rtpem_mode(RTPEM[1], RTPEM_MODE_TXONLY);
+ f_flow_modify(RTPEM[1], ep, call_id, "sendrecv", flow[1]);
+ f_sleep(0.5);
+ stats[0] := f_rtpem_stats_get(RTPEM[0]);
+ f_sleep(0.5);
+ stats[1] := f_rtpem_stats_get(RTPEM[0]);
+ if (stats[1].num_pkts_rx > stats[0].num_pkts_rx) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ log2str("received ", stats[1].num_pkts_rx - stats[0].num_pkts_rx, " IuUP packets from MGW on recvonly connection 1"));
+ }
+
+ /* Tear down */
+ f_flow_delete(RTPEM[0]);
+ f_flow_delete(RTPEM[1], ep, call_id);
+ setverdict(pass);
+ }
+ testcase TC_two_crcx_mdcx_and_iuup_rtp_mdcx_recvonly() runs on dummy_CT {
+ var template (value) IuUP_RabFlowCombinationList rfcl := {
+ t_IuUP_RFC_AMR_12_2(0),
+ t_IuUP_RFC_AMR_SID(1),
+ t_IuUP_RFC_AMR_NO_DATA(2)
+ };
+ f_tc_two_crcx_mdcx_and_iuup_rtp_mdcx_recvonly(mp_local_ipv4, mp_remote_ipv4, valueof(rfcl),
+ mp_local_ipv4, mp_remote_ipv4);
+ }
+
control {
execute(TC_selftest());
execute(TC_auep_null());
@@ -3099,8 +3254,10 @@ module MGCP_Test {
execute(TC_two_crcx_mdcx_and_iuup());
execute(TC_two_crcx_mdcx_and_iuup_rfci_unordered());
+ execute(TC_two_crcx_mdcx_and_iuup_mdcx_recvonly());
execute(TC_two_crcx_mdcx_and_iuup_rtp());
execute(TC_two_crcx_mdcx_and_iuup_rtp_rfci_unordered());
+ execute(TC_two_crcx_mdcx_and_iuup_rtp_mdcx_recvonly());
execute(TC_two_crcx_mdcx_and_rtp_clearmode());
diff --git a/mgw/expected-results.xml b/mgw/expected-results.xml
index a4ce3889..44ce65b8 100644
--- a/mgw/expected-results.xml
+++ b/mgw/expected-results.xml
@@ -89,8 +89,10 @@
<testcase classname='MGCP_Test' name='TC_two_crcx_mdcx_and_rtp_osmux_ipv4_ipv6' time='MASKED' />
<testcase classname='MGCP_Test' name='TC_two_crcx_mdcx_and_rtp_osmux_ipv6_ipv4' time='MASKED'/>
<testcase classname='MGCP_Test' name='TC_two_crcx_mdcx_and_iuup' time='MASKED'/>
+ <testcase classname='MGCP_Test' name='TC_two_crcx_mdcx_and_iuup_mdcx_recvonly' time='MASKED'/>
<testcase classname='MGCP_Test' name='TC_two_crcx_mdcx_and_iuup_rfci_unordered' time='MASKED'/>
<testcase classname='MGCP_Test' name='TC_two_crcx_mdcx_and_iuup_rtp' time='MASKED'/>
<testcase classname='MGCP_Test' name='TC_two_crcx_mdcx_and_iuup_rtp_rfci_unordered' time='MASKED'/>
+ <testcase classname='MGCP_Test' name='TC_two_crcx_mdcx_and_iuup_rtp_mdcx_recvonly' time='MASKED'/>
<testcase classname='MGCP_Test' name='TC_one_crcx_loopback_rtp_implicit' time='MASKED'/>
</testsuite>