@ -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
* 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.
*
* 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 Bssmap Ops.create_cb() is called. It can create
* For each new inbound connections, the Ran Ops.create_cb() is called. It can create
* or resolve a TTCN-3 component, and returns a component reference to which that inbound
* 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
* component which then subsequently should also handle the MSC emulation.
*
* Inbound Unit Data messages (such as are dispatched to the Bssmap Ops.unitdata_cb() callback,
* Inbound Unit Data messages (such as are dispatched to the Ran Ops.unitdata_cb() callback,
* which is registered with an argument to the main() function below.
*
* (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
* 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 BSSAP _Conn_PT BSSAP;
port RAN _Conn_PT BSSAP;
/* 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 */
type enumerated BSSAP _Conn_Prim {
type enumerated RAN _Conn_Prim {
/* SCCP tell us that connection was released */
MSC_CONN_PRIM_DISC_IND,
/* 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 */
type port BSSAP _Conn_PT message {
type port RAN _Conn_PT message {
/* BSSAP or direct DTAP messages from/to clients */
inout PDU_BSSAP, PDU_DTAP_MO, PDU_DTAP_MT,
/* misc indications / requests between SCCP and client */
BSSAP _Conn_Prim,
RAN _Conn_Prim,
/* Client requests us to create SCCP Connection */
BSSAP_Conn_Req,
/* 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 */
type record ConnectionData {
/* reference to the instance of the per-connection component */
BSSAP _ConnHdlr comp_ref,
RAN _ConnHdlr comp_ref,
integer sccp_conn_id,
/* most recent MGCP transaction ID (Used on MSC side) */
MgcpTransId mgcp_trans_id optional,
@ -136,16 +136,16 @@ type record ConnectionData {
}
type record ImsiMapping {
BSSAP _ConnHdlr comp_ref,
RAN _ConnHdlr comp_ref,
hexstring imsi optional,
OCT4 tmsi
}
type component BSSMAP _Emulation_CT {
type component RAN _Emulation_CT {
/* SCCP port on the bottom side, using ASP primitives */
port BSSAP_CODEC_PT BSSAP;
/* BSSAP port to the per-connection clients */
port BSSAP _Conn_PT CLIENT;
port RAN _Conn_PT CLIENT;
/* MGCP port */
port IPA_MGCP_PT MGCP;
@ -159,15 +159,15 @@ type component BSSMAP_Emulation_CT {
var ImsiMapping ImsiTable[16];
/* 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 BssmapOps g_bssmap _ops;
var RanOps g_ran _ops;
};
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;
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
if (ConnectionTable[i].sccp_conn_id == sccp_conn_id){
@ -177,8 +177,8 @@ runs on BSSMAP_Emulation_CT return boolean {
return false;
}
private function f_comp_known(BSSAP _ConnHdlr client)
runs on BSSMAP _Emulation_CT return boolean {
private function f_comp_known(RAN _ConnHdlr client)
runs on RAN _Emulation_CT return boolean {
var integer i;
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
if (ConnectionTable[i].comp_ref == client) {
@ -189,7 +189,7 @@ runs on BSSMAP_Emulation_CT return boolean {
}
private function f_cic_known(integer cic)
runs on BSSMAP _Emulation_CT return boolean {
runs on RAN _Emulation_CT return boolean {
var integer i;
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
if (ConnectionTable[i].cic == cic) {
@ -201,32 +201,32 @@ runs on BSSMAP_Emulation_CT return boolean {
/* resolve component reference by connection 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;
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
if (ConnectionTable[i].sccp_conn_id == sccp_conn_id) {
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;
}
/* resolve component reference by CIC */
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;
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
if (ConnectionTable[i].mgcp_trans_id == tid) {
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;
}
private function f_comp_store_mgcp_tid(BSSAP _ConnHdlr client, MgcpTransId tid)
runs on BSSMAP _Emulation_CT {
private function f_comp_store_mgcp_tid(RAN _ConnHdlr client, MgcpTransId tid)
runs on RAN _Emulation_CT {
var integer i;
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
if (ConnectionTable[i].comp_ref == client) {
@ -234,24 +234,24 @@ runs on BSSMAP_Emulation_CT {
return;
}
}
setverdict(fail, "BSSMAP Connection table not found by component ", client);
setverdict(fail, "RAN Connection table not found by component ", client);
mtc.stop;
}
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;
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
if (ConnectionTable[i].cic == cic) {
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;
}
private function f_comp_store_cic(BSSAP _ConnHdlr client, integer cic)
runs on BSSMAP _Emulation_CT {
private function f_comp_store_cic(RAN _ConnHdlr client, integer cic)
runs on RAN _Emulation_CT {
var integer i;
for (i := 0; i < sizeof(ConnectionTable); i := i+1) {
if (ConnectionTable[i].comp_ref == client) {
@ -259,36 +259,36 @@ runs on BSSMAP_Emulation_CT {
return;
}
}
setverdict(fail, "BSSMAP Connection table not found by component ", client);
setverdict(fail, "RAN Connection table not found by component ", client);
mtc.stop;
}
/* resolve connection ID by component reference */
private function f_conn_id_by_comp(BSSAP _ConnHdlr client)
runs on BSSMAP _Emulation_CT return integer {
private function f_conn_id_by_comp(RAN _ConnHdlr client)
runs on RAN _Emulation_CT return integer {
for (var integer i := 0; i < sizeof(ConnectionTable); i := i+1) {
if (ConnectionTable[i].comp_ref == client) {
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;
}
/* resolve ConnectionTable index component reference */
private function f_idx_by_comp(BSSAP _ConnHdlr client)
runs on BSSMAP _Emulation_CT return integer {
private function f_idx_by_comp(RAN _ConnHdlr client)
runs on RAN _Emulation_CT return integer {
for (var integer i := 0; i < sizeof(ConnectionTable); i := i+1) {
if (ConnectionTable[i].comp_ref == client) {
return i;
}
}
setverdict(fail, "BSSMAP Connection table not found by component ", client);
setverdict(fail, "RAN Connection table not found by component ", client);
mtc.stop;
}
private function f_gen_conn_id()
runs on BSSMAP _Emulation_CT return integer {
runs on RAN _Emulation_CT return integer {
var integer conn_id;
do {
@ -299,7 +299,7 @@ runs on BSSMAP_Emulation_CT return integer {
}
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) {
ConnectionTable[i].comp_ref := null;
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)
runs on BSSMAP _Emulation_CT {
private function f_conn_table_add(RAN _ConnHdlr comp_ref, integer sccp_conn_id)
runs on RAN _Emulation_CT {
for (var integer i := 0; i < sizeof(ConnectionTable); i := i+1) {
if (ConnectionTable[i].sccp_conn_id == -1) {
ConnectionTable[i].comp_ref := comp_ref;
@ -325,11 +325,11 @@ runs on BSSMAP_Emulation_CT {
return;
}
}
testcase.stop("BSSMAP Connection table full!");
testcase.stop("RAN Connection table full!");
}
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) {
if (ConnectionTable[i].sccp_conn_id == sccp_conn_id) {
log("Deleted conn table entry ", i,
@ -339,12 +339,12 @@ runs on BSSMAP_Emulation_CT {
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;
}
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) {
if (ImsiTable[i].imsi == imsi or
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 */
private function f_handle_userData(BSSAP _ConnHdlr client, PDU_BSSAP bssap)
runs on BSSMAP _Emulation_CT {
private function f_handle_userData(RAN _ConnHdlr client, PDU_BSSAP bssap)
runs on RAN _Emulation_CT {
/* decode + send decoded BSSAP to client */
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 (g_bssmap _ops.role_ms) {
if (ischosen(bssap.pdu.dtap) and g_ran _ops.decode_dtap) {
if (g_ran _ops.role_ms) {
/* we are the MS, so any message to us must be MT */
var PDU_DTAP_MT mt := {
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
* arrives */
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)
runs on BSSMAP _Emulation_CT return template PDU_BSSAP;
runs on RAN _Emulation_CT return template PDU_BSSAP;
/* handle common Unitdata such as Paging */
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)) {
var BSSAP _ConnHdlr client := null;
var RAN _ConnHdlr client := null;
client := f_imsi_table_find(bssap.pdu.bssmap.paging.iMSI.digits,
bssap.pdu.bssmap.paging.tMSI.tmsiOctets);
if (client != null) {
@ -417,10 +417,10 @@ runs on BSSMAP_Emulation_CT return template PDU_BSSAP {
log("CommonBssmapUnitdataCallback: Not a paging message");
}
/* ELSE: handle in user callback */
return g_bssmap _ops.unitdata_cb.apply(bssap);
return g_ran _ops.unitdata_cb.apply(bssap);
}
type record Bssmap Ops {
type record Ran Ops {
BssmapCreateCallback create_cb,
BssmapUnitdataCallback unitdata_cb,
boolean decode_dtap,
@ -472,7 +472,7 @@ private function f_bssap_l3_is_rr(PDU_BSSAP bssap) return boolean {
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;
[] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) -> value ud_ind {
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;
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;
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_bssmap _ops := ops;
g_ran _id := id;
g_ran _ops := ops;
f_conn_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_DISCONNECT_ind disc_ind;
var BSSAP_Conn_Req creq;
var BSSAP _ConnHdlr vc_conn;
var RAN _ConnHdlr vc_conn;
var PDU_BSSAP bssap;
var PDU_DTAP_MO dtap_mo;
var PDU_DTAP_MT dtap_mt;
var MgcpCommand mgcp_req;
var MgcpResponse mgcp_resp;
var BSSAP _ConnHdlr vc_hdlr;
var RAN _ConnHdlr vc_hdlr;
var octetstring l3_info;
var hexstring imsi;
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);
}
/* 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;
f_conn_table_del(disc_ind.connectionId);
/* 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 */
[] BSSAP.receive(BSSAP_N_CONNECT_cfm:?) -> value conn_cfm {
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;
/* handle user payload */
if (ispresent(conn_cfm.userData)) {
@ -608,7 +608,7 @@ function main(BssmapOps ops, charstring id) runs on BSSMAP_Emulation_CT {
}
/* 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);
BSSAP.send(ts_BSSAP_DISC_req(conn_id, 0));
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
* 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 */
var integer idx := f_idx_by_comp(vc_conn);
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));
}
[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);
/* convert from decoded DTAP to encoded 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));
}
[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);
/* convert from decoded DTAP to encoded 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);
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);
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 */
octetstring l3_payload optional,
/* component reference for this connection */
BSSAP _ConnHdlr vc_conn
RAN _ConnHdlr vc_conn
}
/* 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 */
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 {
inout BSSMAPEM_register, BSSMAPEM _register_imsi;
type port RAN _PROC_PT procedure {
inout RAN_register, RAN _register_imsi;
} with { extension "internal" };
/* CreateCallback that can be used as create_cb and will use the expectation table */
function ExpectedCreateCallback(BSSAP_N_CONNECT_ind conn_ind, charstring id)
runs on BSSMAP_Emulation_CT return BSSAP _ConnHdlr {
var BSSAP _ConnHdlr ret := null;
runs on RAN_Emulation_CT return RAN _ConnHdlr {
var RAN _ConnHdlr ret := null;
var octetstring l3_info;
var integer i;
@ -788,8 +788,8 @@ runs on BSSMAP_Emulation_CT return BSSAP_ConnHdlr {
return ret;
}
private function f_create_expect(octetstring l3, BSSAP _ConnHdlr hdlr)
runs on BSSMAP _Emulation_CT {
private function f_create_expect(octetstring l3, RAN _ConnHdlr hdlr)
runs on RAN _Emulation_CT {
var integer i;
for (i := 0; i < sizeof(ExpectTable); i := i+1) {
if (not ispresent(ExpectTable[i].l3_payload)) {
@ -802,8 +802,8 @@ runs on BSSMAP_Emulation_CT {
testcase.stop("No space left in ExpectTable");
}
private function f_create_imsi(hexstring imsi, OCT4 tmsi, BSSAP _ConnHdlr hdlr)
runs on BSSMAP _Emulation_CT {
private function f_create_imsi(hexstring imsi, OCT4 tmsi, RAN _ConnHdlr hdlr)
runs on RAN _Emulation_CT {
for (var integer i := 0; i < sizeof(ImsiTable); i := i+1) {
if (not ispresent(ImsiTable[i].imsi)) {
ImsiTable[i].imsi := imsi;
@ -818,17 +818,17 @@ runs on BSSMAP_Emulation_CT {
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) {
ExpectTable[i].l3_payload := omit;
}
}
/* helper function for clients to register their IMSI/TMSI */
function f_bssmap _register_imsi(hexstring imsi, OCT4 tmsi)
runs on BSSAP _ConnHdlr {
BSSAP_PROC.call(BSSMAPEM _register_imsi:{imsi, tmsi, self}) {
[] BSSAP_PROC.getreply(BSSMAPEM _register_imsi:{?,?,?}) {};
function f_ran _register_imsi(hexstring imsi, OCT4 tmsi)
runs on RAN _ConnHdlr {
BSSAP_PROC.call(RAN _register_imsi:{imsi, tmsi, self}) {
[] BSSAP_PROC.getreply(RAN _register_imsi:{?,?,?}) {};
}
}