pespin has submitted this change. ( 
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/37898?usp=email )

Change subject: s1gw: Split ConnHdlr to its own file
......................................................................

s1gw: Split ConnHdlr to its own file

This allows easily separating general routines from test specific code.

Change-Id: I9f8d9afbccd59f3e22649b35d2a7ef75578d051a
---
A s1gw/ConnHdlr.ttcn
M s1gw/S1GW_Tests.ttcn
2 files changed, 205 insertions(+), 172 deletions(-)

Approvals:
  osmith: Looks good to me, approved
  laforge: Looks good to me, but someone else must approve
  Jenkins Builder: Verified




diff --git a/s1gw/ConnHdlr.ttcn b/s1gw/ConnHdlr.ttcn
new file mode 100644
index 0000000..69c19b6
--- /dev/null
+++ b/s1gw/ConnHdlr.ttcn
@@ -0,0 +1,200 @@
+/* OsmoS1GW (S1AP Gateway) ConnHdlr
+ *
+ * (C) 2024 by sysmocom - s.f.m.c. GmbH <[email protected]>
+ * Author: Vadim Yanitskiy <[email protected]>
+ *
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+module ConnHdlr {
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from Native_Functions all;
+import from IPL4asp_Types all;
+import from Misc_Helpers all;
+
+import from S1AP_CodecPort all;
+import from S1AP_CodecPort_CtrlFunct all;
+import from S1AP_Types all;
+import from S1AP_Templates all;
+import from S1AP_PDU_Descriptions all;
+import from S1AP_IEs all;
+import from S1AP_PDU_Contents all;
+import from S1AP_Constants all;
+
+import from SCTP_Templates all;
+import from S1AP_Server all;
+
+type component ConnHdlr extends S1APSRV_ConnHdlr {
+       port S1AP_CODEC_PT S1AP_ENB;
+       var ConnectionId g_s1ap_conn_id := -1;
+};
+type record of ConnHdlr ConnHdlrList;
+
+type record ConnHdlrPars {
+       Global_ENB_ID genb_id
+};
+
+template Global_ENB_ID
+ts_Global_ENB_ID(integer enb_id := 0,
+                OCT3 plmn_id := '00f110'O) := {
+       pLMNidentity := plmn_id,
+       eNB_ID := {
+               macroENB_ID := int2bit(enb_id, 20)
+       },
+       iE_Extensions := omit
+}
+
+template (value) ConnHdlrPars
+t_ConnHdlrPars(integer enb_id := 0) := {
+       genb_id := ts_Global_ENB_ID(enb_id)
+}
+
+type function void_fn(ConnHdlrPars pars) runs on ConnHdlr;
+
+function f_ConnHdlr_connect(charstring remote_addr) runs on ConnHdlr {
+       var Result res;
+       timer T;
+
+       map(self:S1AP_ENB, system:S1AP_CODEC_PT);
+
+       /* initiate SCTP connection establishment */
+       res := S1AP_CodecPort_CtrlFunct.f_IPL4_connect(S1AP_ENB,
+                                                      remote_addr, 36412,
+                                                      "0.0.0.0", 0, -1,
+                                                      { sctp := 
c_SctpTuple_S1AP });
+       if (not ispresent(res.connId)) {
+               setverdict(fail, "Could not create an S1AP socket, check your 
configuration");
+               mtc.stop;
+       }
+       g_s1ap_conn_id := res.connId;
+
+       /* wait for the establishment confirmation */
+       T.start(2.0);
+       alt {
+       [] S1AP_ENB.receive(tr_SctpAssocChange(SCTP_COMM_UP, g_s1ap_conn_id)) {
+               log("eNB connection established");
+               }
+       [] S1AP_ENB.receive(PortEvent:{sctpEvent := ?}) { repeat; }
+       [] T.timeout {
+               setverdict(fail, "eNB connection establishment timeout");
+               self.stop;
+               }
+       }
+}
+
+function f_ConnHdlr_disconnect() runs on ConnHdlr {
+       var Result res;
+
+       S1AP_CodecPort_CtrlFunct.f_IPL4_close(S1AP_ENB, g_s1ap_conn_id,
+                                             { sctp := c_SctpTuple_S1AP });
+       g_s1ap_conn_id := -1;
+       unmap(self:S1AP_ENB, system:S1AP_CODEC_PT);
+
+       S1AP_CONN.receive(S1APSRV_Event:S1APSRV_EVENT_CONN_DOWN);
+
+       log("eNB connection closed");
+}
+
+function f_ConnHdlr_expect_shutdown() runs on ConnHdlr {
+       S1AP_ENB.receive(tr_SctpShutDownEvent(g_s1ap_conn_id));
+       S1AP_ENB.receive(tr_SctpAssocChange(SCTP_SHUTDOWN_COMP, 
g_s1ap_conn_id));
+       S1AP_ENB.receive(PortEvent:{connClosed := ?});
+}
+
+function f_ConnHdlr_tx_s1ap_from_enb(template (value) S1AP_PDU pdu)
+runs on ConnHdlr {
+       S1AP_ENB.send(t_S1AP_Send(g_s1ap_conn_id, pdu));
+}
+
+function f_ConnHdlr_tx_s1ap_from_mme(template (value) S1AP_PDU pdu)
+runs on ConnHdlr {
+       S1AP_CONN.send(pdu);
+}
+
+function f_ConnHdlr_rx_s1ap_from_enb(out S1AP_PDU pdu,
+                                    template (present) S1AP_PDU tr_pdu := ?,
+                                    float Tval := 0.5)
+runs on ConnHdlr {
+       timer T := Tval;
+
+       T.start;
+       alt {
+       [] S1AP_CONN.receive(tr_pdu) -> value pdu {
+               setverdict(pass);
+               T.stop;
+               }
+       [] S1AP_CONN.receive(S1AP_PDU:?) -> value pdu {
+               setverdict(fail, "Rx unexpected S1AP PDU from eNB: ", pdu);
+               T.stop;
+               }
+       [] T.timeout {
+               setverdict(fail, "Timeout waiting for S1AP PDU from eNB: ", 
tr_pdu);
+               }
+       }
+}
+
+function f_ConnHdlr_rx_s1ap_from_mme(out S1AP_PDU pdu,
+                                    template (present) S1AP_PDU tr_pdu := ?,
+                                    float Tval := 0.5)
+runs on ConnHdlr {
+       var S1AP_RecvFrom recv;
+       timer T := Tval;
+
+       T.start;
+       alt {
+       [] S1AP_ENB.receive(t_S1AP_RecvFrom(tr_pdu)) -> value recv {
+               pdu := recv.msg;
+               setverdict(pass);
+               T.stop;
+               }
+       [] S1AP_ENB.receive(t_S1AP_RecvFrom(?)) -> value recv {
+               pdu := recv.msg;
+               setverdict(fail, "Rx unexpected S1AP PDU from MME: ", pdu);
+               T.stop;
+               }
+       [] T.timeout {
+               setverdict(fail, "Timeout waiting for S1AP PDU from MME: ", 
tr_pdu);
+               }
+       }
+}
+
+function f_ConnHdlr_setup(Global_ENB_ID genb_id) runs on ConnHdlr {
+       var S1AP_PDU pdu;
+       timer T;
+
+       var SupportedTAs supported_tas_dummy := {
+               {
+                       tAC := '0000'O,
+                       broadcastPLMNs := { '00f000'O },
+                       iE_Extensions := omit
+               }
+       };
+
+       f_ConnHdlr_tx_s1ap_from_enb(ts_S1AP_SetupReq(genb_id,
+                                                    supported_tas_dummy,
+                                                    v32));
+       T.start(1.0);
+       alt {
+       [] S1AP_CONN.receive(S1APSRV_Event:S1APSRV_EVENT_CONN_UP) { repeat; }
+       [] S1AP_CONN.receive(tr_S1AP_SetupReq) {
+               setverdict(pass);
+               T.stop;
+               }
+       [] S1AP_CONN.receive(S1AP_PDU:?) -> value pdu {
+               setverdict(fail, "Rx unexpected S1AP PDU: ", pdu);
+               T.stop;
+               }
+       [] T.timeout {
+               setverdict(fail, "Timeout waiting for S1AP SetupReq");
+               }
+       }
+}
+
+}
diff --git a/s1gw/S1GW_Tests.ttcn b/s1gw/S1GW_Tests.ttcn
index 0fb3075..2625799 100644
--- a/s1gw/S1GW_Tests.ttcn
+++ b/s1gw/S1GW_Tests.ttcn
@@ -30,6 +30,7 @@

 import from SCTP_Templates all;
 import from S1AP_Server all;
