WIP: Prepare MSC_Tests for ability to emulate two BSCs
Change-Id: Ibe3ae6ed4181c6ba7501f5443b4f22e3c8abeb3e
diff --git a/library/BSSMAP_Emulation.ttcn b/library/BSSMAP_Emulation.ttcn
index 4aacdf2..b1c6b81 100644
--- a/library/BSSMAP_Emulation.ttcn
+++ b/library/BSSMAP_Emulation.ttcn
@@ -102,7 +102,14 @@
/* port between individual per-connection components and this dispatcher */
type port BSSAP_Conn_PT message {
- inout PDU_BSSAP, PDU_DTAP_MO, PDU_DTAP_MT, BSSAP_Conn_Prim, BSSAP_Conn_Req, MgcpCommand, MgcpResponse;
+ /* BSSAP or direct DTAP messages from/to clients */
+ inout PDU_BSSAP, PDU_DTAP_MO, PDU_DTAP_MT,
+ /* misc indications / requests between SCCP and client */
+ BSSAP_Conn_Prim,
+ /* Client requests us to create SCCP Connection */
+ BSSAP_Conn_Req,
+ /* MGCP, only used for IPA SCCPlite (MGCP in IPA mux) */
+ MgcpCommand, MgcpResponse;
} with { extension "internal" };
@@ -417,7 +424,10 @@
BssmapCreateCallback create_cb,
BssmapUnitdataCallback unitdata_cb,
boolean decode_dtap,
- boolean role_ms
+ boolean role_ms,
+ /* needed for performing BSSMAP RESET */
+ SCCP_PAR_Address sccp_addr_local optional,
+ SCCP_PAR_Address sccp_addr_peer optional
}
template BIT4 t_ML3_DISC_CC_MM_SS := ('0011'B, '0101'B, '1011'B);
@@ -459,6 +469,52 @@
return false;
}
+private altstep as_reset_ack() runs on BSSMAP_Emulation_CT {
+ var BSSAP_N_UNITDATA_ind ud_ind;
+ [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) -> value ud_ind {
+ log("Respoding to inbound RESET with RESET-ACK");
+ BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,
+ ts_BSSMAP_ResetAck));
+ repeat;
+ }
+}
+
+
+private function f_bssap_wait_for_reset() runs on BSSMAP_Emulation_CT {
+ var BSSAP_N_UNITDATA_ind ud_ind;
+ timer T := 20.0;
+
+ T.start;
+ alt {
+ [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) -> value ud_ind {
+ BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,
+ ts_BSSMAP_ResetAck));
+ }
+ [] as_reset_ack();
+ [] BSSAP.receive {
+ repeat;
+ }
+ [] T.timeout {
+ setverdict(fail);
+ }
+ }
+}
+
+function f_bssap_reset(SCCP_PAR_Address peer, SCCP_PAR_Address own) runs on BSSMAP_Emulation_CT {
+ timer T := 5.0;
+
+ BSSAP.send(ts_BSSAP_UNITDATA_req(peer, own, ts_BSSMAP_Reset(0)));
+ T.start;
+ alt {
+ [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(own, peer, tr_BSSMAP_ResetAck)) {
+ log("Received RESET-ACK in response to RESET, we're ready to go!");
+ }
+ [] as_reset_ack();
+ [] BSSAP.receive { repeat };
+ [] T.timeout { setverdict(fail, "Waiting for RESET-ACK after sending RESET"); }
+ }
+}
+
function main(BssmapOps ops, charstring id) runs on BSSMAP_Emulation_CT {
g_bssmap_id := id;
@@ -466,6 +522,10 @@
f_conn_table_init();
f_expect_table_init();
+ if (isvalue(ops.sccp_addr_peer) and isvalue(ops.sccp_addr_local)) {
+ f_bssap_reset(ops.sccp_addr_peer, ops.sccp_addr_local);
+ }
+
while (true) {
var BSSAP_N_UNITDATA_ind ud_ind;
var BSSAP_N_CONNECT_ind conn_ind;