aboutsummaryrefslogtreecommitdiffstats
path: root/ipa
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-11-23 18:22:10 +0100
committerHarald Welte <laforge@gnumonks.org>2017-11-23 18:23:38 +0100
commitb3414b217219283666e01928e0b193211d2b3159 (patch)
tree23f5d65c3e26ef2114c0bf3444c8f61d4bdfaa0e /ipa
parent365f4edbd8dceb0048b15b43299511db104443da (diff)
ipa: First version that emulates both MSC and BSC up to ASSIGNMENT REQ
Diffstat (limited to 'ipa')
-rw-r--r--ipa/BSC_MS_ConnectionHandler.ttcn105
-rw-r--r--ipa/BSC_MS_Simulation.ttcn77
-rw-r--r--ipa/IPA_Test.ttcn148
-rw-r--r--ipa/MSC_ConnectionHandler.ttcn2
-rwxr-xr-xipa/MSC_Simulation.ttcn59
-rwxr-xr-xipa/gen_links.sh2
6 files changed, 315 insertions, 78 deletions
diff --git a/ipa/BSC_MS_ConnectionHandler.ttcn b/ipa/BSC_MS_ConnectionHandler.ttcn
new file mode 100644
index 00000000..443babee
--- /dev/null
+++ b/ipa/BSC_MS_ConnectionHandler.ttcn
@@ -0,0 +1,105 @@
+module BSC_MS_ConnectionHandler {
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from SCCPasp_Types all;
+import from BSSAP_Types all;
+import from BSSMAP_Emulation all;
+import from BSSMAP_Templates all;
+
+import from MobileL3_Types all;
+import from MobileL3_CommonIE_Types all;
+import from L3_Templates all;
+
+/* this component represents a single subscriber connection at the MSC.
+ * There is a 1:1 mapping between SCCP connections and BSSAP_ConnHdlr components.
+ * We inherit all component variables, ports, functions, ... from BSSAP_ConnHdlr */
+type component BSC_MS_ConnHdlr extends BSSAP_ConnHdlr {
+ /* SCCP Connecction Identifier for the underlying SCCP connection */
+ var integer g_sccp_conn_id;
+}
+
+/* Callback function from general BSSMAP_Emulation whenever a new incoming
+ * SCCP connection arrivces. Must create + start a new component */
+private function CreateCallback(ASP_SCCP_N_CONNECT_ind conn_ind)
+runs on BSSMAP_Emulation_CT return BSSAP_ConnHdlr {
+ log("Incoming SCCP Connection on BSC ?!?");
+ self.stop;
+}
+
+/* Callback function from general BSSMAP_Emulation whenever a connectionless
+ * BSSMAP message arrives. Can retunr a PDU_BSSAP that should be sent in return */
+private function UnitdataCallback(PDU_BSSAP bssap)
+runs on BSSMAP_Emulation_CT return template PDU_BSSAP {
+ var template PDU_BSSAP resp := omit;
+
+ if (match(bssap, tr_BSSMAP_Reset)) {
+ resp := ts_BSSMAP_ResetAck;
+ }
+
+ return resp;
+}
+
+const BssmapOps BSC_MS_BssmapOps := {
+ create_cb := refers(CreateCallback),
+ unitdata_cb := refers(UnitdataCallback)
+}
+
+
+function f_gen_cl3(hexstring imsi) return PDU_BSSAP {
+ var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(imsi));
+ var PDU_ML3_MS_NW l3 := valueof(ts_CM_SERV_REQ('0001'B, mi));
+ var BSSMAP_IE_CellIdentifier cell_id := valueof(ts_CellID_LAC_CI(23, 42));
+ var PDU_BSSAP bssap := valueof(ts_BSSMAP_ComplL3(cell_id, enc_PDU_ML3_MS_NW(l3)));
+ return bssap;
+}
+
+/* main function processing various incoming events */
+function main(SCCP_PAR_Address sccp_addr_own, SCCP_PAR_Address sccp_addr_remote)
+runs on BSC_MS_ConnHdlr {
+ var PDU_BSSAP bssap;
+
+ log("Starting main of BSC_MS_ConnHdlr");
+
+ /* generate and send the Complete Layer3 Info */
+ bssap := f_gen_cl3('901770123456789'H);
+
+ var BSSAP_Conn_Req creq := {
+ addr_peer := sccp_addr_remote,
+ addr_own := sccp_addr_own,
+ bssap := bssap
+ }
+ BSSAP.send(creq);
+
+ while (true) {
+ alt {
+ /* new SCCP-level connection indication from BSC */
+ [] BSSAP.receive(tr_BSSMAP_AssignmentCmd) -> value bssap {
+ /* TODO: Read CIC */
+ /* respond with ASSIGNMENT COMPL */
+ BSSAP.send(ts_BSSMAP_AssignmentComplete(bssap.pdu.bssmap.assignmentRequest.circuitIdentityCode));
+ }
+ /* TODO: CLEAR REQUEST from BSS */
+ /* CLEAR COMMAND from MSC; respond with CLEAR COMPLETE) */
+ [] BSSAP.receive(tr_BSSMAP_ClearCommand) -> value bssap {
+ BSSAP.send(ts_BSSMAP_ClearComplete);
+ /* FIXME: local release? */
+ }
+
+ [] BSSAP.receive(tr_BSSAP_DTAP) -> value bssap {
+ var PDU_ML3_MS_NW l3 := dec_PDU_ML3_MS_NW(bssap.pdu.dtap);
+ log("Unhandled DTAP ", l3);
+ }
+
+ [] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {
+ self.stop;
+ }
+
+ [] BSSAP.receive(PDU_BSSAP:?) -> value bssap {
+ log("Received unhandled SCCP-CO: ", bssap);
+ }
+ }
+ }
+}
+
+}
diff --git a/ipa/BSC_MS_Simulation.ttcn b/ipa/BSC_MS_Simulation.ttcn
new file mode 100644
index 00000000..c33e8484
--- /dev/null
+++ b/ipa/BSC_MS_Simulation.ttcn
@@ -0,0 +1,77 @@
+module BSC_MS_Simulation {
+
+import from IPL4asp_Types all;
+
+import from IPA_Emulation all;
+
+import from SCCP_Types all;
+import from SCCPasp_Types all;
+import from SCCP_Emulation all;
+
+import from BSSMAP_Emulation all;
+
+import from BSC_MS_ConnectionHandler all;
+
+type component BSC_CT {
+ /* component references */
+ var IPA_Emulation_CT vc_IPA;
+ var SCCP_CT vc_SCCP;
+ var BSSMAP_Emulation_CT vc_BSSMAP;
+ /* test port to SCCP emulation */
+ port SCCPasp_PT SCCP;
+
+ var SCCP_PAR_Address g_sccp_addr_own;
+ var SCCP_PAR_Address g_sccp_addr_remote;
+}
+
+function main(charstring remote_ip, PortNumber remote_port,
+ charstring local_ip, PortNumber local_port,
+ MSC_SCCP_MTP3_parameters sccp_pars,
+ SCCP_PAR_Address sccp_addr_own,
+ SCCP_PAR_Address sccp_addr_remote) runs on BSC_CT
+{
+ g_sccp_addr_own := sccp_addr_own;
+ g_sccp_addr_remote := sccp_addr_remote;
+
+ /* create components */
+ vc_IPA := IPA_Emulation_CT.create;
+ vc_SCCP := SCCP_CT.create;
+ vc_BSSMAP := BSSMAP_Emulation_CT.create;
+
+ map(vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
+
+ /* connect MTP3 service provider (IPA) to lower side of SCCP */
+ connect(vc_IPA:MTP3_SP_PORT, vc_SCCP:MTP3_SCCP_PORT);
+
+ /* connect BSSNAP dispatcher to upper side of SCCP */
+ connect(vc_BSSMAP:SCCP, vc_SCCP:SCCP_SP_PORT);
+
+ vc_IPA.start(IPA_Emulation.main_client(remote_ip, remote_port, local_ip, local_port));
+ vc_SCCP.start(SCCPStart(sccp_pars));
+ vc_BSSMAP.start(BSSMAP_Emulation.main(BSC_MS_BssmapOps));
+
+ while (true) {
+ timer T := 5.0;
+ T.start;
+ T.timeout;
+ f_start_BSC_MS();
+ //vc_IPA.MTP3_SP_PORT.send(t_ASP_MTP3_TRANSFERreq_sccp('83'O, 1, 2, 0, '012345'O));
+ }
+
+ vc_IPA.done;
+ vc_BSSMAP.done;
+ vc_SCCP.done
+}
+
+function f_start_BSC_MS() runs on BSC_CT {
+ var BSC_MS_ConnHdlr vc_conn;
+
+ /* start new component */
+ vc_conn := BSC_MS_ConnHdlr.create;
+ /* connect client BSSAP port to BSSAP dispatcher */
+ connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);
+ /* start component */
+ vc_conn.start(BSC_MS_ConnectionHandler.main(g_sccp_addr_own, g_sccp_addr_remote));
+}
+
+}
diff --git a/ipa/IPA_Test.ttcn b/ipa/IPA_Test.ttcn
index 4e87fa68..c8b82053 100644
--- a/ipa/IPA_Test.ttcn
+++ b/ipa/IPA_Test.ttcn
@@ -1,48 +1,58 @@
module IPA_Test {
+import from Osmocom_Types all;
+
import from IPL4asp_Types all;
import from IPA_Emulation all;
+import from MTP3asp_Types all;
+
import from SCCP_Types all;
import from SCCPasp_Types all;
import from SCCP_Emulation all;
-import from MobileL3_Types all;
-import from MobileL3_CommonIE_Types all;
-import from L3_Templates all;
+import from MSC_Simulation all;
+import from BSC_MS_Simulation all;
+
+const integer NUM_MSC := 1;
+const integer NUM_BSC := 1;
+
+type record BscState {
+ BSC_CT BSC,
+ MSC_SCCP_MTP3_parameters sccp_pars,
+ SCCP_PAR_Address sccp_addr_own,
+ SCCP_PAR_Address sccp_addr_peer
+}
-import from BSSAP_Types all;
-import from BSSMAP_Templates all;
+type record MscState {
+ MSC_CT MSC,
+ MSC_SCCP_MTP3_parameters sccp_pars,
+ SCCP_PAR_Address sccp_addr_own
+}
type component test_CT {
- /* component references */
- var IPA_Emulation_CT vc_IPA;
- var SCCP_CT vc_SCCP;
- /* test port to SCCP emulation */
- port SCCPasp_PT SCCP;
+ var MscState msc[NUM_MSC];
+ var BscState bsc[NUM_BSC];
var boolean g_initialized := false;
- var octetstring g_sio;
- var MSC_SCCP_MTP3_parameters g_sccp_pars;
- var SCCP_PAR_Address g_sccp_addr_own, g_sccp_addr_peer;
-
- var ConnectionId g_ipa_conn_id := -1;
+ var octetstring g_sio := '83'O;
}
modulepar {
- PortNumber mp_local_port := 0;
- charstring mp_local_ip := "127.0.0.1";
- PortNumber mp_remote_port := 3002;
- charstring mp_remote_ip := "127.0.0.1";
+ PortNumber mp_bsc_port := 49999;
+ charstring mp_bsc_ip := "127.0.0.1";
+
+ PortNumber mp_msc_port := 5000;
+ charstring mp_msc_ip := "127.0.0.1";
charstring mp_sccp_service_type := "mtp3_itu";
- integer mp_own_pc := 196;
- integer mp_own_ssn := 254;
+ integer mp_bsc_pc := 196;
+ integer mp_bsc_ssn := 254;
- integer mp_peer_pc := 185; /* 0.23.1 */
- integer mp_peer_ssn := 254;
+ integer mp_msc_pc := 185; /* 0.23.1 */
+ integer mp_msc_ssn := 254;
}
/* construct a SCCP_PAR_Address with just PC + SSN and no GT */
@@ -59,76 +69,62 @@ template (value) SCCP_PAR_Address ts_SccpAddr_PC_SSN(integer pc, integer ssn) :=
globalTitle := omit
}
-
-function f_gen_cl3() return PDU_BSSAP {
- var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV('901770123456789'H));
- var PDU_ML3_MS_NW l3 := valueof(ts_CM_SERV_REQ('0001'B, mi));
- var BSSMAP_IE_CellIdentifier cell_id := valueof(ts_CellID_LAC_CI(23, 42));
- var PDU_BSSAP bssap := valueof(ts_BSSMAP_ComplL3(cell_id, enc_PDU_ML3_MS_NW(l3)));
- return bssap;
+template MTP3_Field_sio ts_sio(octetstring sio_in) := {
+ ni := substr(oct2bit(sio_in),0,2),
+ prio := substr(oct2bit(sio_in),2,2),
+ si := substr(oct2bit(sio_in),4,4)
}
-function f_send_bssap_cc(PDU_BSSAP bssap) runs on test_CT {
- var ASP_SCCP_N_CONNECT_req prim;
- prim := valueof(t_ASP_N_CONNECT_req(g_sccp_addr_peer, g_sccp_addr_own, omit, omit,
- enc_PDU_BSSAP(bssap), 23, omit));
- SCCP.send(prim);
+template MSC_SCCP_MTP3_parameters ts_SCCP_Pars(octetstring sio, integer opc, integer dpc,
+ integer local_ssn) := {
+ sio := ts_sio(sio),
+ opc := opc,
+ dpc := dpc,
+ sls := 0,
+ sccp_serviceType := mp_sccp_service_type,
+ ssn := local_ssn
+};
+
+function f_init_BscState(inout BscState bsc_st, integer opc, integer dpc, integer local_ssn, integer remote_ssn)
+runs on test_CT {
+ bsc_st.sccp_pars := valueof(ts_SCCP_Pars(g_sio, opc, dpc, local_ssn));
+ bsc_st.sccp_addr_own := valueof(ts_SccpAddr_PC_SSN(opc, local_ssn));
+ bsc_st.sccp_addr_peer := valueof(ts_SccpAddr_PC_SSN(dpc, remote_ssn));
}
-function init_pars() runs on test_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_MscState(inout MscState msc_st, integer opc, integer dpc, integer local_ssn, integer remote_ssn)
+runs on test_CT {
+ msc_st.sccp_pars := valueof(ts_SCCP_Pars(g_sio, opc, dpc, local_ssn));
+ msc_st.sccp_addr_own := valueof(ts_SccpAddr_PC_SSN(opc, local_ssn));
}
-private function f_init() runs on test_CT {
- var Result res;
+function f_init() runs on test_CT {
+ var integer i;
- if (g_initialized == true) {
- return;
+ for (i := 0; i < NUM_MSC; i := i+1) {
+ f_init_MscState(msc[i], mp_msc_pc +i, mp_bsc_pc, mp_msc_ssn, mp_bsc_ssn);
+ msc[i].MSC := MSC_CT.create;
+ msc[i].MSC.start(MSC_Simulation.main(mp_msc_ip, mp_msc_port + i, msc[i].sccp_pars, msc[i].sccp_addr_own));
}
- g_initialized := true;
-
- init_pars();
-
- /* create components */
- vc_IPA := IPA_Emulation_CT.create;
- vc_SCCP := SCCP_CT.create;
-
- map(vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
- /* connect MTP3 service provider (IPA) to lower side of SCCP */
- connect(vc_IPA:MTP3_SP_PORT, vc_SCCP:MTP3_SCCP_PORT);
-
- /* connect us to upper side of SCCP */
- connect(self:SCCP, vc_SCCP:SCCP_SP_PORT);
-
- vc_IPA.start(IPA_Emulation.ScanEvents());
- vc_SCCP.start(SCCPStart(g_sccp_pars));
+ for (i := 0; i < NUM_BSC; i := i+1) {
+ f_init_BscState(bsc[i], mp_bsc_pc +i, mp_msc_pc, mp_bsc_ssn, mp_msc_ssn);
+ bsc[i].BSC := BSC_CT.create;
+ bsc[i].BSC.start(BSC_MS_Simulation.main(mp_msc_ip, mp_msc_port, mp_bsc_ip, mp_bsc_port+i,
+ bsc[i].sccp_pars, bsc[i].sccp_addr_own,
+ bsc[i].sccp_addr_peer));
+ }
- //IPA_Emulation.f_connect(mp_remote_ip, mp_remote_port, mp_local_ip, mp_local_port);
}
testcase TC_recv_dump() runs on test_CT {
f_init();
- var PDU_BSSAP bssap := f_gen_cl3();
- f_send_bssap_cc(bssap);
+ //var PDU_BSSAP bssap := f_gen_cl3();
+ //f_send_bssap_cc(bssap);
while (true) {
- SCCP.receive;
+ //SCCP.receive;
}
}
diff --git a/ipa/MSC_ConnectionHandler.ttcn b/ipa/MSC_ConnectionHandler.ttcn
index 0d7cd20b..9cec5562 100644
--- a/ipa/MSC_ConnectionHandler.ttcn
+++ b/ipa/MSC_ConnectionHandler.ttcn
@@ -52,7 +52,7 @@ const BssmapOps MSC_BssmapOps := {
/* main function processing various incoming events */
function main(integer connection_id, integer timeslot) runs on MSC_ConnHdlr {
g_sccp_conn_id := connection_id;
- g_e1_timeslot := timeslot
+ g_e1_timeslot := 1; /* FIXME */
while (true) {
var PDU_BSSAP bssap;
diff --git a/ipa/MSC_Simulation.ttcn b/ipa/MSC_Simulation.ttcn
new file mode 100755
index 00000000..8c941884
--- /dev/null
+++ b/ipa/MSC_Simulation.ttcn
@@ -0,0 +1,59 @@
+module MSC_Simulation {
+
+import from IPL4asp_Types all;
+
+import from IPA_Emulation all;
+
+import from SCCP_Types all;
+import from SCCPasp_Types all;
+import from SCCP_Emulation all;
+
+/*
+import from MobileL3_Types all;
+import from MobileL3_CommonIE_Types all;
+import from L3_Templates all;
+
+import from BSSAP_Types all;
+import from BSSMAP_Templates all;
+*/
+import from BSSMAP_Emulation all;
+
+import from MSC_ConnectionHandler all;
+
+type component MSC_CT {
+ /* component references */
+ var IPA_Emulation_CT vc_IPA;
+ var SCCP_CT vc_SCCP;
+ var BSSMAP_Emulation_CT vc_BSSMAP;
+ /* test port to SCCP emulation */
+ port SCCPasp_PT SCCP;
+}
+
+function main(charstring local_ip, PortNumber local_port,
+ MSC_SCCP_MTP3_parameters sccp_pars,
+ SCCP_PAR_Address sccp_addr_own) runs on MSC_CT
+{
+ /* create components */
+ vc_IPA := IPA_Emulation_CT.create;
+ vc_SCCP := SCCP_CT.create;
+ vc_BSSMAP := BSSMAP_Emulation_CT.create;
+
+ map(vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
+
+ /* connect MTP3 service provider (IPA) to lower side of SCCP */
+ connect(vc_IPA:MTP3_SP_PORT, vc_SCCP:MTP3_SCCP_PORT);
+
+ /* connect BSSNAP dispatcher to upper side of SCCP */
+ connect(vc_BSSMAP:SCCP, vc_SCCP:SCCP_SP_PORT);
+
+ vc_IPA.start(IPA_Emulation.main_server(local_ip, local_port));
+ vc_SCCP.start(SCCPStart(sccp_pars));
+ vc_BSSMAP.start(BSSMAP_Emulation.main(MSC_BssmapOps));
+
+ /* wait until termination of respective components */
+ vc_IPA.done;
+ vc_BSSMAP.done;
+ vc_SCCP.done;
+}
+
+}
diff --git a/ipa/gen_links.sh b/ipa/gen_links.sh
index d9bc7a4f..be11ec05 100755
--- a/ipa/gen_links.sh
+++ b/ipa/gen_links.sh
@@ -47,5 +47,5 @@ gen_links $DIR $FILES
DIR=../library
-FILES="General_Types.ttcn Osmocom_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc L3_Templates.ttcn BSSMAP_Templates.ttcn"
+FILES="General_Types.ttcn Osmocom_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcn L3_Templates.ttcn BSSMAP_Templates.ttcn BSSMAP_Emulation.ttcn"
gen_links $DIR $FILES