laforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/42024?usp=email )
Change subject: RAN_Emulation: Assume SCCP peer available if rx BSSAP/RANAP Reset ......................................................................
RAN_Emulation: Assume SCCP peer available if rx BSSAP/RANAP Reset
This way we speed up tests, and also avoid extra verbosity by avoiding receiving and transmitting extra RESET.
Change-Id: Id9020320b61d89720e17e1024b629f0227445266 --- M bsc/BSC_Tests.ttcn M library/RAN_Emulation.ttcnpp M msc/MSC_Tests.ttcn 3 files changed, 58 insertions(+), 11 deletions(-)
Approvals: fixeria: Looks good to me, but someone else must approve Jenkins Builder: Verified laforge: Looks good to me, approved
diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn index 6b3aa96..a9d063d 100644 --- a/bsc/BSC_Tests.ttcn +++ b/bsc/BSC_Tests.ttcn @@ -1219,14 +1219,20 @@ connect(self:SCCPLITE_IPA_CTRL, g_bssap[bssap_idx].vc_RAN:CTRL_CLIENT); f_ran_adapter_start(g_bssap[bssap_idx]); } else { + var boolean rx_reset; f_sccp_adapter_init(g_bssap[bssap_idx].sccpa, mp_bssap_cfg[bssap_idx].sccp, "VirtMSC"); if (isbound(g_bssap[bssap_idx].sccpa.vc_IPA)) { connect(self:SCCPLITE_IPA_CFG_PORT[bssap_idx], g_bssap[bssap_idx].sccpa.vc_IPA:CFG_PORT); } connect(self:BSSAP, g_bssap[bssap_idx].sccpa.vc_SCCP:SCCP_SP_PORT); f_sccp_adapter_start(g_bssap[bssap_idx].sccpa); - f_bssap_wait_sccp_peer_available(BSSAP, bit2int(g_bssap[bssap_idx].sccpa.sccp_addr_peer.signPointCode)); - f_legacy_bssap_reset(); + rx_reset := f_bssap_wait_sccp_peer_available(BSSAP, + g_bssap[bssap_idx].sccpa.sccp_addr_peer, + g_bssap[bssap_idx].sccpa.sccp_addr_own, + g_osmux_enabled_cn and g_bssap[bssap_idx].sccpa.cfg.transport == SCCP_TRANSPORT_SIGTRAN); + if (not rx_reset) { + f_legacy_bssap_reset(); + } } }
diff --git a/library/RAN_Emulation.ttcnpp b/library/RAN_Emulation.ttcnpp index d308355..f3eea3e 100644 --- a/library/RAN_Emulation.ttcnpp +++ b/library/RAN_Emulation.ttcnpp @@ -1387,11 +1387,18 @@ }
#ifdef RAN_EMULATION_BSSAP -function f_bssap_wait_sccp_peer_available(BSSAP_CODEC_PT pt, integer peer_pc, float timeout_sec := 3.0) +/* returns true if upper layer (RANAP) is also ready (RESET received and acked) */ +function f_bssap_wait_sccp_peer_available(BSSAP_CODEC_PT pt, + SCCP_PAR_Address addr_peer, + template (present) SCCP_PAR_Address addr_local := ?, + boolean append_osmux_support := false, + float timeout_sec := 3.0) return boolean { timer T; var ASP_SCCP_N_PCSTATE_ind n_pcstate_ind; + var BSSAP_N_UNITDATA_ind ud_ind; var boolean rx_explicit_down := false; + var integer peer_pc := bit2int(addr_peer.signPointCode);
log("Waiting for SCCP peer PC=", peer_pc, " to become available"); T.start(timeout_sec); @@ -1408,12 +1415,20 @@ log("SCCP peer PC=", aff_pc," is now available"); /* All peer is available, we are done */ T.stop; - return; + return false; } log("SCCP peer PC=", aff_pc," is NOT available: ", n_pcstate_ind); rx_explicit_down := true; repeat; } + [] pt.receive(tr_BSSAP_UNITDATA_ind(addr_local, addr_peer, tr_BSSMAP_Reset(append_osmux_support))) -> value ud_ind { + log("Waiting for SCCP peer PC=", peer_pc, ": Rx BSSMAP RANAP RESET, ACKing"); + pt.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress, + ts_BSSMAP_ResetAck(append_osmux_support))); + /* Peer is available on BSSAP, so it must also be available on SCCP; done. */ + T.stop; + return true; + } [] pt.receive { log("Waiting for SCCP peer PC=", peer_pc, ": Discarding message"); repeat; @@ -1428,15 +1443,23 @@ } } log("Done waiting for SCCP peer PC=", peer_pc); + return false; } #endif
#ifdef RAN_EMULATION_RANAP -function f_ranap_wait_sccp_peer_available(RANAP_CODEC_PT pt, integer peer_pc, float timeout_sec := 3.0) +/* returns true if upper layer (RANAP) is also ready (RESET received and acked) */ +private function f_ranap_wait_sccp_peer_available(RANAP_CODEC_PT pt, + SCCP_PAR_Address addr_peer, + template (present) SCCP_PAR_Address addr_local := ?, + template (value) GlobalRNC_ID grnc_id, + float timeout_sec := 3.0) return boolean { timer T; var ASP_SCCP_N_PCSTATE_ind n_pcstate_ind; + var RANAP_N_UNITDATA_ind rud_ind; var boolean rx_explicit_down := false; + var integer peer_pc := bit2int(addr_peer.signPointCode);
log("Waiting for SCCP peer PC=", peer_pc, " to become available"); T.start(timeout_sec); @@ -1453,12 +1476,22 @@ log("SCCP peer PC=", aff_pc," is now available"); /* All peer is available, we are done */ T.stop; - return; + return false; } log("SCCP peer PC=", aff_pc," is NOT available: ", n_pcstate_ind); rx_explicit_down := true; repeat; } + [] pt.receive(tr_RANAP_UNITDATA_ind(addr_local, addr_peer, tr_RANAP_Reset)) -> value rud_ind { + log("Waiting for SCCP peer PC=", peer_pc, ": Rx Iu RANAP RESET, ACKing"); + var CN_DomainIndicator dom; + dom := rud_ind.userData.initiatingMessage.value_.Reset.protocolIEs[1].value_.cN_DomainIndicator; + pt.send(ts_RANAP_UNITDATA_req(rud_ind.callingAddress, rud_ind.calledAddress, + f_ts_RANAP_ResetAck(dom, grnc_id))); + /* Peer is available on RANAP, so it must also be available on SCCP; done. */ + T.stop; + return true; + } [] pt.receive { log("Waiting for SCCP peer PC=", peer_pc, ": Discarding message"); repeat; @@ -1473,6 +1506,7 @@ } } log("Done waiting for SCCP peer PC=", peer_pc); + return false; } #endif
@@ -1484,21 +1518,26 @@ f_expect_table_init();
if (isvalue(ops.sccp_addr_peer) and isvalue(ops.sccp_addr_local)) { + var boolean received_reset := false; select (g_ran_ops.protocol) { #ifdef RAN_EMULATION_BSSAP case (RAN_PROTOCOL_BSSAP) { if (ispresent(ops.sccp_addr_peer.signPointCode)) { - f_bssap_wait_sccp_peer_available(BSSAP, bit2int(ops.sccp_addr_peer.signPointCode)); + received_reset := f_bssap_wait_sccp_peer_available(BSSAP, ops.sccp_addr_peer, ops.sccp_addr_local, append_osmux_ie()); } - f_bssap_reset(ops.sccp_addr_peer, ops.sccp_addr_local); + if (not received_reset) { + f_bssap_reset(ops.sccp_addr_peer, ops.sccp_addr_local); + } } #endif #ifdef RAN_EMULATION_RANAP case (RAN_PROTOCOL_RANAP) { if (ispresent(ops.sccp_addr_peer.signPointCode)) { - f_ranap_wait_sccp_peer_available(RANAP, bit2int(ops.sccp_addr_peer.signPointCode)); + received_reset := f_ranap_wait_sccp_peer_available(RANAP, ops.sccp_addr_peer, ops.sccp_addr_local, ops.grnc_id); } - f_ranap_reset(ops.sccp_addr_peer, ops.sccp_addr_local, ops.grnc_id); + if (not received_reset) { + f_ranap_reset(ops.sccp_addr_peer, ops.sccp_addr_local, ops.grnc_id); + } } #endif } diff --git a/msc/MSC_Tests.ttcn b/msc/MSC_Tests.ttcn index 51d8755..5464355 100644 --- a/msc/MSC_Tests.ttcn +++ b/msc/MSC_Tests.ttcn @@ -2310,7 +2310,9 @@ f_init_bssap_direct();
f_sccp_adapter_start(g_bssap[0].sccpa); - f_bssap_wait_sccp_peer_available(BSSAP_DIRECT, bit2int(g_bssap[0].sccpa.sccp_addr_peer.signPointCode)); + f_bssap_wait_sccp_peer_available(BSSAP_DIRECT, + g_bssap[0].sccpa.sccp_addr_peer, + g_bssap[0].sccpa.sccp_addr_own);
/* Make a blind connection attemt, to trigger the deadlock condition */ BSSAP_DIRECT.send(ts_BSSAP_CONNECT_req(g_bssap[0].sccpa.sccp_addr_peer, g_bssap[0].sccpa.sccp_addr_own, 1, omit));