BSC_Tests: Add new TC_chan_rel_a_reset

This test case tests for proper release of RF channels after the MSC
issues a BSSMAP RESET.
diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn
index 09ba0a9..c366fe4 100644
--- a/bsc/BSC_Tests.ttcn
+++ b/bsc/BSC_Tests.ttcn
@@ -481,6 +481,55 @@
 	setverdict(pass);
 }
 
+/* Test behavior of channel release after BSSMAP RESET from MSC */
+testcase TC_chan_rel_a_reset() runs on test_CT {
+	var RSL_Message rx_rsl;
+	var DchanTuple dt;
+	var RslLinkId main_dcch := valueof(ts_RslLinkID_DCCH(0));
+
+	f_init();
+	f_bssap_reset();
+
+	dt := f_est_dchan('23'O, 23, '00010203040506'O);
+
+	/* Clear the queue, it might still contain stuff like IMMEDIATE ASSIGN */
+	IPA_RSL[0].clear;
+
+	/* perform BSSAP RESET, expect RESET ACK and DISC.ind on connection */
+	BSSAP.send(ts_BSSAP_UNITDATA_req(g_sccp_addr_peer, g_sccp_addr_own, ts_BSSMAP_Reset(0)));
+	interleave {
+	[] BSSAP.receive(tr_BSSAP_UNITDATA_ind(g_sccp_addr_own, g_sccp_addr_peer, tr_BSSMAP_ResetAck)) { }
+	[] BSSAP.receive(tr_BSSAP_DISC_ind(dt.sccp_conn_id, ?, ?)) { }
+	}
+
+	alt {
+	/* ignore DEACTIVATE SACCH (if any) */
+	[] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
+					tr_RSL_DEACT_SACCH(dt.rsl_chan_nr))) {
+		repeat;
+	}
+	/* acknowledge RLL release (if any)*/
+	[] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
+					tr_RSL_REL_REQ(dt.rsl_chan_nr, ?))) {
+		/* FIXME: Why are we getting this for LinkID SACCH? */
+		f_ipa_tx(0, ts_RSL_REL_CONF(dt.rsl_chan_nr, main_dcch));
+		repeat;
+	}
+	/* Expect RF channel release from BSC on Abis */
+	[] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
+						tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL))) {
+		/* respond with CHAN REL ACK */
+		f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
+		}
+	/* ignore any user data */
+	[] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_MsgTypeR(?))) {
+		repeat;
+		}
+	}
+
+	setverdict(pass);
+}
+
 
 testcase TC_ctrl_msc_connection_status() runs on test_CT {
 	var charstring ctrl_resp;
@@ -542,6 +591,7 @@
 	execute( TC_chan_rel_conn_fail() );
 	execute( TC_chan_rel_hard_clear() );
 	execute( TC_chan_rel_hard_rlsd() );
+	execute( TC_chan_rel_a_reset() );
 }
 
 }