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));

--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/42024?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Id9020320b61d89720e17e1024b629f0227445266
Gerrit-Change-Number: 42024
Gerrit-PatchSet: 5
Gerrit-Owner: pespin <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <[email protected]>
Gerrit-Reviewer: laforge <[email protected]>

Reply via email to