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]>