+import from ConnHdlr all;

 modulepar {
        charstring mp_s1gw_enb_ip;      /* eNB facing address of the S1GW */
@@ -37,13 +38,6 @@
        charstring mp_mme_bind_ip;      /* MME address on which we get 
connections from S1GW */
 }

-private type record of ConnHdlr ConnHdlrList;
-
-type component ConnHdlr extends S1APSRV_ConnHdlr {
-       port S1AP_CODEC_PT S1AP_ENB;
-       var ConnectionId g_s1ap_conn_id := -1;
-};
-
 type component test_CT {
        timer g_Tguard;
        var S1AP_Server_CT vc_S1APSRV;
@@ -55,16 +49,6 @@
        }
 }

-template Global_ENB_ID
-ts_Global_ENB_ID(integer enb_id := 0,
-                OCT3 plmn_id := '00f110'O) := {
-       pLMNidentity := plmn_id,
-       eNB_ID := {
-               macroENB_ID := int2bit(enb_id, 20)
-       },
-       iE_Extensions := omit
-}
-
 function f_init(float Tval := 20.0) runs on test_CT {
        g_Tguard.start(Tval);
        activate(as_Tguard());
@@ -80,17 +64,6 @@
        vc_S1APSRV.start(S1AP_Server.main(cpars));
 }

