Review at  https://gerrit.osmocom.org/5955

MSC_Tests: Integrate MNCC, GSUP, BSSAP connection handler, ...

Change-Id: I7bb6660c6b6cef81533f0fbb5e735f08ed275b8c
---
A msc_tests/BSC_ConnectionHandler.ttcn
M msc_tests/MSC_Tests.ttcn
M msc_tests/gen_links.sh
3 files changed, 291 insertions(+), 96 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks 
refs/changes/55/5955/1

diff --git a/msc_tests/BSC_ConnectionHandler.ttcn 
b/msc_tests/BSC_ConnectionHandler.ttcn
new file mode 100644
index 0000000..cc3e2e8
--- /dev/null
+++ b/msc_tests/BSC_ConnectionHandler.ttcn
@@ -0,0 +1,122 @@
+module BSC_ConnectionHandler {
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from GSM_Types all;
+import from SCCPasp_Types all;
+import from BSSAP_Types all;
+import from BSSMAP_Emulation all;
+import from BSSMAP_Templates all;
+
+import from GSUP_Types all;
+import from GSUP_Emulation all;
+
+import from MNCC_Types all;
+import from MNCC_Emulation all;
+
+import from MobileL3_Types all;
+import from MobileL3_CommonIE_Types all;
+import from L3_Templates all;
+
+/* this component represents a single subscriber connection */
+type component BSC_ConnHdlr extends BSSAP_ConnHdlr, MNCC_ConnHdlr, 
GSUP_ConnHdlr {
+}
+
+/* Callback function from general BSSMAP_Emulation whenever a connectionless
+ * BSSMAP message arrives. Canreturn a PDU_BSSAPthat should be sent in return 
*/
+private function BscUnitdataCallback(PDU_BSSAP bssap)
+runs on BSSMAP_Emulation_CT return template PDU_BSSAP {
+       var template PDU_BSSAP resp := omit;
+
+       log("BSSMAP_BscUnitdataCallback");
+       /* answer all RESET with RESET ACK */
+       if (match(bssap, tr_BSSMAP_Reset)){
+               log("BSSMAP_BscUnitdataCallback: Responding to RESET with 
RESET-ACK");
+               resp := ts_BSSMAP_ResetAck;
+       }
+
+       /* FIXME: Handle paging, etc. */
+       return resp;
+}
+
+const BssmapOps BSC_BssmapOps := {
+       /* Create call-back for inbound connections from MSC (hand-over) */
+       create_cb := refers(BSSMAP_Emulation.ExpectedCreateCallback),
+       unitdata_cb := refers(BscUnitdataCallback)
+}
+
+
+private function MnccUnitdataCallback(MNCC_PDU mncc)
+runs on MNCC_Emulation_CT return template MNCC_PDU {
+       log("Ignoring MNCC", mncc);
+       return omit;
+}
+
+const MnccOps BCC_MnccOps := {
+       create_cb := refers(MNCC_Emulation.ExpectedCreateCallback),
+       unitdata_cb := refers(MnccUnitdataCallback)
+}
+
+
+
+template BSSAP_Conn_Req ts_BSSAP_Conn_Req(SCCP_PAR_Address peer, 
SCCP_PAR_Address own, PDU_BSSAP bssap) := {
+       addr_peer := peer,
+       addr_own := own,
+       bssap := bssap
+};
+
+template (value) MobileStationClassmark1_V ts_CM1(BIT1 a5_1_unavail := '0'B, 
BIT2 rev := '10'B) := {
+       rf_PowerCapability := '010'B,
+       a5_1 := a5_1_unavail,
+       esind := '1'B,
+       revisionLevel := rev,
+       spare1_1 := '0'B
+}
+
+function f_establish_fully(SCCP_PAR_Address sccp_addr_peer, SCCP_PAR_Address 
sccp_addr_own)
+runs on BSC_ConnHdlr {
+
+       var hexstring imsi := '26242012345678'H;
+       var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(imsi));
+       var LocationAreaIdentification_V old_lai := { '62F220'O, '9999'O };
+       var BSSMAP_IE_CellIdentifier cell_id := valueof(ts_CellId_CGI('262'H, 
'042'H, 23,42));
+       var PDU_ML3_MS_NW l3_info := 
valueof(ts_ML3_MO_LU_Req(valueof(ts_ML3_IE_LuType_Attach),
+                                                             old_lai, mi, 
valueof(ts_CM1)));
+       var octetstring l3_enc := enc_PDU_ML3_MS_NW(l3_info);
+
+       /* tell GSUP dispatcher to send this IMSI to us */
+       f_create_gsup_expect(hex2str(imsi));
+
+       log("Sending COMPL L3", l3_info);
+       /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
+       BSSAP.send(ts_BSSAP_Conn_Req(sccp_addr_peer, sccp_addr_own,
+                                    valueof(ts_BSSMAP_ComplL3(cell_id, 
l3_enc))));
+
+       GSUP.receive(tr_GSUP_UL_REQ(imsi));
+       GSUP.send(ts_GSUP_UL_RES(imsi));
+
+}
+
+function f_foo() runs on BSC_ConnHdlr{
+       /* SCCP CC handled by BSSMAP_Emulation_CT.main() */
+       /* Expect auth, if enabled */
+
+       /* TODO: ISD */
+       /* Expect encr, if enabled */
+       /* Expect encr, if enabled */
+       /* Expect ASS CMD, if chan_type != requested */
+       /* Send ASS CMPL in successful case */
+
+       /* Expect AoIP port/ip information for RTP stream */
+       /* Expect MSC-originated MGCP to our simulated MGW */
+       /* Verify Counters via CTRL */
+       /* re-configure MSC behaviour via VTY */
+}
+
+
+
+
+
+}
+
+
diff --git a/msc_tests/MSC_Tests.ttcn b/msc_tests/MSC_Tests.ttcn
index adb9453..de65b0b 100644
--- a/msc_tests/MSC_Tests.ttcn
+++ b/msc_tests/MSC_Tests.ttcn
@@ -16,112 +16,104 @@
 import from SCTPasp_Types all;
 import from SCTPasp_PortType all;
 
