BTS_Tests: add TC_ipa_crcx_ack_addr reproducing OS#5242

Change-Id: Ic85904c967238555a6243a3df2d9225b957d5a5c
Related: OS#5242
diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn
index c2de538..5837a03 100644
--- a/bts/BTS_Tests.ttcn
+++ b/bts/BTS_Tests.ttcn
@@ -5036,6 +5036,39 @@
 	vc_conn.done;
 }
 
+/* Make sure that CRCX ACK contains a valid listen address (see OS#5242) */
+private function f_TC_ipa_crcx_ack_addr(charstring id) runs on ConnHdlr {
+	var OCT4 bind_ip := f_inet_addr("192.168.1.1");
+	var PortNumber bind_port := 16811;
+	var RSL_Message crcx_ack;
+
+	crcx_ack := f_rsl_transceive_ret(ts_RSL_IPA_CRCX(g_chan_nr, bind_ip, bind_port),
+					 tr_RSL_IPA_CRCX_ACK(g_chan_nr, ?, ?, ?),
+					 "IPA CRCX ACK");
+	var HostName bts_bind_ip := f_inet_ntoa(crcx_ack.ies[2].body.ipa_local_ip);
+	if (match(bts_bind_ip, "0.0.0.0")) {
+		setverdict(fail, "CRCX ACK indicates nonsense addr ", bts_bind_ip);
+	}
+
+	var uint16_t conn_id := crcx_ack.ies[1].body.ipa_conn_id;
+	f_rsl_transceive(ts_RSL_IPA_DLCX(g_chan_nr, conn_id),
+			 tr_RSL_IPA_DLCX_ACK(g_chan_nr, ?, ?),
+			 "IPA DLCX ACK");
+}
+testcase TC_ipa_crcx_ack_addr() runs on test_CT {
+	var ConnHdlrPars pars;
+	var ConnHdlr vc_conn;
+	f_init();
+
+	pars := valueof(t_Pars(t_RslChanNr_Bm(1), ts_RSL_ChanMode(RSL_CHRT_TCH_F, RSL_CMOD_SP_GSM1)));
+	vc_conn := f_start_handler(refers(f_TC_ipa_crcx_ack_addr), pars);
+	vc_conn.done;
+
+	pars := valueof(t_Pars(ts_RslChanNr_Lm(5, 0), ts_RSL_ChanMode(RSL_CHRT_TCH_H, RSL_CMOD_SP_GSM1)));
+	vc_conn := f_start_handler(refers(f_TC_ipa_crcx_ack_addr), pars);
+	vc_conn.done;
+}
+
 
 /***********************************************************************
  * PCU Socket related tests
@@ -8558,6 +8591,7 @@
 	execute( TC_ipa_crcx_mdcx_dlcx_not_active() );
 	execute( TC_ipa_crcx_mdcx_mdcx_dlcx_not_active() );
 	execute( TC_ipa_crcx_sdcch_not_active() );
+	execute( TC_ipa_crcx_ack_addr() );
 
 	if (mp_pcu_socket != "") {
 		execute( TC_paging_imsi_200percent_with_ps() );