Rename BSSMAP_Emulation -> RAN_Emulation
So far, BSSMAP_Emulation supported only a transport over BSSMAP. However, we soon intend to merge support for RANAP in order to simulate RANAP/Iu connections as well as BSSMAP. Let's start by renaming some of the existing types/functions/ports/modules without introducing any functional changes just yet. Related: OS#2857, OS#2856 Change-Id: Iecbcb0c6c136baad9460eca40606bb4010d8882d
This commit is contained in:
parent
408a7ef9fc
commit
6811d10af7
|
@ -5,7 +5,7 @@ import from Osmocom_Types all;
|
||||||
import from SCCPasp_Types all;
|
import from SCCPasp_Types all;
|
||||||
import from BSSAP_Types all;
|
import from BSSAP_Types all;
|
||||||
import from BSSAP_CodecPort all;
|
import from BSSAP_CodecPort all;
|
||||||
import from BSSMAP_Emulation all;
|
import from RAN_Emulation all;
|
||||||
import from BSSMAP_Templates all;
|
import from BSSMAP_Templates all;
|
||||||
|
|
||||||
import from MobileL3_Types all;
|
import from MobileL3_Types all;
|
||||||
|
@ -17,9 +17,9 @@ import from MGCP_Templates all;
|
||||||
import from SDP_Types all;
|
import from SDP_Types all;
|
||||||
|
|
||||||
/* this component represents a single subscriber connection at the MSC.
|
/* this component represents a single subscriber connection at the MSC.
|
||||||
* There is a 1:1 mapping between SCCP connections and BSSAP_ConnHdlr components.
|
* There is a 1:1 mapping between SCCP connections and RAN_ConnHdlr components.
|
||||||
* We inherit all component variables, ports, functions, ... from BSSAP_ConnHdlr */
|
* We inherit all component variables, ports, functions, ... from RAN_ConnHdlr */
|
||||||
type component BSC_MS_ConnHdlr extends BSSAP_ConnHdlr {
|
type component BSC_MS_ConnHdlr extends RAN_ConnHdlr {
|
||||||
/* SCCP Connecction Identifier for the underlying SCCP connection */
|
/* SCCP Connecction Identifier for the underlying SCCP connection */
|
||||||
var integer g_sccp_conn_id;
|
var integer g_sccp_conn_id;
|
||||||
var MgcpConnectionId g_mgcp_conn_id;
|
var MgcpConnectionId g_mgcp_conn_id;
|
||||||
|
@ -27,18 +27,18 @@ type component BSC_MS_ConnHdlr extends BSSAP_ConnHdlr {
|
||||||
var BSC_State g_state;
|
var BSC_State g_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Callback function from general BSSMAP_Emulation whenever a new incoming
|
/* Callback function from general RAN_Emulation whenever a new incoming
|
||||||
* SCCP connection arrivces. Must create + start a new component */
|
* SCCP connection arrivces. Must create + start a new component */
|
||||||
private function CreateCallback(BSSAP_N_CONNECT_ind conn_ind, charstring id)
|
private function CreateCallback(BSSAP_N_CONNECT_ind conn_ind, charstring id)
|
||||||
runs on BSSMAP_Emulation_CT return BSSAP_ConnHdlr {
|
runs on RAN_Emulation_CT return RAN_ConnHdlr {
|
||||||
log("Incoming SCCP Connection on BSC ?!?");
|
log("Incoming SCCP Connection on BSC ?!?");
|
||||||
self.stop;
|
self.stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Callback function from general BSSMAP_Emulation whenever a connectionless
|
/* Callback function from general RAN_Emulation whenever a connectionless
|
||||||
* BSSMAP message arrives. Can retunr a PDU_BSSAP that should be sent in return */
|
* BSSMAP message arrives. Can retunr a PDU_BSSAP that should be sent in return */
|
||||||
private function UnitdataCallback(PDU_BSSAP bssap)
|
private function UnitdataCallback(PDU_BSSAP bssap)
|
||||||
runs on BSSMAP_Emulation_CT return template PDU_BSSAP {
|
runs on RAN_Emulation_CT return template PDU_BSSAP {
|
||||||
var template PDU_BSSAP resp := omit;
|
var template PDU_BSSAP resp := omit;
|
||||||
|
|
||||||
if (match(bssap, tr_BSSMAP_Reset)) {
|
if (match(bssap, tr_BSSMAP_Reset)) {
|
||||||
|
@ -48,7 +48,7 @@ runs on BSSMAP_Emulation_CT return template PDU_BSSAP {
|
||||||
return resp;
|
return resp;
|
||||||
}
|
}
|
||||||
|
|
||||||
const BssmapOps BSC_MS_BssmapOps := {
|
const RanOps BSC_MS_RanOps := {
|
||||||
create_cb := refers(CreateCallback),
|
create_cb := refers(CreateCallback),
|
||||||
unitdata_cb := refers(UnitdataCallback),
|
unitdata_cb := refers(UnitdataCallback),
|
||||||
decode_dtap := false,
|
decode_dtap := false,
|
||||||
|
@ -154,16 +154,16 @@ runs on BSC_MS_ConnHdlr {
|
||||||
log("Unhandled DTAP ", l3);
|
log("Unhandled DTAP ", l3);
|
||||||
}
|
}
|
||||||
|
|
||||||
[g_state == BSC_STATE_WAIT_DISC_IND] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {
|
[g_state == BSC_STATE_WAIT_DISC_IND] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {
|
||||||
setverdict(pass);
|
setverdict(pass);
|
||||||
self.stop;
|
self.stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
[] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_CONF_IND) {
|
[] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* disconnect in invalid state */
|
/* disconnect in invalid state */
|
||||||
[] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {
|
[] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {
|
||||||
setverdict(fail);
|
setverdict(fail);
|
||||||
self.stop;
|
self.stop;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ import from SCCPasp_Types all;
|
||||||
import from SCCP_Emulation all;
|
import from SCCP_Emulation all;
|
||||||
|
|
||||||
import from BSSAP_CodecPort all;
|
import from BSSAP_CodecPort all;
|
||||||
import from BSSMAP_Emulation all;
|
import from RAN_Emulation all;
|
||||||
|
|
||||||
import from BSC_MS_ConnectionHandler all;
|
import from BSC_MS_ConnectionHandler all;
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ type component BSC_CT {
|
||||||
/* component references */
|
/* component references */
|
||||||
var IPA_Emulation_CT vc_IPA;
|
var IPA_Emulation_CT vc_IPA;
|
||||||
var SCCP_CT vc_SCCP;
|
var SCCP_CT vc_SCCP;
|
||||||
var BSSMAP_Emulation_CT vc_BSSMAP;
|
var RAN_Emulation_CT vc_BSSMAP;
|
||||||
/* test port to SCCP emulation */
|
/* test port to SCCP emulation */
|
||||||
port SCCPasp_PT SCCP;
|
port SCCPasp_PT SCCP;
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ function main(charstring remote_ip, PortNumber remote_port,
|
||||||
/* create components for IPA/SCCP/BSS[M]AP stack */
|
/* create components for IPA/SCCP/BSS[M]AP stack */
|
||||||
vc_IPA := IPA_Emulation_CT.create(id & "-IPA");
|
vc_IPA := IPA_Emulation_CT.create(id & "-IPA");
|
||||||
vc_SCCP := SCCP_CT.create(id & "-SCCP");
|
vc_SCCP := SCCP_CT.create(id & "-SCCP");
|
||||||
vc_BSSMAP := BSSMAP_Emulation_CT.create(id & "-BSSMAP");
|
vc_BSSMAP := RAN_Emulation_CT.create(id & "-BSSMAP");
|
||||||
|
|
||||||
map(vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
|
map(vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ function main(charstring remote_ip, PortNumber remote_port,
|
||||||
/* start components */
|
/* start components */
|
||||||
vc_IPA.start(IPA_Emulation.main_client(remote_ip, remote_port, local_ip, local_port, ccm_pars));
|
vc_IPA.start(IPA_Emulation.main_client(remote_ip, remote_port, local_ip, local_port, ccm_pars));
|
||||||
vc_SCCP.start(SCCPStart(sccp_pars));
|
vc_SCCP.start(SCCPStart(sccp_pars));
|
||||||
vc_BSSMAP.start(BSSMAP_Emulation.main(BSC_MS_ConnectionHandler.BSC_MS_BssmapOps, id));
|
vc_BSSMAP.start(RAN_Emulation.main(BSC_MS_ConnectionHandler.BSC_MS_RanOps, id));
|
||||||
|
|
||||||
/* Initial delay to wait for IPA connection establishment */
|
/* Initial delay to wait for IPA connection establishment */
|
||||||
T.start(2.0);
|
T.start(2.0);
|
||||||
|
|
|
@ -5,7 +5,7 @@ import from Osmocom_Types all;
|
||||||
import from SCCPasp_Types all;
|
import from SCCPasp_Types all;
|
||||||
import from BSSAP_Types all;
|
import from BSSAP_Types all;
|
||||||
import from BSSAP_CodecPort all;
|
import from BSSAP_CodecPort all;
|
||||||
import from BSSMAP_Emulation all;
|
import from RAN_Emulation all;
|
||||||
import from BSSMAP_Templates all;
|
import from BSSMAP_Templates all;
|
||||||
|
|
||||||
import from MGCP_Types all;
|
import from MGCP_Types all;
|
||||||
|
@ -13,9 +13,9 @@ import from MGCP_Templates all;
|
||||||
import from SDP_Types all;
|
import from SDP_Types all;
|
||||||
|
|
||||||
/* this component represents a single subscriber connection at the MSC.
|
/* this component represents a single subscriber connection at the MSC.
|
||||||
* There is a 1:1 mapping between SCCP connections and BSSAP_ConnHdlr components.
|
* There is a 1:1 mapping between SCCP connections and RAN_ConnHdlr components.
|
||||||
* We inherit all component variables, ports, functions, ... from BSSAP_ConnHdlr */
|
* We inherit all component variables, ports, functions, ... from RAN_ConnHdlr */
|
||||||
type component MSC_ConnHdlr extends BSSAP_ConnHdlr {
|
type component MSC_ConnHdlr extends RAN_ConnHdlr {
|
||||||
/* SCCP Connecction Identifier for the underlying SCCP connection */
|
/* SCCP Connecction Identifier for the underlying SCCP connection */
|
||||||
var integer g_sccp_conn_id;
|
var integer g_sccp_conn_id;
|
||||||
|
|
||||||
|
@ -28,10 +28,10 @@ type component MSC_ConnHdlr extends BSSAP_ConnHdlr {
|
||||||
/* Callback function from general BSSMAP_Emulation whenever a new incoming
|
/* Callback function from general BSSMAP_Emulation whenever a new incoming
|
||||||
* SCCP connection arrivces. Must create + start a new component */
|
* SCCP connection arrivces. Must create + start a new component */
|
||||||
private function CreateCallback(BSSAP_N_CONNECT_ind conn_ind, charstring id)
|
private function CreateCallback(BSSAP_N_CONNECT_ind conn_ind, charstring id)
|
||||||
runs on BSSMAP_Emulation_CT return BSSAP_ConnHdlr {
|
runs on RAN_Emulation_CT return RAN_ConnHdlr {
|
||||||
var MSC_ConnHdlr vc_conn;
|
var MSC_ConnHdlr vc_conn;
|
||||||
/* Create a new BSSAP_ConnHdlr component */
|
/* Create a new RAN_ConnHdlr component */
|
||||||
vc_conn := MSC_ConnHdlr.create(g_bssmap_id & "-Conn-" & int2str(conn_ind.connectionId));
|
vc_conn := MSC_ConnHdlr.create(g_ran_id & "-Conn-" & int2str(conn_ind.connectionId));
|
||||||
/* connect it to the port */
|
/* connect it to the port */
|
||||||
connect(vc_conn:BSSAP, self:CLIENT);
|
connect(vc_conn:BSSAP, self:CLIENT);
|
||||||
/* start it */
|
/* start it */
|
||||||
|
@ -44,7 +44,7 @@ runs on BSSMAP_Emulation_CT return BSSAP_ConnHdlr {
|
||||||
/* Callback function from general BSSMAP_Emulation whenever a connectionless
|
/* Callback function from general BSSMAP_Emulation whenever a connectionless
|
||||||
* BSSMAP message arrives. Can retunr a PDU_BSSAP that should be sent in return */
|
* BSSMAP message arrives. Can retunr a PDU_BSSAP that should be sent in return */
|
||||||
private function UnitdataCallback(PDU_BSSAP bssap)
|
private function UnitdataCallback(PDU_BSSAP bssap)
|
||||||
runs on BSSMAP_Emulation_CT return template PDU_BSSAP {
|
runs on RAN_Emulation_CT return template PDU_BSSAP {
|
||||||
var template PDU_BSSAP resp := omit;
|
var template PDU_BSSAP resp := omit;
|
||||||
|
|
||||||
if (match(bssap, tr_BSSMAP_Reset)) {
|
if (match(bssap, tr_BSSMAP_Reset)) {
|
||||||
|
@ -54,7 +54,7 @@ runs on BSSMAP_Emulation_CT return template PDU_BSSAP {
|
||||||
return resp;
|
return resp;
|
||||||
}
|
}
|
||||||
|
|
||||||
const BssmapOps MSC_BssmapOps := {
|
const RanOps MSC_RanOps := {
|
||||||
create_cb := refers(CreateCallback),
|
create_cb := refers(CreateCallback),
|
||||||
unitdata_cb := refers(UnitdataCallback),
|
unitdata_cb := refers(UnitdataCallback),
|
||||||
decode_dtap := false,
|
decode_dtap := false,
|
||||||
|
@ -129,14 +129,14 @@ function main(integer connection_id, integer e1_timeslot) runs on MSC_ConnHdlr {
|
||||||
}
|
}
|
||||||
|
|
||||||
[g_state == MSC_STATE_WAIT_DLCX_ACK] BSSAP.receive(tr_DLCX_ACK) {
|
[g_state == MSC_STATE_WAIT_DLCX_ACK] BSSAP.receive(tr_DLCX_ACK) {
|
||||||
BSSAP.send(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
|
BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
|
||||||
setverdict(pass);
|
setverdict(pass);
|
||||||
self.stop;
|
self.stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: CLEAR REQUEST from BSS */
|
/* TODO: CLEAR REQUEST from BSS */
|
||||||
|
|
||||||
[] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {
|
[] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {
|
||||||
setverdict(fail);
|
setverdict(fail);
|
||||||
self.stop;
|
self.stop;
|
||||||
}
|
}
|
||||||
|
@ -147,7 +147,7 @@ function main(integer connection_id, integer e1_timeslot) runs on MSC_ConnHdlr {
|
||||||
|
|
||||||
/* Guard timer has expired, close connection */
|
/* Guard timer has expired, close connection */
|
||||||
[] T.timeout {
|
[] T.timeout {
|
||||||
BSSAP.send(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
|
BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
|
||||||
setverdict(fail, "Timeout of guard timer");
|
setverdict(fail, "Timeout of guard timer");
|
||||||
self.stop;
|
self.stop;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ import from L3_Templates all;
|
||||||
import from BSSAP_Types all;
|
import from BSSAP_Types all;
|
||||||
import from BSSMAP_Templates all;
|
import from BSSMAP_Templates all;
|
||||||
*/
|
*/
|
||||||
import from BSSMAP_Emulation all;
|
import from RAN_Emulation all;
|
||||||
|
|
||||||
import from MGCP_Adapter all;
|
import from MGCP_Adapter all;
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ type component MSC_CT {
|
||||||
/* component references */
|
/* component references */
|
||||||
var IPA_Emulation_CT vc_IPA;
|
var IPA_Emulation_CT vc_IPA;
|
||||||
var SCCP_CT vc_SCCP;
|
var SCCP_CT vc_SCCP;
|
||||||
var BSSMAP_Emulation_CT vc_BSSMAP;
|
var RAN_Emulation_CT vc_BSSMAP;
|
||||||
var MGCP_Adapter_CT vc_MGCP_UDP;
|
var MGCP_Adapter_CT vc_MGCP_UDP;
|
||||||
/* test port to SCCP emulation */
|
/* test port to SCCP emulation */
|
||||||
port SCCPasp_PT SCCP;
|
port SCCPasp_PT SCCP;
|
||||||
|
@ -43,7 +43,7 @@ function main(charstring local_ip, PortNumber local_port,
|
||||||
/* create components */
|
/* create components */
|
||||||
vc_IPA := IPA_Emulation_CT.create(id & "-IPA");
|
vc_IPA := IPA_Emulation_CT.create(id & "-IPA");
|
||||||
vc_SCCP := SCCP_CT.create(id & "-SCCP");
|
vc_SCCP := SCCP_CT.create(id & "-SCCP");
|
||||||
vc_BSSMAP := BSSMAP_Emulation_CT.create(id & "-BSSMAP");
|
vc_BSSMAP := RAN_Emulation_CT.create(id & "-BSSMAP");
|
||||||
|
|
||||||
map(vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
|
map(vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ function main(charstring local_ip, PortNumber local_port,
|
||||||
|
|
||||||
vc_IPA.start(IPA_Emulation.main_server(local_ip, local_port));
|
vc_IPA.start(IPA_Emulation.main_server(local_ip, local_port));
|
||||||
vc_SCCP.start(SCCPStart(sccp_pars));
|
vc_SCCP.start(SCCPStart(sccp_pars));
|
||||||
vc_BSSMAP.start(BSSMAP_Emulation.main(MSC_ConnectionHandler.MSC_BssmapOps, id & "-BSSMAP"));
|
vc_BSSMAP.start(RAN_Emulation.main(MSC_ConnectionHandler.MSC_RanOps, id & "-BSSMAP"));
|
||||||
|
|
||||||
/* wait until termination of respective components */
|
/* wait until termination of respective components */
|
||||||
vc_IPA.done;
|
vc_IPA.done;
|
||||||
|
|
|
@ -47,7 +47,7 @@ FILES="RTP_EncDec.cc RTP_Types.ttcn"
|
||||||
gen_links $DIR $FILES
|
gen_links $DIR $FILES
|
||||||
|
|
||||||
DIR=../library
|
DIR=../library
|
||||||
FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp L3_Templates.ttcn BSSMAP_Templates.ttcn BSSMAP_Emulation.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn BSSAP_CodecPort.ttcn"
|
FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp L3_Templates.ttcn BSSMAP_Templates.ttcn RAN_Emulation.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn BSSAP_CodecPort.ttcn"
|
||||||
gen_links $DIR $FILES
|
gen_links $DIR $FILES
|
||||||
|
|
||||||
ignore_pp_results
|
ignore_pp_results
|
||||||
|
|
|
@ -24,7 +24,7 @@ import from GSM_Types all;
|
||||||
import from IPL4asp_Types all;
|
import from IPL4asp_Types all;
|
||||||
|
|
||||||
import from BSSAP_Types all;
|
import from BSSAP_Types all;
|
||||||
import from BSSAP_Adapter all;
|
import from RAN_Adapter all;
|
||||||
import from BSSAP_CodecPort all;
|
import from BSSAP_CodecPort all;
|
||||||
import from BSSMAP_Templates all;
|
import from BSSMAP_Templates all;
|
||||||
import from IPA_Emulation all;
|
import from IPA_Emulation all;
|
||||||
|
@ -82,7 +82,7 @@ type component test_CT extends CTRL_Adapter_CT {
|
||||||
var MGCP_Emulation_CT vc_MGCP;
|
var MGCP_Emulation_CT vc_MGCP;
|
||||||
port TELNETasp_PT BSCVTY;
|
port TELNETasp_PT BSCVTY;
|
||||||
|
|
||||||
var BSSAP_Adapter g_bssap;
|
var RAN_Adapter g_bssap;
|
||||||
/* for old legacy-tests only */
|
/* for old legacy-tests only */
|
||||||
port BSSAP_CODEC_PT BSSAP;
|
port BSSAP_CODEC_PT BSSAP;
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ modulepar {
|
||||||
/* IP address at which the test binds */
|
/* IP address at which the test binds */
|
||||||
charstring mp_test_ip := "127.0.0.1";
|
charstring mp_test_ip := "127.0.0.1";
|
||||||
|
|
||||||
BSSAP_Configuration mp_bssap_cfg := {
|
RAN_Configuration mp_bssap_cfg := {
|
||||||
transport := BSSAP_TRANSPORT_AoIP,
|
transport := BSSAP_TRANSPORT_AoIP,
|
||||||
sccp_service_type := "mtp3_itu",
|
sccp_service_type := "mtp3_itu",
|
||||||
sctp_addr := { 23905, "127.0.0.1", 2905, "127.0.0.1" },
|
sctp_addr := { 23905, "127.0.0.1", 2905, "127.0.0.1" },
|
||||||
|
@ -313,10 +313,10 @@ function f_init(integer nr_bts := NUM_BTS, boolean handler_mode := false) runs o
|
||||||
T_guard.start;
|
T_guard.start;
|
||||||
activate(as_Tguard());
|
activate(as_Tguard());
|
||||||
|
|
||||||
/* Call a function of our 'parent component' BSSAP_Adapter_CT to start the
|
/* Call a function of our 'parent component' RAN_Adapter_CT to start the
|
||||||
* MSC-side BSSAP emulation */
|
* MSC-side BSSAP emulation */
|
||||||
if (handler_mode) {
|
if (handler_mode) {
|
||||||
f_bssap_init(g_bssap, mp_bssap_cfg, "VirtMSC", MSC_BssmapOps);
|
f_bssap_init(g_bssap, mp_bssap_cfg, "VirtMSC", MSC_RanOps);
|
||||||
f_bssap_start(g_bssap);
|
f_bssap_start(g_bssap);
|
||||||
} else {
|
} else {
|
||||||
f_bssap_init(g_bssap, mp_bssap_cfg, "VirtMSC", omit);
|
f_bssap_init(g_bssap, mp_bssap_cfg, "VirtMSC", omit);
|
||||||
|
@ -1625,10 +1625,10 @@ testcase TC_oml_unknown_unit_id() runs on test_CT {
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* "New world" test cases using RSL_Emulation + BSSMAP_Emulation
|
* "New world" test cases using RSL_Emulation + RAN_Emulation
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
import from BSSMAP_Emulation all;
|
import from RAN_Emulation all;
|
||||||
import from RSL_Emulation all;
|
import from RSL_Emulation all;
|
||||||
import from MSC_ConnectionHandler all;
|
import from MSC_ConnectionHandler all;
|
||||||
|
|
||||||
|
@ -1636,7 +1636,7 @@ type function void_fn(charstring id) runs on MSC_ConnHdlr;
|
||||||
|
|
||||||
/* helper function to create and connect a MSC_ConnHdlr component */
|
/* helper function to create and connect a MSC_ConnHdlr component */
|
||||||
private function f_connect_handler(inout MSC_ConnHdlr vc_conn) runs on test_CT {
|
private function f_connect_handler(inout MSC_ConnHdlr vc_conn) runs on test_CT {
|
||||||
connect(vc_conn:BSSMAPEM, g_bssap.vc_BSSMAP:PROC);
|
connect(vc_conn:RAN, g_bssap.vc_RAN:PROC);
|
||||||
connect(vc_conn:MGCP_PROC, vc_MGCP:MGCP_PROC);
|
connect(vc_conn:MGCP_PROC, vc_MGCP:MGCP_PROC);
|
||||||
connect(vc_conn:RSL, bts[0].rsl.vc_RSL:CLIENT_PT);
|
connect(vc_conn:RSL, bts[0].rsl.vc_RSL:CLIENT_PT);
|
||||||
connect(vc_conn:RSL_PROC, bts[0].rsl.vc_RSL:RSL_PROC);
|
connect(vc_conn:RSL_PROC, bts[0].rsl.vc_RSL:RSL_PROC);
|
||||||
|
@ -1644,7 +1644,7 @@ private function f_connect_handler(inout MSC_ConnHdlr vc_conn) runs on test_CT {
|
||||||
connect(vc_conn:RSL1, bts[1].rsl.vc_RSL:CLIENT_PT);
|
connect(vc_conn:RSL1, bts[1].rsl.vc_RSL:CLIENT_PT);
|
||||||
connect(vc_conn:RSL1_PROC, bts[1].rsl.vc_RSL:RSL_PROC);
|
connect(vc_conn:RSL1_PROC, bts[1].rsl.vc_RSL:RSL_PROC);
|
||||||
}
|
}
|
||||||
connect(vc_conn:BSSAP, g_bssap.vc_BSSMAP:CLIENT);
|
connect(vc_conn:BSSAP, g_bssap.vc_RAN:CLIENT);
|
||||||
connect(vc_conn:MGCP, vc_MGCP:MGCP_CLIENT);
|
connect(vc_conn:MGCP, vc_MGCP:MGCP_CLIENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3096,7 +3096,7 @@ private function f_tc_ho_into_this_bsc(charstring id) runs on MSC_ConnHdlr {
|
||||||
|
|
||||||
BSSAP.send(ts_BSSAP_Conn_Req(g_pars.handover.sccp_addr_bsc, g_pars.handover.sccp_addr_msc,
|
BSSAP.send(ts_BSSAP_Conn_Req(g_pars.handover.sccp_addr_bsc, g_pars.handover.sccp_addr_msc,
|
||||||
f_gen_handover_req()));
|
f_gen_handover_req()));
|
||||||
BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
|
BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
|
||||||
|
|
||||||
/* The RSL Emulation magically accepts the Chan Activ behind the scenes. */
|
/* The RSL Emulation magically accepts the Chan Activ behind the scenes. */
|
||||||
|
|
||||||
|
@ -3168,7 +3168,7 @@ private function f_tc_ho_in_fail_msc_clears(charstring id) runs on MSC_ConnHdlr
|
||||||
|
|
||||||
BSSAP.send(ts_BSSAP_Conn_Req(g_pars.handover.sccp_addr_bsc, g_pars.handover.sccp_addr_msc,
|
BSSAP.send(ts_BSSAP_Conn_Req(g_pars.handover.sccp_addr_bsc, g_pars.handover.sccp_addr_msc,
|
||||||
f_gen_handover_req()));
|
f_gen_handover_req()));
|
||||||
BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
|
BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
|
||||||
|
|
||||||
/* The RSL Emulation magically accepts the Chan Activ behind the scenes. */
|
/* The RSL Emulation magically accepts the Chan Activ behind the scenes. */
|
||||||
|
|
||||||
|
@ -3253,7 +3253,7 @@ private function f_tc_ho_in_fail_msc_clears_after_ho_detect(charstring id) runs
|
||||||
|
|
||||||
BSSAP.send(ts_BSSAP_Conn_Req(g_pars.handover.sccp_addr_bsc, g_pars.handover.sccp_addr_msc,
|
BSSAP.send(ts_BSSAP_Conn_Req(g_pars.handover.sccp_addr_bsc, g_pars.handover.sccp_addr_msc,
|
||||||
f_gen_handover_req()));
|
f_gen_handover_req()));
|
||||||
BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
|
BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
|
||||||
|
|
||||||
/* The RSL Emulation magically accepts the Chan Activ behind the scenes. */
|
/* The RSL Emulation magically accepts the Chan Activ behind the scenes. */
|
||||||
|
|
||||||
|
@ -3339,7 +3339,7 @@ private function f_tc_ho_in_fail_no_detect(charstring id) runs on MSC_ConnHdlr {
|
||||||
|
|
||||||
BSSAP.send(ts_BSSAP_Conn_Req(g_pars.handover.sccp_addr_bsc, g_pars.handover.sccp_addr_msc,
|
BSSAP.send(ts_BSSAP_Conn_Req(g_pars.handover.sccp_addr_bsc, g_pars.handover.sccp_addr_msc,
|
||||||
f_gen_handover_req()));
|
f_gen_handover_req()));
|
||||||
BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
|
BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
|
||||||
|
|
||||||
/* The RSL Emulation magically accepts the Chan Activ behind the scenes. */
|
/* The RSL Emulation magically accepts the Chan Activ behind the scenes. */
|
||||||
|
|
||||||
|
@ -3430,7 +3430,7 @@ private function f_tc_ho_in_fail_no_detect2(charstring id) runs on MSC_ConnHdlr
|
||||||
|
|
||||||
BSSAP.send(ts_BSSAP_Conn_Req(g_pars.handover.sccp_addr_bsc, g_pars.handover.sccp_addr_msc,
|
BSSAP.send(ts_BSSAP_Conn_Req(g_pars.handover.sccp_addr_bsc, g_pars.handover.sccp_addr_msc,
|
||||||
f_gen_handover_req()));
|
f_gen_handover_req()));
|
||||||
BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
|
BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
|
||||||
|
|
||||||
/* The RSL Emulation magically accepts the Chan Activ behind the scenes. */
|
/* The RSL Emulation magically accepts the Chan Activ behind the scenes. */
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ import from GSM_Types all;
|
||||||
import from IPL4asp_Types all;
|
import from IPL4asp_Types all;
|
||||||
|
|
||||||
import from BSSAP_Types all;
|
import from BSSAP_Types all;
|
||||||
import from BSSAP_Adapter all;
|
import from RAN_Adapter all;
|
||||||
import from BSSAP_CodecPort all;
|
import from BSSAP_CodecPort all;
|
||||||
import from BSSMAP_Templates all;
|
import from BSSMAP_Templates all;
|
||||||
import from IPA_Emulation all;
|
import from IPA_Emulation all;
|
||||||
|
@ -51,7 +51,7 @@ import from L3_Templates all;
|
||||||
import from GSM_RR_Types all;
|
import from GSM_RR_Types all;
|
||||||
|
|
||||||
import from BSSMAP_Templates all;
|
import from BSSMAP_Templates all;
|
||||||
import from BSSMAP_Emulation all;
|
import from RAN_Emulation all;
|
||||||
|
|
||||||
import from MSC_ConnectionHandler all;
|
import from MSC_ConnectionHandler all;
|
||||||
import from BSC_Tests all;
|
import from BSC_Tests all;
|
||||||
|
@ -84,7 +84,7 @@ type component LCLS_MSC_ConnHdlr extends MSC_ConnHdlr {
|
||||||
/* port type between lcls_test_CT and LCLS_MSC_ConnHdlr */
|
/* port type between lcls_test_CT and LCLS_MSC_ConnHdlr */
|
||||||
type port LCLS_InterComp_PT message {
|
type port LCLS_InterComp_PT message {
|
||||||
/* BSSAP from BSSA_ConnHdlr */
|
/* BSSAP from BSSA_ConnHdlr */
|
||||||
inout PDU_BSSAP, BSSAP_Conn_Prim, PDU_DTAP_MO, PDU_DTAP_MT,
|
inout PDU_BSSAP, RAN_Conn_Prim, PDU_DTAP_MO, PDU_DTAP_MT,
|
||||||
/* RSL from RSL_DchanHdlr */
|
/* RSL from RSL_DchanHdlr */
|
||||||
RSLDC_ChanRqd, RSL_Message,
|
RSLDC_ChanRqd, RSL_Message,
|
||||||
/* MGCP from MGCP_ConnHdlr */
|
/* MGCP from MGCP_ConnHdlr */
|
||||||
|
@ -101,7 +101,7 @@ type enumerated LclsCompSync {
|
||||||
/* forward messages between the RSL/MGCP/BSSAP Emulation and the master component */
|
/* forward messages between the RSL/MGCP/BSSAP Emulation and the master component */
|
||||||
private altstep as_lcls_conn_hdlr_proxy() runs on LCLS_MSC_ConnHdlr {
|
private altstep as_lcls_conn_hdlr_proxy() runs on LCLS_MSC_ConnHdlr {
|
||||||
var PDU_BSSAP bssap;
|
var PDU_BSSAP bssap;
|
||||||
var BSSAP_Conn_Prim bssap_p;
|
var RAN_Conn_Prim bssap_p;
|
||||||
var PDU_DTAP_MO dtap_mo;
|
var PDU_DTAP_MO dtap_mo;
|
||||||
var PDU_DTAP_MT dtap_mt;
|
var PDU_DTAP_MT dtap_mt;
|
||||||
var MgcpCommand mgcp_cmd;
|
var MgcpCommand mgcp_cmd;
|
||||||
|
@ -109,7 +109,7 @@ private altstep as_lcls_conn_hdlr_proxy() runs on LCLS_MSC_ConnHdlr {
|
||||||
var RSL_Message rsl_msg;
|
var RSL_Message rsl_msg;
|
||||||
/* from ConnHdlr to master process */
|
/* from ConnHdlr to master process */
|
||||||
[] BSSAP.receive(PDU_BSSAP:?) -> value bssap { MASTER.send(bssap); }
|
[] BSSAP.receive(PDU_BSSAP:?) -> value bssap { MASTER.send(bssap); }
|
||||||
[] BSSAP.receive(BSSAP_Conn_Prim:?) -> value bssap_p { MASTER.send(bssap_p); }
|
[] BSSAP.receive(RAN_Conn_Prim:?) -> value bssap_p { MASTER.send(bssap_p); }
|
||||||
[] BSSAP.receive(PDU_DTAP_MO:?) -> value dtap_mo { MASTER.send(dtap_mo); }
|
[] BSSAP.receive(PDU_DTAP_MO:?) -> value dtap_mo { MASTER.send(dtap_mo); }
|
||||||
[] BSSAP.receive(PDU_DTAP_MT:?) -> value dtap_mt { MASTER.send(dtap_mt); }
|
[] BSSAP.receive(PDU_DTAP_MT:?) -> value dtap_mt { MASTER.send(dtap_mt); }
|
||||||
[] MGCP.receive(MgcpCommand:?) -> value mgcp_cmd { MASTER.send(mgcp_cmd); }
|
[] MGCP.receive(MgcpCommand:?) -> value mgcp_cmd { MASTER.send(mgcp_cmd); }
|
||||||
|
@ -117,7 +117,7 @@ private altstep as_lcls_conn_hdlr_proxy() runs on LCLS_MSC_ConnHdlr {
|
||||||
[] RSL.receive(RSL_Message:?) -> value rsl_msg { MASTER.send(rsl_msg); }
|
[] RSL.receive(RSL_Message:?) -> value rsl_msg { MASTER.send(rsl_msg); }
|
||||||
/* from master process to ConnHdlr */
|
/* from master process to ConnHdlr */
|
||||||
[] MASTER.receive(PDU_BSSAP:?) -> value bssap { BSSAP.send(bssap); }
|
[] MASTER.receive(PDU_BSSAP:?) -> value bssap { BSSAP.send(bssap); }
|
||||||
[] MASTER.receive(BSSAP_Conn_Prim:?) -> value bssap_p { BSSAP.send(bssap_p); }
|
[] MASTER.receive(RAN_Conn_Prim:?) -> value bssap_p { BSSAP.send(bssap_p); }
|
||||||
[] MASTER.receive(PDU_DTAP_MO:?) -> value dtap_mo { BSSAP.send(dtap_mo); }
|
[] MASTER.receive(PDU_DTAP_MO:?) -> value dtap_mo { BSSAP.send(dtap_mo); }
|
||||||
[] MASTER.receive(PDU_DTAP_MT:?) -> value dtap_mt { BSSAP.send(dtap_mt); }
|
[] MASTER.receive(PDU_DTAP_MT:?) -> value dtap_mt { BSSAP.send(dtap_mt); }
|
||||||
[] MASTER.receive(MgcpCommand:?) -> value mgcp_cmd { MGCP.send(mgcp_cmd); }
|
[] MASTER.receive(MgcpCommand:?) -> value mgcp_cmd { MGCP.send(mgcp_cmd); }
|
||||||
|
@ -160,7 +160,7 @@ runs on LCLS_MSC_ConnHdlr {
|
||||||
/* helper function to create and connect a MSC_ConnHdlr component */
|
/* helper function to create and connect a MSC_ConnHdlr component */
|
||||||
/* FIXME: Why can't we use BSC_Tests.f_connect_andler() ?!? */
|
/* FIXME: Why can't we use BSC_Tests.f_connect_andler() ?!? */
|
||||||
private function f_connect_handler(inout LCLS_MSC_ConnHdlr vc_conn) runs on lcls_test_CT {
|
private function f_connect_handler(inout LCLS_MSC_ConnHdlr vc_conn) runs on lcls_test_CT {
|
||||||
connect(vc_conn:BSSMAPEM, g_bssap.vc_BSSMAP:PROC);
|
connect(vc_conn:RAN, g_bssap.vc_RAN:PROC);
|
||||||
connect(vc_conn:MGCP_PROC, vc_MGCP:MGCP_PROC);
|
connect(vc_conn:MGCP_PROC, vc_MGCP:MGCP_PROC);
|
||||||
connect(vc_conn:RSL, bts[0].rsl.vc_RSL:CLIENT_PT);
|
connect(vc_conn:RSL, bts[0].rsl.vc_RSL:CLIENT_PT);
|
||||||
connect(vc_conn:RSL_PROC, bts[0].rsl.vc_RSL:RSL_PROC);
|
connect(vc_conn:RSL_PROC, bts[0].rsl.vc_RSL:RSL_PROC);
|
||||||
|
@ -168,7 +168,7 @@ private function f_connect_handler(inout LCLS_MSC_ConnHdlr vc_conn) runs on lcls
|
||||||
connect(vc_conn:RSL1, bts[1].rsl.vc_RSL:CLIENT_PT);
|
connect(vc_conn:RSL1, bts[1].rsl.vc_RSL:CLIENT_PT);
|
||||||
connect(vc_conn:RSL1_PROC, bts[1].rsl.vc_RSL:RSL_PROC);
|
connect(vc_conn:RSL1_PROC, bts[1].rsl.vc_RSL:RSL_PROC);
|
||||||
}
|
}
|
||||||
connect(vc_conn:BSSAP, g_bssap.vc_BSSMAP:CLIENT);
|
connect(vc_conn:BSSAP, g_bssap.vc_RAN:CLIENT);
|
||||||
connect(vc_conn:MGCP, vc_MGCP:MGCP_CLIENT);
|
connect(vc_conn:MGCP, vc_MGCP:MGCP_CLIENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -713,7 +713,7 @@ testcase TC_lcls_connect_clear() runs on lcls_test_CT {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[] CONN_A.receive(tr_BSSMAP_ClearComplete) {
|
[] CONN_A.receive(tr_BSSMAP_ClearComplete) {
|
||||||
CONN_A.send(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
|
CONN_A.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
|
||||||
}
|
}
|
||||||
[] CONN_B.receive(tr_BSSMAP_LclsNotificationSts(LCLS_STS_not_possible_ls));
|
[] CONN_B.receive(tr_BSSMAP_LclsNotificationSts(LCLS_STS_not_possible_ls));
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import from Osmocom_Types all;
|
||||||
import from GSM_Types all;
|
import from GSM_Types all;
|
||||||
import from SCCPasp_Types all;
|
import from SCCPasp_Types all;
|
||||||
import from BSSAP_Types all;
|
import from BSSAP_Types all;
|
||||||
import from BSSMAP_Emulation all;
|
import from RAN_Emulation all;
|
||||||
import from BSSMAP_Templates all;
|
import from BSSMAP_Templates all;
|
||||||
|
|
||||||
import from IPL4asp_Types all;
|
import from IPL4asp_Types all;
|
||||||
|
@ -330,14 +330,14 @@ altstep as_Media() runs on MSC_ConnHdlr {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* this component represents a single subscriber connection at the MSC.
|
/* this component represents a single subscriber connection at the MSC.
|
||||||
* There is a 1:1 mapping between SCCP connections and BSSAP_ConnHdlr components.
|
* There is a 1:1 mapping between SCCP connections and RAN_ConnHdlr components.
|
||||||
* We inherit all component variables, ports, functions, ... from BSSAP_ConnHdlr */
|
* We inherit all component variables, ports, functions, ... from RAN_ConnHdlr */
|
||||||
type component MSC_ConnHdlr extends BSSAP_ConnHdlr, RSL_DchanHdlr, MGCP_ConnHdlr {
|
type component MSC_ConnHdlr extends RAN_ConnHdlr, RSL_DchanHdlr, MGCP_ConnHdlr {
|
||||||
/* SCCP Connecction Identifier for the underlying SCCP connection */
|
/* SCCP Connecction Identifier for the underlying SCCP connection */
|
||||||
var integer g_sccp_conn_id;
|
var integer g_sccp_conn_id;
|
||||||
|
|
||||||
/* procedure port back to our parent (BSSMAP_Emulation_CT) for control */
|
/* procedure port back to our parent (RAN_Emulation_CT) for control */
|
||||||
port BSSMAPEM_PROC_PT BSSMAPEM;
|
port RAN_PROC_PT RAN;
|
||||||
port TELNETasp_PT BSCVTY;
|
port TELNETasp_PT BSCVTY;
|
||||||
|
|
||||||
var MediaState g_media;
|
var MediaState g_media;
|
||||||
|
@ -357,10 +357,10 @@ function f_MscConnHdlr_init(integer i, HostName bts, HostName mgw, BSSMAP_FIELD_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Callback function from general BSSMAP_Emulation whenever a connectionless
|
/* Callback function from general RAN_Emulation whenever a connectionless
|
||||||
* BSSMAP message arrives. Can retunr a PDU_BSSAP that should be sent in return */
|
* BSSMAP message arrives. Can retunr a PDU_BSSAP that should be sent in return */
|
||||||
private function UnitdataCallback(PDU_BSSAP bssap)
|
private function UnitdataCallback(PDU_BSSAP bssap)
|
||||||
runs on BSSMAP_Emulation_CT return template PDU_BSSAP {
|
runs on RAN_Emulation_CT return template PDU_BSSAP {
|
||||||
var template PDU_BSSAP resp := omit;
|
var template PDU_BSSAP resp := omit;
|
||||||
|
|
||||||
/* answer all RESET with a RESET ACK */
|
/* answer all RESET with a RESET ACK */
|
||||||
|
@ -371,8 +371,8 @@ runs on BSSMAP_Emulation_CT return template PDU_BSSAP {
|
||||||
return resp;
|
return resp;
|
||||||
}
|
}
|
||||||
|
|
||||||
const BssmapOps MSC_BssmapOps := {
|
const RanOps MSC_RanOps := {
|
||||||
create_cb := refers(BSSMAP_Emulation.ExpectedCreateCallback),
|
create_cb := refers(RAN_Emulation.ExpectedCreateCallback),
|
||||||
unitdata_cb := refers(UnitdataCallback),
|
unitdata_cb := refers(UnitdataCallback),
|
||||||
decode_dtap := false,
|
decode_dtap := false,
|
||||||
role_ms := false,
|
role_ms := false,
|
||||||
|
@ -387,8 +387,8 @@ const MGCPOps MSC_MGCPOps := {
|
||||||
|
|
||||||
/* register an expect with the BSSMAP core */
|
/* register an expect with the BSSMAP core */
|
||||||
private function f_create_bssmap_exp(octetstring l3_enc) runs on MSC_ConnHdlr {
|
private function f_create_bssmap_exp(octetstring l3_enc) runs on MSC_ConnHdlr {
|
||||||
BSSMAPEM.call(BSSMAPEM_register:{l3_enc, self}) {
|
RAN.call(RAN_register:{l3_enc, self}) {
|
||||||
[] BSSMAPEM.getreply(BSSMAPEM_register:{?, ?}) {};
|
[] RAN.getreply(RAN_register:{?, ?}) {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ FILES="TELNETasp_PT.cc TELNETasp_PT.hh TELNETasp_PortType.ttcn"
|
||||||
gen_links $DIR $FILES
|
gen_links $DIR $FILES
|
||||||
|
|
||||||
DIR=../library
|
DIR=../library
|
||||||
FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp L3_Templates.ttcn BSSMAP_Templates.ttcn BSSMAP_Emulation.ttcn RLCMAC_CSN1_Types.ttcn GSM_RR_Types.ttcn RSL_Types.ttcn RSL_Emulation.ttcn MGCP_Emulation.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc BSSAP_CodecPort.ttcn BSSAP_Adapter.ttcn Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunct.ttcn RTP_CodecPort_CtrlFunctDef.cc RTP_Emulation.ttcn IuUP_Types.ttcn IuUP_EncDec.cc IuUP_Emulation.ttcn SCCP_Templates.ttcn IPA_Testing.ttcn"
|
FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp L3_Templates.ttcn BSSMAP_Templates.ttcn RAN_Emulation.ttcn RLCMAC_CSN1_Types.ttcn GSM_RR_Types.ttcn RSL_Types.ttcn RSL_Emulation.ttcn MGCP_Emulation.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc BSSAP_CodecPort.ttcn RAN_Adapter.ttcn Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunct.ttcn RTP_CodecPort_CtrlFunctDef.cc RTP_Emulation.ttcn IuUP_Types.ttcn IuUP_EncDec.cc IuUP_Emulation.ttcn SCCP_Templates.ttcn IPA_Testing.ttcn"
|
||||||
gen_links $DIR $FILES
|
gen_links $DIR $FILES
|
||||||
|
|
||||||
ignore_pp_results
|
ignore_pp_results
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
module BSSAP_Adapter {
|
module RAN_Adapter {
|
||||||
|
|
||||||
/* This module implements a 'dumb' BSSAP adapter. It creates the M3UA and SCCP components and stacks a BSSAP
|
/* This module implements a 'dumb' RAN adapter. It creates the M3UA and SCCP components and stacks a
|
||||||
* codec port on top. As a result, it provides the ability to transceive SCCP-User-SAP primitives with
|
* BSSAP/RANAP codec port on top. As a result, it provides the ability to transceive SCCP-User-SAP primitives
|
||||||
* deoded BSSAP payload. Use this if you want to have full control about what you transmit or receive,
|
* with deoded BSSAP/RANAP payload. Use this if you want to have full control about what you transmit or
|
||||||
* without any automatisms in place. Allows you to refuse connections or other abnormal behavior. */
|
* receive, without any automatisms in place. Allows you to refuse connections or other abnormal behavior. */
|
||||||
|
|
||||||
import from General_Types all;
|
import from General_Types all;
|
||||||
import from Osmocom_Types all;
|
import from Osmocom_Types all;
|
||||||
|
|
||||||
import from M3UA_Types all;
|
|
||||||
import from M3UA_Emulation all;
|
import from M3UA_Emulation all;
|
||||||
import from MTP3asp_Types all;
|
import from MTP3asp_Types all;
|
||||||
import from MTP3asp_PortType all;
|
import from MTP3asp_PortType all;
|
||||||
|
@ -23,11 +22,10 @@ import from SCCP_Templates all;
|
||||||
import from SCTPasp_Types all;
|
import from SCTPasp_Types all;
|
||||||
import from SCTPasp_PortType all;
|
import from SCTPasp_PortType all;
|
||||||
|
|
||||||
import from BSSAP_CodecPort all;
|
|
||||||
import from BSSMAP_Templates all;
|
import from BSSMAP_Templates all;
|
||||||
import from BSSMAP_Emulation all;
|
import from RAN_Emulation all;
|
||||||
|
|
||||||
type record BSSAP_Adapter {
|
type record RAN_Adapter {
|
||||||
/* component references */
|
/* component references */
|
||||||
M3UA_CT vc_M3UA, /* only in 3GPP AoIP */
|
M3UA_CT vc_M3UA, /* only in 3GPP AoIP */
|
||||||
IPA_Emulation_CT vc_IPA, /* only in SCCPlite */
|
IPA_Emulation_CT vc_IPA, /* only in SCCPlite */
|
||||||
|
@ -39,17 +37,17 @@ type record BSSAP_Adapter {
|
||||||
SCCP_PAR_Address sccp_addr_peer,
|
SCCP_PAR_Address sccp_addr_peer,
|
||||||
|
|
||||||
/* handler mode */
|
/* handler mode */
|
||||||
BSSMAP_Emulation_CT vc_BSSMAP
|
RAN_Emulation_CT vc_RAN
|
||||||
}
|
}
|
||||||
|
|
||||||
type enumerated BSSAP_Transport {
|
type enumerated RAN_Transport {
|
||||||
BSSAP_TRANSPORT_AoIP, /* 3GPP AoIP: SCCP over M3UA over SCTP */
|
BSSAP_TRANSPORT_AoIP, /* 3GPP AoIP: SCCP over M3UA over SCTP */
|
||||||
BSSAP_TRANSPORT_SCCPlite_SERVER, /* SCCPlite: SCCP over IPA over TCP */
|
BSSAP_TRANSPORT_SCCPlite_SERVER, /* SCCPlite: SCCP over IPA over TCP */
|
||||||
BSSAP_TRANSPORT_SCCPlite_CLIENT /* SCCPlite: SCCP over IPA over TCP */
|
BSSAP_TRANSPORT_SCCPlite_CLIENT /* SCCPlite: SCCP over IPA over TCP */
|
||||||
};
|
};
|
||||||
|
|
||||||
type record BSSAP_Configuration {
|
type record RAN_Configuration {
|
||||||
BSSAP_Transport transport,
|
RAN_Transport transport,
|
||||||
charstring sccp_service_type,
|
charstring sccp_service_type,
|
||||||
SCTP_Association_Address sctp_addr,
|
SCTP_Association_Address sctp_addr,
|
||||||
integer own_pc,
|
integer own_pc,
|
||||||
|
@ -60,7 +58,7 @@ type record BSSAP_Configuration {
|
||||||
integer rctx
|
integer rctx
|
||||||
};
|
};
|
||||||
|
|
||||||
private function init_pars(inout BSSAP_Adapter ba, in BSSAP_Configuration cfg) {
|
private function init_pars(inout RAN_Adapter ba, in RAN_Configuration cfg) {
|
||||||
ba.sccp_pars := {
|
ba.sccp_pars := {
|
||||||
sio := {
|
sio := {
|
||||||
ni := substr(oct2bit(cfg.sio),0,2),
|
ni := substr(oct2bit(cfg.sio),0,2),
|
||||||
|
@ -78,8 +76,8 @@ private function init_pars(inout BSSAP_Adapter ba, in BSSAP_Configuration cfg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function f_bssap_init(inout BSSAP_Adapter ba, in BSSAP_Configuration cfg, charstring id,
|
function f_bssap_init(inout RAN_Adapter ba, in RAN_Configuration cfg, charstring id,
|
||||||
template BssmapOps ops) {
|
template RanOps ops) {
|
||||||
init_pars(ba, cfg);
|
init_pars(ba, cfg);
|
||||||
ops.sccp_addr_local := ba.sccp_addr_own;
|
ops.sccp_addr_local := ba.sccp_addr_own;
|
||||||
ops.sccp_addr_peer := ba.sccp_addr_peer;
|
ops.sccp_addr_peer := ba.sccp_addr_peer;
|
||||||
|
@ -87,7 +85,7 @@ function f_bssap_init(inout BSSAP_Adapter ba, in BSSAP_Configuration cfg, charst
|
||||||
/* create components */
|
/* create components */
|
||||||
ba.vc_SCCP := SCCP_CT.create(id & "-SCCP");
|
ba.vc_SCCP := SCCP_CT.create(id & "-SCCP");
|
||||||
if (isvalue(ops)) {
|
if (isvalue(ops)) {
|
||||||
ba.vc_BSSMAP := BSSMAP_Emulation_CT.create(id & "-BSSMAP");
|
ba.vc_RAN := RAN_Emulation_CT.create(id & "-RAN");
|
||||||
}
|
}
|
||||||
select (cfg.transport) {
|
select (cfg.transport) {
|
||||||
case (BSSAP_TRANSPORT_AoIP) {
|
case (BSSAP_TRANSPORT_AoIP) {
|
||||||
|
@ -131,7 +129,7 @@ function f_bssap_init(inout BSSAP_Adapter ba, in BSSAP_Configuration cfg, charst
|
||||||
disconnect(ba.vc_IPA:IPA_SP_PORT, ba.vc_WAIT:IPA_SP_PORT);
|
disconnect(ba.vc_IPA:IPA_SP_PORT, ba.vc_WAIT:IPA_SP_PORT);
|
||||||
}
|
}
|
||||||
case else {
|
case else {
|
||||||
setverdict(fail, "Unsuppored BSSAP_Transport");
|
setverdict(fail, "Unsuppored RAN_Transport");
|
||||||
mtc.stop;
|
mtc.stop;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,20 +140,20 @@ function f_bssap_init(inout BSSAP_Adapter ba, in BSSAP_Configuration cfg, charst
|
||||||
//T.timeout;
|
//T.timeout;
|
||||||
log("Connecting BSSMAP Emulation to SCCP_SP_PORT and starting emulation");
|
log("Connecting BSSMAP Emulation to SCCP_SP_PORT and starting emulation");
|
||||||
/* connect BSSNAP component to upper side of SCCP */
|
/* connect BSSNAP component to upper side of SCCP */
|
||||||
connect(ba.vc_BSSMAP:BSSAP, ba.vc_SCCP:SCCP_SP_PORT);
|
connect(ba.vc_RAN:BSSAP, ba.vc_SCCP:SCCP_SP_PORT);
|
||||||
if (cfg.transport == BSSAP_TRANSPORT_SCCPlite_SERVER or
|
if (cfg.transport == BSSAP_TRANSPORT_SCCPlite_SERVER or
|
||||||
cfg.transport == BSSAP_TRANSPORT_SCCPlite_CLIENT) {
|
cfg.transport == BSSAP_TRANSPORT_SCCPlite_CLIENT) {
|
||||||
/* connect IPA MGCP port with BSSMAP MGCP port */
|
/* connect IPA MGCP port with BSSMAP MGCP port */
|
||||||
connect(ba.vc_IPA:IPA_MGCP_PORT, ba.vc_BSSMAP:MGCP);
|
connect(ba.vc_IPA:IPA_MGCP_PORT, ba.vc_RAN:MGCP);
|
||||||
}
|
}
|
||||||
/* start the BSSMAP emulation */
|
/* start the BSSMAP emulation */
|
||||||
ba.vc_BSSMAP.start(BSSMAP_Emulation.main(valueof(ops), ""));
|
ba.vc_RAN.start(RAN_Emulation.main(valueof(ops), ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function f_bssap_start(inout BSSAP_Adapter ba) {
|
function f_bssap_start(inout RAN_Adapter ba) {
|
||||||
ba.vc_SCCP.start(SCCPStart(ba.sccp_pars));
|
ba.vc_SCCP.start(SCCPStart(ba.sccp_pars));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
module BSSMAP_Emulation {
|
module RAN_Emulation {
|
||||||
|
|
||||||
/* BSSMAP Emulation, runs on top of BSSAP_CodecPort. It multiplexes/demultiplexes
|
/* RAN Emulation, runs on top of BSSAP_CodecPort. It multiplexes/demultiplexes
|
||||||
* the individual connections, so there can be separate TTCN-3 components handling
|
* the individual connections, so there can be separate TTCN-3 components handling
|
||||||
* each of the connections.
|
* each of the connections.
|
||||||
*
|
*
|
||||||
* The BSSMAP_Emulation.main() function processes SCCP primitives from the SCCP
|
* The RAN_Emulation.main() function processes SCCP primitives from the SCCP
|
||||||
* stack via the BSSAP_CodecPort, and dispatches them to the per-connection components.
|
* stack via the BSSAP_CodecPort, and dispatches them to the per-connection components.
|
||||||
*
|
*
|
||||||
* Outbound BSSAP/SCCP connections are initiated by sending a BSSAP_Conn_Req primitive
|
* Outbound BSSAP/SCCP connections are initiated by sending a BSSAP_Conn_Req primitive
|
||||||
* to the component running the BSSMAP_Emulation.main() function.
|
* to the component running the RAN_Emulation.main() function.
|
||||||
*
|
*
|
||||||
* For each new inbound connections, the BssmapOps.create_cb() is called. It can create
|
* For each new inbound connections, the RanOps.create_cb() is called. It can create
|
||||||
* or resolve a TTCN-3 component, and returns a component reference to which that inbound
|
* or resolve a TTCN-3 component, and returns a component reference to which that inbound
|
||||||
* connection is routed/dispatched.
|
* connection is routed/dispatched.
|
||||||
*
|
*
|
||||||
|
@ -19,7 +19,7 @@ module BSSMAP_Emulation {
|
||||||
* if you are simulating BTS + MSC, and first trigger a connection from BTS/RSL side in a
|
* if you are simulating BTS + MSC, and first trigger a connection from BTS/RSL side in a
|
||||||
* component which then subsequently should also handle the MSC emulation.
|
* component which then subsequently should also handle the MSC emulation.
|
||||||
*
|
*
|
||||||
* Inbound Unit Data messages (such as are dispatched to the BssmapOps.unitdata_cb() callback,
|
* Inbound Unit Data messages (such as are dispatched to the RanOps.unitdata_cb() callback,
|
||||||
* which is registered with an argument to the main() function below.
|
* which is registered with an argument to the main() function below.
|
||||||
*
|
*
|
||||||
* (C) 2017-2018 by Harald Welte <laforge@gnumonks.org>
|
* (C) 2017-2018 by Harald Welte <laforge@gnumonks.org>
|
||||||
|
@ -44,15 +44,15 @@ import from MobileL3_Types all;
|
||||||
|
|
||||||
/* General "base class" component definition, of which specific implementations
|
/* General "base class" component definition, of which specific implementations
|
||||||
* derive themselves by means of the "extends" feature */
|
* derive themselves by means of the "extends" feature */
|
||||||
type component BSSAP_ConnHdlr {
|
type component RAN_ConnHdlr {
|
||||||
/* port towards MSC Emulator core / SCCP connection dispatchar */
|
/* port towards MSC Emulator core / SCCP connection dispatchar */
|
||||||
port BSSAP_Conn_PT BSSAP;
|
port RAN_Conn_PT BSSAP;
|
||||||
/* procedure based port to register for incoming connections */
|
/* procedure based port to register for incoming connections */
|
||||||
port BSSMAPEM_PROC_PT BSSAP_PROC;
|
port RAN_PROC_PT BSSAP_PROC;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Auxiliary primitive that can happen on the port between per-connection client and this dispatcher */
|
/* Auxiliary primitive that can happen on the port between per-connection client and this dispatcher */
|
||||||
type enumerated BSSAP_Conn_Prim {
|
type enumerated RAN_Conn_Prim {
|
||||||
/* SCCP tell us that connection was released */
|
/* SCCP tell us that connection was released */
|
||||||
MSC_CONN_PRIM_DISC_IND,
|
MSC_CONN_PRIM_DISC_IND,
|
||||||
/* we tell SCCP to release connection */
|
/* we tell SCCP to release connection */
|
||||||
|
@ -110,11 +110,11 @@ template BSSAP_Conn_Req ts_BSSAP_Conn_Req(SCCP_PAR_Address peer, SCCP_PAR_Addres
|
||||||
|
|
||||||
|
|
||||||
/* port between individual per-connection components and this dispatcher */
|
/* port between individual per-connection components and this dispatcher */
|
||||||
type port BSSAP_Conn_PT message {
|
type port RAN_Conn_PT message {
|
||||||
/* BSSAP or direct DTAP messages from/to clients */
|
/* BSSAP or direct DTAP messages from/to clients */
|
||||||
inout PDU_BSSAP, PDU_DTAP_MO, PDU_DTAP_MT,
|
inout PDU_BSSAP, PDU_DTAP_MO, PDU_DTAP_MT,
|
||||||
/* misc indications / requests between SCCP and client */
|
/* misc indications / requests between SCCP and client */
|
||||||
BSSAP_Conn_Prim,
|
RAN_Conn_Prim,
|
||||||
/* Client requests us to create SCCP Connection */
|
/* Client requests us to create SCCP Connection */
|
||||||
BSSAP_Conn_Req,
|
BSSAP_Conn_Req,
|
||||||
/* MGCP, only used for IPA SCCPlite (MGCP in IPA mux) */
|
/* MGCP, only used for IPA SCCPlite (MGCP in IPA mux) */
|
||||||
|
@ -125,7 +125,7 @@ type port BSSAP_Conn_PT message {
|
||||||
/* represents a single BSSAP connection over SCCP */
|
/* represents a single BSSAP connection over SCCP */
|
||||||
type record ConnectionData {
|
type record ConnectionData {
|
||||||
/* reference to the instance of the per-connection component */
|
/* reference to the instance of the per-connection component */
|
||||||
BSSAP_ConnHdlr comp_ref,
|
RAN_ConnHdlr comp_ref,
|
||||||
integer sccp_conn_id,
|
integer sccp_conn_id,
|
||||||
/* most recent MGCP transaction ID (Used on MSC side) */
|
/* most recent MGCP transaction ID (Used on MSC side) */
|
||||||
MgcpTransId mgcp_trans_id optional,
|
MgcpTransId mgcp_trans_id optional,
|
||||||
|
@ -136,16 +136,16 @@ type record ConnectionData {
|
||||||
}
|
}
|
||||||
|
|
||||||
type record ImsiMapping {
|
type record ImsiMapping {
|
||||||
BSSAP_ConnHdlr comp_ref,
|
RAN_ConnHdlr comp_ref,
|
||||||
hexstring imsi optional,
|
hexstring imsi optional,
|
||||||
OCT4 tmsi
|
OCT4 tmsi
|
||||||
}
|
}
|
||||||
|
|
||||||
type component BSSMAP_Emulation_CT {
|
type component RAN_Emulation_CT {
|
||||||
/* SCCP port on the bottom side, using ASP primitives */
|
/* SCCP port on the bottom side, using ASP primitives */
|
||||||
port BSSAP_CODEC_PT BSSAP;
|
port BSSAP_CODEC_PT BSSAP;
|
||||||
/* BSSAP port to the per-connection clients */
|
/* BSSAP port to the per-connection clients */
|
||||||
port BSSAP_Conn_PT CLIENT;
|
port RAN_Conn_PT CLIENT;
|
||||||
/* MGCP port */
|
/* MGCP port */
|
||||||
port IPA_MGCP_PT MGCP;
|
port IPA_MGCP_PT MGCP;
|
||||||
|
|
||||||
|
@ -159,15 +159,15 @@ type component BSSMAP_Emulation_CT {
|
||||||
var ImsiMapping ImsiTable[16];
|
var ImsiMapping ImsiTable[16];
|
||||||
|
|
||||||
/* procedure based port to register for incoming connections */
|
/* procedure based port to register for incoming connections */
|
||||||
port BSSMAPEM_PROC_PT PROC;
|
port RAN_PROC_PT PROC;
|
||||||
|
|
||||||
var charstring g_bssmap_id;
|
var charstring g_ran_id;
|
||||||
var integer g_next_e1_ts := 1;
|
var integer g_next_e1_ts := 1;
|
||||||
var BssmapOps g_bssmap_ops;
|
var RanOps g_ran_ops;
|
||||||
};
|
};
|
||||||
|
|
||||||
private function f_conn_id_known(integer sccp_conn_id)
|
private function f_conn_id_known(integer sccp_conn_id)
|
||||||
runs on BSSMAP_Emulation_CT return boolean {
|
runs on RAN_Emulation_CT return boolean {
|
||||||
var integer i;
|
var integer i;
|
||||||
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
||||||
if (ConnectionTable[i].sccp_conn_id == sccp_conn_id){
|
if (ConnectionTable[i].sccp_conn_id == sccp_conn_id){
|
||||||
|
@ -177,8 +177,8 @@ runs on BSSMAP_Emulation_CT return boolean {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function f_comp_known(BSSAP_ConnHdlr client)
|
private function f_comp_known(RAN_ConnHdlr client)
|
||||||
runs on BSSMAP_Emulation_CT return boolean {
|
runs on RAN_Emulation_CT return boolean {
|
||||||
var integer i;
|
var integer i;
|
||||||
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
||||||
if (ConnectionTable[i].comp_ref == client) {
|
if (ConnectionTable[i].comp_ref == client) {
|
||||||
|
@ -189,7 +189,7 @@ runs on BSSMAP_Emulation_CT return boolean {
|
||||||
}
|
}
|
||||||
|
|
||||||
private function f_cic_known(integer cic)
|
private function f_cic_known(integer cic)
|
||||||
runs on BSSMAP_Emulation_CT return boolean {
|
runs on RAN_Emulation_CT return boolean {
|
||||||
var integer i;
|
var integer i;
|
||||||
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
||||||
if (ConnectionTable[i].cic == cic) {
|
if (ConnectionTable[i].cic == cic) {
|
||||||
|
@ -201,32 +201,32 @@ runs on BSSMAP_Emulation_CT return boolean {
|
||||||
|
|
||||||
/* resolve component reference by connection ID */
|
/* resolve component reference by connection ID */
|
||||||
private function f_comp_by_conn_id(integer sccp_conn_id)
|
private function f_comp_by_conn_id(integer sccp_conn_id)
|
||||||
runs on BSSMAP_Emulation_CT return BSSAP_ConnHdlr {
|
runs on RAN_Emulation_CT return RAN_ConnHdlr {
|
||||||
var integer i;
|
var integer i;
|
||||||
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
||||||
if (ConnectionTable[i].sccp_conn_id == sccp_conn_id) {
|
if (ConnectionTable[i].sccp_conn_id == sccp_conn_id) {
|
||||||
return ConnectionTable[i].comp_ref;
|
return ConnectionTable[i].comp_ref;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setverdict(fail, "BSSMAP Connection table not found by SCCP Connection ID ", sccp_conn_id);
|
setverdict(fail, "RAN Connection table not found by SCCP Connection ID ", sccp_conn_id);
|
||||||
mtc.stop;
|
mtc.stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* resolve component reference by CIC */
|
/* resolve component reference by CIC */
|
||||||
private function f_comp_by_mgcp_tid(MgcpTransId tid)
|
private function f_comp_by_mgcp_tid(MgcpTransId tid)
|
||||||
runs on BSSMAP_Emulation_CT return BSSAP_ConnHdlr {
|
runs on RAN_Emulation_CT return RAN_ConnHdlr {
|
||||||
var integer i;
|
var integer i;
|
||||||
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
||||||
if (ConnectionTable[i].mgcp_trans_id == tid) {
|
if (ConnectionTable[i].mgcp_trans_id == tid) {
|
||||||
return ConnectionTable[i].comp_ref;
|
return ConnectionTable[i].comp_ref;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setverdict(fail, "BSSMAP Connection table not found by MGCP Transaction ID ", tid);
|
setverdict(fail, "RAN Connection table not found by MGCP Transaction ID ", tid);
|
||||||
mtc.stop;
|
mtc.stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function f_comp_store_mgcp_tid(BSSAP_ConnHdlr client, MgcpTransId tid)
|
private function f_comp_store_mgcp_tid(RAN_ConnHdlr client, MgcpTransId tid)
|
||||||
runs on BSSMAP_Emulation_CT {
|
runs on RAN_Emulation_CT {
|
||||||
var integer i;
|
var integer i;
|
||||||
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
||||||
if (ConnectionTable[i].comp_ref == client) {
|
if (ConnectionTable[i].comp_ref == client) {
|
||||||
|
@ -234,24 +234,24 @@ runs on BSSMAP_Emulation_CT {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setverdict(fail, "BSSMAP Connection table not found by component ", client);
|
setverdict(fail, "RAN Connection table not found by component ", client);
|
||||||
mtc.stop;
|
mtc.stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function f_comp_by_cic(integer cic)
|
private function f_comp_by_cic(integer cic)
|
||||||
runs on BSSMAP_Emulation_CT return BSSAP_ConnHdlr {
|
runs on RAN_Emulation_CT return RAN_ConnHdlr {
|
||||||
var integer i;
|
var integer i;
|
||||||
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
||||||
if (ConnectionTable[i].cic == cic) {
|
if (ConnectionTable[i].cic == cic) {
|
||||||
return ConnectionTable[i].comp_ref;
|
return ConnectionTable[i].comp_ref;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setverdict(fail, "BSSMAP Connection table not found by CIC ", cic);
|
setverdict(fail, "RAN Connection table not found by CIC ", cic);
|
||||||
mtc.stop;
|
mtc.stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function f_comp_store_cic(BSSAP_ConnHdlr client, integer cic)
|
private function f_comp_store_cic(RAN_ConnHdlr client, integer cic)
|
||||||
runs on BSSMAP_Emulation_CT {
|
runs on RAN_Emulation_CT {
|
||||||
var integer i;
|
var integer i;
|
||||||
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
||||||
if (ConnectionTable[i].comp_ref == client) {
|
if (ConnectionTable[i].comp_ref == client) {
|
||||||
|
@ -259,36 +259,36 @@ runs on BSSMAP_Emulation_CT {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setverdict(fail, "BSSMAP Connection table not found by component ", client);
|
setverdict(fail, "RAN Connection table not found by component ", client);
|
||||||
mtc.stop;
|
mtc.stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* resolve connection ID by component reference */
|
/* resolve connection ID by component reference */
|
||||||
private function f_conn_id_by_comp(BSSAP_ConnHdlr client)
|
private function f_conn_id_by_comp(RAN_ConnHdlr client)
|
||||||
runs on BSSMAP_Emulation_CT return integer {
|
runs on RAN_Emulation_CT return integer {
|
||||||
for (var integer i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
for (var integer i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
||||||
if (ConnectionTable[i].comp_ref == client) {
|
if (ConnectionTable[i].comp_ref == client) {
|
||||||
return ConnectionTable[i].sccp_conn_id;
|
return ConnectionTable[i].sccp_conn_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setverdict(fail, "BSSMAP Connection table not found by component ", client);
|
setverdict(fail, "RAN Connection table not found by component ", client);
|
||||||
mtc.stop;
|
mtc.stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* resolve ConnectionTable index component reference */
|
/* resolve ConnectionTable index component reference */
|
||||||
private function f_idx_by_comp(BSSAP_ConnHdlr client)
|
private function f_idx_by_comp(RAN_ConnHdlr client)
|
||||||
runs on BSSMAP_Emulation_CT return integer {
|
runs on RAN_Emulation_CT return integer {
|
||||||
for (var integer i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
for (var integer i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
||||||
if (ConnectionTable[i].comp_ref == client) {
|
if (ConnectionTable[i].comp_ref == client) {
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setverdict(fail, "BSSMAP Connection table not found by component ", client);
|
setverdict(fail, "RAN Connection table not found by component ", client);
|
||||||
mtc.stop;
|
mtc.stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function f_gen_conn_id()
|
private function f_gen_conn_id()
|
||||||
runs on BSSMAP_Emulation_CT return integer {
|
runs on RAN_Emulation_CT return integer {
|
||||||
var integer conn_id;
|
var integer conn_id;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -299,7 +299,7 @@ runs on BSSMAP_Emulation_CT return integer {
|
||||||
}
|
}
|
||||||
|
|
||||||
private function f_conn_table_init()
|
private function f_conn_table_init()
|
||||||
runs on BSSMAP_Emulation_CT {
|
runs on RAN_Emulation_CT {
|
||||||
for (var integer i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
for (var integer i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
||||||
ConnectionTable[i].comp_ref := null;
|
ConnectionTable[i].comp_ref := null;
|
||||||
ConnectionTable[i].sccp_conn_id := -1;
|
ConnectionTable[i].sccp_conn_id := -1;
|
||||||
|
@ -314,8 +314,8 @@ runs on BSSMAP_Emulation_CT {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function f_conn_table_add(BSSAP_ConnHdlr comp_ref, integer sccp_conn_id)
|
private function f_conn_table_add(RAN_ConnHdlr comp_ref, integer sccp_conn_id)
|
||||||
runs on BSSMAP_Emulation_CT {
|
runs on RAN_Emulation_CT {
|
||||||
for (var integer i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
for (var integer i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
||||||
if (ConnectionTable[i].sccp_conn_id == -1) {
|
if (ConnectionTable[i].sccp_conn_id == -1) {
|
||||||
ConnectionTable[i].comp_ref := comp_ref;
|
ConnectionTable[i].comp_ref := comp_ref;
|
||||||
|
@ -325,11 +325,11 @@ runs on BSSMAP_Emulation_CT {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
testcase.stop("BSSMAP Connection table full!");
|
testcase.stop("RAN Connection table full!");
|
||||||
}
|
}
|
||||||
|
|
||||||
private function f_conn_table_del(integer sccp_conn_id)
|
private function f_conn_table_del(integer sccp_conn_id)
|
||||||
runs on BSSMAP_Emulation_CT {
|
runs on RAN_Emulation_CT {
|
||||||
for (var integer i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
for (var integer i := 0; i < sizeof(ConnectionTable); i := i+1) {
|
||||||
if (ConnectionTable[i].sccp_conn_id == sccp_conn_id) {
|
if (ConnectionTable[i].sccp_conn_id == sccp_conn_id) {
|
||||||
log("Deleted conn table entry ", i,
|
log("Deleted conn table entry ", i,
|
||||||
|
@ -339,12 +339,12 @@ runs on BSSMAP_Emulation_CT {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setverdict(fail, "BSSMAP Connection table attempt to delete non-existant ", sccp_conn_id);
|
setverdict(fail, "RAN Connection table attempt to delete non-existant ", sccp_conn_id);
|
||||||
mtc.stop;
|
mtc.stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function f_imsi_table_find(hexstring imsi, template OCT4 tmsi)
|
private function f_imsi_table_find(hexstring imsi, template OCT4 tmsi)
|
||||||
runs on BSSMAP_Emulation_CT return BSSAP_ConnHdlr {
|
runs on RAN_Emulation_CT return RAN_ConnHdlr {
|
||||||
for (var integer i := 0; i < sizeof(ImsiTable); i := i+1) {
|
for (var integer i := 0; i < sizeof(ImsiTable); i := i+1) {
|
||||||
if (ImsiTable[i].imsi == imsi or
|
if (ImsiTable[i].imsi == imsi or
|
||||||
isvalue(tmsi) and match(ImsiTable[i].tmsi, tmsi)) {
|
isvalue(tmsi) and match(ImsiTable[i].tmsi, tmsi)) {
|
||||||
|
@ -355,8 +355,8 @@ runs on BSSMAP_Emulation_CT return BSSAP_ConnHdlr {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* handle (optional) userData portion of various primitives and dispatch it to the client */
|
/* handle (optional) userData portion of various primitives and dispatch it to the client */
|
||||||
private function f_handle_userData(BSSAP_ConnHdlr client, PDU_BSSAP bssap)
|
private function f_handle_userData(RAN_ConnHdlr client, PDU_BSSAP bssap)
|
||||||
runs on BSSMAP_Emulation_CT {
|
runs on RAN_Emulation_CT {
|
||||||
/* decode + send decoded BSSAP to client */
|
/* decode + send decoded BSSAP to client */
|
||||||
|
|
||||||
if (ischosen(bssap.pdu.bssmap)) {
|
if (ischosen(bssap.pdu.bssmap)) {
|
||||||
|
@ -370,8 +370,8 @@ runs on BSSMAP_Emulation_CT {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ischosen(bssap.pdu.dtap) and g_bssmap_ops.decode_dtap) {
|
if (ischosen(bssap.pdu.dtap) and g_ran_ops.decode_dtap) {
|
||||||
if (g_bssmap_ops.role_ms) {
|
if (g_ran_ops.role_ms) {
|
||||||
/* we are the MS, so any message to us must be MT */
|
/* we are the MS, so any message to us must be MT */
|
||||||
var PDU_DTAP_MT mt := {
|
var PDU_DTAP_MT mt := {
|
||||||
dlci := bssap.dlci,
|
dlci := bssap.dlci,
|
||||||
|
@ -394,16 +394,16 @@ runs on BSSMAP_Emulation_CT {
|
||||||
/* call-back type, to be provided by specific implementation; called when new SCCP connection
|
/* call-back type, to be provided by specific implementation; called when new SCCP connection
|
||||||
* arrives */
|
* arrives */
|
||||||
type function BssmapCreateCallback(BSSAP_N_CONNECT_ind conn_ind, charstring id)
|
type function BssmapCreateCallback(BSSAP_N_CONNECT_ind conn_ind, charstring id)
|
||||||
runs on BSSMAP_Emulation_CT return BSSAP_ConnHdlr;
|
runs on RAN_Emulation_CT return RAN_ConnHdlr;
|
||||||
|
|
||||||
type function BssmapUnitdataCallback(PDU_BSSAP bssap)
|
type function BssmapUnitdataCallback(PDU_BSSAP bssap)
|
||||||
runs on BSSMAP_Emulation_CT return template PDU_BSSAP;
|
runs on RAN_Emulation_CT return template PDU_BSSAP;
|
||||||
|
|
||||||
/* handle common Unitdata such as Paging */
|
/* handle common Unitdata such as Paging */
|
||||||
private function CommonBssmapUnitdataCallback(PDU_BSSAP bssap)
|
private function CommonBssmapUnitdataCallback(PDU_BSSAP bssap)
|
||||||
runs on BSSMAP_Emulation_CT return template PDU_BSSAP {
|
runs on RAN_Emulation_CT return template PDU_BSSAP {
|
||||||
if (match(bssap, tr_BSSMAP_Paging)) {
|
if (match(bssap, tr_BSSMAP_Paging)) {
|
||||||
var BSSAP_ConnHdlr client := null;
|
var RAN_ConnHdlr client := null;
|
||||||
client := f_imsi_table_find(bssap.pdu.bssmap.paging.iMSI.digits,
|
client := f_imsi_table_find(bssap.pdu.bssmap.paging.iMSI.digits,
|
||||||
bssap.pdu.bssmap.paging.tMSI.tmsiOctets);
|
bssap.pdu.bssmap.paging.tMSI.tmsiOctets);
|
||||||
if (client != null) {
|
if (client != null) {
|
||||||
|
@ -417,10 +417,10 @@ runs on BSSMAP_Emulation_CT return template PDU_BSSAP {
|
||||||
log("CommonBssmapUnitdataCallback: Not a paging message");
|
log("CommonBssmapUnitdataCallback: Not a paging message");
|
||||||
}
|
}
|
||||||
/* ELSE: handle in user callback */
|
/* ELSE: handle in user callback */
|
||||||
return g_bssmap_ops.unitdata_cb.apply(bssap);
|
return g_ran_ops.unitdata_cb.apply(bssap);
|
||||||
}
|
}
|
||||||
|
|
||||||
type record BssmapOps {
|
type record RanOps {
|
||||||
BssmapCreateCallback create_cb,
|
BssmapCreateCallback create_cb,
|
||||||
BssmapUnitdataCallback unitdata_cb,
|
BssmapUnitdataCallback unitdata_cb,
|
||||||
boolean decode_dtap,
|
boolean decode_dtap,
|
||||||
|
@ -472,7 +472,7 @@ private function f_bssap_l3_is_rr(PDU_BSSAP bssap) return boolean {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private altstep as_reset_ack() runs on BSSMAP_Emulation_CT {
|
private altstep as_reset_ack() runs on RAN_Emulation_CT {
|
||||||
var BSSAP_N_UNITDATA_ind ud_ind;
|
var BSSAP_N_UNITDATA_ind ud_ind;
|
||||||
[] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) -> value ud_ind {
|
[] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) -> value ud_ind {
|
||||||
log("Respoding to inbound RESET with RESET-ACK");
|
log("Respoding to inbound RESET with RESET-ACK");
|
||||||
|
@ -483,7 +483,7 @@ private altstep as_reset_ack() runs on BSSMAP_Emulation_CT {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private function f_bssap_wait_for_reset() runs on BSSMAP_Emulation_CT {
|
private function f_bssap_wait_for_reset() runs on RAN_Emulation_CT {
|
||||||
var BSSAP_N_UNITDATA_ind ud_ind;
|
var BSSAP_N_UNITDATA_ind ud_ind;
|
||||||
timer T := 20.0;
|
timer T := 20.0;
|
||||||
|
|
||||||
|
@ -504,7 +504,7 @@ private function f_bssap_wait_for_reset() runs on BSSMAP_Emulation_CT {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function f_bssap_reset(SCCP_PAR_Address peer, SCCP_PAR_Address own) runs on BSSMAP_Emulation_CT {
|
function f_bssap_reset(SCCP_PAR_Address peer, SCCP_PAR_Address own) runs on RAN_Emulation_CT {
|
||||||
timer T := 5.0;
|
timer T := 5.0;
|
||||||
|
|
||||||
BSSAP.send(ts_BSSAP_UNITDATA_req(peer, own, ts_BSSMAP_Reset(0)));
|
BSSAP.send(ts_BSSAP_UNITDATA_req(peer, own, ts_BSSMAP_Reset(0)));
|
||||||
|
@ -522,10 +522,10 @@ function f_bssap_reset(SCCP_PAR_Address peer, SCCP_PAR_Address own) runs on BSSM
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function main(BssmapOps ops, charstring id) runs on BSSMAP_Emulation_CT {
|
function main(RanOps ops, charstring id) runs on RAN_Emulation_CT {
|
||||||
|
|
||||||
g_bssmap_id := id;
|
g_ran_id := id;
|
||||||
g_bssmap_ops := ops;
|
g_ran_ops := ops;
|
||||||
f_conn_table_init();
|
f_conn_table_init();
|
||||||
f_expect_table_init();
|
f_expect_table_init();
|
||||||
|
|
||||||
|
@ -541,13 +541,13 @@ function main(BssmapOps ops, charstring id) runs on BSSMAP_Emulation_CT {
|
||||||
var BSSAP_N_DATA_ind data_ind;
|
var BSSAP_N_DATA_ind data_ind;
|
||||||
var BSSAP_N_DISCONNECT_ind disc_ind;
|
var BSSAP_N_DISCONNECT_ind disc_ind;
|
||||||
var BSSAP_Conn_Req creq;
|
var BSSAP_Conn_Req creq;
|
||||||
var BSSAP_ConnHdlr vc_conn;
|
var RAN_ConnHdlr vc_conn;
|
||||||
var PDU_BSSAP bssap;
|
var PDU_BSSAP bssap;
|
||||||
var PDU_DTAP_MO dtap_mo;
|
var PDU_DTAP_MO dtap_mo;
|
||||||
var PDU_DTAP_MT dtap_mt;
|
var PDU_DTAP_MT dtap_mt;
|
||||||
var MgcpCommand mgcp_req;
|
var MgcpCommand mgcp_req;
|
||||||
var MgcpResponse mgcp_resp;
|
var MgcpResponse mgcp_resp;
|
||||||
var BSSAP_ConnHdlr vc_hdlr;
|
var RAN_ConnHdlr vc_hdlr;
|
||||||
var octetstring l3_info;
|
var octetstring l3_info;
|
||||||
var hexstring imsi;
|
var hexstring imsi;
|
||||||
var OCT4 tmsi;
|
var OCT4 tmsi;
|
||||||
|
@ -590,7 +590,7 @@ function main(BssmapOps ops, charstring id) runs on BSSMAP_Emulation_CT {
|
||||||
f_handle_userData(vc_conn, disc_ind.userData);
|
f_handle_userData(vc_conn, disc_ind.userData);
|
||||||
}
|
}
|
||||||
/* notify client about termination */
|
/* notify client about termination */
|
||||||
var BSSAP_Conn_Prim prim := MSC_CONN_PRIM_DISC_IND;
|
var RAN_Conn_Prim prim := MSC_CONN_PRIM_DISC_IND;
|
||||||
CLIENT.send(prim) to vc_conn;
|
CLIENT.send(prim) to vc_conn;
|
||||||
f_conn_table_del(disc_ind.connectionId);
|
f_conn_table_del(disc_ind.connectionId);
|
||||||
/* TOOD: return confirm to other side? */
|
/* TOOD: return confirm to other side? */
|
||||||
|
@ -599,7 +599,7 @@ function main(BssmapOps ops, charstring id) runs on BSSMAP_Emulation_CT {
|
||||||
/* SCCP -> Client: connection confirm for outbound connection */
|
/* SCCP -> Client: connection confirm for outbound connection */
|
||||||
[] BSSAP.receive(BSSAP_N_CONNECT_cfm:?) -> value conn_cfm {
|
[] BSSAP.receive(BSSAP_N_CONNECT_cfm:?) -> value conn_cfm {
|
||||||
vc_conn := f_comp_by_conn_id(conn_cfm.connectionId);
|
vc_conn := f_comp_by_conn_id(conn_cfm.connectionId);
|
||||||
var BSSAP_Conn_Prim prim := MSC_CONN_PRIM_CONF_IND;
|
var RAN_Conn_Prim prim := MSC_CONN_PRIM_CONF_IND;
|
||||||
CLIENT.send(prim) to vc_conn;
|
CLIENT.send(prim) to vc_conn;
|
||||||
/* handle user payload */
|
/* handle user payload */
|
||||||
if (ispresent(conn_cfm.userData)) {
|
if (ispresent(conn_cfm.userData)) {
|
||||||
|
@ -608,7 +608,7 @@ function main(BssmapOps ops, charstring id) runs on BSSMAP_Emulation_CT {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disconnect request client -> SCCP */
|
/* Disconnect request client -> SCCP */
|
||||||
[] CLIENT.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_REQ) -> sender vc_conn {
|
[] CLIENT.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ) -> sender vc_conn {
|
||||||
var integer conn_id := f_conn_id_by_comp(vc_conn);
|
var integer conn_id := f_conn_id_by_comp(vc_conn);
|
||||||
BSSAP.send(ts_BSSAP_DISC_req(conn_id, 0));
|
BSSAP.send(ts_BSSAP_DISC_req(conn_id, 0));
|
||||||
f_conn_table_del(conn_id);
|
f_conn_table_del(conn_id);
|
||||||
|
@ -636,7 +636,7 @@ function main(BssmapOps ops, charstring id) runs on BSSMAP_Emulation_CT {
|
||||||
|
|
||||||
/* InitialL3 contains RR (PAG RESP) or MM (CM SRV REQ), we must increment
|
/* InitialL3 contains RR (PAG RESP) or MM (CM SRV REQ), we must increment
|
||||||
* counter only on MM/CC/SS, but not on RR */
|
* counter only on MM/CC/SS, but not on RR */
|
||||||
if (g_bssmap_ops.role_ms and not f_bssap_l3_is_rr(creq.bssap)) {
|
if (g_ran_ops.role_ms and not f_bssap_l3_is_rr(creq.bssap)) {
|
||||||
/* we have just sent the first MM message, increment the counter */
|
/* we have just sent the first MM message, increment the counter */
|
||||||
var integer idx := f_idx_by_comp(vc_conn);
|
var integer idx := f_idx_by_comp(vc_conn);
|
||||||
ConnectionTable[idx].n_sd[0] := 1;
|
ConnectionTable[idx].n_sd[0] := 1;
|
||||||
|
@ -651,7 +651,7 @@ function main(BssmapOps ops, charstring id) runs on BSSMAP_Emulation_CT {
|
||||||
BSSAP.send(ts_BSSAP_DATA_req(conn_id, bssap));
|
BSSAP.send(ts_BSSAP_DATA_req(conn_id, bssap));
|
||||||
}
|
}
|
||||||
|
|
||||||
[g_bssmap_ops.role_ms] CLIENT.receive(PDU_DTAP_MO:?) -> value dtap_mo sender vc_conn {
|
[g_ran_ops.role_ms] CLIENT.receive(PDU_DTAP_MO:?) -> value dtap_mo sender vc_conn {
|
||||||
var integer idx := f_idx_by_comp(vc_conn);
|
var integer idx := f_idx_by_comp(vc_conn);
|
||||||
/* convert from decoded DTAP to encoded DTAP */
|
/* convert from decoded DTAP to encoded DTAP */
|
||||||
var octetstring l3_enc := enc_PDU_ML3_MS_NW(dtap_mo.dtap);
|
var octetstring l3_enc := enc_PDU_ML3_MS_NW(dtap_mo.dtap);
|
||||||
|
@ -663,7 +663,7 @@ function main(BssmapOps ops, charstring id) runs on BSSMAP_Emulation_CT {
|
||||||
BSSAP.send(ts_BSSAP_DATA_req(ConnectionTable[idx].sccp_conn_id, bssap));
|
BSSAP.send(ts_BSSAP_DATA_req(ConnectionTable[idx].sccp_conn_id, bssap));
|
||||||
}
|
}
|
||||||
|
|
||||||
[not g_bssmap_ops.role_ms] CLIENT.receive(PDU_DTAP_MT:?) -> value dtap_mt sender vc_conn {
|
[not g_ran_ops.role_ms] CLIENT.receive(PDU_DTAP_MT:?) -> value dtap_mt sender vc_conn {
|
||||||
var integer conn_id := f_conn_id_by_comp(vc_conn);
|
var integer conn_id := f_conn_id_by_comp(vc_conn);
|
||||||
/* convert from decoded DTAP to encoded DTAP */
|
/* convert from decoded DTAP to encoded DTAP */
|
||||||
var octetstring l3_enc := enc_PDU_ML3_NW_MS(dtap_mt.dtap);
|
var octetstring l3_enc := enc_PDU_ML3_NW_MS(dtap_mt.dtap);
|
||||||
|
@ -712,14 +712,14 @@ function main(BssmapOps ops, charstring id) runs on BSSMAP_Emulation_CT {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[] PROC.getcall(BSSMAPEM_register:{?,?}) -> param(l3_info, vc_hdlr) {
|
[] PROC.getcall(RAN_register:{?,?}) -> param(l3_info, vc_hdlr) {
|
||||||
f_create_expect(l3_info, vc_hdlr);
|
f_create_expect(l3_info, vc_hdlr);
|
||||||
PROC.reply(BSSMAPEM_register:{l3_info, vc_hdlr}) to vc_hdlr;
|
PROC.reply(RAN_register:{l3_info, vc_hdlr}) to vc_hdlr;
|
||||||
}
|
}
|
||||||
|
|
||||||
[] PROC.getcall(BSSMAPEM_register_imsi:{?,?,?}) -> param(imsi, tmsi, vc_hdlr) {
|
[] PROC.getcall(RAN_register_imsi:{?,?,?}) -> param(imsi, tmsi, vc_hdlr) {
|
||||||
f_create_imsi(imsi, tmsi, vc_hdlr);
|
f_create_imsi(imsi, tmsi, vc_hdlr);
|
||||||
PROC.reply(BSSMAPEM_register_imsi:{imsi, tmsi, vc_hdlr}) to vc_hdlr;
|
PROC.reply(RAN_register_imsi:{imsi, tmsi, vc_hdlr}) to vc_hdlr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -742,23 +742,23 @@ type record ExpectData {
|
||||||
/* L3 payload based on which we can match it */
|
/* L3 payload based on which we can match it */
|
||||||
octetstring l3_payload optional,
|
octetstring l3_payload optional,
|
||||||
/* component reference for this connection */
|
/* component reference for this connection */
|
||||||
BSSAP_ConnHdlr vc_conn
|
RAN_ConnHdlr vc_conn
|
||||||
}
|
}
|
||||||
|
|
||||||
/* procedure based port to register for incoming connections */
|
/* procedure based port to register for incoming connections */
|
||||||
signature BSSMAPEM_register(in octetstring l3, in BSSAP_ConnHdlr hdlr);
|
signature RAN_register(in octetstring l3, in RAN_ConnHdlr hdlr);
|
||||||
|
|
||||||
/* procedure based port to register for incoming IMSI/TMSI */
|
/* procedure based port to register for incoming IMSI/TMSI */
|
||||||
signature BSSMAPEM_register_imsi(in hexstring imsi, in OCT4 tmsi, in BSSAP_ConnHdlr hdlr);
|
signature RAN_register_imsi(in hexstring imsi, in OCT4 tmsi, in RAN_ConnHdlr hdlr);
|
||||||
|
|
||||||
type port BSSMAPEM_PROC_PT procedure {
|
type port RAN_PROC_PT procedure {
|
||||||
inout BSSMAPEM_register, BSSMAPEM_register_imsi;
|
inout RAN_register, RAN_register_imsi;
|
||||||
} with { extension "internal" };
|
} with { extension "internal" };
|
||||||
|
|
||||||
/* CreateCallback that can be used as create_cb and will use the expectation table */
|
/* CreateCallback that can be used as create_cb and will use the expectation table */
|
||||||
function ExpectedCreateCallback(BSSAP_N_CONNECT_ind conn_ind, charstring id)
|
function ExpectedCreateCallback(BSSAP_N_CONNECT_ind conn_ind, charstring id)
|
||||||
runs on BSSMAP_Emulation_CT return BSSAP_ConnHdlr {
|
runs on RAN_Emulation_CT return RAN_ConnHdlr {
|
||||||
var BSSAP_ConnHdlr ret := null;
|
var RAN_ConnHdlr ret := null;
|
||||||
var octetstring l3_info;
|
var octetstring l3_info;
|
||||||
var integer i;
|
var integer i;
|
||||||
|
|
||||||
|
@ -788,8 +788,8 @@ runs on BSSMAP_Emulation_CT return BSSAP_ConnHdlr {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function f_create_expect(octetstring l3, BSSAP_ConnHdlr hdlr)
|
private function f_create_expect(octetstring l3, RAN_ConnHdlr hdlr)
|
||||||
runs on BSSMAP_Emulation_CT {
|
runs on RAN_Emulation_CT {
|
||||||
var integer i;
|
var integer i;
|
||||||
for (i := 0; i < sizeof(ExpectTable); i := i+1) {
|
for (i := 0; i < sizeof(ExpectTable); i := i+1) {
|
||||||
if (not ispresent(ExpectTable[i].l3_payload)) {
|
if (not ispresent(ExpectTable[i].l3_payload)) {
|
||||||
|
@ -802,8 +802,8 @@ runs on BSSMAP_Emulation_CT {
|
||||||
testcase.stop("No space left in ExpectTable");
|
testcase.stop("No space left in ExpectTable");
|
||||||
}
|
}
|
||||||
|
|
||||||
private function f_create_imsi(hexstring imsi, OCT4 tmsi, BSSAP_ConnHdlr hdlr)
|
private function f_create_imsi(hexstring imsi, OCT4 tmsi, RAN_ConnHdlr hdlr)
|
||||||
runs on BSSMAP_Emulation_CT {
|
runs on RAN_Emulation_CT {
|
||||||
for (var integer i := 0; i < sizeof(ImsiTable); i := i+1) {
|
for (var integer i := 0; i < sizeof(ImsiTable); i := i+1) {
|
||||||
if (not ispresent(ImsiTable[i].imsi)) {
|
if (not ispresent(ImsiTable[i].imsi)) {
|
||||||
ImsiTable[i].imsi := imsi;
|
ImsiTable[i].imsi := imsi;
|
||||||
|
@ -818,17 +818,17 @@ runs on BSSMAP_Emulation_CT {
|
||||||
|
|
||||||
|
|
||||||
private function f_expect_table_init()
|
private function f_expect_table_init()
|
||||||
runs on BSSMAP_Emulation_CT {
|
runs on RAN_Emulation_CT {
|
||||||
for (var integer i := 0; i < sizeof(ExpectTable); i := i+1) {
|
for (var integer i := 0; i < sizeof(ExpectTable); i := i+1) {
|
||||||
ExpectTable[i].l3_payload := omit;
|
ExpectTable[i].l3_payload := omit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* helper function for clients to register their IMSI/TMSI */
|
/* helper function for clients to register their IMSI/TMSI */
|
||||||
function f_bssmap_register_imsi(hexstring imsi, OCT4 tmsi)
|
function f_ran_register_imsi(hexstring imsi, OCT4 tmsi)
|
||||||
runs on BSSAP_ConnHdlr {
|
runs on RAN_ConnHdlr {
|
||||||
BSSAP_PROC.call(BSSMAPEM_register_imsi:{imsi, tmsi, self}) {
|
BSSAP_PROC.call(RAN_register_imsi:{imsi, tmsi, self}) {
|
||||||
[] BSSAP_PROC.getreply(BSSMAPEM_register_imsi:{?,?,?}) {};
|
[] BSSAP_PROC.getreply(RAN_register_imsi:{?,?,?}) {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ import from GSM_Types all;
|
||||||
import from IPL4asp_Types all;
|
import from IPL4asp_Types all;
|
||||||
import from SCCPasp_Types all;
|
import from SCCPasp_Types all;
|
||||||
import from BSSAP_Types all;
|
import from BSSAP_Types all;
|
||||||
import from BSSMAP_Emulation all;
|
import from RAN_Emulation all;
|
||||||
import from BSSMAP_Templates all;
|
import from BSSMAP_Templates all;
|
||||||
|
|
||||||
import from GSUP_Types all;
|
import from GSUP_Types all;
|
||||||
|
@ -42,7 +42,7 @@ import from Osmocom_VTY_Functions all;
|
||||||
import from SGsAP_Emulation all;
|
import from SGsAP_Emulation all;
|
||||||
|
|
||||||
/* this component represents a single subscriber connection */
|
/* this component represents a single subscriber connection */
|
||||||
type component BSC_ConnHdlr extends BSSAP_ConnHdlr, MNCC_ConnHdlr, GSUP_ConnHdlr, MGCP_ConnHdlr, SMPP_ConnHdlr, CTRL_Adapter_CT, SGsAP_ConnHdlr {
|
type component BSC_ConnHdlr extends RAN_ConnHdlr, MNCC_ConnHdlr, GSUP_ConnHdlr, MGCP_ConnHdlr, SMPP_ConnHdlr, CTRL_Adapter_CT, SGsAP_ConnHdlr {
|
||||||
var BSC_ConnHdlrPars g_pars;
|
var BSC_ConnHdlrPars g_pars;
|
||||||
timer g_Tguard := 60.0;
|
timer g_Tguard := 60.0;
|
||||||
port TELNETasp_PT MSCVTY;
|
port TELNETasp_PT MSCVTY;
|
||||||
|
@ -155,10 +155,10 @@ function f_init_handler(BSC_ConnHdlrPars pars, float t_guard := 60.0) runs on BS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Callback function from general BSSMAP_Emulation whenever a connectionless
|
/* Callback function from general RAN_Emulation whenever a connectionless
|
||||||
* BSSMAP message arrives. Canreturn a PDU_BSSAPthat should be sent in return */
|
* BSSMAP message arrives. Canreturn a PDU_BSSAPthat should be sent in return */
|
||||||
private function BscUnitdataCallback(PDU_BSSAP bssap)
|
private function BscUnitdataCallback(PDU_BSSAP bssap)
|
||||||
runs on BSSMAP_Emulation_CT return template PDU_BSSAP {
|
runs on RAN_Emulation_CT return template PDU_BSSAP {
|
||||||
var template PDU_BSSAP resp := omit;
|
var template PDU_BSSAP resp := omit;
|
||||||
|
|
||||||
log("BSSMAP_BscUnitdataCallback");
|
log("BSSMAP_BscUnitdataCallback");
|
||||||
|
@ -172,9 +172,9 @@ runs on BSSMAP_Emulation_CT return template PDU_BSSAP {
|
||||||
return resp;
|
return resp;
|
||||||
}
|
}
|
||||||
|
|
||||||
const BssmapOps BSC_BssmapOps := {
|
const RanOps BSC_RanOps := {
|
||||||
/* Create call-back for inbound connections from MSC (hand-over) */
|
/* Create call-back for inbound connections from MSC (hand-over) */
|
||||||
create_cb := refers(BSSMAP_Emulation.ExpectedCreateCallback),
|
create_cb := refers(RAN_Emulation.ExpectedCreateCallback),
|
||||||
unitdata_cb := refers(BscUnitdataCallback),
|
unitdata_cb := refers(BscUnitdataCallback),
|
||||||
decode_dtap := true,
|
decode_dtap := true,
|
||||||
role_ms := true,
|
role_ms := true,
|
||||||
|
@ -196,7 +196,7 @@ const MnccOps BCC_MnccOps := {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Encode 'l3' and ask BSSMAP_Emulation to create new connection with COMPL L3 INFO */
|
/* Encode 'l3' and ask RAN_Emulation to create new connection with COMPL L3 INFO */
|
||||||
function f_bssap_compl_l3(PDU_ML3_MS_NW l3)
|
function f_bssap_compl_l3(PDU_ML3_MS_NW l3)
|
||||||
runs on BSC_ConnHdlr {
|
runs on BSC_ConnHdlr {
|
||||||
log("Sending COMPL L3: ", l3);
|
log("Sending COMPL L3: ", l3);
|
||||||
|
@ -204,8 +204,8 @@ runs on BSC_ConnHdlr {
|
||||||
BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own,
|
BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own,
|
||||||
valueof(ts_BSSMAP_ComplL3(g_pars.cell_id, l3_enc))));
|
valueof(ts_BSSMAP_ComplL3(g_pars.cell_id, l3_enc))));
|
||||||
alt {
|
alt {
|
||||||
[] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_CONF_IND) {}
|
[] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND) {}
|
||||||
[] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {
|
[] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {
|
||||||
setverdict(fail, "DISC.ind from SCCP");
|
setverdict(fail, "DISC.ind from SCCP");
|
||||||
mtc.stop;
|
mtc.stop;
|
||||||
}
|
}
|
||||||
|
@ -386,12 +386,12 @@ runs on BSC_ConnHdlr {
|
||||||
/* FIXME: there could be pending SMS or other common procedures by the MSC, let's ignore them */
|
/* FIXME: there could be pending SMS or other common procedures by the MSC, let's ignore them */
|
||||||
BSSAP.receive(tr_BSSMAP_ClearCommand);
|
BSSAP.receive(tr_BSSMAP_ClearCommand);
|
||||||
BSSAP.send(ts_BSSMAP_ClearComplete);
|
BSSAP.send(ts_BSSMAP_ClearComplete);
|
||||||
BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
|
BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
|
||||||
setverdict(pass);
|
setverdict(pass);
|
||||||
}
|
}
|
||||||
|
|
||||||
function f_foo() runs on BSC_ConnHdlr{
|
function f_foo() runs on BSC_ConnHdlr{
|
||||||
/* SCCP CC handled by BSSMAP_Emulation_CT.main() */
|
/* SCCP CC handled by RAN_Emulation_CT.main() */
|
||||||
/* Expect auth, if enabled */
|
/* Expect auth, if enabled */
|
||||||
|
|
||||||
/* TODO: ISD */
|
/* TODO: ISD */
|
||||||
|
@ -484,7 +484,7 @@ runs on BSC_ConnHdlr {
|
||||||
var MNCC_PDU mncc;
|
var MNCC_PDU mncc;
|
||||||
var MgcpCommand mgcp_cmd;
|
var MgcpCommand mgcp_cmd;
|
||||||
|
|
||||||
f_bssmap_register_imsi(g_pars.imsi, g_pars.tmsi);
|
f_ran_register_imsi(g_pars.imsi, g_pars.tmsi);
|
||||||
|
|
||||||
f_establish_fully(EST_TYPE_PAG_RESP);
|
f_establish_fully(EST_TYPE_PAG_RESP);
|
||||||
|
|
||||||
|
@ -560,7 +560,7 @@ runs on BSC_ConnHdlr {
|
||||||
f_mt_call_initate(cpars);
|
f_mt_call_initate(cpars);
|
||||||
|
|
||||||
/* BSC <- MSC: Expect paging. FIXME: By TMSI or not? */
|
/* BSC <- MSC: Expect paging. FIXME: By TMSI or not? */
|
||||||
f_bssmap_register_imsi(g_pars.imsi, g_pars.tmsi);
|
f_ran_register_imsi(g_pars.imsi, g_pars.tmsi);
|
||||||
BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi));
|
BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi));
|
||||||
|
|
||||||
/* Complete the call via BSSAP */
|
/* Complete the call via BSSAP */
|
||||||
|
@ -690,7 +690,7 @@ runs on BSC_ConnHdlr {
|
||||||
interleave {
|
interleave {
|
||||||
[] BSSAP.receive(t_clear) {
|
[] BSSAP.receive(t_clear) {
|
||||||
BSSAP.send(ts_BSSMAP_ClearComplete);
|
BSSAP.send(ts_BSSMAP_ClearComplete);
|
||||||
BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
|
BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
|
||||||
}
|
}
|
||||||
[] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {
|
[] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {
|
||||||
if (respond_to_dlcx) {
|
if (respond_to_dlcx) {
|
||||||
|
@ -790,7 +790,7 @@ altstep as_clear_cmd_compl_disc(float t := 5.0) runs on BSC_ConnHdlr {
|
||||||
[] BSSAP.receive(tr_BSSMAP_ClearCommand) {
|
[] BSSAP.receive(tr_BSSMAP_ClearCommand) {
|
||||||
BSSAP.send(ts_BSSMAP_ClearComplete);
|
BSSAP.send(ts_BSSMAP_ClearComplete);
|
||||||
alt {
|
alt {
|
||||||
[] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {
|
[] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {
|
||||||
setverdict(pass);
|
setverdict(pass);
|
||||||
}
|
}
|
||||||
[] BSSAP.receive {
|
[] BSSAP.receive {
|
||||||
|
|
|
@ -36,10 +36,10 @@ import from GSUP_Types all;
|
||||||
import from IPA_Emulation all;
|
import from IPA_Emulation all;
|
||||||
|
|
||||||
import from BSSAP_Types all;
|
import from BSSAP_Types all;
|
||||||
import from BSSAP_Adapter all;
|
import from RAN_Adapter all;
|
||||||
import from BSSAP_CodecPort all;
|
import from BSSAP_CodecPort all;
|
||||||
import from BSSMAP_Templates all;
|
import from BSSMAP_Templates all;
|
||||||
import from BSSMAP_Emulation all;
|
import from RAN_Emulation all;
|
||||||
import from BSC_ConnectionHandler all;
|
import from BSC_ConnectionHandler all;
|
||||||
|
|
||||||
import from SGsAP_Templates all;
|
import from SGsAP_Templates all;
|
||||||
|
@ -66,7 +66,7 @@ import from DNS_Helpers all;
|
||||||
import from TCCConversion_Functions all;
|
import from TCCConversion_Functions all;
|
||||||
|
|
||||||
const integer NUM_BSC := 2;
|
const integer NUM_BSC := 2;
|
||||||
type record of BSSAP_Configuration BSSAP_Configurations;
|
type record of RAN_Configuration RAN_Configurations;
|
||||||
|
|
||||||
/* Needed for SGsAP SMS */
|
/* Needed for SGsAP SMS */
|
||||||
import from MobileL3_SMS_Types all;
|
import from MobileL3_SMS_Types all;
|
||||||
|
@ -74,7 +74,7 @@ import from MobileL3_SMS_Types all;
|
||||||
type component MTC_CT extends CTRL_Adapter_CT {
|
type component MTC_CT extends CTRL_Adapter_CT {
|
||||||
var boolean g_initialized := false;
|
var boolean g_initialized := false;
|
||||||
|
|
||||||
var BSSAP_Adapter g_bssap[NUM_BSC];
|
var RAN_Adapter g_bssap[NUM_BSC];
|
||||||
|
|
||||||
/* no 'adapter_CT' for MNCC or GSUP */
|
/* no 'adapter_CT' for MNCC or GSUP */
|
||||||
var MNCC_Emulation_CT vc_MNCC;
|
var MNCC_Emulation_CT vc_MNCC;
|
||||||
|
@ -121,7 +121,7 @@ modulepar {
|
||||||
charstring mp_mme_name := "mmec01.mmegi0001.mme.epc.mnc070.mcc901.3gppnetwork.org";
|
charstring mp_mme_name := "mmec01.mmegi0001.mme.epc.mnc070.mcc901.3gppnetwork.org";
|
||||||
charstring mp_vlr_name := "vlr.example.net";
|
charstring mp_vlr_name := "vlr.example.net";
|
||||||
|
|
||||||
BSSAP_Configurations mp_bssap_cfg := {
|
RAN_Configurations mp_bssap_cfg := {
|
||||||
{
|
{
|
||||||
sccp_service_type := "mtp3_itu",
|
sccp_service_type := "mtp3_itu",
|
||||||
sctp_addr := { 23905, "127.0.0.1", 2905, "127.0.0.1" },
|
sctp_addr := { 23905, "127.0.0.1", 2905, "127.0.0.1" },
|
||||||
|
@ -277,7 +277,7 @@ function f_init(integer num_bsc := 1, boolean sgsap := false, boolean gsup := tr
|
||||||
|
|
||||||
for (var integer i := 0; i < num_bsc; i := i + 1) {
|
for (var integer i := 0; i < num_bsc; i := i + 1) {
|
||||||
if (isbound(mp_bssap_cfg[i])) {
|
if (isbound(mp_bssap_cfg[i])) {
|
||||||
f_bssap_init(g_bssap[i], mp_bssap_cfg[i], "MSC_Test_" & int2str(i), BSC_BssmapOps);
|
f_bssap_init(g_bssap[i], mp_bssap_cfg[i], "MSC_Test_" & int2str(i), BSC_RanOps);
|
||||||
f_bssap_start(g_bssap[i]);
|
f_bssap_start(g_bssap[i]);
|
||||||
} else {
|
} else {
|
||||||
testcase.stop("missing BSSAP configuration");
|
testcase.stop("missing BSSAP configuration");
|
||||||
|
@ -522,8 +522,8 @@ function f_start_handler_with_pars(void_fn fn, BSC_ConnHdlrPars pars) runs on MT
|
||||||
|
|
||||||
vc_conn := BSC_ConnHdlr.create(id);
|
vc_conn := BSC_ConnHdlr.create(id);
|
||||||
/* BSSMAP part / A interface */
|
/* BSSMAP part / A interface */
|
||||||
connect(vc_conn:BSSAP, g_bssap[0].vc_BSSMAP:CLIENT);
|
connect(vc_conn:BSSAP, g_bssap[0].vc_RAN:CLIENT);
|
||||||
connect(vc_conn:BSSAP_PROC, g_bssap[0].vc_BSSMAP:PROC);
|
connect(vc_conn:BSSAP_PROC, g_bssap[0].vc_RAN:PROC);
|
||||||
/* MNCC part */
|
/* MNCC part */
|
||||||
connect(vc_conn:MNCC, vc_MNCC:MNCC_CLIENT);
|
connect(vc_conn:MNCC, vc_MNCC:MNCC_CLIENT);
|
||||||
connect(vc_conn:MNCC_PROC, vc_MNCC:MNCC_PROC);
|
connect(vc_conn:MNCC_PROC, vc_MNCC:MNCC_PROC);
|
||||||
|
@ -804,7 +804,7 @@ private function f_tc_lu_clear_request(charstring id, BSC_ConnHdlrPars pars) run
|
||||||
mtc.stop;
|
mtc.stop;
|
||||||
repeat;
|
repeat;
|
||||||
}
|
}
|
||||||
[] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
|
[] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
|
||||||
}
|
}
|
||||||
setverdict(pass);
|
setverdict(pass);
|
||||||
}
|
}
|
||||||
|
@ -834,7 +834,7 @@ private function f_tc_lu_disconnect(charstring id, BSC_ConnHdlrPars pars) runs o
|
||||||
|
|
||||||
f_sleep(1.0);
|
f_sleep(1.0);
|
||||||
/* send clear request in the middle of the LU */
|
/* send clear request in the middle of the LU */
|
||||||
BSSAP.send(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
|
BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
|
||||||
setverdict(pass);
|
setverdict(pass);
|
||||||
f_sleep(1.0);
|
f_sleep(1.0);
|
||||||
}
|
}
|
||||||
|
@ -1197,10 +1197,10 @@ private function f_tc_cl3_no_payload(charstring id, BSC_ConnHdlrPars pars) runs
|
||||||
timer T := 5.0;
|
timer T := 5.0;
|
||||||
T.start;
|
T.start;
|
||||||
alt {
|
alt {
|
||||||
[] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
|
[] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
|
||||||
/* Expect LU REJECT with Cause == Illegal MS */
|
/* Expect LU REJECT with Cause == Illegal MS */
|
||||||
[] BSSAP.receive(tr_PDU_DTAP_MT(?)) { repeat; }
|
[] BSSAP.receive(tr_PDU_DTAP_MT(?)) { repeat; }
|
||||||
[] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_CONF_IND) { repeat; }
|
[] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND) { repeat; }
|
||||||
[] as_clear_cmd_compl_disc();
|
[] as_clear_cmd_compl_disc();
|
||||||
[] T.timeout {
|
[] T.timeout {
|
||||||
setverdict(fail, "Timeout waiting for ClearCommand or SCCP Release");
|
setverdict(fail, "Timeout waiting for ClearCommand or SCCP Release");
|
||||||
|
@ -1236,9 +1236,9 @@ private function f_tc_cl3_rnd_payload(charstring id, BSC_ConnHdlrPars pars) runs
|
||||||
T.start;
|
T.start;
|
||||||
alt {
|
alt {
|
||||||
/* Immediate disconnect */
|
/* Immediate disconnect */
|
||||||
[] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
|
[] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
|
||||||
[] BSSAP.receive(tr_PDU_DTAP_MT(?)) { repeat; }
|
[] BSSAP.receive(tr_PDU_DTAP_MT(?)) { repeat; }
|
||||||
[] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_CONF_IND) { repeat; }
|
[] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND) { repeat; }
|
||||||
[] as_clear_cmd_compl_disc();
|
[] as_clear_cmd_compl_disc();
|
||||||
[] T.timeout {
|
[] T.timeout {
|
||||||
setverdict(fail, "Timeout waiting for ClearCommand or SCCP Release");
|
setverdict(fail, "Timeout waiting for ClearCommand or SCCP Release");
|
||||||
|
@ -1435,7 +1435,7 @@ private function f_mt_call_start(inout CallParameters cpars) runs on BSC_ConnHdl
|
||||||
} else {
|
} else {
|
||||||
tmsi := 'FFFFFFFF'O;
|
tmsi := 'FFFFFFFF'O;
|
||||||
}
|
}
|
||||||
f_bssmap_register_imsi(g_pars.imsi, tmsi);
|
f_ran_register_imsi(g_pars.imsi, tmsi);
|
||||||
|
|
||||||
/* Allocate call reference and send SETUP via MNCC to MSC */
|
/* Allocate call reference and send SETUP via MNCC to MSC */
|
||||||
cpars.mncc_callref := f_rnd_int(2147483648);
|
cpars.mncc_callref := f_rnd_int(2147483648);
|
||||||
|
@ -2017,7 +2017,7 @@ private function f_tc_lu_and_mt_sms(charstring id, BSC_ConnHdlrPars pars) runs o
|
||||||
} else {
|
} else {
|
||||||
tmsi := 'FFFFFFFF'O;
|
tmsi := 'FFFFFFFF'O;
|
||||||
}
|
}
|
||||||
f_bssmap_register_imsi(g_pars.imsi, tmsi);
|
f_ran_register_imsi(g_pars.imsi, tmsi);
|
||||||
|
|
||||||
f_vty_sms_send(hex2str(pars.imsi), "2342", "Hello SMS");
|
f_vty_sms_send(hex2str(pars.imsi), "2342", "Hello SMS");
|
||||||
|
|
||||||
|
@ -2055,7 +2055,7 @@ private function f_tc_lu_and_mt_sms_paging_and_nothing(charstring id, BSC_ConnHd
|
||||||
} else {
|
} else {
|
||||||
tmsi := 'FFFFFFFF'O;
|
tmsi := 'FFFFFFFF'O;
|
||||||
}
|
}
|
||||||
f_bssmap_register_imsi(g_pars.imsi, tmsi);
|
f_ran_register_imsi(g_pars.imsi, tmsi);
|
||||||
|
|
||||||
f_vty_sms_send(hex2str(pars.imsi), "2342", "Hello SMS");
|
f_vty_sms_send(hex2str(pars.imsi), "2342", "Hello SMS");
|
||||||
|
|
||||||
|
@ -2311,9 +2311,9 @@ runs on BSC_ConnHdlr {
|
||||||
|
|
||||||
/* Register an 'expect' for given IMSI (+TMSI) */
|
/* Register an 'expect' for given IMSI (+TMSI) */
|
||||||
if (isvalue(g_pars.tmsi)) {
|
if (isvalue(g_pars.tmsi)) {
|
||||||
f_bssmap_register_imsi(g_pars.imsi, g_pars.tmsi);
|
f_ran_register_imsi(g_pars.imsi, g_pars.tmsi);
|
||||||
} else {
|
} else {
|
||||||
f_bssmap_register_imsi(g_pars.imsi, 'FFFFFFFF'O);
|
f_ran_register_imsi(g_pars.imsi, 'FFFFFFFF'O);
|
||||||
}
|
}
|
||||||
|
|
||||||
var template GSUP_PDU mt_forwardSM_res := tr_GSUP_MT_FORWARD_SM_RES(
|
var template GSUP_PDU mt_forwardSM_res := tr_GSUP_MT_FORWARD_SM_RES(
|
||||||
|
@ -2375,9 +2375,9 @@ runs on BSC_ConnHdlr {
|
||||||
|
|
||||||
/* Register an 'expect' for given IMSI (+TMSI) */
|
/* Register an 'expect' for given IMSI (+TMSI) */
|
||||||
if (isvalue(g_pars.tmsi)) {
|
if (isvalue(g_pars.tmsi)) {
|
||||||
f_bssmap_register_imsi(g_pars.imsi, g_pars.tmsi);
|
f_ran_register_imsi(g_pars.imsi, g_pars.tmsi);
|
||||||
} else {
|
} else {
|
||||||
f_bssmap_register_imsi(g_pars.imsi, 'FFFFFFFF'O);
|
f_ran_register_imsi(g_pars.imsi, 'FFFFFFFF'O);
|
||||||
}
|
}
|
||||||
|
|
||||||
var template GSUP_PDU mt_forwardSM_err := tr_GSUP_MT_FORWARD_SM_ERR(
|
var template GSUP_PDU mt_forwardSM_err := tr_GSUP_MT_FORWARD_SM_ERR(
|
||||||
|
@ -2441,9 +2441,9 @@ runs on BSC_ConnHdlr {
|
||||||
|
|
||||||
/* Register an 'expect' for given IMSI (+TMSI) */
|
/* Register an 'expect' for given IMSI (+TMSI) */
|
||||||
if (isvalue(g_pars.tmsi)) {
|
if (isvalue(g_pars.tmsi)) {
|
||||||
f_bssmap_register_imsi(g_pars.imsi, g_pars.tmsi);
|
f_ran_register_imsi(g_pars.imsi, g_pars.tmsi);
|
||||||
} else {
|
} else {
|
||||||
f_bssmap_register_imsi(g_pars.imsi, 'FFFFFFFF'O);
|
f_ran_register_imsi(g_pars.imsi, 'FFFFFFFF'O);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Submit the 1st MT SMS on GSUP */
|
/* Submit the 1st MT SMS on GSUP */
|
||||||
|
@ -2553,9 +2553,9 @@ runs on BSC_ConnHdlr {
|
||||||
|
|
||||||
/* Register an 'expect' for given IMSI (+TMSI) */
|
/* Register an 'expect' for given IMSI (+TMSI) */
|
||||||
if (isvalue(g_pars.tmsi)) {
|
if (isvalue(g_pars.tmsi)) {
|
||||||
f_bssmap_register_imsi(g_pars.imsi, g_pars.tmsi);
|
f_ran_register_imsi(g_pars.imsi, g_pars.tmsi);
|
||||||
} else {
|
} else {
|
||||||
f_bssmap_register_imsi(g_pars.imsi, 'FFFFFFFF'O);
|
f_ran_register_imsi(g_pars.imsi, 'FFFFFFFF'O);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send CM Service Request for MO SMMA */
|
/* Send CM Service Request for MO SMMA */
|
||||||
|
@ -2656,9 +2656,9 @@ runs on BSC_ConnHdlr {
|
||||||
|
|
||||||
/* Register an 'expect' for given IMSI (+TMSI) */
|
/* Register an 'expect' for given IMSI (+TMSI) */
|
||||||
if (isvalue(g_pars.tmsi)) {
|
if (isvalue(g_pars.tmsi)) {
|
||||||
f_bssmap_register_imsi(g_pars.imsi, g_pars.tmsi);
|
f_ran_register_imsi(g_pars.imsi, g_pars.tmsi);
|
||||||
} else {
|
} else {
|
||||||
f_bssmap_register_imsi(g_pars.imsi, 'FFFFFFFF'O);
|
f_ran_register_imsi(g_pars.imsi, 'FFFFFFFF'O);
|
||||||
}
|
}
|
||||||
|
|
||||||
var template GSUP_PDU mt_forwardSM_res := tr_GSUP_MT_FORWARD_SM_RES(
|
var template GSUP_PDU mt_forwardSM_res := tr_GSUP_MT_FORWARD_SM_RES(
|
||||||
|
@ -2813,7 +2813,7 @@ private function f_tc_smpp_mt_sms(charstring id, BSC_ConnHdlrPars pars) runs on
|
||||||
} else {
|
} else {
|
||||||
tmsi := 'FFFFFFFF'O;
|
tmsi := 'FFFFFFFF'O;
|
||||||
}
|
}
|
||||||
f_bssmap_register_imsi(g_pars.imsi, tmsi);
|
f_ran_register_imsi(g_pars.imsi, tmsi);
|
||||||
|
|
||||||
var SmsParameters spars := valueof(t_SmsPars);
|
var SmsParameters spars := valueof(t_SmsPars);
|
||||||
/* TODO: test with more intelligent user data; test different coding schemes */
|
/* TODO: test with more intelligent user data; test different coding schemes */
|
||||||
|
@ -2964,7 +2964,7 @@ runs on BSC_ConnHdlr {
|
||||||
/* Perform location update */
|
/* Perform location update */
|
||||||
f_perform_lu();
|
f_perform_lu();
|
||||||
|
|
||||||
f_bssmap_register_imsi(g_pars.imsi, g_pars.tmsi);
|
f_ran_register_imsi(g_pars.imsi, g_pars.tmsi);
|
||||||
|
|
||||||
/* We need to inspect GSUP activity */
|
/* We need to inspect GSUP activity */
|
||||||
f_create_gsup_expect(hex2str(g_pars.imsi));
|
f_create_gsup_expect(hex2str(g_pars.imsi));
|
||||||
|
@ -3577,7 +3577,7 @@ private function f_sgsap_bssmap_screening() runs on BSC_ConnHdlr {
|
||||||
/* Trigger a paging request and expect the paging on BSSMAP, this is
|
/* Trigger a paging request and expect the paging on BSSMAP, this is
|
||||||
* to make sure that pagings are sent throught the A-Interface again
|
* to make sure that pagings are sent throught the A-Interface again
|
||||||
* and not throught the SGs interface.*/
|
* and not throught the SGs interface.*/
|
||||||
f_bssmap_register_imsi(g_pars.imsi, g_pars.tmsi);
|
f_ran_register_imsi(g_pars.imsi, g_pars.tmsi);
|
||||||
f_vty_transceive(MSCVTY, "subscriber imsi " & hex2str(g_pars.imsi) & " paging");
|
f_vty_transceive(MSCVTY, "subscriber imsi " & hex2str(g_pars.imsi) & " paging");
|
||||||
|
|
||||||
alt {
|
alt {
|
||||||
|
|
|
@ -89,7 +89,7 @@ DIR=../library
|
||||||
FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn MNCC_Types.ttcn MNCC_EncDec.cc MNCC_CodecPort.ttcn mncc.h MNCC_Emulation.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc "
|
FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn MNCC_Types.ttcn MNCC_EncDec.cc MNCC_CodecPort.ttcn mncc.h MNCC_Emulation.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc "
|
||||||
FILES+="IPA_Types.ttcn IPA_Emulation.ttcnpp IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc GSUP_Types.ttcn GSUP_Emulation.ttcn "
|
FILES+="IPA_Types.ttcn IPA_Emulation.ttcnpp IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc GSUP_Types.ttcn GSUP_Emulation.ttcn "
|
||||||
FILES+="Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn L3_Templates.ttcn L3_Common.ttcn "
|
FILES+="Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn L3_Templates.ttcn L3_Common.ttcn "
|
||||||
FILES+="BSSMAP_Emulation.ttcn BSSAP_CodecPort.ttcn BSSMAP_Templates.ttcn BSSAP_Adapter.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_Emulation.ttcn "
|
FILES+="RAN_Emulation.ttcn BSSAP_CodecPort.ttcn BSSMAP_Templates.ttcn RAN_Adapter.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_Emulation.ttcn "
|
||||||
FILES+="RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunctDef.cc "
|
FILES+="RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunctDef.cc "
|
||||||
FILES+="MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunctDef.cc "
|
FILES+="MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunctDef.cc "
|
||||||
FILES+="SMPP_CodecPort.ttcn SMPP_CodecPort_CtrlFunct.ttcn SMPP_CodecPort_CtrlFunctDef.cc SMPP_Emulation.ttcn SMPP_Templates.ttcn "
|
FILES+="SMPP_CodecPort.ttcn SMPP_CodecPort_CtrlFunct.ttcn SMPP_CodecPort_CtrlFunctDef.cc SMPP_Emulation.ttcn SMPP_Templates.ttcn "
|
||||||
|
|
Loading…
Reference in New Issue