+import from Osmocom_CTRL_Functions all;
+import from Osmocom_CTRL_Types all;
+import from Osmocom_CTRL_Adapter all;
+
+import from MNCC_Emulation all;
+
+import from GSUP_Emulation all;
+import from IPA_Emulation all;
+
 import from BSSAP_Types all;
+import from BSSAP_Adapter all;
+import from BSSAP_CodecPort all;
+import from BSSMAP_Templates all;
+import from BSC_ConnectionHandler all;
 
-type component MTC_CT {
-       /* M3UA emulation component */
-       var M3UA_CT vc_M3UA;
-       /* SCCP emulation component */
-       var SCCP_CT vc_SCCP;
-       /* test port to SCCP emulation */
-       port SCCPasp_PT SCCP;
+import from MobileL3_Types all;
+import from MobileL3_CommonIE_Types all;
+import from L3_Templates all;
 
-       var octetstring g_sio;
-       var MSC_SCCP_MTP3_parameters g_sccp_pars;
-       var SCCP_PAR_Address g_sccp_addr_own, g_sccp_addr_peer;
 
+type component MTC_CT extends BSSAP_Adapter_CT, CTRL_Adapter_CT {
        var boolean g_initialized := false;
+
+       /* no 'adapter_CT' for MNCC or GSUP */
+       var MNCC_Emulation_CT vc_MNCC;
+       var GSUP_Emulation_CT vc_GSUP;
+       var IPA_Emulation_CT vc_GSUP_IPA;
+
+       /* only to get events from IPA underneath GSUP */
+       port IPA_CTRL_PT GSUP_IPA_EVENT;
 }
 
 modulepar {
-       charstring mp_sccp_service_type := "mtp3_itu";
+       /* remote parameters of IUT */
+       charstring mp_msc_ip := "127.0.0.1";
+       integer mp_msc_ctrl_port := 4255;
+       integer mp_msc_vty_port := 4254;
 
-       SCTP_Association_Address mp_sctp_addr := { 22905, "127.0.0.1", 2905, 
"127.0.0.1" };
-       integer mp_own_pc := 196;
-       integer mp_own_ssn := 254;
+       /* local parameters of emulated HLR */
+       charstring mp_hlr_ip := "127.0.0.1";
+       integer mp_hlr_port := 4222;
 
-       integer mp_peer_pc := 185;      /* 0.23.1 */
-       integer mp_peer_ssn := 254;
+       charstring mp_msc_mncc := "/tmp/mncc";
 }
 
 
-/* construct a SCCP_PAR_Address with just PC + SSN and no GT */
-template (value) SCCP_PAR_Address ts_SccpAddr_PC_SSN(integer pc, integer ssn) 
:= {
-       addressIndicator := {
-               pointCodeIndic := '1'B,
-               ssnIndicator := '1'B,
-               globalTitleIndic := '0000'B,
-               routingIndicator := '1'B
-       },
-       signPointCode := SCCP_SPC_int2bit(pc, mp_sccp_service_type, '83'O),
-       //signPointCode := SCCP_SPC_int2bit(pc, mp_sccp_service_type, g_sio),
-       subsystemNumber := ssn,
-       globalTitle := omit
+function f_init_mncc(charstring id) runs on MTC_CT {
+       id := id & "-MNCC";
+       var MnccOps ops := {
+               create_cb := refers(MNCC_Emulation.ExpectedCreateCallback),
+               unitdata_cb := refers(MNCC_Emulation.DummyUnitdataCallback)
+       }
+
+       vc_MNCC := MNCC_Emulation_CT.create(id);
+       map(vc_MNCC:MNCC, system:MNCC_CODEC_PT);
+       vc_MNCC.start(MNCC_Emulation.main(ops, id, mp_msc_mncc));
 }
 
-function init_pars() runs on MTC_CT {
-       g_sio := '83'O;
-       g_sccp_pars := {
-               sio := {
-                       ni := substr(oct2bit(g_sio),0,2),
-                       prio := substr(oct2bit(g_sio),2,2),
-                       si := substr(oct2bit(g_sio),4,4)
-               },
-               opc := mp_own_pc,
-               dpc := mp_peer_pc,
-               sls := 0,
-               sccp_serviceType := mp_sccp_service_type,
-               ssn := mp_own_ssn
-       };
-       g_sccp_addr_own := valueof(ts_SccpAddr_PC_SSN(mp_own_pc, mp_own_ssn));
-       g_sccp_addr_peer := valueof(ts_SccpAddr_PC_SSN(mp_peer_pc, 
mp_peer_ssn));
+function f_init_gsup(charstring id) runs on MTC_CT {
+       id := id & "-GSUP";
+       var GsupOps ops := {
+               create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
+       }
+
+       vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
+       vc_GSUP := GSUP_Emulation_CT.create(id);
+
+       map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
+       connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
+       /* we use this hack to get events like ASP_IPA_EVENT_UP */
+       connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
+
+       vc_GSUP.start(GSUP_Emulation.main(ops, id));
+       vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
+
+       /* wait for incoming connection to GSUP port before proceeding */
+       timer T := 10.0;
+       T.start;
+       alt {
+               [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { 
}
+               [] T.timeout {
+                       setverdict(inconc, "No connection to GSUP Port");
+                       self.stop
+               }
+       }
 }
 
-function init() runs on MTC_CT {
+function f_init() runs on MTC_CT {
 
        if (g_initialized == true) {
                return;
        }
        g_initialized := true;
 
-       init_pars();
-
-       /* Create components */
-       vc_M3UA := M3UA_CT.create;
-       vc_SCCP := SCCP_CT.create;
-
-       /* connect system SCTP port to M3UA lower side */
-       map(vc_M3UA:SCTP_PORT, system:sctp);
-
-       /* connect MTP3 service provider to SCCP MTP3 port */
-       connect(vc_M3UA:MTP3_SP_PORT, vc_SCCP:MTP3_SCCP_PORT);
-
-       /* connect test suite to SCCP service provider port */
-       connect(self:SCCP, vc_SCCP:SCCP_SP_PORT);
-
-       vc_M3UA.start(f_M3UA_Emulation(mp_sctp_addr));
-       vc_SCCP.start(SCCPStart(g_sccp_pars));
-
-}
-
-function terminate() runs on MTC_CT {
-
-       disconnect(self:SCCP, vc_SCCP:SCCP_SP_PORT);
-       disconnect(vc_M3UA:MTP3_SP_PORT, vc_SCCP:MTP3_SCCP_PORT);
-       unmap(vc_M3UA:SCTP_PORT, system:sctp);
-
-       all component.stop;
-
-       self.stop;
-}
-
-testcase TC_nothing() runs on MTC_CT {
-       init();
-
-       timer T := 30.0;
-       T.start;
-       T.timeout;
-
+       f_bssap_init("MSC_Test", BSC_BssmapOps);
+       f_ipa_ctrl_start(mp_msc_ip, mp_msc_ctrl_port);
+       f_init_mncc("MSC_Test");
+       f_init_gsup("MSC_Test");
 }
 
 template PDU_BSSAP ts_BSSAP_BSSMAP := {
@@ -290,30 +282,111 @@
 //     enc_PDU_BSSAP
 
 function f_send_BSSAP_UNITDATA(template PDU_BSSAP bssap) runs on MTC_CT {
-       SCCP.send(t_ASP_N_UNITDATA_req(g_sccp_addr_peer, g_sccp_addr_own, 
'00000001'B, '00000001'B,
-                                       enc_PDU_BSSAP(valueof(bssap)), omit))
+       BSSAP.send(ts_BSSAP_UNITDATA_req(g_sccp_addr_peer, g_sccp_addr_own, 
bssap))
 }
 
-testcase TC_reset() runs on MTC_CT {
-       init();
+type record BSC_ConnHdlrPars {
+       SCCP_PAR_Address sccp_addr_own,
+       SCCP_PAR_Address sccp_addr_peer
+};
 
-       timer T := 2.0;
+type function void_fn(charstring id, BSC_ConnHdlrPars pars) runs on 
BSC_ConnHdlr;
+
+/* FIXME: move into BSC_ConnectionHandler? */
+function f_start_handler(void_fn fn, charstring id) runs on MTC_CT return 
BSC_ConnHdlr {
+       var BSC_ConnHdlr vc_conn;
+       var BSC_ConnHdlrPars pars := {
+               sccp_addr_own := g_sccp_addr_own,
+               sccp_addr_peer := g_sccp_addr_peer
+       };
+
+       vc_conn := BSC_ConnHdlr.create(id);
+       /* BSSMAP part / A interface */
+       connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);
+       connect(vc_conn:BSSAP_PROC, vc_BSSMAP:PROC);
+       /* MNCC part */
+       connect(vc_conn:MNCC, vc_MNCC:MNCC_CLIENT);
+       connect(vc_conn:MNCC_PROC, vc_MNCC:MNCC_PROC);
+       /* GSUP part */
+       connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
+       connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
+
+       vc_conn.start(derefers(fn)(id, pars));
+       return vc_conn;
+}
+
+function f_sleep(float seconds) {
+       timer T := seconds;
        T.start;
        T.timeout;
+}
 
-       f_send_BSSAP_UNITDATA(ts_BSSMAP_Reset(0));
+private function f_tc_foo(charstring id, BSC_ConnHdlrPars pars) runs on 
BSC_ConnHdlr {
+       f_establish_fully(pars.sccp_addr_peer, pars.sccp_addr_own);
+       f_sleep(30.0);
+}
+
+testcase TC_nothing() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+
+       f_init();
+
+       vc_conn := f_start_handler(refers(f_tc_foo), testcasename());
+       vc_conn.done;
+}
+
+
+private function f_tc_cmserv_imsi_unknown(charstring id, BSC_ConnHdlrPars pars)
+runs on BSC_ConnHdlr {
+
+       var hexstring imsi := '262430000000000'H;
+       var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(imsi));
+       var BSSMAP_IE_CellIdentifier cell_id := valueof(ts_CellId_CGI('262'H, 
'042'H, 23, 42));
+       var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('0001'B, mi));
+       var octetstring l3_enc := enc_PDU_ML3_MS_NW(l3_info);
+
+       log("Sending COMPL L3", l3_info);
+       /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
+       BSSAP.send(ts_BSSAP_Conn_Req(pars.sccp_addr_peer, pars.sccp_addr_own,
+                                    valueof(ts_BSSMAP_ComplL3(cell_id, 
l3_enc))));
+
+       var PDU_BSSAP bssap_rx;
+       var PDU_ML3_NW_MS l3_rx;
+
+       timer T := 10.0;
        T.start;
        alt {
-               //[] SCCP.receive(tr_BSSMAP_ResetAck) { }
-               [] T.timeout { setverdict(fail); }
+       [] BSSAP.receive(tr_BSSAP_DTAP) -> value bssap_rx {
+               l3_rx := dec_PDU_ML3_NW_MS(bssap_rx.pdu.dtap);
+               if (not match(l3_rx, tr_CM_SERV_REJ)) {
+                       setverdict(fail, "Received unexpeted DTAP/L3");
+               }
+               }
+       [] BSSAP.receive { setverdict(fail, "Received unexpected BSSAP"); }
+       [] T.timeout { setverdict(inconc, "Timeout waiting for CM SERV REQ"); }
        }
 
-       terminate();
+       alt {
+       [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
+               setverdict(pass);
+               }
+       [] BSSAP.receive { setverdict(fail, "Received unexpected BSSAP"); }
+       [] T.timeout { setverdict(inconc, "Timeout waiting for CM SERV REQ"); }
+       }
 }
+
+testcase TC_cmserv_imsi_unknown() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init();
+       vc_conn := f_start_handler(refers(f_tc_cmserv_imsi_unknown), 
testcasename());
+       vc_conn.done;
+}
+
+
 
 
 control {
-       execute( TC_reset() );
+       execute( TC_cmserv_imsi_unknown() );
        execute( TC_nothing() );
 }
 
diff --git a/msc_tests/gen_links.sh b/msc_tests/gen_links.sh
index 7703b52..ef3dc63 100755
--- a/msc_tests/gen_links.sh
+++ b/msc_tests/gen_links.sh
@@ -73,9 +73,9 @@
 
 DIR=../library
 FILES="General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn MNCC_Types.ttcn 
MNCC_EncDec.cc MNCC_CodecPort.ttcn mncc.h MNCC_Emulation.ttcn "
-FILES+="IPA_Types.ttcn IPA_Emulation.ttcn IPA_CodecPort.ttcn 
IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc RSL_Types.ttcn 
GSUP_Types.ttcn "
-FILES+="Osmocom_CTRL_Types.ttcn L3_Templates.ttcn L3_Templates.ttcn "
-FILES+="BSSMAP_Emulation.ttcn BSSAP_CodecPort.ttcn BSSMAP_Templates.ttcn 
MGCP_Types.ttcn MGCP_Templates.ttcn IPA_Emulation.ttcn "
+FILES+="IPA_Types.ttcn IPA_Emulation.ttcn IPA_CodecPort.ttcn 
IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc RSL_Types.ttcn 
GSUP_Types.ttcn GSUP_Emulation.ttcn "
+FILES+="Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn 
Osmocom_CTRL_Adapter.ttcn L3_Templates.ttcn L3_Templates.ttcn "
+FILES+="BSSMAP_Emulation.ttcn BSSAP_CodecPort.ttcn BSSMAP_Templates.ttcn 
BSSAP_Adapter.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn IPA_Emulation.ttcn "
 FILES+="RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunctDef.cc "
 FILES+="MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunctDef.cc "
 gen_links $DIR $FILES

-- 
To view, visit https://gerrit.osmocom.org/5955
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7bb6660c6b6cef81533f0fbb5e735f08ed275b8c
Gerrit-PatchSet: 1
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <lafo...@gnumonks.org>

Reply via email to