-type record ConnHdlrPars {
-       Global_ENB_ID genb_id
-};
-
-template (value) ConnHdlrPars
-t_ConnHdlrPars(integer enb_id := 0) := {
-       genb_id := ts_Global_ENB_ID(enb_id)
-}
-
-type function void_fn(ConnHdlrPars pars) runs on ConnHdlr;
-
 function f_ConnHdlr_spawn(void_fn fn, ConnHdlrPars pars)
 runs on test_CT return ConnHdlr {
        var ConnHdlr vc_conn;
@@ -105,150 +78,10 @@
        return vc_conn;
 }

-function f_ConnHdlr_connect() runs on ConnHdlr {
-       var Result res;
-       timer T;
-
-       map(self:S1AP_ENB, system:S1AP_CODEC_PT);
-
-       /* initiate SCTP connection establishment */
-       res := S1AP_CodecPort_CtrlFunct.f_IPL4_connect(S1AP_ENB,
-                                                      mp_s1gw_enb_ip, 36412,
-                                                      "0.0.0.0", 0, -1,
-                                                      { sctp := 
c_SctpTuple_S1AP });
-       if (not ispresent(res.connId)) {
-               setverdict(fail, "Could not create an S1AP socket, check your 
configuration");
-               mtc.stop;
-       }
-       g_s1ap_conn_id := res.connId;
-
-       /* wait for the establishment confirmation */
-       T.start(2.0);
-       alt {
-       [] S1AP_ENB.receive(tr_SctpAssocChange(SCTP_COMM_UP, g_s1ap_conn_id)) {
-               log("eNB connection established");
-               }
-       [] S1AP_ENB.receive(PortEvent:{sctpEvent := ?}) { repeat; }
-       [] T.timeout {
-               setverdict(fail, "eNB connection establishment timeout");
-               self.stop;
-               }
-       }
-}
-
-function f_ConnHdlr_disconnect() runs on ConnHdlr {
-       var Result res;
-
-       S1AP_CodecPort_CtrlFunct.f_IPL4_close(S1AP_ENB, g_s1ap_conn_id,
-                                             { sctp := c_SctpTuple_S1AP });
-       g_s1ap_conn_id := -1;
-       unmap(self:S1AP_ENB, system:S1AP_CODEC_PT);
-
-       S1AP_CONN.receive(S1APSRV_Event:S1APSRV_EVENT_CONN_DOWN);
-
-       log("eNB connection closed");
-}
-
-function f_ConnHdlr_expect_shutdown() runs on ConnHdlr {
-       S1AP_ENB.receive(tr_SctpShutDownEvent(g_s1ap_conn_id));
-       S1AP_ENB.receive(tr_SctpAssocChange(SCTP_SHUTDOWN_COMP, 
g_s1ap_conn_id));
-       S1AP_ENB.receive(PortEvent:{connClosed := ?});
-}
-
-function f_ConnHdlr_tx_s1ap_from_enb(template (value) S1AP_PDU pdu)
-runs on ConnHdlr {
-       S1AP_ENB.send(t_S1AP_Send(g_s1ap_conn_id, pdu));
-}
-
-function f_ConnHdlr_tx_s1ap_from_mme(template (value) S1AP_PDU pdu)
-runs on ConnHdlr {
-       S1AP_CONN.send(pdu);
-}
-
-function f_ConnHdlr_rx_s1ap_from_enb(out S1AP_PDU pdu,
-                                    template (present) S1AP_PDU tr_pdu := ?,
-                                    float Tval := 0.5)
-runs on ConnHdlr {
-       timer T := Tval;
-
-       T.start;
-       alt {
-       [] S1AP_CONN.receive(tr_pdu) -> value pdu {
-               setverdict(pass);
-               T.stop;
-               }
-       [] S1AP_CONN.receive(S1AP_PDU:?) -> value pdu {
-               setverdict(fail, "Rx unexpected S1AP PDU from eNB: ", pdu);
-               T.stop;
-               }
-       [] T.timeout {
-               setverdict(fail, "Timeout waiting for S1AP PDU from eNB: ", 
tr_pdu);
-               }
-       }
-}
-
-function f_ConnHdlr_rx_s1ap_from_mme(out S1AP_PDU pdu,
-                                    template (present) S1AP_PDU tr_pdu := ?,
-                                    float Tval := 0.5)
-runs on ConnHdlr {
-       var S1AP_RecvFrom recv;
-       timer T := Tval;
-
-       T.start;
-       alt {
-       [] S1AP_ENB.receive(t_S1AP_RecvFrom(tr_pdu)) -> value recv {
-               pdu := recv.msg;
-               setverdict(pass);
-               T.stop;
-               }
-       [] S1AP_ENB.receive(t_S1AP_RecvFrom(?)) -> value recv {
-               pdu := recv.msg;
-               setverdict(fail, "Rx unexpected S1AP PDU from MME: ", pdu);
-               T.stop;
-               }
-       [] T.timeout {
-               setverdict(fail, "Timeout waiting for S1AP PDU from MME: ", 
tr_pdu);
-               }
-       }
-}
-
-function f_ConnHdlr_setup(Global_ENB_ID genb_id) runs on ConnHdlr {
-       var S1AP_PDU pdu;
-       timer T;
-
-       var SupportedTAs supported_tas_dummy := {
-               {
-                       tAC := '0000'O,
-                       broadcastPLMNs := { '00f000'O },
-                       iE_Extensions := omit
-               }
-       };
-
-       f_ConnHdlr_tx_s1ap_from_enb(ts_S1AP_SetupReq(genb_id,
-                                                    supported_tas_dummy,
-                                                    v32));
-       T.start(1.0);
-       alt {
-       [] S1AP_CONN.receive(S1APSRV_Event:S1APSRV_EVENT_CONN_UP) { repeat; }
-       [] S1AP_CONN.receive(tr_S1AP_SetupReq) {
-               setverdict(pass);
-               T.stop;
-               }
-       [] S1AP_CONN.receive(S1AP_PDU:?) -> value pdu {
-               setverdict(fail, "Rx unexpected S1AP PDU: ", pdu);
-               T.stop;
-               }
-       [] T.timeout {
-               setverdict(fail, "Timeout waiting for S1AP SetupReq");
-               }
-       }
-}
-
-
 function f_TC_setup(ConnHdlrPars pars) runs on ConnHdlr {
        f_ConnHdlr_register(pars.genb_id);

-       f_ConnHdlr_connect();
+       f_ConnHdlr_connect(mp_s1gw_enb_ip);
        f_ConnHdlr_setup(pars.genb_id);
        f_sleep(0.5); /* keep the connection idle for some time */
        f_ConnHdlr_disconnect();
@@ -287,7 +120,7 @@
 function f_TC_conn_term_by_mme(ConnHdlrPars pars) runs on ConnHdlr {
        f_ConnHdlr_register(pars.genb_id);

-       f_ConnHdlr_connect();
+       f_ConnHdlr_connect(mp_s1gw_enb_ip);
        f_ConnHdlr_setup(pars.genb_id);
        f_sleep(0.5); /* keep the connection idle for some time */

@@ -313,7 +146,7 @@
 /* MME is not available, expect S1GW to terminate the eNB connection */
 function f_TC_conn_term_mme_unavail(ConnHdlrPars pars) runs on ConnHdlr {
        /* establish an eNB connection to the S1GW */
-       f_ConnHdlr_connect();
+       f_ConnHdlr_connect(mp_s1gw_enb_ip);
        /* expect our eNB connection to be released gracefully */
        f_ConnHdlr_expect_shutdown();
        setverdict(pass);
@@ -337,7 +170,7 @@
        var S1AP_PDU pdu;

        f_ConnHdlr_register(pars.genb_id);
-       f_ConnHdlr_connect();
+       f_ConnHdlr_connect(mp_s1gw_enb_ip);
        f_ConnHdlr_setup(pars.genb_id);

        log("eNB -> [S1GW] -> MME: E-RAB SETUP REQUEST");

--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/37898?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: I9f8d9afbccd59f3e22649b35d2a7ef75578d051a
Gerrit-Change-Number: 37898
Gerrit-PatchSet: 2
Gerrit-Owner: pespin <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: osmith <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>

Reply via email to