gerrit-log
Threads by month
- ----- 2026 -----
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
May 2022
- 2 participants
- 1343 discussions
Change in osmo-ccid-firmware[master]: add simple gangupdater for multiple octsim boards
by roh 15 Mar '25
by roh 15 Mar '25
15 Mar '25
roh has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/26896 )
Change subject: add simple gangupdater for multiple octsim boards
......................................................................
add simple gangupdater for multiple octsim boards
Change-Id: Ic10572c121ac55586ec43126b63d69529757132b
---
A contrib/flash_all_octsim.sh
1 file changed, 22 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/96/26896/1
diff --git a/contrib/flash_all_octsim.sh b/contrib/flash_all_octsim.sh
new file mode 100644
index 0000000..4f4c89b
--- /dev/null
+++ b/contrib/flash_all_octsim.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+# this script is to scan for octsim boards, sort them by usb path and call dfu-util on each to update the board
+# basic flow
+# - get usb path and serialno tupel from dfu-util -l
+# - reformat and sort by usbpath, drop the usbpath (grep cut tr sort cut)
+# - flash the boards
+
+# TODO:
+# - error handling
+# - filter dfu-util output and generate nice summary
+
+dfu-util -l \
+ | grep "^Found" \
+ | grep "\[1d50:6141\]" \
+ | cut -d ' ' -f 8,13 \
+ | tr -d ',' \
+ | cut -d \" -f 2,4 \
+ | tr \" ' ' \
+ | sort \
+ | cut -d ' ' -f 2
+ | xargs -n 1 dfu-util -d 1d50:6141 -D sysmoOCTSIM.bin -R -p
--
To view, visit https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/26896
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-ccid-firmware
Gerrit-Branch: master
Gerrit-Change-Id: Ic10572c121ac55586ec43126b63d69529757132b
Gerrit-Change-Number: 26896
Gerrit-PatchSet: 1
Gerrit-Owner: roh <jsteiger(a)sysmocom.de>
Gerrit-MessageType: newchange
2
2
Change in simtrace2[master]: simtrace2-tool: hack: kick the comms by sending a fake message
by James Tavares 22 Nov '22
by James Tavares 22 Nov '22
22 Nov '22
James Tavares has uploaded this change for review. ( https://gerrit.osmocom.org/c/simtrace2/+/26864 )
Change subject: simtrace2-tool: hack: kick the comms by sending a fake message
......................................................................
simtrace2-tool: hack: kick the comms by sending a fake message
This is a workaround until the root cause of the communications failure
between simtrace2-tool and simtrace2 firmware is identified. Additional
details provided on simtrace mailing list.
Change-Id: I40fa06bee5d8194516497e16597e069124ddf0fb
---
M host/include/osmocom/simtrace2/simtrace2_api.h
M host/lib/simtrace2_api.c
M host/src/simtrace2-tool.c
3 files changed, 23 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/simtrace2 refs/changes/64/26864/1
diff --git a/host/include/osmocom/simtrace2/simtrace2_api.h b/host/include/osmocom/simtrace2/simtrace2_api.h
index d658d16..3a7e5ae 100644
--- a/host/include/osmocom/simtrace2/simtrace2_api.h
+++ b/host/include/osmocom/simtrace2/simtrace2_api.h
@@ -44,6 +44,7 @@
int osmo_st2_slot_tx_msg(struct osmo_st2_slot *slot, struct msgb *msg,
uint8_t msg_class, uint8_t msg_type);
+int osmo_st2_generic_do_error_none(struct osmo_st2_cardem_inst *ci);
int osmo_st2_cardem_request_card_insert(struct osmo_st2_cardem_inst *ci, bool inserted);
int osmo_st2_cardem_request_pb_and_rx(struct osmo_st2_cardem_inst *ci, uint8_t pb, uint8_t le);
diff --git a/host/lib/simtrace2_api.c b/host/lib/simtrace2_api.c
index 4ad7eb7..beb6de4 100644
--- a/host/lib/simtrace2_api.c
+++ b/host/lib/simtrace2_api.c
@@ -155,6 +155,24 @@
}
/***********************************************************************
+ * Generic protocol
+ ***********************************************************************/
+
+/*! \brief Send an empty DO_ERROR message to the simtrace2 board */
+int osmo_st2_generic_do_error_none(struct osmo_st2_cardem_inst *ci)
+{
+ struct msgb *msg = st_msgb_alloc();
+ struct cardemu_usb_msg_error *err;
+
+ LOGSLOT(ci->slot, LOGL_NOTICE, "<= %s\n", __func__);
+
+ err = (struct cardemu_usb_msg_error *) msgb_put(msg, sizeof(*err));
+ memset(err, 0, sizeof(*err));
+
+ return osmo_st2_slot_tx_msg(ci->slot, msg, SIMTRACE_MSGC_GENERIC, SIMTRACE_CMD_DO_ERROR);
+}
+
+/***********************************************************************
* Card Emulation protocol
***********************************************************************/
diff --git a/host/src/simtrace2-tool.c b/host/src/simtrace2-tool.c
index d92638f..407eac9 100644
--- a/host/src/simtrace2-tool.c
+++ b/host/src/simtrace2-tool.c
@@ -297,6 +297,10 @@
fprintf(stderr, "can't obtain EP addrs; rc=%d\n", rc);
goto close_exit;
}
+
+ // HACK: kick the board with a fake message to get subsequent messages to be accepted
+ // TODO: figure out the real problem, and remove this
+ osmo_st2_generic_do_error_none(ci);
}
if (argc - optind <= 0) {
--
To view, visit https://gerrit.osmocom.org/c/simtrace2/+/26864
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: simtrace2
Gerrit-Branch: master
Gerrit-Change-Id: I40fa06bee5d8194516497e16597e069124ddf0fb
Gerrit-Change-Number: 26864
Gerrit-PatchSet: 1
Gerrit-Owner: James Tavares <jtavares(a)kvh.com>
Gerrit-MessageType: newchange
3
5
Change in osmo-ttcn3-hacks[master]: library/RSL_Types: fix wrong comment near tr_RSL_MsgTypeT
by pespin 31 May '22
by pespin 31 May '22
31 May '22
Attention is currently required from: fixeria.
pespin has posted comments on this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/28211 )
Change subject: library/RSL_Types: fix wrong comment near tr_RSL_MsgTypeT
......................................................................
Patch Set 1: Code-Review+2
--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/28211
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Ic10e324375d1495d94352e7229e6be481106e8bb
Gerrit-Change-Number: 28211
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Comment-Date: Tue, 31 May 2022 21:00:03 +0000
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
Gerrit-MessageType: comment
1
0
Change in osmo-ttcn3-hacks[master]: BSC_Tests: configure 3 additional TRX instances for BTS2
by fixeria 31 May '22
by fixeria 31 May '22
31 May '22
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/28213 )
Change subject: BSC_Tests: configure 3 additional TRX instances for BTS2
......................................................................
BSC_Tests: configure 3 additional TRX instances for BTS2
Change-Id: Ie1241c54abac9a56906c525155cbf7482bca738e
Related: SYS#5460
---
M bsc/BSC_Tests.ttcn
M bsc/osmo-bsc.cfg
2 files changed, 91 insertions(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/13/28213/1
diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn
index 913b284..04dc806 100644
--- a/bsc/BSC_Tests.ttcn
+++ b/bsc/BSC_Tests.ttcn
@@ -106,7 +106,7 @@
private const BtsParams c_BtsParams[NUM_BTS_CFG] := {
/* BTS0 */ { trx_num := 1, tsc := 2 },
/* BTS1 */ { trx_num := 1, tsc := 3 },
- /* BTS2 */ { trx_num := 1, tsc := 4 },
+ /* BTS2 */ { trx_num := 4, tsc := 4 },
/* BTS3 */ { trx_num := 1, tsc := 4 }
}
diff --git a/bsc/osmo-bsc.cfg b/bsc/osmo-bsc.cfg
index 2f8ee6d..c9cc6a0 100644
--- a/bsc/osmo-bsc.cfg
+++ b/bsc/osmo-bsc.cfg
@@ -350,6 +350,96 @@
timeslot 7
phys_chan_config PDCH
hopping enabled 0
+ trx 1
+ rf_locked 0
+ arfcn 873
+ nominal power 23
+ max_power_red 20
+ rsl e1 tei 0
+ timeslot 0
+ phys_chan_config TCH/F
+ hopping enabled 0
+ timeslot 1
+ phys_chan_config TCH/F
+ hopping enabled 0
+ timeslot 2
+ phys_chan_config TCH/F
+ hopping enabled 0
+ timeslot 3
+ phys_chan_config TCH/F
+ hopping enabled 0
+ timeslot 4
+ phys_chan_config TCH/F
+ hopping enabled 0
+ timeslot 5
+ phys_chan_config TCH/H
+ hopping enabled 0
+ timeslot 6
+ phys_chan_config PDCH
+ hopping enabled 0
+ timeslot 7
+ phys_chan_config PDCH
+ hopping enabled 0
+ trx 2
+ rf_locked 0
+ arfcn 875
+ nominal power 23
+ max_power_red 20
+ rsl e1 tei 0
+ timeslot 0
+ phys_chan_config TCH/F
+ hopping enabled 0
+ timeslot 1
+ phys_chan_config TCH/F
+ hopping enabled 0
+ timeslot 2
+ phys_chan_config TCH/F
+ hopping enabled 0
+ timeslot 3
+ phys_chan_config TCH/F
+ hopping enabled 0
+ timeslot 4
+ phys_chan_config TCH/F
+ hopping enabled 0
+ timeslot 5
+ phys_chan_config TCH/H
+ hopping enabled 0
+ timeslot 6
+ phys_chan_config PDCH
+ hopping enabled 0
+ timeslot 7
+ phys_chan_config PDCH
+ hopping enabled 0
+ trx 3
+ rf_locked 0
+ arfcn 877
+ nominal power 23
+ max_power_red 20
+ rsl e1 tei 0
+ timeslot 0
+ phys_chan_config TCH/F
+ hopping enabled 0
+ timeslot 1
+ phys_chan_config TCH/F
+ hopping enabled 0
+ timeslot 2
+ phys_chan_config TCH/F
+ hopping enabled 0
+ timeslot 3
+ phys_chan_config TCH/F
+ hopping enabled 0
+ timeslot 4
+ phys_chan_config TCH/F
+ hopping enabled 0
+ timeslot 5
+ phys_chan_config TCH/H
+ hopping enabled 0
+ timeslot 6
+ phys_chan_config PDCH
+ hopping enabled 0
+ timeslot 7
+ phys_chan_config PDCH
+ hopping enabled 0
bts 3
type osmo-bts
band DCS1800
--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/28213
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Ie1241c54abac9a56906c525155cbf7482bca738e
Gerrit-Change-Number: 28213
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-MessageType: newchange
1
0
Change in osmo-ttcn3-hacks[master]: BSC_Tests: add TC_chan_alloc_algo_{a,de}scending
by fixeria 31 May '22
by fixeria 31 May '22
31 May '22
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/28214 )
Change subject: BSC_Tests: add TC_chan_alloc_algo_{a,de}scending
......................................................................
BSC_Tests: add TC_chan_alloc_algo_{a,de}scending
Change-Id: Ic74a9cd264320a9a17648f9331b67fb2c2404122
Related: SYS#5460
---
M bsc/BSC_Tests.ttcn
1 file changed, 56 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/14/28214/1
diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn
index 04dc806..d7b659e 100644
--- a/bsc/BSC_Tests.ttcn
+++ b/bsc/BSC_Tests.ttcn
@@ -11528,6 +11528,58 @@
f_shutdown_helper();
}
+private function f_TC_chan_alloc_algo(DchanTuple dt, BtsTrxIdx idx)
+runs on test_CT {
+ /* MSC sends an Assignment Request */
+ var PDU_BSSAP ass_cmd := f_gen_ass_req();
+ ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
+ ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
+ BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ass_cmd));
+
+ /* Expect the BSC to allocate a TCH/F channel on the given BTS/TRX */
+ var RSL_Message rx_rsl := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV), idx);
+ var RslChannelNr chan_nr := rx_rsl.ies[0].body.chan_nr;
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, 23 + 10), idx);
+
+ f_perform_clear_test_ct(dt);
+}
+
+testcase TC_chan_alloc_algo_ascending() runs on test_CT {
+ /* We need to access BTS2, which has 4 TRXs */
+ f_init(nr_bts := 3);
+
+ /* HACK: work around "Couldn't find Expect for CRCX" */
+ vc_MGCP.stop;
+
+ f_vty_enter_cfg_bts(BSCVTY, 2);
+ f_vty_transceive(BSCVTY, "channel allocator ascending");
+ f_vty_transceive(BSCVTY, "end");
+
+ /* Expect the BSC to allocate a TCH channel on BTS2/TRX0 */
+ var DchanTuple dt := f_est_dchan('23'O, 23, '00000000'O, {2, 0});
+ f_TC_chan_alloc_algo(dt, {2, 0});
+
+ f_shutdown_helper();
+}
+
+testcase TC_chan_alloc_algo_descending() runs on test_CT {
+ /* We need to access BTS2, which has 4 TRXs */
+ f_init(nr_bts := 3);
+
+ /* HACK: work around "Couldn't find Expect for CRCX" */
+ vc_MGCP.stop;
+
+ f_vty_enter_cfg_bts(BSCVTY, 2);
+ f_vty_transceive(BSCVTY, "channel allocator descending");
+ f_vty_transceive(BSCVTY, "end");
+
+ /* Expect the BSC to allocate a TCH channel on BTS2/TRX3 */
+ var DchanTuple dt := f_est_dchan('23'O, 23, '00000000'O, {2, 0});
+ f_TC_chan_alloc_algo(dt, {2, 3});
+
+ f_shutdown_helper();
+}
+
control {
/* CTRL interface testing */
execute( TC_ctrl_msc_connection_status() );
@@ -11854,6 +11906,10 @@
execute( TC_lost_sdcch_during_assignment() );
+ /* Channel allocator */
+ execute( TC_chan_alloc_algo_ascending() );
+ execute( TC_chan_alloc_algo_descending() );
+
/* Run TC_ho_out_of_this_bsc last, because it may trigger a segfault before osmo-bsc's patch
* with change-id I5a3345ab0005a73597f5c27207480912a2f5aae6 */
execute( TC_ho_out_of_this_bsc() );
--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/28214
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Ic74a9cd264320a9a17648f9331b67fb2c2404122
Gerrit-Change-Number: 28214
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-MessageType: newchange
1
0
Change in osmo-ttcn3-hacks[master]: BSC_Tests: add support for per-TRX RSL connections
by fixeria 31 May '22
by fixeria 31 May '22
31 May '22
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/28212 )
Change subject: BSC_Tests: add support for per-TRX RSL connections
......................................................................
BSC_Tests: add support for per-TRX RSL connections
So far it was possible to communicate with multiple BTS instances,
however we were limited to only one IPA/RSL connection per BTS.
Communicating with additional TRX instances requires establishing
additional per-TRX IPA/RSL connections. This patch extends the
testsuite infrastructure, so that it becomes possible to have
up to 4 individual TRX instances for each BTS.
* Introduce record 'BtsParams', store per-BTS params in an array.
* IPA_RSL_PT: test_CT.IPA_RSL[NUM_BTS] -> test_CT.IPA_RSL[NUM_BTS][NUM_TRX].
* BTS_State: test_CT.bts[NUM_BTS] -> test_CT.bts[NUM_BTS][NUM_TRX].
* f_init_bts_and_check_sysinfo() accepts number of TRX instances.
* f_init_bts() accepts number of TRX instances to configure.
* f_ipa_rsl_start() accepts a BtsTrxIdx param.
* Introduce record BtsTrxIdx allowing to specify BTS/TRX index values.
* f_ipa_tx(), f_exp_ipa_rx() accept a BtsTrxIdx param (default {0, 0}).
* f_est_dchan[_dyn]() accept a BtsTrxIdx param (default {0, 0}).
** and store the given BtsTrxIdx in returned DchanTuple.
* f_chreq_act_ack() accepts a BtsTrxIdx param (default {0, 0}).
* f_expect_chan_rel() accepts a BtsTrxIdx param (default {0, 0}).
* f_exp_ipa_rx_nonfatal() accepts BtsTrxIdx (default {0, 0}).
* f_exp_chan_rel_and_clear() uses BtsTrxIdx indicated in the given DchanTuple.
The major limitation is that MSC_ConnHdlr components still have no
access to additional TRX instances - this can be implemented later.
Change-Id: Ic0fd97234464ef624010a5f01189aa61f3393b84
Related: SYS#5460
---
M bsc/BSC_Tests.ttcn
M bsc/BSC_Tests_CBSP.ttcn
M bsc/BSC_Tests_LCLS.ttcn
M bsc/BSC_Tests_VAMOS.ttcn
4 files changed, 397 insertions(+), 361 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/12/28212/1
diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn
index feb8bfb..913b284 100644
--- a/bsc/BSC_Tests.ttcn
+++ b/bsc/BSC_Tests.ttcn
@@ -75,10 +75,10 @@
import from GSM_RestOctets all;
import from TCCConversion_Functions all;
-type record of integer integer_list;
-
+const integer NUM_TRX := 4;
const integer NUM_BTS := 3;
const integer NUM_BTS_CFG := 4; /* we have 4 BTS in the osmo-bsc.cfg (for inter-BSC HO tests) but use only 3 */
+const integer NUM_TRX_CFG := 1; /* we support up to 4 TRX per BTS, but have only 1 TRX per BTS in osmo-bsc.cfg */
const integer NUM_MSC := 3;
const float T3101_MAX := 12.0;
@@ -87,17 +87,27 @@
const integer NUM_TCHF_PER_BTS := 4;
const integer NUM_SDCCH_PER_BTS := 3;
+friend type record BtsTrxIdx {
+ uint8_t bts,
+ uint8_t trx
+}
+
+private type record BtsParams {
+ integer trx_num,
+ integer tsc
+}
+
/* Default Training Sequence Code expected for bts[i]:
* BTS 0 has BSIC 10 (and no explicit timeslot training_sequence_code config), so expecting TSC = (BSIC & 7) = 2.
* BTS 1 has BSIC 11, TSC = (BSIC & 7) = 3.
* BTS 2 has BSIC 12, TSC = (BSIC & 7) = 4.
* BTS 2 has BSIC 12, TSC = (BSIC & 7) = 4.
*/
-const integer_list BTS_TSC := {
- 2,
- 3,
- 4,
- 4
+private const BtsParams c_BtsParams[NUM_BTS_CFG] := {
+ /* BTS0 */ { trx_num := 1, tsc := 2 },
+ /* BTS1 */ { trx_num := 1, tsc := 3 },
+ /* BTS2 */ { trx_num := 1, tsc := 4 },
+ /* BTS3 */ { trx_num := 1, tsc := 4 }
}
/* per-BTS state which we keep */
@@ -593,12 +603,12 @@
}
type component test_CT extends CTRL_Adapter_CT {
- /* Array of per-BTS state */
- var BTS_State bts[NUM_BTS];
+ /* Array of per-BTS/TRX state */
+ var BTS_State bts[NUM_BTS][NUM_TRX];
/* RSL common Channel Port (for RSL_Emulation) */
port RSL_CCHAN_PT RSL_CCHAN[NUM_BTS];
- /* array of per-BTS RSL test ports */
- port IPA_RSL_PT IPA_RSL[NUM_BTS];
+ /* array of per-BTS/TRX RSL test ports */
+ port IPA_RSL_PT IPA_RSL[NUM_BTS][NUM_TRX];
port IPA_CODEC_PT IPA; /* Required for compilation of TC_rsl_unknown_unit_id() */
/* CTRL muxed over IPA in SCCPlite conn BSC<->MSC (or BSC-NAT) */
port IPA_CTRL_PT SCCPLITE_IPA_CTRL;
@@ -731,7 +741,7 @@
}
pars.exp_ms_power_level := mp_exp_ms_power_level;
pars.mscpool.bssap_idx := bssap_idx;
- pars.expect_tsc := BTS_TSC[0];
+ pars.expect_tsc := c_BtsParams[0].tsc;
pars.imsi := f_rnd_imsi('00101'H);
log(testcasename(), ": using IMSI ", pars.imsi);
@@ -925,21 +935,21 @@
* \param clnt IPA_Client for which to establish
* \param bsc_host IP address / hostname of the BSC
* \param bsc_port TCP port number of the BSC
- * \param i number identifying this BTS
+ * \param idx BTS/TRX index values
* \param handler_mode Start an RSL_Emulation_CT component (true) or not (false) */
-function f_ipa_rsl_start(inout IPA_Client clnt, charstring bsc_host, PortNumber bsc_port, integer i,
- boolean handler_mode := false)
+function f_ipa_rsl_start(inout IPA_Client clnt, charstring bsc_host, PortNumber bsc_port,
+ BtsTrxIdx idx := {0, 0}, boolean handler_mode := false)
runs on test_CT {
timer T := 10.0;
- clnt.id := "IPA" & int2str(i) & "-RSL";
+ clnt.id := "IPA-BTS" & int2str(idx.bts) & "-TRX" & int2str(idx.trx) & "-RSL";
clnt.vc_IPA := IPA_Emulation_CT.create(clnt.id & "-IPA") alive;
clnt.ccm_pars := c_IPA_default_ccm_pars;
clnt.ccm_pars.name := "Osmocom TTCN-3 BTS Simulator";
- clnt.ccm_pars.unit_id := int2str(1234+i) & "/0/0";
+ clnt.ccm_pars.unit_id := int2str(1234 + idx.bts) & "/0/" & int2str(idx.trx);
if (handler_mode) {
clnt.vc_RSL := RSL_Emulation_CT.create(clnt.id & "-RSL") alive;
- connect(clnt.vc_RSL:CCHAN_PT, self:RSL_CCHAN[i]);
+ connect(clnt.vc_RSL:CCHAN_PT, self:RSL_CCHAN[idx.bts]);
}
map(clnt.vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
@@ -947,10 +957,11 @@
if (handler_mode) {
connect(clnt.vc_IPA:IPA_RSL_PORT, clnt.vc_RSL:IPA_PT);
} else {
- connect(clnt.vc_IPA:IPA_RSL_PORT, self:IPA_RSL[i]);
+ connect(clnt.vc_IPA:IPA_RSL_PORT, self:IPA_RSL[idx.bts][idx.trx]);
}
- clnt.vc_IPA.start(IPA_Emulation.main_client(bsc_host, bsc_port, "", 10000+i, clnt.ccm_pars));
+ var integer local_port := 10000 + idx.bts * NUM_TRX + idx.trx;
+ clnt.vc_IPA.start(IPA_Emulation.main_client(bsc_host, bsc_port, "", local_port, clnt.ccm_pars));
if (handler_mode) {
clnt.vc_RSL.start(RSL_Emulation.main());
return;
@@ -959,11 +970,11 @@
/* wait for IPA RSL link to connect and send ID ACK */
T.start;
alt {
- [] IPA_RSL[i].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_ID_ACK)) {
+ [] IPA_RSL[idx.bts][idx.trx].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_ID_ACK)) {
T.stop;
}
- [] IPA_RSL[i].receive(ASP_IPA_Event:?) { repeat }
- [] IPA_RSL[i].receive { repeat }
+ [] IPA_RSL[idx.bts][idx.trx].receive(ASP_IPA_Event:?) { repeat }
+ [] IPA_RSL[idx.bts][idx.trx].receive { repeat }
[] T.timeout {
setverdict(fail, "Timeout RSL waiting for ASP_IPA_EVENT_ID_ACK");
mtc.stop;
@@ -1108,19 +1119,19 @@
var ASP_RSL_Unitdata rx_rsl_ud;
/* For handler_mode := false, receiving the RSL bootstrap messages directly on IPA_RSL */
- [] IPA_RSL[rsl_idx].receive(tr_ASP_RSL_UD(tr_RSL_NO_BCCH_INFO)) -> value rx_rsl_ud {
+ [] IPA_RSL[rsl_idx][0].receive(tr_ASP_RSL_UD(tr_RSL_NO_BCCH_INFO)) -> value rx_rsl_ud {
f_sysinfo_seen(rsl_idx, rx_rsl_ud.rsl);
repeat;
}
- [] IPA_RSL[rsl_idx].receive(tr_ASP_RSL_UD(tr_RSL_BCCH_INFO)) -> value rx_rsl_ud {
+ [] IPA_RSL[rsl_idx][0].receive(tr_ASP_RSL_UD(tr_RSL_BCCH_INFO)) -> value rx_rsl_ud {
f_sysinfo_seen(rsl_idx, rx_rsl_ud.rsl);
repeat;
}
- [] IPA_RSL[rsl_idx].receive(tr_ASP_RSL_UD(tr_RSL_NO_SACCH_FILL)) -> value rx_rsl_ud {
+ [] IPA_RSL[rsl_idx][0].receive(tr_ASP_RSL_UD(tr_RSL_NO_SACCH_FILL)) -> value rx_rsl_ud {
f_sysinfo_seen(rsl_idx, rx_rsl_ud.rsl);
repeat;
}
- [] IPA_RSL[rsl_idx].receive(tr_ASP_RSL_UD(tr_RSL_SACCH_FILL)) -> value rx_rsl_ud {
+ [] IPA_RSL[rsl_idx][0].receive(tr_ASP_RSL_UD(tr_RSL_SACCH_FILL)) -> value rx_rsl_ud {
f_sysinfo_seen(rsl_idx, rx_rsl_ud.rsl);
repeat;
}
@@ -1234,30 +1245,38 @@
f_init_mgcp("VirtMSC");
for (var integer i := 0; i < nr_bts; i := i+1) {
- f_init_bts(i, handler_mode);
+ f_init_bts(i, c_BtsParams[i].trx_num, handler_mode);
}
/* Emit a marker to appear in the SUT's own logging output */
f_logp(BSCVTY, testcasename() & "() start");
}
-function f_init_bts(integer bts_idx := 0, boolean handler_mode := false)
+function f_init_bts(integer bts_idx := 0,
+ integer trx_num := NUM_TRX_CFG,
+ boolean handler_mode := false)
runs on test_CT {
/* wait until osmo-bts-omldummy has respawned */
f_wait_oml(bts_idx, "degraded", 5.0);
- /* start RSL connection */
- f_ipa_rsl_start(bts[bts_idx].rsl, mp_bsc_ip, mp_bsc_rsl_port, bts_idx, handler_mode);
+ /* start RSL connection(s) */
+ for (var integer trx_idx := 0; trx_idx < trx_num; trx_idx := trx_idx + 1) {
+ f_ipa_rsl_start(bts[bts_idx][trx_idx].rsl,
+ mp_bsc_ip, mp_bsc_rsl_port,
+ {bts_idx, trx_idx}, handler_mode);
+ }
/* wait until BSC tells us "connected" */
f_wait_oml(bts_idx, "connected", 5.0);
}
-function f_init_bts_and_check_sysinfo(integer bts_idx := 0, boolean handler_mode := false,
+function f_init_bts_and_check_sysinfo(integer bts_idx := 0,
+ integer trx_num := NUM_TRX_CFG,
+ boolean handler_mode := false,
template SystemInformationConfig expect_si)
runs on test_CT {
var default sysinfo := activate(as_catch_RSL_sysinfo(bts_idx));
- f_init_bts(bts_idx, handler_mode);
+ f_init_bts(bts_idx, trx_num, handler_mode);
/* Give some time to (hopefully/most likely) collect all system informations from RSL startup.
* We could stop as soon as all expected SI are received, but then we might miss SI that we don't expect and
@@ -1278,18 +1297,20 @@
}
}
-/* expect to receive a RSL message matching a specified template on a given BTS / stream */
-function f_exp_ipa_rx(integer bts_nr, template (present) RSL_Message t_rx, float t_secs := 2.0, IpaStreamId sid := IPAC_PROTO_RSL_TRX0)
+/* expect to receive a RSL message matching a specified template on a given BTS / TRX */
+function f_exp_ipa_rx(template (present) RSL_Message t_rx,
+ BtsTrxIdx idx := {0, 0},
+ float Tval := 2.0)
runs on test_CT return RSL_Message {
var ASP_RSL_Unitdata rx_rsl_ud;
- timer T := t_secs;
+ timer T := Tval;
T.start;
alt {
- [] IPA_RSL[bts_nr].receive(tr_ASP_RSL_UD(t_rx, sid)) -> value rx_rsl_ud {
+ [] IPA_RSL[idx.bts][idx.trx].receive(tr_ASP_RSL_UD(t_rx, ?)) -> value rx_rsl_ud {
T.stop;
}
- [] IPA_RSL[bts_nr].receive { repeat; }
+ [] IPA_RSL[idx.bts][idx.trx].receive { repeat; }
[] T.timeout {
setverdict(fail, "Timeout expecting ", t_rx);
mtc.stop;
@@ -1299,9 +1320,11 @@
}
/* helper function to transmit RSL on a given BTS/stream */
-function f_ipa_tx(integer bts_nr, template (value) RSL_Message t_tx, IpaStreamId sid := IPAC_PROTO_RSL_TRX0)
+function f_ipa_tx(template (value) RSL_Message t_tx,
+ BtsTrxIdx idx := {0, 0},
+ IpaStreamId sid := IPAC_PROTO_RSL_TRX0)
runs on test_CT {
- IPA_RSL[bts_nr].send(ts_ASP_RSL_UD(t_tx, sid));
+ IPA_RSL[idx.bts][idx.trx].send(ts_ASP_RSL_UD(t_tx, sid));
}
@@ -1312,8 +1335,8 @@
f_init(1);
- IPA_RSL[0].send(ts_ASP_RSL_UD(ts_RSL_CHAN_RQD('23'O, 23)));
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ f_ipa_tx(ts_RSL_CHAN_RQD('23'O, 23));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
f_shutdown_helper();
}
@@ -1346,25 +1369,25 @@
f_logp(BSCVTY, "f_chan_act_counter(" & chreq_ctr_suffix & ")");
var RSL_Message rx_rsl;
- f_ipa_tx(0, ts_RSL_CHAN_RQD(ra, fn));
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ f_ipa_tx(ts_RSL_CHAN_RQD(ra, fn));
+ rx_rsl := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
var RslChannelNr chan_nr := rx_rsl.ies[0].body.chan_nr;
f_ctrs_bts_add(0, "chreq:total");
f_ctrs_bts_add(0, "chreq:attempted_" & chreq_ctr_suffix);
f_ctrs_bts_verify();
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10));
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_IMM_ASSIGN(0));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10));
+ rx_rsl := f_exp_ipa_rx(tr_RSL_IMM_ASSIGN(0));
f_ctrs_bts_add(0, "chreq:successful");
f_ctrs_bts_add(0, "chreq:successful_" & chreq_ctr_suffix);
f_ctrs_bts_verify();
/* test is done, release RSL Conn Fail Ind to clean up */
- f_ipa_tx(0, ts_RSL_CONN_FAIL_IND(chan_nr, RSL_ERR_RADIO_LINK_FAIL));
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), 10.0);
- f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(chan_nr));
+ f_ipa_tx(ts_RSL_CONN_FAIL_IND(chan_nr, RSL_ERR_RADIO_LINK_FAIL));
+ rx_rsl := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), Tval := 10.0);
+ f_ipa_tx(ts_RSL_RF_CHAN_REL_ACK(chan_nr));
f_sleep(1.0);
}
@@ -1411,7 +1434,7 @@
var RslChannelNr chan_nr := f_chreq_act_ack(ra);
/* expect BSC to disable the channel again if there's no RLL EST IND */
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
+ rx_rsl := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), Tval := T3101_MAX);
f_shutdown_helper();
}
@@ -1440,10 +1463,10 @@
f_init(1);
f_vty_allow_emerg_bts(false, 0);
- IPA_RSL[0].clear;
- f_ipa_tx(0, ts_RSL_CHAN_RQD('A5'O, 23));
+ IPA_RSL[0][0].clear;
+ f_ipa_tx(ts_RSL_CHAN_RQD('A5'O, 23));
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeC(RSL_MT_IMMEDIATE_ASSIGN_CMD));
+ rx_rsl := f_exp_ipa_rx(tr_RSL_MsgTypeC(RSL_MT_IMMEDIATE_ASSIGN_CMD));
rr := dec_GsmRrMessage(rx_rsl.ies[1].body.full_imm_ass_info.payload);
if (rr.header.message_type == IMMEDIATE_ASSIGNMENT_REJECT) {
setverdict(pass);
@@ -1467,13 +1490,13 @@
var RslChannelNr chan_nr := f_chreq_act_ack();
var octetstring l3 := '00010203040506'O
- f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
+ f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3)));
/* expect BSC to disable the channel again if there's no response from MSC */
/* MS waits 20s (T3210) at LU; 10s (T3230) at CM SERV REQ and 5s (T3220) AT detach */
- f_expect_chan_rel(0, chan_nr, expect_rll_rel_req := false);
+ f_expect_chan_rel(chan_nr, expect_rll_rel_req := false);
f_shutdown_helper();
}
@@ -1488,13 +1511,13 @@
var RslChannelNr chan_nr := f_chreq_act_ack();
var octetstring l3 := '00010203040506'O
- f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
+ f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;
BSSAP.send(ts_BSSAP_DISC_req(rx_c_ind.connectionId, 0));
/* expect BSC to disable the channel */
- f_expect_chan_rel(0, chan_nr, expect_rll_rel_req := false);
+ f_expect_chan_rel(chan_nr, expect_rll_rel_req := false);
f_shutdown_helper();
}
@@ -1507,11 +1530,11 @@
chact_nack := f_ctrl_get_ratectr_abs(IPA_CTRL, "bts", 0, "chan_act:nack");
- f_ipa_tx(0, ts_RSL_CHAN_RQD('33'O, 33));
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ f_ipa_tx(ts_RSL_CHAN_RQD('33'O, 33));
+ rx_rsl := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
var RslChannelNr chan_nr := rx_rsl.ies[0].body.chan_nr;
- f_ipa_tx(0, ts_RSL_CHAN_ACT_NACK(chan_nr, RSL_ERR_EQUIPMENT_FAIL));
+ f_ipa_tx(ts_RSL_CHAN_ACT_NACK(chan_nr, RSL_ERR_EQUIPMENT_FAIL));
/* wait for some time to hope the NACK arrives before the CTRL GET below */
f_sleep(0.5);
@@ -1539,19 +1562,19 @@
var RslChannelNr chan_nr := f_chreq_act_ack('33'O, i);
}
- IPA_RSL[0].clear;
+ IPA_RSL[0][0].clear;
f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", 0, "chreq:total",
chreq_total + NUM_TCHF_PER_BTS + NUM_TCHH_PER_BTS + NUM_SDCCH_PER_BTS);
/* now expect additional channel activations to fail */
- f_ipa_tx(0, ts_RSL_CHAN_RQD('42'O, 42));
+ f_ipa_tx(ts_RSL_CHAN_RQD('42'O, 42));
alt {
- [] IPA_RSL[0].receive(tr_ASP_RSL_UD(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV))) {
+ [] IPA_RSL[0][0].receive(tr_ASP_RSL_UD(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV))) {
setverdict(fail, "Received CHAN ACT ACK without resources?!?");
}
- [] IPA_RSL[0].receive(tr_ASP_RSL_UD(tr_RSL_IMM_ASSIGN(?))) -> value rsl_ud {
+ [] IPA_RSL[0][0].receive(tr_ASP_RSL_UD(tr_RSL_IMM_ASSIGN(?))) -> value rsl_ud {
var GsmRrMessage rr;
/* match on IMM ASS REJ */
rr := dec_GsmRrMessage(rsl_ud.rsl.ies[1].body.full_imm_ass_info.payload);
@@ -1565,7 +1588,7 @@
repeat;
}
}
- [] IPA_RSL[0].receive { repeat; }
+ [] IPA_RSL[0][0].receive { repeat; }
}
f_shutdown_helper();
}
@@ -1584,18 +1607,18 @@
/* Expect CHANnel RELease */
alt {
- [] IPA_RSL[0].receive(tr_ASP_RSL_UD(tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL))) {
+ [] IPA_RSL[0][0].receive(tr_ASP_RSL_UD(tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL))) {
log("Received CHANnel RELease");
setverdict(pass);
}
- [] IPA_RSL[0].receive(tr_ASP_RSL_UD(tr_RSL_IMM_ASSIGN(?))) {
+ [] IPA_RSL[0][0].receive(tr_ASP_RSL_UD(tr_RSL_IMM_ASSIGN(?))) {
/* See OS#3709, OsmoBSC should not send Immediate
* Assignment Reject since a dedicated channel was
* already allocated, and Immediate Assignment was
* already sent. */
setverdict(fail, "Unexpected Immediate Assignment!");
}
- [] IPA_RSL[0].receive {
+ [] IPA_RSL[0][0].receive {
setverdict(fail, "Unexpected RSL message!");
}
}
@@ -1787,79 +1810,87 @@
type record DchanTuple {
integer sccp_conn_id,
- RslChannelNr rsl_chan_nr
+ RslChannelNr rsl_chan_nr,
+ BtsTrxIdx idx
}
type record of DchanTuple DchanTuples;
/* Send CHAN RQD and wait for allocation; acknowledge it */
-private function f_chreq_act_ack(OCT1 ra := '23'O, GsmFrameNumber fn := 23)
+private function f_chreq_act_ack(OCT1 ra := '23'O,
+ GsmFrameNumber fn := 23,
+ BtsTrxIdx idx := {0, 0})
runs on test_CT return RslChannelNr {
var RSL_Message rx_rsl;
- f_ipa_tx(0, ts_RSL_CHAN_RQD(ra, fn));
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ f_ipa_tx(ts_RSL_CHAN_RQD(ra, fn), {idx.bts, 0});
+ rx_rsl := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV), idx);
var RslChannelNr chan_nr := rx_rsl.ies[0].body.chan_nr;
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10));
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_IMM_ASSIGN(0));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10), idx);
+ rx_rsl := f_exp_ipa_rx(tr_RSL_IMM_ASSIGN(0), {idx.bts, 0});
return chan_nr;
}
/* helper function to establish a dedicated channel via BTS and MSC */
-function f_est_dchan(OCT1 ra, GsmFrameNumber fn, octetstring l3)
+function f_est_dchan(OCT1 ra, GsmFrameNumber fn, octetstring l3,
+ BtsTrxIdx idx := {0, 0})
runs on test_CT return DchanTuple {
var BSSAP_N_CONNECT_ind rx_c_ind;
var DchanTuple dt;
/* Send CHAN RQD and wait for allocation; acknowledge it */
- dt.rsl_chan_nr := f_chreq_act_ack(ra, fn);
+ dt.rsl_chan_nr := f_chreq_act_ack(ra, fn, idx);
- f_ipa_tx(0, ts_RSL_EST_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
+ f_ipa_tx(ts_RSL_EST_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3), idx);
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;
dt.sccp_conn_id := rx_c_ind.connectionId;
BSSAP.send(ts_BSSAP_CONNECT_res(dt.sccp_conn_id));
+ dt.idx := idx;
return dt;
}
/* Like f_est_dchan(), but for the first lchan of a dynamic timeslot: first ACK the deactivation of PDCH. */
-function f_est_dchan_dyn(OCT1 ra, GsmFrameNumber fn, octetstring l3)
+function f_est_dchan_dyn(OCT1 ra, GsmFrameNumber fn, octetstring l3,
+ BtsTrxIdx idx := {0, 0})
runs on test_CT return DchanTuple {
var BSSAP_N_CONNECT_ind rx_c_ind;
var DchanTuple dt;
/* Send CHAN RQD */
var RSL_Message rx_rsl;
- f_ipa_tx(0, ts_RSL_CHAN_RQD(ra, fn));
+ f_ipa_tx(ts_RSL_CHAN_RQD(ra, fn), {idx.bts, 0});
/* The dyn TS first deactivates PDCH */
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
+ rx_rsl := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), idx, Tval := T3101_MAX);
dt.rsl_chan_nr := rx_rsl.ies[0].body.chan_nr;
- f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
+ f_ipa_tx(ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr), idx);
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ rx_rsl := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV), idx);
dt.rsl_chan_nr := rx_rsl.ies[0].body.chan_nr;
/* Now activates the signalling channel */
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(dt.rsl_chan_nr, fn+10));
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_IMM_ASSIGN(0));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(dt.rsl_chan_nr, fn+10), idx);
+ rx_rsl := f_exp_ipa_rx(tr_RSL_IMM_ASSIGN(0), {idx.bts, 0});
- f_ipa_tx(0, ts_RSL_EST_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
+ f_ipa_tx(ts_RSL_EST_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3), idx);
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;
dt.sccp_conn_id := rx_c_ind.connectionId;
BSSAP.send(ts_BSSAP_CONNECT_res(dt.sccp_conn_id));
+ dt.idx := idx;
return dt;
}
/* expect RF CAN REL from BTS, acknowledge it and clear the MSC side */
-private function f_exp_chan_rel_and_clear(DchanTuple dt, integer bts_nr := 0) runs on test_CT {
+private function f_exp_chan_rel_and_clear(DchanTuple dt)
+runs on test_CT {
var RSL_Message rx_rsl;
/* expect BSC to disable the channel */
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
+ rx_rsl := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), dt.idx, Tval := T3101_MAX);
/* respond with CHAN REL ACK */
- f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
+ f_ipa_tx(ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr), dt.idx);
/* expect Clear Complete from BSC */
BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_ClearComplete));
@@ -1878,7 +1909,7 @@
dt := f_est_dchan('23'O, 23, '00010203040506'O);
/* simulate RLL REL IND */
- f_ipa_tx(0, ts_RSL_REL_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0))));
+ f_ipa_tx(ts_RSL_REL_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0))));
/* expect Clear Request on MSC side */
BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_ClearRequest)) -> value rx_di;
@@ -1888,7 +1919,7 @@
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
/* expect BSC to disable the channel */
- f_exp_chan_rel_and_clear(dt, 0);
+ f_exp_chan_rel_and_clear(dt);
/* wait for SCCP emulation to do its job */
f_sleep(1.0);
@@ -1906,7 +1937,7 @@
dt := f_est_dchan('23'O, 23, '00010203040506'O);
/* simulate CONN FAIL IND */
- f_ipa_tx(0, ts_RSL_CONN_FAIL_IND(dt.rsl_chan_nr, RSL_ERR_RADIO_LINK_FAIL));
+ f_ipa_tx(ts_RSL_CONN_FAIL_IND(dt.rsl_chan_nr, RSL_ERR_RADIO_LINK_FAIL));
/* TODO: different cause values? */
/* expect Clear Request from BSC */
@@ -1917,7 +1948,7 @@
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
/* expect BSC to disable the channel */
- f_exp_chan_rel_and_clear(dt, 0);
+ f_exp_chan_rel_and_clear(dt);
/* wait for SCCP emulation to do its job */
f_sleep(1.0);
@@ -1937,13 +1968,13 @@
dt.rsl_chan_nr := f_chreq_act_ack(f_rnd_ra_cs(), 23);
/* BTS->BSC: simulate CONN FAIL IND */
- f_ipa_tx(0, ts_RSL_CONN_FAIL_IND(dt.rsl_chan_nr, RSL_ERR_RADIO_LINK_FAIL));
+ f_ipa_tx(ts_RSL_CONN_FAIL_IND(dt.rsl_chan_nr, RSL_ERR_RADIO_LINK_FAIL));
/* BTS->BSC: Expect RF channel release from BSC on Abis */
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), 10.0);
+ rx_rsl := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), Tval := 10.0);
/* BTS<-BSC: respond with CHAN REL ACK */
- f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
+ f_ipa_tx(ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
f_shutdown_helper();
}
@@ -1962,15 +1993,15 @@
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(0)));
/* BTS->BSC: expect BSC to deactivate SACCH */
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_DEACT_SACCH(dt.rsl_chan_nr));
+ rx_rsl := f_exp_ipa_rx(tr_RSL_DEACT_SACCH(dt.rsl_chan_nr));
/* BTS->BSC: simulate a late CONN FAIL IND from BTS */
- f_ipa_tx(0, ts_RSL_CONN_FAIL_IND(dt.rsl_chan_nr, RSL_ERR_RADIO_LINK_FAIL));
+ f_ipa_tx(ts_RSL_CONN_FAIL_IND(dt.rsl_chan_nr, RSL_ERR_RADIO_LINK_FAIL));
/* BTS<-BSC: Expect RF channel release from BSC on Abis */
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), 10.0);
+ rx_rsl := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), Tval := 10.0);
/* BTS->BSC: respond with CHAN REL ACK */
- f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
+ f_ipa_tx(ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
/* BSC->MSC: expect Clear Complete from BSC */
BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_ClearComplete));
@@ -2027,7 +2058,8 @@
f_shutdown_helper();
}
-function f_expect_chan_rel(integer bts_nr, RslChannelNr rsl_chan_nr,
+function f_expect_chan_rel(RslChannelNr rsl_chan_nr,
+ BtsTrxIdx idx := {0, 0},
boolean expect_deact_sacch := true,
boolean expect_rr_chan_rel := true,
boolean expect_rll_rel_req := true,
@@ -2047,11 +2079,11 @@
log("f_expect_chan_rel() expecting: expect_deact_sacch=", expect_deact_sacch, " expect_rr_chan_rel=", expect_rr_chan_rel,
" expect_rll_rel_req=", expect_rll_rel_req);
alt {
- [] IPA_RSL[bts_nr].receive(tr_ASP_RSL_UD(tr_RSL_DEACT_SACCH(rsl_chan_nr))) {
+ [] IPA_RSL[idx.bts][idx.trx].receive(tr_ASP_RSL_UD(tr_RSL_DEACT_SACCH(rsl_chan_nr))) {
got_deact_sacch := true;
repeat;
}
- [] IPA_RSL[bts_nr].receive(tr_ASP_RSL_UD(tr_RSL_DATA_REQ(rsl_chan_nr, ?, decmatch tr_RRM_RR_RELEASE))) -> value ud {
+ [] IPA_RSL[idx.bts][idx.trx].receive(tr_ASP_RSL_UD(tr_RSL_DATA_REQ(rsl_chan_nr, ?, decmatch tr_RRM_RR_RELEASE))) -> value ud {
got_rr_chan_rel := true;
if (f_rsl_find_ie(ud.rsl, RSL_IE_L3_INFO, l3_ie) == false) {
@@ -2083,20 +2115,20 @@
}
repeat;
}
- [] IPA_RSL[bts_nr].receive(tr_ASP_RSL_UD(tr_RSL_REL_REQ(rsl_chan_nr, ?))) {
+ [] IPA_RSL[idx.bts][idx.trx].receive(tr_ASP_RSL_UD(tr_RSL_REL_REQ(rsl_chan_nr, ?))) {
got_rll_rel_req := true;
/* FIXME: Why are we getting this for LinkID SACCH? */
if (handle_rll_rel) {
- f_ipa_tx(0, ts_RSL_REL_CONF(rsl_chan_nr, main_dcch));
+ f_ipa_tx(ts_RSL_REL_CONF(rsl_chan_nr, main_dcch));
}
repeat;
}
- [] IPA_RSL[bts_nr].receive(tr_ASP_RSL_UD(tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL))) {
+ [] IPA_RSL[idx.bts][idx.trx].receive(tr_ASP_RSL_UD(tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL))) {
/* respond with CHAN REL ACK */
- f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(rsl_chan_nr));
+ f_ipa_tx(ts_RSL_RF_CHAN_REL_ACK(rsl_chan_nr));
}
/* ignore any user data */
- [] IPA_RSL[bts_nr].receive(tr_ASP_RSL_UD(tr_RSL_MsgTypeR(?))) {
+ [] IPA_RSL[idx.bts][idx.trx].receive(tr_ASP_RSL_UD(tr_RSL_MsgTypeR(?))) {
repeat;
}
}
@@ -2134,7 +2166,7 @@
BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
}
- f_expect_chan_rel(0, dt.rsl_chan_nr, expect_rll_rel_req := false);
+ f_expect_chan_rel(dt.rsl_chan_nr, expect_rll_rel_req := false);
f_shutdown_helper();
}
@@ -2167,7 +2199,7 @@
SystemInformationConfig_default, use that: */
var template CellSelIndValue exp_cells := f_tr_rr_chan_rel_earfcns(1);
- f_expect_chan_rel(0, dt.rsl_chan_nr, expect_rll_rel_req := false, expect_cells := exp_cells);
+ f_expect_chan_rel(dt.rsl_chan_nr, expect_rll_rel_req := false, expect_cells := exp_cells);
f_shutdown_helper();
}
@@ -2212,7 +2244,7 @@
BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
}
- f_expect_chan_rel(0, dt.rsl_chan_nr, expect_rll_rel_req := false);
+ f_expect_chan_rel(dt.rsl_chan_nr, expect_rll_rel_req := false);
f_shutdown_helper();
}
@@ -2227,7 +2259,7 @@
/* release the SCCP connection */
BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
- f_expect_chan_rel(0, dt.rsl_chan_nr, expect_rll_rel_req := false);
+ f_expect_chan_rel(dt.rsl_chan_nr, expect_rll_rel_req := false);
f_shutdown_helper();
}
@@ -2242,7 +2274,7 @@
/* release the SCCP connection */
BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
- f_expect_chan_rel(0, dt.rsl_chan_nr, expect_rll_rel_req := false);
+ f_expect_chan_rel(dt.rsl_chan_nr, expect_rll_rel_req := false);
f_shutdown_helper();
}
@@ -2255,7 +2287,7 @@
dt := f_est_dchan('23'O, 23, '00010203040506'O);
/* Clear the queue, it might still contain stuff like IMMEDIATE ASSIGN */
- IPA_RSL[0].clear;
+ IPA_RSL[0][0].clear;
/* perform BSSAP RESET, expect RESET ACK and DISC.ind on connection */
BSSAP.send(ts_BSSAP_UNITDATA_req(g_bssap[0].sccp_addr_peer, g_bssap[0].sccp_addr_own, ts_BSSMAP_Reset(0, g_osmux_enabled)));
@@ -2264,7 +2296,7 @@
[] BSSAP.receive(tr_BSSAP_DISC_ind(dt.sccp_conn_id, ?, ?)) { }
}
- f_expect_chan_rel(0, dt.rsl_chan_nr, expect_rll_rel_req := false);
+ f_expect_chan_rel(dt.rsl_chan_nr, expect_rll_rel_req := false);
f_shutdown_helper();
}
@@ -2281,7 +2313,7 @@
f_init(1);
dt := f_est_dchan('23'O, 23, '00010203040506'O);
- f_expect_chan_rel(0, dt.rsl_chan_nr, expect_rll_rel_req := false);
+ f_expect_chan_rel(dt.rsl_chan_nr, expect_rll_rel_req := false);
f_shutdown_helper();
}
@@ -2298,7 +2330,7 @@
BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
}
- f_expect_chan_rel(0, dt.rsl_chan_nr, expect_rll_rel_req := false, expect_rr_cause := expect_rr_cause);
+ f_expect_chan_rel(dt.rsl_chan_nr, expect_rll_rel_req := false, expect_rr_cause := expect_rr_cause);
}
/* Test that Clear Command cause codes affect the RR Channel Release cause code */
@@ -2323,7 +2355,7 @@
var octetstring l3 := '00010203040506'O;
var RslChannelNr chan_nr := valueof(t_RslChanNr_Bm(6));
- f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
+ f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
T.start;
alt {
@@ -2331,7 +2363,7 @@
setverdict(fail, "MSC received COMPL L3 for non-active lchan");
}
[] BSSAP.receive {}
- [] IPA_RSL[0].receive {}
+ [] IPA_RSL[0][0].receive {}
[] T.timeout {}
}
@@ -2347,7 +2379,7 @@
chan_nr := f_chreq_act_ack()
var octetstring l3 := '00010203040506'O;
- f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(1)), l3));
+ f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(1)), l3));
timer T := 2.0;
T.start;
@@ -2356,7 +2388,7 @@
setverdict(fail, "MSC received COMPL L3 for invalid SAPI 1");
}
[] BSSAP.receive { repeat; }
- [] IPA_RSL[0].receive { repeat; }
+ [] IPA_RSL[0][0].receive { repeat; }
[] T.timeout {}
}
@@ -2372,7 +2404,7 @@
var RslChannelNr chan_nr := f_chreq_act_ack();
var octetstring l3 := '00010203040506'O;
- f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(3)), l3));
+ f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(3)), l3));
T.start;
alt {
@@ -2380,7 +2412,7 @@
setverdict(fail, "MSC received COMPL L3 for invalid SAPI 3");
}
[] BSSAP.receive { repeat; }
- [] IPA_RSL[0].receive { repeat; }
+ [] IPA_RSL[0][0].receive { repeat; }
[] T.timeout {}
}
@@ -2396,7 +2428,7 @@
var RslChannelNr chan_nr := f_chreq_act_ack();
var octetstring l3 := '00010203040506'O;
- f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_SACCH(0)), l3));
+ f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_SACCH(0)), l3));
T.start;
alt {
@@ -2404,7 +2436,7 @@
setverdict(fail, "MSC received COMPL L3 for invalid Link SACCH");
}
[] BSSAP.receive { repeat; }
- [] IPA_RSL[0].receive { repeat; }
+ [] IPA_RSL[0][0].receive { repeat; }
[] T.timeout {}
}
@@ -2521,16 +2553,16 @@
/* MSC sends some data on (not yet established) SAPI=3 link */
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSAP_DTAP(rnd_data, '03'O)));
/* BSC attempts to establish a SAPI=3 link on DCCH */
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_EST_REQ(dt.rsl_chan_nr, tr_RslLinkID_DCCH(3)));
+ rx_rsl := f_exp_ipa_rx(tr_RSL_EST_REQ(dt.rsl_chan_nr, tr_RslLinkID_DCCH(3)));
/* MS sends unexpected RELease INDication on SAPI=3 */
- f_ipa_tx(0, ts_RSL_REL_IND(dt.rsl_chan_nr, ts_RslLinkID_DCCH(3)));
+ f_ipa_tx(ts_RSL_REL_IND(dt.rsl_chan_nr, ts_RslLinkID_DCCH(3)));
/* We expect to receive BSSMAP SAPI N Reject message from the BSC */
f_exp_sapi_n_reject(3, GSM0808_CAUSE_MS_NOT_EQUIPPED);
/* Clean up the connection */
BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
- f_expect_chan_rel(0, dt.rsl_chan_nr, expect_rll_rel_req := false);
+ f_expect_chan_rel(dt.rsl_chan_nr, expect_rll_rel_req := false);
f_shutdown_helper();
}
@@ -2549,16 +2581,16 @@
/* MSC sends some data on (not yet established) SAPI=3 link */
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSAP_DTAP(rnd_data, '03'O)));
/* BSC attempts to establish a SAPI=3 link on DCCH */
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_EST_REQ(dt.rsl_chan_nr, tr_RslLinkID_DCCH(3)));
+ rx_rsl := f_exp_ipa_rx(tr_RSL_EST_REQ(dt.rsl_chan_nr, tr_RslLinkID_DCCH(3)));
/* BTS sends unexpected ERROR INDication on SAPI=3 */
- f_ipa_tx(0, ts_RSL_ERROR_IND(dt.rsl_chan_nr, ts_RslLinkID_DCCH(3), ''O));
+ f_ipa_tx(ts_RSL_ERROR_IND(dt.rsl_chan_nr, ts_RslLinkID_DCCH(3), ''O));
/* We expect to receive BSSMAP SAPI N Reject message from the BSC */
f_exp_sapi_n_reject(3, GSM0808_CAUSE_BSS_NOT_EQUIPPED);
/* Clean up the connection */
BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
- f_expect_chan_rel(0, dt.rsl_chan_nr, expect_rll_rel_req := false);
+ f_expect_chan_rel(dt.rsl_chan_nr, expect_rll_rel_req := false);
f_shutdown_helper();
}
@@ -2577,14 +2609,14 @@
/* MSC sends some data on (not yet established) SAPI=3 link */
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSAP_DTAP(rnd_data, '03'O)));
/* BSC attempts to establish a SAPI=3 link on DCCH */
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_EST_REQ(dt.rsl_chan_nr, tr_RslLinkID_DCCH(3)));
+ rx_rsl := f_exp_ipa_rx(tr_RSL_EST_REQ(dt.rsl_chan_nr, tr_RslLinkID_DCCH(3)));
/* MS does not respond, so the link establishment timeout triggers SAPI N Reject */
f_exp_sapi_n_reject(3, GSM0808_CAUSE_BSS_NOT_EQUIPPED, T_val := 8.0);
/* Clean up the connection */
BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
- f_expect_chan_rel(0, dt.rsl_chan_nr, expect_rll_rel_req := false);
+ f_expect_chan_rel(dt.rsl_chan_nr, expect_rll_rel_req := false);
f_shutdown_helper();
}
@@ -2603,15 +2635,15 @@
/* MSC sends some data on (not yet established) SAPI=3 link */
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSAP_DTAP(rnd_data, '03'O)));
/* BSC attempts to establish a SAPI=3 link on DCCH */
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_EST_REQ(dt.rsl_chan_nr, tr_RslLinkID_DCCH(3)));
+ rx_rsl := f_exp_ipa_rx(tr_RSL_EST_REQ(dt.rsl_chan_nr, tr_RslLinkID_DCCH(3)));
/* MS sends unexpected ERROR INDication on DCCH/ACCH SAPI=3 */
- f_ipa_tx(0, ts_RSL_ERROR_IND(dt.rsl_chan_nr, ts_RslLinkID_DCCH(3), ''O));
+ f_ipa_tx(ts_RSL_ERROR_IND(dt.rsl_chan_nr, ts_RslLinkID_DCCH(3), ''O));
f_exp_sapi_n_reject(3, GSM0808_CAUSE_BSS_NOT_EQUIPPED, '10'B);
/* Clean up the connection */
BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
- f_expect_chan_rel(0, dt.rsl_chan_nr, expect_rll_rel_req := false);
+ f_expect_chan_rel(dt.rsl_chan_nr, expect_rll_rel_req := false);
f_shutdown_helper();
}
@@ -2680,7 +2712,7 @@
BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
}
- f_expect_chan_rel(0, dt.rsl_chan_nr, expect_rll_rel_req := false, expect_cells := expect_cells);
+ f_expect_chan_rel(dt.rsl_chan_nr, expect_rll_rel_req := false, expect_cells := expect_cells);
}
for (var integer i := 1; i < total_earfcns; i := i + 1) {
@@ -2835,11 +2867,10 @@
timer T := 30.0;
T.start;
alt {
- [] IPA_RSL[rsl_idx].receive(tr_ASP_RSL_UD((tr_RSL_NO_BCCH_INFO,
- tr_RSL_BCCH_INFO,
- tr_RSL_NO_SACCH_FILL,
- tr_RSL_SACCH_FILL))
- ) -> value rx_rsl_ud {
+ [] IPA_RSL[rsl_idx][0].receive(tr_ASP_RSL_UD((tr_RSL_NO_BCCH_INFO,
+ tr_RSL_BCCH_INFO,
+ tr_RSL_NO_SACCH_FILL,
+ tr_RSL_SACCH_FILL))) -> value rx_rsl_ud {
f_sysinfo_seen(rsl_idx, rx_rsl_ud.rsl);
if (g_system_information[rsl_idx].si1 == omit) {
repeat;
@@ -2848,7 +2879,7 @@
g_system_information[rsl_idx].si1 := omit;
T.stop;
}
- [] IPA_RSL[rsl_idx].receive { repeat; }
+ [] IPA_RSL[rsl_idx][0].receive { repeat; }
[] T.timeout { setverdict(fail, "Timeout receiving next SI1"); }
}
return last_si1;
@@ -3213,7 +3244,7 @@
/* Clear the queue, it might still contain stuff like BCCH FILLING */
for (i := 0; i < NUM_BTS; i := i + 1) {
- IPA_RSL[i].clear;
+ IPA_RSL[i][0].clear;
}
if (isvalue(rsl_chneed)) {
@@ -3233,7 +3264,7 @@
}
for (i := 0; i < sizeof(bts_ids); i := i + 1) {
- rx_rsl := f_exp_ipa_rx(bts_ids[i], tr_RSL_PAGING_CMD(mi));
+ rx_rsl := f_exp_ipa_rx(tr_RSL_PAGING_CMD(mi), idx := {bts_ids[i], 0});
/* check channel type, paging group */
if (rx_rsl.ies[1].body.paging_group != paging_group) {
setverdict(fail, "Paging for wrong paging group");
@@ -3252,10 +3283,10 @@
}
T.start;
alt {
- [] IPA_RSL[i].receive(tr_ASP_RSL_UD(tr_RSL_PAGING_CMD(mi))) {
+ [] IPA_RSL[i][0].receive(tr_ASP_RSL_UD(tr_RSL_PAGING_CMD(mi))) {
setverdict(fail, "Paging on BTS ", i, " which is not part of ", bts_ids);
}
- [] IPA_RSL[i].receive { repeat; }
+ [] IPA_RSL[i][0].receive { repeat; }
[] T.timeout { }
}
}
@@ -3419,22 +3450,22 @@
f_pageing_helper('001010123456789'H, cid_list, c_BtsId_all);
/* tell BSC there is no paging space anymore */
- f_ipa_tx(0, ts_RSL_PAGING_LOAD_IND(0));
+ f_ipa_tx(ts_RSL_PAGING_LOAD_IND(0));
f_sleep(0.2);
- IPA_RSL[0].clear;
+ IPA_RSL[0][0].clear;
/* Wait for 4 seconds if any more PAGING CMD are received on RSL. Normally,
* there would be 8 retransmissions during 4 seconds */
T.start;
T_retrans.start;
alt {
- [] IPA_RSL[0].receive(tr_ASP_RSL_UD(tr_RSL_PAGING_CMD(?))) {
+ [] IPA_RSL[0][0].receive(tr_ASP_RSL_UD(tr_RSL_PAGING_CMD(?))) {
setverdict(fail, "Received PAGING after LOAD_IND(0)");
mtc.stop;
}
[] T_retrans.timeout {
/* re-trnsmit the zero-space LOAD IND to avoid BSC 'auto credit' */
- f_ipa_tx(0, ts_RSL_PAGING_LOAD_IND(0));
+ f_ipa_tx(ts_RSL_PAGING_LOAD_IND(0));
T_retrans.start;
repeat;
}
@@ -3512,21 +3543,21 @@
/* Clear the queue, it might still contain stuff like BCCH FILLING */
for (var integer i := 0; i < sizeof(IPA_RSL); i := i+1) {
- IPA_RSL[i].clear;
+ IPA_RSL[i][0].clear;
}
/* Wait for 3 seconds if any more PAGING CMD are received on RSL */
T.start;
alt {
- [] IPA_RSL[0].receive(tr_ASP_RSL_UD(tr_RSL_PAGING_CMD(?))) {
+ [] IPA_RSL[0][0].receive(tr_ASP_RSL_UD(tr_RSL_PAGING_CMD(?))) {
setverdict(fail, "Received PAGING after A-RESET");
mtc.stop;
}
- [] IPA_RSL[1].receive(tr_ASP_RSL_UD(tr_RSL_PAGING_CMD(?))) {
+ [] IPA_RSL[1][0].receive(tr_ASP_RSL_UD(tr_RSL_PAGING_CMD(?))) {
setverdict(fail, "Received PAGING after A-RESET");
mtc.stop;
}
- [] IPA_RSL[2].receive(tr_ASP_RSL_UD(tr_RSL_PAGING_CMD(?))) {
+ [] IPA_RSL[2][0].receive(tr_ASP_RSL_UD(tr_RSL_PAGING_CMD(?))) {
setverdict(fail, "Received PAGING after A-RESET");
mtc.stop;
}
@@ -3559,7 +3590,7 @@
dt.rsl_chan_nr := f_chreq_act_ack();
/* Send unsolicited Paging response (no matching Paging CMD stored in BSC) */
- f_ipa_tx(0, ts_RSL_EST_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0)), enc_PDU_ML3_MS_NW(l3)));
+ f_ipa_tx(ts_RSL_EST_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0)), enc_PDU_ML3_MS_NW(l3)));
/* Expevct a CR with a matching Paging response on the A-Interface */
@@ -3600,10 +3631,10 @@
f_init(1, guard_timeout := 100.0);
/* Clear the queue, it might still contain stuff like BCCH FILLING */
- IPA_RSL[0].clear;
+ IPA_RSL[0][0].clear;
if (send_pag_load_ind) {
/* Tell there's plenty of space at the BTS (UINT16_MAX): */
- f_ipa_tx(0, ts_RSL_PAGING_LOAD_IND(65535));
+ f_ipa_tx(ts_RSL_PAGING_LOAD_IND(65535));
}
for (i := 0; i < num_subscribers; i := i + 1) {
@@ -3616,7 +3647,7 @@
T_rx.start;
T_load_ind.start;
alt {
- [] IPA_RSL[0].receive(tr_ASP_RSL_UD(tr_RSL_PAGING_CMD(?), IPAC_PROTO_RSL_TRX0)) -> value rx_rsl_ud {
+ [] IPA_RSL[0][0].receive(tr_ASP_RSL_UD(tr_RSL_PAGING_CMD(?), IPAC_PROTO_RSL_TRX0)) -> value rx_rsl_ud {
var hexstring imsi := rx_rsl_ud.rsl.ies[2].body.ms_identity.mobileIdentityV.oddEvenInd_identity.imsi.digits;
var hexstring imsi_suffix := substr(imsi, lengthof(imsi)-6, 6);
var charstring imsi_str := hex2str(imsi_suffix);
@@ -3632,11 +3663,11 @@
repeat;
}
}
- [] IPA_RSL[0].receive { repeat; }
+ [] IPA_RSL[0][0].receive { repeat; }
[] T_load_ind.timeout {
log("[CCH Load Ind timer] received paging requests so far: ", rx_paging_num);
if (send_pag_load_ind) {
- f_ipa_tx(0, ts_RSL_PAGING_LOAD_IND(40));
+ f_ipa_tx(ts_RSL_PAGING_LOAD_IND(40));
}
T_load_ind.start;
repeat;
@@ -3672,7 +3703,7 @@
rsl_fail := f_ctrl_get_ratectr_abs(IPA_CTRL, "bts", 0, "rsl_fail");
- f_ipa_rsl_stop(bts[0].rsl);
+ f_ipa_rsl_stop(bts[0][0].rsl);
f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", 0, "rsl_fail", rsl_fail+1);
@@ -3683,31 +3714,32 @@
/* The body of TC_rsl_unknown_unit_id() and TC_oml_unknown_unit_id() tests. */
function f_ipa_unknown_unit_id(integer mp_bsc_ipa_port) runs on test_CT return boolean {
+ var IPA_Client client;
timer T := 10.0;
- bts[0].rsl.id := "IPA-0-RSL";
- bts[0].rsl.vc_IPA := IPA_Emulation_CT.create(bts[0].rsl.id & "-IPA") alive;
- bts[0].rsl.ccm_pars := c_IPA_default_ccm_pars;
- bts[0].rsl.ccm_pars.name := "Osmocom TTCN-3 BTS Simulator";
- bts[0].rsl.ccm_pars.unit_id := "99/0/0"; /* value which is unknown at BTS */
+ client.id := "IPA-BTS0-TRX0-RSL";
+ client.vc_IPA := IPA_Emulation_CT.create(client.id & "-IPA") alive;
+ client.ccm_pars := c_IPA_default_ccm_pars;
+ client.ccm_pars.name := "Osmocom TTCN-3 BTS Simulator";
+ client.ccm_pars.unit_id := "99/0/0"; /* value which is unknown at BTS */
f_ipa_ctrl_start_client(mp_bsc_ip, mp_bsc_ctrl_port);
f_init_mgcp("VirtMSC");
/* start RSL/OML connection (XXX re-uses RSL port/protocol definitions for OML) */
- map(bts[0].rsl.vc_IPA:IPA_PORT, system:IPA);
- connect(bts[0].rsl.vc_IPA:IPA_RSL_PORT, self:IPA_RSL[0]);
- bts[0].rsl.vc_IPA.start(IPA_Emulation.main_client(mp_bsc_ip, mp_bsc_ipa_port, "", 10000, bts[0].rsl.ccm_pars));
+ map(client.vc_IPA:IPA_PORT, system:IPA);
+ connect(client.vc_IPA:IPA_RSL_PORT, self:IPA_RSL[0][0]);
+ client.vc_IPA.start(IPA_Emulation.main_client(mp_bsc_ip, mp_bsc_ipa_port, "", 10000, client.ccm_pars));
/* wait for IPA OML link to connect and then disconnect */
T.start;
alt {
- [] IPA_RSL[0].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_DOWN)) {
+ [] IPA_RSL[0][0].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_DOWN)) {
T.stop;
return true;
}
- [] IPA_RSL[0].receive { repeat }
+ [] IPA_RSL[0][0].receive { repeat }
[] T.timeout {
return false;
}
@@ -3748,19 +3780,20 @@
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
+ * TODO: allow connecting to TRX1..N, not only TRX0 */
private function f_connect_handler(inout MSC_ConnHdlr vc_conn, integer bssap_idx := 0) runs on test_CT {
connect(vc_conn:RAN, g_bssap[bssap_idx].vc_RAN: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_PROC, bts[0].rsl.vc_RSL:RSL_PROC);
- if (isvalue(bts[1])) {
- 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:RSL, bts[0][0].rsl.vc_RSL:CLIENT_PT);
+ connect(vc_conn:RSL_PROC, bts[0][0].rsl.vc_RSL:RSL_PROC);
+ if (isvalue(bts[1][0])) {
+ connect(vc_conn:RSL1, bts[1][0].rsl.vc_RSL:CLIENT_PT);
+ connect(vc_conn:RSL1_PROC, bts[1][0].rsl.vc_RSL:RSL_PROC);
}
- if (isvalue(bts[2])) {
- connect(vc_conn:RSL2, bts[2].rsl.vc_RSL:CLIENT_PT);
- connect(vc_conn:RSL2_PROC, bts[2].rsl.vc_RSL:RSL_PROC);
+ if (isvalue(bts[2][0])) {
+ connect(vc_conn:RSL2, bts[2][0].rsl.vc_RSL:CLIENT_PT);
+ connect(vc_conn:RSL2_PROC, bts[2][0].rsl.vc_RSL:RSL_PROC);
}
connect(vc_conn:BSSAP, g_bssap[bssap_idx].vc_RAN:CLIENT);
if (mp_enable_lcs_tests) {
@@ -5127,8 +5160,8 @@
f_disable_all_sdcch();
/* RA containing reason=LU */
- f_ipa_tx(0, ts_RSL_CHAN_RQD('02'O, 2342));
- rsl_msg := f_exp_ipa_rx(0, tr_RSL_IMM_ASSIGN(0));
+ f_ipa_tx(ts_RSL_CHAN_RQD('02'O, 2342));
+ rsl_msg := f_exp_ipa_rx(tr_RSL_IMM_ASSIGN(0));
rr := dec_GsmRrMessage(rsl_msg.ies[1].body.full_imm_ass_info.payload);
if (rr.header.message_type != IMMEDIATE_ASSIGNMENT_REJECT) {
setverdict(fail, "Expected reject");
@@ -5446,7 +5479,7 @@
rr_ho_cmpl_seen := false,
handover_done := false,
old_chan_nr := -,
- expect_target_tsc := BTS_TSC[1]
+ expect_target_tsc := c_BtsParams[1].tsc
};
/* issue hand-over command on VTY, from BTS 0 to BTS 1 */
f_vty_handover(BSCVTY, 0, 0, g_chan_nr, 1);
@@ -5476,7 +5509,7 @@
* g_chan_nr to the new lchan that was handed over to. It lives in bts 1, so look it up at RSL1_PROC. */
f_verify_encr_info(chan_act);
- f_chan_act_verify_tsc(chan_act, BTS_TSC[1]);
+ f_chan_act_verify_tsc(chan_act, c_BtsParams[1].tsc);
f_perform_clear(RSL1, RSL1_PROC);
@@ -5489,7 +5522,7 @@
f_init(2, true);
f_sleep(1.0);
- pars.expect_tsc := BTS_TSC[0];
+ pars.expect_tsc := c_BtsParams[0].tsc;
f_ctrs_bsc_and_bts_handover_init();
@@ -5571,7 +5604,7 @@
rr_ho_cmpl_seen := false,
handover_done := false,
old_chan_nr := -,
- expect_target_tsc := BTS_TSC[1]
+ expect_target_tsc := c_BtsParams[1].tsc
};
/* issue hand-over command on VTY */
f_vty_handover(BSCVTY, 0, 0, g_chan_nr, 1);
@@ -6073,7 +6106,7 @@
var RslChannelNr new_chan_nr := valueof(t_RslChanNr0(1, RSL_CHAN_NR_Bm_ACCH));
f_rslem_register(0, new_chan_nr);
g_chan_nr := new_chan_nr;
- var uint3_t expect_target_tsc := BTS_TSC[0];
+ var uint3_t expect_target_tsc := c_BtsParams[0].tsc;
f_sleep(1.0);
f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
@@ -6984,7 +7017,7 @@
f_bts_0_cfg(BSCVTY, {"no neighbors"});
f_probe_for_handover("1.a", "HO to bts 1 works, implicitly listed as neighbor (legacy behavior when none are configured)",
"handover any to arfcn 871 bsic 11",
- true, expect_target_tsc := BTS_TSC[1]);
+ true, expect_target_tsc := c_BtsParams[1].tsc);
f_probe_for_handover("1.b", "HO to unknown cell does not start",
"handover any to arfcn 13 bsic 39",
@@ -6996,7 +7029,7 @@
f_probe_for_handover("1.d", "HO to 871-11 still works (verify that this test properly cleans up)",
"handover any to arfcn 871 bsic 11",
- true, expect_target_tsc := BTS_TSC[1]);
+ true, expect_target_tsc := c_BtsParams[1].tsc);
f_perform_clear();
}
@@ -7058,7 +7091,7 @@
f_probe_for_handover("2.a", "HO to bts 1 works, explicitly listed as neighbor",
"handover any to arfcn 871 bsic 11",
- true, expect_target_tsc := BTS_TSC[1]);
+ true, expect_target_tsc := c_BtsParams[1].tsc);
f_probe_for_handover("2.b", "HO to bts 2 doesn't work, not listed as neighbor",
"handover any to arfcn 871 bsic 12",
@@ -7114,7 +7147,7 @@
false);
f_probe_for_handover("3.b", "HO to bts 2 works, explicitly listed as neighbor; no ambiguity because bts 3 is not listed as neighbor",
"handover any to arfcn 871 bsic 12",
- true, expect_target_tsc := BTS_TSC[2]);
+ true, expect_target_tsc := c_BtsParams[2].tsc);
f_perform_clear();
}
testcase TC_ho_neighbor_config_3() runs on test_CT {
@@ -7306,7 +7339,7 @@
f_probe_for_handover("7.a", "HO to 871-12 does HO to bts 2",
"handover any to arfcn 871 bsic 12",
- true, expect_target_tsc := BTS_TSC[2]);
+ true, expect_target_tsc := c_BtsParams[2].tsc);
f_probe_for_handover("7.b", "HO to 123-45 triggers inter-BSC HO",
"handover any to arfcn 123 bsic 45",
true, true);
@@ -7421,7 +7454,7 @@
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
/* expect BSC to disable the channel */
- f_exp_chan_rel_and_clear(dt, 0);
+ f_exp_chan_rel_and_clear(dt);
}
/* In the buggy behavior, a timeout of 2 seconds happens between above
@@ -7464,7 +7497,7 @@
dt := f_est_dchan('23'O, 23, '00010203040506'O);
/* simulate RLL REL IND */
- f_ipa_tx(0, ts_RSL_REL_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0))));
+ f_ipa_tx(ts_RSL_REL_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0))));
/* expect Clear Request on MSC side */
BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_ClearRequest)) -> value rx_di;
@@ -7474,7 +7507,7 @@
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
/* expect BSC to disable the channel */
- f_exp_chan_rel_and_clear(dt, 0);
+ f_exp_chan_rel_and_clear(dt);
}
/* In the buggy behavior, a timeout of 2 seconds happens between above
@@ -7498,12 +7531,12 @@
/* ask BSC via VTY to activate a given IPA style chan as PDCH */
f_vty_ts_action("pdch activate", bts_nr, trx_nr, ts_nr);
/* expect the BSC to issue the related RSL command */
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_IPA_PDCH_ACT(chan_nr));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_IPA_PDCH_ACT(chan_nr));
if (istemplatekind(nack, "omit")) {
/* respond with a related acknowledgement */
- f_ipa_tx(0, ts_RSL_IPA_PDCH_ACT_ACK(chan_nr, ts_RSL_IE_FrameNumber(2342)));
+ f_ipa_tx(ts_RSL_IPA_PDCH_ACT_ACK(chan_nr, ts_RSL_IE_FrameNumber(2342)));
} else {
- f_ipa_tx(0, ts_RSL_IPA_PDCH_ACT_NACK(chan_nr, valueof(nack)));
+ f_ipa_tx(ts_RSL_IPA_PDCH_ACT_NACK(chan_nr, valueof(nack)));
}
}
@@ -7515,12 +7548,12 @@
/* ask BSC via VTY to activate a given IPA style chan as PDCH */
f_vty_ts_action("pdch deactivate", bts_nr, trx_nr, ts_nr);
/* expect the BSC to issue the related RSL command */
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_IPA_PDCH_DEACT(chan_nr));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_IPA_PDCH_DEACT(chan_nr));
if (istemplatekind(nack, "omit")) {
/* respond with a related acknowledgement */
- f_ipa_tx(0, ts_RSL_IPA_PDCH_DEACT_ACK(chan_nr));
+ f_ipa_tx(ts_RSL_IPA_PDCH_DEACT_ACK(chan_nr));
} else {
- f_ipa_tx(0, ts_RSL_IPA_PDCH_DEACT_NACK(chan_nr, valueof(nack)));
+ f_ipa_tx(ts_RSL_IPA_PDCH_DEACT_NACK(chan_nr, valueof(nack)));
}
}
@@ -7579,8 +7612,8 @@
log("TCH/F_PDCH pchan starts out in TCH/F mode:");
f_ts_dyn_mode_assert(0, 0, chan_nr.tn, TCHF_MODE);
/* The BSC will activate the dynamic PDCH by default, so confirm that */
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_IPA_PDCH_ACT(chan_nr));
- f_ipa_tx(0, ts_RSL_IPA_PDCH_ACT_ACK(chan_nr, ts_RSL_IE_FrameNumber(2342)));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_IPA_PDCH_ACT(chan_nr));
+ f_ipa_tx(ts_RSL_IPA_PDCH_ACT_ACK(chan_nr, ts_RSL_IE_FrameNumber(2342)));
f_sleep(1.0);
log("TCH/F_PDCH pchan, PDCH ACT was ACKed, so now in PDCH mode:");
f_ts_dyn_mode_assert(0, 0, chan_nr.tn, PDCH_MODE);
@@ -7625,8 +7658,8 @@
f_ts_dyn_mode_assert(0, 0, chan_nr.tn, TCHF_MODE);
/* The BSC will activate the dynamic PDCH by default, so confirm that */
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_IPA_PDCH_ACT(chan_nr));
- f_ipa_tx(0, ts_RSL_IPA_PDCH_ACT_ACK(chan_nr, ts_RSL_IE_FrameNumber(2342)));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_IPA_PDCH_ACT(chan_nr));
+ f_ipa_tx(ts_RSL_IPA_PDCH_ACT_ACK(chan_nr, ts_RSL_IE_FrameNumber(2342)));
f_sleep(1.0);
f_ts_dyn_mode_assert(0, 0, chan_nr.tn, PDCH_MODE);
@@ -7659,12 +7692,12 @@
/* ask BSC via VTY to activate a given OSMO style chan as PDCH */
/* FIXME: no VTY command to activate Osmocom PDCH !! */
/* expect the BSC to issue the related RSL command */
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_CHAN_ACT(chan_nr, ?));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_CHAN_ACT(chan_nr, ?));
if (istemplatekind(nack, "omit")) {
/* respond with a related acknowledgement */
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, 2342));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, 2342));
} else {
- f_ipa_tx(0, ts_RSL_CHAN_ACT_NACK(chan_nr, valueof(nack)));
+ f_ipa_tx(ts_RSL_CHAN_ACT_NACK(chan_nr, valueof(nack)));
}
}
@@ -7676,12 +7709,12 @@
/* ask BSC via VTY to activate a given OSMO style chan as PDCH */
/* FIXME: no VTY command to activate Osmocom PDCH !! */
/* expect the BSC to issue the related RSL command */
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_RF_CHAN_REL(chan_nr));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_RF_CHAN_REL(chan_nr));
if (istemplatekind(nack, "omit")) {
/* respond with a related acknowledgement */
- f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(chan_nr));
+ f_ipa_tx(ts_RSL_RF_CHAN_REL_ACK(chan_nr));
} else {
- //f_ipa_tx(0, ts_RSL_RF_CHAN_REL_NACK(chan_nr, valueof(nack)));
+ //f_ipa_tx(ts_RSL_RF_CHAN_REL_NACK(chan_nr, valueof(nack)));
}
}
@@ -7702,9 +7735,9 @@
log("TCH/F_TCH/H_PDCH pchan starts out in disabled mode:");
f_ts_dyn_mode_assert(0, 0, chan_nr.tn, NONE_MODE);
/* The BSC will activate the dynamic PDCH by default, so confirm that */
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_CHAN_ACT_PDCH(chan_nr));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_CHAN_ACT_PDCH(chan_nr));
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, 2342));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, 2342));
f_sleep(1.0);
log("TCH/F_TCH/H_PDCH requested to PDCH ACT on startup, which was ACKed, so now in PDCH:");
f_ts_dyn_mode_assert(0, 0, chan_nr.tn, PDCH_MODE);
@@ -7731,10 +7764,10 @@
f_ts_dyn_mode_assert(0, 0, chan_nr.tn, NONE_MODE);
/* The BSC will activate the dynamic PDCH by default, so confirm that */
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_CHAN_ACT_PDCH(chan_nr));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_CHAN_ACT_PDCH(chan_nr));
/* NACK this activation and expect the "show timeslot" mode still to be NONE */
- f_ipa_tx(0, ts_RSL_CHAN_ACT_NACK(chan_nr, RSL_ERR_EQUIPMENT_FAIL));
+ f_ipa_tx(ts_RSL_CHAN_ACT_NACK(chan_nr, RSL_ERR_EQUIPMENT_FAIL));
f_sleep(1.0);
f_ts_dyn_mode_assert(0, 0, chan_nr.tn, NONE_MODE);
@@ -7763,9 +7796,9 @@
log("TCH/F_TCH/H_SDCCH8_PDCH pchan starts out in disabled mode:");
f_ts_dyn_mode_assert(0, 0, pdch_chan_nr.tn, NONE_MODE);
/* The BSC will activate the dynamic PDCH by default, so confirm that */
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_CHAN_ACT_PDCH(pdch_chan_nr));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_CHAN_ACT_PDCH(pdch_chan_nr));
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(pdch_chan_nr, 2342));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(pdch_chan_nr, 2342));
f_sleep(1.0);
log("TCH/F_TCH/H_SDCCH8_PDC requested to PDCH ACT on startup, which was ACKed, so now in PDCH:");
f_ts_dyn_mode_assert(0, 0, pdch_chan_nr.tn, PDCH_MODE);
@@ -7780,19 +7813,19 @@
}
/* Now the dyn ts is selected. First PDCH is released, then sdcch chan is activated */
- f_ipa_tx(0, ts_RSL_CHAN_RQD(int2oct(oct2int('23'O) + i, 1), 2342));
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_RF_CHAN_REL(pdch_chan_nr));
- f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(pdch_chan_nr));
+ f_ipa_tx(ts_RSL_CHAN_RQD(int2oct(oct2int('23'O) + i, 1), 2342));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_RF_CHAN_REL(pdch_chan_nr));
+ f_ipa_tx(ts_RSL_RF_CHAN_REL_ACK(pdch_chan_nr));
- rsl_msg := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ rsl_msg := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
dt.rsl_chan_nr := rsl_msg.ies[0].body.chan_nr;
f_ts_dyn_mode_assert(0, 0, dt.rsl_chan_nr.tn, SDCCH8_MODE);
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(dt.rsl_chan_nr, 2342));
- rsl_msg := f_exp_ipa_rx(0, tr_RSL_IMM_ASSIGN(0));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(dt.rsl_chan_nr, 2342));
+ rsl_msg := f_exp_ipa_rx(tr_RSL_IMM_ASSIGN(0));
f_ts_dyn_mode_assert(0, 0, dt.rsl_chan_nr.tn, SDCCH8_MODE);
- f_ipa_tx(0, ts_RSL_EST_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0)), '1234'O));
+ f_ipa_tx(ts_RSL_EST_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0)), '1234'O));
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3('1234'O))) -> value rx_c_ind;
dt.sccp_conn_id := rx_c_ind.connectionId;
BSSAP.send(ts_BSSAP_CONNECT_res(dt.sccp_conn_id));
@@ -7800,11 +7833,11 @@
/* Instruct BSC to clear channel */
var BssmapCause cause := 0;
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
- f_exp_chan_rel_and_clear(dt, 0);
+ f_exp_chan_rel_and_clear(dt);
/* The BSC will switch the TS back to PDCH once the only lchan using it is released: */
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_CHAN_ACT_PDCH(pdch_chan_nr));
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(pdch_chan_nr, 2342));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_CHAN_ACT_PDCH(pdch_chan_nr));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(pdch_chan_nr, 2342));
f_sleep(1.0);
f_ts_dyn_mode_assert(0, 0, pdch_chan_nr.tn, PDCH_MODE);
@@ -7840,8 +7873,8 @@
/* The dyn TS want to activate PDCH mode, ACK that. */
var RslChannelNr chan_nr;
chan_nr := valueof(t_RslChanNr_PDCH(2));
- f_exp_ipa_rx(0, tr_RSL_CHAN_ACT_PDCH(chan_nr));
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, 2342));
+ f_exp_ipa_rx(tr_RSL_CHAN_ACT_PDCH(chan_nr));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, 2342));
f_sleep(1.0);
@@ -7900,9 +7933,9 @@
log("TCH/F_TCH/H_SDCCH8_PDCH pchan starts out in disabled mode:");
f_ts_dyn_mode_assert(0, 0, pdch_chan_nr.tn, NONE_MODE);
/* The BSC will activate the dynamic PDCH by default, so confirm that */
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_CHAN_ACT_PDCH(pdch_chan_nr));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_CHAN_ACT_PDCH(pdch_chan_nr));
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(pdch_chan_nr, 2342));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(pdch_chan_nr, 2342));
f_sleep(1.0);
log("TCH/F_TCH/H_SDCCH8_PDC requested to PDCH ACT on startup, which was ACKed, so now in PDCH:");
f_ts_dyn_mode_assert(0, 0, pdch_chan_nr.tn, PDCH_MODE);
@@ -7917,19 +7950,19 @@
}
/* Now the dyn ts is selected. First PDCH is released, then TCH chan is activated */
- f_ipa_tx(0, ts_RSL_CHAN_RQD(int2oct(oct2int(ra) + i, 1), 2342));
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_RF_CHAN_REL(pdch_chan_nr));
- f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(pdch_chan_nr));
+ f_ipa_tx(ts_RSL_CHAN_RQD(int2oct(oct2int(ra) + i, 1), 2342));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_RF_CHAN_REL(pdch_chan_nr));
+ f_ipa_tx(ts_RSL_RF_CHAN_REL_ACK(pdch_chan_nr));
- rsl_msg := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ rsl_msg := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
dt.rsl_chan_nr := rsl_msg.ies[0].body.chan_nr;
f_ts_dyn_mode_assert(0, 0, dt.rsl_chan_nr.tn, TCHH_MODE);
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(dt.rsl_chan_nr, 2342));
- rsl_msg := f_exp_ipa_rx(0, tr_RSL_IMM_ASSIGN(0));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(dt.rsl_chan_nr, 2342));
+ rsl_msg := f_exp_ipa_rx(tr_RSL_IMM_ASSIGN(0));
f_ts_dyn_mode_assert(0, 0, dt.rsl_chan_nr.tn, TCHH_MODE);
- f_ipa_tx(0, ts_RSL_EST_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0)), '1234'O));
+ f_ipa_tx(ts_RSL_EST_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0)), '1234'O));
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3('1234'O))) -> value rx_c_ind;
dt.sccp_conn_id := rx_c_ind.connectionId;
BSSAP.send(ts_BSSAP_CONNECT_res(dt.sccp_conn_id));
@@ -7937,11 +7970,11 @@
/* Instruct BSC to clear channel */
var BssmapCause cause := 0;
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
- f_exp_chan_rel_and_clear(dt, 0);
+ f_exp_chan_rel_and_clear(dt);
/* The BSC will switch the TS back to PDCH once the only lchan using it is released: */
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_CHAN_ACT_PDCH(pdch_chan_nr));
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(pdch_chan_nr, 2342));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_CHAN_ACT_PDCH(pdch_chan_nr));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(pdch_chan_nr, 2342));
f_sleep(1.0);
f_ts_dyn_mode_assert(0, 0, pdch_chan_nr.tn, PDCH_MODE);
@@ -7977,9 +8010,9 @@
log("TCH/F_TCH/H_SDCCH8_PDCH pchan starts out in disabled mode:");
f_ts_dyn_mode_assert(0, 0, pdch_chan_nr.tn, NONE_MODE);
/* The BSC will activate the dynamic PDCH by default, so confirm that */
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_CHAN_ACT_PDCH(pdch_chan_nr));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_CHAN_ACT_PDCH(pdch_chan_nr));
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(pdch_chan_nr, 2342));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(pdch_chan_nr, 2342));
f_sleep(1.0);
log("TCH/F_TCH/H_SDCCH8_PDC requested to PDCH ACT on startup, which was ACKed, so now in PDCH:");
f_ts_dyn_mode_assert(0, 0, pdch_chan_nr.tn, PDCH_MODE);
@@ -7994,16 +8027,16 @@
}
/* Now the dyn ts is selected. First PDCH is released, then sdcch chan is activated */
- f_ipa_tx(0, ts_RSL_CHAN_RQD(int2oct(oct2int('23'O) + i, 1), 2342));
- rsl_unused := f_exp_ipa_rx(0, tr_RSL_RF_CHAN_REL(pdch_chan_nr));
- f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(pdch_chan_nr));
+ f_ipa_tx(ts_RSL_CHAN_RQD(int2oct(oct2int('23'O) + i, 1), 2342));
+ rsl_unused := f_exp_ipa_rx(tr_RSL_RF_CHAN_REL(pdch_chan_nr));
+ f_ipa_tx(ts_RSL_RF_CHAN_REL_ACK(pdch_chan_nr));
- rsl_msg := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ rsl_msg := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
dt.rsl_chan_nr := rsl_msg.ies[0].body.chan_nr;
f_ts_dyn_mode_assert(0, 0, dt.rsl_chan_nr.tn, SDCCH8_MODE);
- f_ipa_tx(0, ts_RSL_CHAN_ACT_NACK(dt.rsl_chan_nr, RSL_ERR_EQUIPMENT_FAIL));
- rsl_msg := f_exp_ipa_rx(0, tr_RSL_IMM_ASSIGN(0));
+ f_ipa_tx(ts_RSL_CHAN_ACT_NACK(dt.rsl_chan_nr, RSL_ERR_EQUIPMENT_FAIL));
+ rsl_msg := f_exp_ipa_rx(tr_RSL_IMM_ASSIGN(0));
rr := dec_GsmRrMessage(rsl_msg.ies[1].body.full_imm_ass_info.payload);
if (rr.header.message_type != IMMEDIATE_ASSIGNMENT_REJECT) {
Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Expected reject");
@@ -8012,8 +8045,8 @@
/* FIXME? Currently the TS stays in state BORKEN: */
/* The BSC will switch the TS back to PDCH once the only lchan using it is released: */
- /* rsl_unused := f_exp_ipa_rx(0, tr_RSL_CHAN_ACT_PDCH(pdch_chan_nr));
- * f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(pdch_chan_nr, 2342));
+ /* rsl_unused := f_exp_ipa_rx(tr_RSL_CHAN_ACT_PDCH(pdch_chan_nr));
+ * f_ipa_tx(ts_RSL_CHAN_ACT_ACK(pdch_chan_nr, 2342));
* f_sleep(1.0);
* f_ts_dyn_mode_assert(0, 0, pdch_chan_nr.tn, PDCH_MODE)
*/
@@ -8074,7 +8107,7 @@
chan_nr := t_RslChanNr_BCCH(0),
bs_power := tr_RSL_IE_BS_Power(red / 2));
tr_rsl_pdu.msg_disc := tr_RSL_MsgDisc(RSL_MDISC_CCHAN, false);
- var RSL_Message unused := f_exp_ipa_rx(0, tr_rsl_pdu);
+ var RSL_Message unused := f_exp_ipa_rx(tr_rsl_pdu);
/* Additionally verify the applied value over the CTRL interface */
var CtrlValue cred := f_ctrl_get_bts(IPA_CTRL, 0, "c0-power-reduction");
@@ -8198,7 +8231,7 @@
/* Instruct BSC to clear channel */
var BssmapCause cause := 0;
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
- f_exp_chan_rel_and_clear(dt, 0);
+ f_exp_chan_rel_and_clear(dt);
}
private function f_perform_compl_l3(RSL_DCHAN_PT rsl_pt, RSLEM_PROC_PT rsl_proc_pt,
@@ -9041,14 +9074,14 @@
for (i := 0; i < NUM_TCHF_PER_BTS + NUM_TCHH_PER_BTS + NUM_SDCCH_PER_BTS; i := i+1) {
f_chreq_act_ack('33'O, i);
}
- IPA_RSL[0].clear;
+ IPA_RSL[0][0].clear;
f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", 0, "chreq:total",
chreq_total + NUM_TCHF_PER_BTS + NUM_TCHH_PER_BTS + NUM_SDCCH_PER_BTS);
/* Send EST IND for the first TCH, so we get to test the RR release cause */
var RslChannelNr first_tch := valueof(t_RslChanNr_Bm(1));
var octetstring l3 := '00010203040506'O;
- f_ipa_tx(0, ts_RSL_EST_IND(first_tch, valueof(ts_RslLinkID_DCCH(0)), l3));
+ f_ipa_tx(ts_RSL_EST_IND(first_tch, valueof(ts_RslLinkID_DCCH(0)), l3));
/* Accept BSSAP conn, so we get to test the Clear Request cause */
var BSSAP_N_CONNECT_ind rx_c_ind;
@@ -9057,10 +9090,10 @@
BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId));
/* Send Channel request for emegergency call */
- f_ipa_tx(0, ts_RSL_CHAN_RQD('A5'O, 23));
+ f_ipa_tx(ts_RSL_CHAN_RQD('A5'O, 23));
/* Expect the BSC to release one (the first) TCH/F on the BTS */
- f_expect_chan_rel(0, first_tch, expect_rr_chan_rel := true, expect_rll_rel_req := false,
+ f_expect_chan_rel(first_tch, expect_rr_chan_rel := true, expect_rll_rel_req := false,
expect_rr_cause := GSM48_RR_CAUSE_PREMPTIVE_REL);
/* Also expect a BSSMAP Clear Request with PREEMPTION */
@@ -9073,12 +9106,12 @@
}
/* Expect the BSC to send activate/assign the channel for the emergency call */
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ rx_rsl := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
if (first_tch != rx_rsl.ies[0].body.chan_nr) {
setverdict(fail, "different TCH lchan activated than expected");
}
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(first_tch, 33));
- rx_rsl := f_exp_ipa_rx(0, tr_RSL_IMM_ASSIGN(0));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(first_tch, 33));
+ rx_rsl := f_exp_ipa_rx(tr_RSL_IMM_ASSIGN(0));
/* complete the BSSMAP Clear to satisfy the conn leak check */
BSSAP.send(ts_BSSAP_DATA_req(sccp_conn_id, ts_BSSMAP_ClearCommand(enum2int(preemption))));
@@ -9340,8 +9373,8 @@
/* CS domain: 3 (SDCCH/4+CBCH) + 4 (TCH/F) + 2 (TCH/H) channels available */
for (var integer i := 0; i < 9; i := i + 1) {
- f_ipa_tx(0, ts_RSL_CHAN_RQD(f_rnd_ra_cs(), 23));
- rsl_msg := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ f_ipa_tx(ts_RSL_CHAN_RQD(f_rnd_ra_cs(), 23));
+ rsl_msg := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
/* Make sure that Channel Identification IE is present */
if (not f_rsl_find_ie(rsl_msg, RSL_IE_CHAN_IDENT, ie)) {
@@ -9381,11 +9414,11 @@
/* CS domain: 3 (SDCCH/4+CBCH) + 4 (TCH/F) + 2 (TCH/H) channels available */
for (var integer i := 0; i < 9; i := i + 1) {
- f_ipa_tx(0, ts_RSL_CHAN_RQD(f_rnd_ra_cs(), 23));
- rsl_msg := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ f_ipa_tx(ts_RSL_CHAN_RQD(f_rnd_ra_cs(), 23));
+ rsl_msg := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(rsl_msg.ies[0].body.chan_nr, 33));
- rsl_msg := f_exp_ipa_rx(0, tr_RSL_MsgTypeC(RSL_MT_IMMEDIATE_ASSIGN_CMD));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(rsl_msg.ies[0].body.chan_nr, 33));
+ rsl_msg := f_exp_ipa_rx(tr_RSL_MsgTypeC(RSL_MT_IMMEDIATE_ASSIGN_CMD));
/* Make sure that Full Immediate Assign Info IE is present */
if (not f_rsl_find_ie(rsl_msg, RSL_IE_FULL_IMM_ASS_INFO, ie)) {
@@ -9441,11 +9474,11 @@
/* Send a BSSMAP Assignment Command, expect CHANnel ACTIVation */
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ass_cmd));
- rsl_msg := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ rsl_msg := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
/* ACKnowledge CHANnel ACTIVation, expect RSL DATA REQuest */
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(rsl_msg.ies[0].body.chan_nr, 33));
- rsl_msg := f_exp_ipa_rx(0, tr_RSL_MsgTypeR(RSL_MT_DATA_REQ));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(rsl_msg.ies[0].body.chan_nr, 33));
+ rsl_msg := f_exp_ipa_rx(tr_RSL_MsgTypeR(RSL_MT_DATA_REQ));
/* Make sure that L3 Information IE is present */
if (not f_rsl_find_ie(rsl_msg, RSL_IE_L3_INFO, ie)) {
@@ -9511,11 +9544,11 @@
f_vty_handover(BSCVTY, 0, 0, dt.rsl_chan_nr, 1);
/* Expect RSL CHANnel ACTIVation on BTS1/TRX0/TS1 */
- rsl_msg := f_exp_ipa_rx(1, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ rsl_msg := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV), idx := {1, 0});
/* ACKnowledge channel activation and expect (RR) Handover Command */
- f_ipa_tx(1, ts_RSL_CHAN_ACT_ACK(rsl_msg.ies[0].body.chan_nr, 33));
- rsl_msg := f_exp_ipa_rx(0, tr_RSL_MsgTypeR(RSL_MT_DATA_REQ));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(rsl_msg.ies[0].body.chan_nr, 33), idx := {1, 0});
+ rsl_msg := f_exp_ipa_rx(tr_RSL_MsgTypeR(RSL_MT_DATA_REQ));
/* Make sure that L3 Information IE is present */
if (not f_rsl_find_ie(rsl_msg, RSL_IE_L3_INFO, ie)) {
@@ -9624,7 +9657,7 @@
T.start;
alt {
- [] IPA_RSL[0].receive(tr_ASP_RSL_UD(tr_RSL_BCCH_INFO(RSL_SYSTEM_INFO_4))) -> value rx_rsl_ud {
+ [] IPA_RSL[0][0].receive(tr_ASP_RSL_UD(tr_RSL_BCCH_INFO(RSL_SYSTEM_INFO_4))) -> value rx_rsl_ud {
var RSL_IE_Body ie := rx_rsl_ud.rsl.ies[2].body; /* FULL BCCH Information IE */
var SystemInformation si := dec_SystemInformation(ie.other.payload);
@@ -9654,7 +9687,7 @@
si.payload.si4.cbch_mobile_alloc.v);
}
}
- [] IPA_RSL[0].receive { repeat; }
+ [] IPA_RSL[0][0].receive { repeat; }
[] T.timeout {
setverdict(fail, "Timeout waiting for RSL BCCH INFOrmation (SI4)");
}
@@ -10149,7 +10182,7 @@
rr_ho_cmpl_seen := false,
handover_done := false,
old_chan_nr := -,
- expect_target_tsc := BTS_TSC[1]
+ expect_target_tsc := c_BtsParams[1].tsc
};
/* issue hand-over command on VTY */
f_vty_handover(BSCVTY, 0, 0, g_chan_nr, 1);
@@ -10545,7 +10578,7 @@
T.start;
alt {
- [] IPA_RSL[0].receive(tr_ASP_RSL_UD(?, IPAC_PROTO_RSL_TRX0)) -> value rx_rsl_ud {
+ [] IPA_RSL[0][0].receive(tr_ASP_RSL_UD(?, IPAC_PROTO_RSL_TRX0)) -> value rx_rsl_ud {
if (rx_rsl_ud.rsl.msg_type == RSL_MT_CHAN_ACTIV) {
T.stop;
setverdict(fail, "CHANnel ACTivate in VAMOS mode succeeded even though BTS does not support VAMOS");
@@ -10768,7 +10801,7 @@
var MSC_ConnHdlr vc_conn2;
pars2.imsi := pars1.imsi;
pars2.media_nr := 2;
- pars2.expect_tsc := BTS_TSC[1];
+ pars2.expect_tsc := c_BtsParams[1].tsc;
f_init(2, true, guard_timeout := 40.0);
f_sleep(1.0);
@@ -10784,19 +10817,21 @@
f_shutdown_helper();
}
-function f_exp_ipa_rx_nonfatal(integer bts_nr, template (present) RSL_Message t_rx, float t_secs := 2.0,
- IpaStreamId sid := IPAC_PROTO_RSL_TRX0, boolean ignore_other_rx := true)
+function f_exp_ipa_rx_nonfatal(template (present) RSL_Message t_rx,
+ boolean ignore_other_rx := true,
+ BtsTrxIdx idx := {0, 0},
+ float Tval := 2.0)
runs on test_CT return template (omit) RSL_Message {
var ASP_RSL_Unitdata rx_rsl_ud;
- timer T := t_secs;
+ timer T := Tval;
T.start;
alt {
- [] IPA_RSL[bts_nr].receive(tr_ASP_RSL_UD(t_rx, sid)) -> value rx_rsl_ud {
+ [] IPA_RSL[idx.bts][idx.trx].receive(tr_ASP_RSL_UD(t_rx, ?)) -> value rx_rsl_ud {
T.stop;
}
- [ignore_other_rx] IPA_RSL[bts_nr].receive { repeat; }
- [not ignore_other_rx] IPA_RSL[bts_nr].receive {
+ [ignore_other_rx] IPA_RSL[idx.bts][idx.trx].receive { repeat; }
+ [not ignore_other_rx] IPA_RSL[idx.bts][idx.trx].receive {
log("f_exp_ipa_rx_nonfatal(): Got different message than ", t_rx);
T.stop;
return omit;
@@ -10852,9 +10887,9 @@
/* RA containing reason=LU */
var GsmFrameNumber fn := 2342;
var uint8_t ra := 2;
- f_ipa_tx(0, ts_RSL_CHAN_RQD(int2oct(ra, 1), fn));
+ f_ipa_tx(ts_RSL_CHAN_RQD(int2oct(ra, 1), fn));
- chan_act := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ chan_act := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
/* First send the Chan Act ACK */
var RslChannelNr chan_nr := chan_act.ies[0].body.chan_nr;
@@ -10866,17 +10901,17 @@
mtc.stop;
}
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, fn + 10));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, fn + 10));
/* Then expect the Immediate Assignment, after we ACKed the chan act */
- imm_ass := f_exp_ipa_rx(0, tr_RSL_IMM_ASSIGN(0));
+ imm_ass := f_exp_ipa_rx(tr_RSL_IMM_ASSIGN(0));
f_verify_imm_ass(imm_ass, ra, fn, chan_nr, chan_ident_ie.chan_ident.ch_desc.v.arfcn,
chan_ident_ie.chan_ident.ch_desc.v.tsc);
/* Check that the lchan is working */
var octetstring l3 := '00010203040506'O;
- f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
+ f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
var BSSAP_N_CONNECT_ind rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;
@@ -10900,12 +10935,12 @@
/* RA containing reason=LU */
var GsmFrameNumber fn := 2342;
var uint8_t ra := 2;
- f_ipa_tx(0, ts_RSL_CHAN_RQD(int2oct(ra, 1), fn));
+ f_ipa_tx(ts_RSL_CHAN_RQD(int2oct(ra, 1), fn));
/* (set bts 0 cfg back to default) */
f_vty_set_imm_ass(BSCVTY);
- chan_act := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ chan_act := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
var RslChannelNr chan_nr := chan_act.ies[0].body.chan_nr;
var DchanTuple dt;
dt.rsl_chan_nr := chan_nr;
@@ -10916,16 +10951,16 @@
}
/* *FIRST* expect the Immediate Assignment, before we ACK the chan act */
- imm_ass := f_exp_ipa_rx(0, tr_RSL_IMM_ASSIGN(0));
+ imm_ass := f_exp_ipa_rx(tr_RSL_IMM_ASSIGN(0));
f_verify_imm_ass(imm_ass, ra, fn, chan_nr, chan_ident_ie.chan_ident.ch_desc.v.arfcn,
chan_ident_ie.chan_ident.ch_desc.v.tsc);
/* Only now send the Chan Act ACK */
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10));
/* Check that the lchan is working */
var octetstring l3 := '00010203040506'O;
- f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
+ f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
var BSSAP_N_CONNECT_ind rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;
@@ -10949,12 +10984,12 @@
/* RA containing reason=LU */
var GsmFrameNumber fn := 2342;
var uint8_t ra := 2;
- f_ipa_tx(0, ts_RSL_CHAN_RQD(int2oct(ra, 1), fn));
+ f_ipa_tx(ts_RSL_CHAN_RQD(int2oct(ra, 1), fn));
/* (set bts 0 cfg back to default) */
f_vty_set_imm_ass(BSCVTY);
- chan_act := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ chan_act := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
var RslChannelNr chan_nr := chan_act.ies[0].body.chan_nr;
var DchanTuple dt;
dt.rsl_chan_nr := chan_nr;
@@ -10965,16 +11000,16 @@
}
/* *FIRST* expect the Immediate Assignment, before we ACK the chan act */
- imm_ass := f_exp_ipa_rx(0, tr_RSL_IMM_ASSIGN(0));
+ imm_ass := f_exp_ipa_rx(tr_RSL_IMM_ASSIGN(0));
f_verify_imm_ass(imm_ass, ra, fn, chan_nr, chan_ident_ie.chan_ident.ch_desc.v.arfcn,
chan_ident_ie.chan_ident.ch_desc.v.tsc);
/* Only now send the Chan Act ACK */
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10));
/* Check that the lchan is working */
var octetstring l3 := '00010203040506'O;
- f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
+ f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
var BSSAP_N_CONNECT_ind rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;
@@ -10997,8 +11032,8 @@
var RslChannelNr chan_nr := valueof(t_RslChanNr_PDCH(6));
/* The BSC will activate the dynamic PDCH by default, so confirm that */
- f_exp_ipa_rx(0, tr_RSL_CHAN_ACT_PDCH(chan_nr));
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, 2323));
+ f_exp_ipa_rx(tr_RSL_CHAN_ACT_PDCH(chan_nr));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, 2323));
/* clean up timeslot 6 config, will only take effect when the OML drops the next time */
f_ts_set_chcomb(0, 0, 6, "PDCH");
@@ -11019,21 +11054,21 @@
/* RA containing reason=LU */
var GsmFrameNumber fn := 2342;
var uint8_t ra := 2;
- f_ipa_tx(0, ts_RSL_CHAN_RQD(int2oct(ra, 1), fn));
+ f_ipa_tx(ts_RSL_CHAN_RQD(int2oct(ra, 1), fn));
/* (set bts 0 cfg back to default) */
f_vty_set_imm_ass(BSCVTY);
/* Expect the dyn TS to deactivate PDCH first */
- f_exp_ipa_rx(0, tr_RSL_RF_CHAN_REL(chan_nr));
- f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(chan_nr));
+ f_exp_ipa_rx(tr_RSL_RF_CHAN_REL(chan_nr));
+ f_ipa_tx(ts_RSL_RF_CHAN_REL_ACK(chan_nr));
/* Now activation as SDCCH8 */
chan_nr := valueof(t_RslChanNr_SDCCH8(tn := 6, sub_slot := 0));
var DchanTuple dt;
dt.rsl_chan_nr := chan_nr;
- chan_act := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ chan_act := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
var RSL_IE_Body chan_ident_ie;
if (not f_rsl_find_ie(chan_act, RSL_IE_CHAN_IDENT, chan_ident_ie)) {
setverdict(fail, "RSL Channel Identification IE is absent");
@@ -11041,16 +11076,16 @@
}
/* *FIRST* expect the Immediate Assignment, before we ACK the chan act */
- imm_ass := f_exp_ipa_rx(0, tr_RSL_IMM_ASSIGN(0));
+ imm_ass := f_exp_ipa_rx(tr_RSL_IMM_ASSIGN(0));
f_verify_imm_ass(imm_ass, ra, fn, chan_nr, chan_ident_ie.chan_ident.ch_desc.v.arfcn,
chan_ident_ie.chan_ident.ch_desc.v.tsc);
/* Only now send the Chan Act ACK */
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10));
/* Check that the lchan is working */
var octetstring l3 := '00010203040506'O;
- f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
+ f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
var BSSAP_N_CONNECT_ind rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;
@@ -11073,8 +11108,8 @@
var RslChannelNr chan_nr := valueof(t_RslChanNr_PDCH(6));
/* The BSC will activate the dynamic PDCH by default, so confirm that */
- f_exp_ipa_rx(0, tr_RSL_CHAN_ACT_PDCH(chan_nr));
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, 2323));
+ f_exp_ipa_rx(tr_RSL_CHAN_ACT_PDCH(chan_nr));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, 2323));
/* clean up timeslot 6 config, will only take effect when the OML drops the next time */
f_ts_set_chcomb(0, 0, 6, "PDCH");
@@ -11095,39 +11130,39 @@
/* RA containing reason=LU */
var GsmFrameNumber fn := 2342;
var uint8_t ra := 2;
- f_ipa_tx(0, ts_RSL_CHAN_RQD(int2oct(ra, 1), fn));
+ f_ipa_tx(ts_RSL_CHAN_RQD(int2oct(ra, 1), fn));
/* (set bts 0 cfg back to default) */
f_vty_set_imm_ass(BSCVTY);
/* Expect the dyn TS to deactivate PDCH first */
- f_exp_ipa_rx(0, tr_RSL_RF_CHAN_REL(chan_nr));
+ f_exp_ipa_rx(tr_RSL_RF_CHAN_REL(chan_nr));
/* And already the Immediate Assignment even before the PDCH Deact ACK */
- imm_ass := f_exp_ipa_rx(0, tr_RSL_IMM_ASSIGN(0));
+ imm_ass := f_exp_ipa_rx(tr_RSL_IMM_ASSIGN(0));
/* continue the Osmo style PDCH Deact (usual chan rel) */
- f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(chan_nr));
+ f_ipa_tx(ts_RSL_RF_CHAN_REL_ACK(chan_nr));
/* Now activation as SDCCH8 */
chan_nr := valueof(t_RslChanNr_SDCCH8(tn := 6, sub_slot := 0));
var DchanTuple dt;
dt.rsl_chan_nr := chan_nr;
- chan_act := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ chan_act := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
var RSL_IE_Body chan_ident_ie;
if (not f_rsl_find_ie(chan_act, RSL_IE_CHAN_IDENT, chan_ident_ie)) {
setverdict(fail, "RSL Channel Identification IE is absent");
mtc.stop;
}
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10));
f_verify_imm_ass(imm_ass, ra, fn, chan_nr, chan_ident_ie.chan_ident.ch_desc.v.arfcn,
chan_ident_ie.chan_ident.ch_desc.v.tsc);
/* Check that the lchan is working */
var octetstring l3 := '00010203040506'O;
- f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
+ f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
var BSSAP_N_CONNECT_ind rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;
@@ -11417,8 +11452,8 @@
/* The dyn TS wants to activate PDCH mode, ACK that. */
var RslChannelNr chan_nr;
chan_nr := valueof(t_RslChanNr_PDCH(2));
- f_exp_ipa_rx(0, tr_RSL_CHAN_ACT_PDCH(chan_nr));
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, 2342));
+ f_exp_ipa_rx(tr_RSL_CHAN_ACT_PDCH(chan_nr));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, 2342));
/* Exhaust all dedicated SDCCH lchans.
/* GSM 44.018 Table 9.1.8.2:
@@ -11460,7 +11495,7 @@
var BssmapCause cause := 0;
var DchanTuple dt := dyn_sddch[0];
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
- f_exp_chan_rel_and_clear(dt, 0);
+ f_exp_chan_rel_and_clear(dt);
/* one dyn TS SDCCH is free again, so only the static_sdcch should increment. For tch, both static and dynamic
* count as occupied, so those still both increment. */
@@ -11471,13 +11506,13 @@
for (i := 1; i < lengthof(dyn_sddch); i := i+1) {
dt := dyn_sddch[i];
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
- f_exp_chan_rel_and_clear(dt, 0);
+ f_exp_chan_rel_and_clear(dt);
}
/* All SDCCH on the dyn TS are released, the dyn TS wants to activate PDCH again */
chan_nr := valueof(t_RslChanNr_PDCH(2));
- f_exp_ipa_rx(0, tr_RSL_CHAN_ACT_PDCH(chan_nr));
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, 2342));
+ f_exp_ipa_rx(tr_RSL_CHAN_ACT_PDCH(chan_nr));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, 2342));
/* Now all channels are occupied except the dyn TS, so expecting only the static counters to increment */
f_all_allocated_expect_counter_change({"all_allocated:static_sdcch", "all_allocated:static_tch"});
diff --git a/bsc/BSC_Tests_CBSP.ttcn b/bsc/BSC_Tests_CBSP.ttcn
index bede026..a933b24 100644
--- a/bsc/BSC_Tests_CBSP.ttcn
+++ b/bsc/BSC_Tests_CBSP.ttcn
@@ -109,23 +109,23 @@
}
private altstep as_IgnRSL(template (present) RSL_Message tr) runs on cbsp_test_CT {
-[] IPA_RSL[0].receive(tr_ASP_RSL_UD(tr)) { repeat; }
-[] IPA_RSL[1].receive(tr_ASP_RSL_UD(tr)) { repeat; }
-[] IPA_RSL[2].receive(tr_ASP_RSL_UD(tr)) { repeat; }
+[] IPA_RSL[0][0].receive(tr_ASP_RSL_UD(tr)) { repeat; }
+[] IPA_RSL[1][0].receive(tr_ASP_RSL_UD(tr)) { repeat; }
+[] IPA_RSL[2][0].receive(tr_ASP_RSL_UD(tr)) { repeat; }
}
private altstep as_FailRSL() runs on cbsp_test_CT {
var template (present) RSL_Message tr := (tr_RSL_SMSCB_CMD);
var ASP_RSL_Unitdata rx;
-[] IPA_RSL[0].receive(tr_ASP_RSL_UD(tr)) -> value rx {
+[] IPA_RSL[0][0].receive(tr_ASP_RSL_UD(tr)) -> value rx {
setverdict(fail, "Received unexpected RSL ", rx);
mtc.stop;
}
-[] IPA_RSL[1].receive(tr_ASP_RSL_UD(tr)) -> value rx {
+[] IPA_RSL[1][0].receive(tr_ASP_RSL_UD(tr)) -> value rx {
setverdict(fail, "Received unexpected RSL ", rx);
mtc.stop;
}
-[] IPA_RSL[2].receive(tr_ASP_RSL_UD(tr)) -> value rx {
+[] IPA_RSL[2][0].receive(tr_ASP_RSL_UD(tr)) -> value rx {
setverdict(fail, "Received unexpected RSL ", rx);
mtc.stop;
}
@@ -225,9 +225,9 @@
function f_cbsp_reset_bss(integer idx) runs on cbsp_test_CT {
/* Make sure no CBSP ETWS commands from a previous CBSP test remain in the RSL queue */
- IPA_RSL[0].clear;
- IPA_RSL[1].clear;
- IPA_RSL[2].clear;
+ IPA_RSL[0][0].clear;
+ IPA_RSL[1][0].clear;
+ IPA_RSL[2][0].clear;
var template (value) CBSP_PDU tx;
timer T := 3.0;
@@ -254,9 +254,9 @@
{
var template ASP_RSL_Unitdata zero_payload := tr_ASP_RSL_UD(tr_RSL_OSMO_ETWS_CMD(t_RslChanNr_PCH_AGCH(0), ''O));
interleave {
- [] IPA_RSL[0].receive(zero_payload) { log("CBSP: disabled ETWS PN broadcast on bts 0"); }
- [] IPA_RSL[1].receive(zero_payload) { log("CBSP: disabled ETWS PN broadcast on bts 1"); }
- [] IPA_RSL[2].receive(zero_payload) { log("CBSP: disabled ETWS PN broadcast on bts 2"); }
+ [] IPA_RSL[0][0].receive(zero_payload) { log("CBSP: disabled ETWS PN broadcast on bts 0"); }
+ [] IPA_RSL[1][0].receive(zero_payload) { log("CBSP: disabled ETWS PN broadcast on bts 1"); }
+ [] IPA_RSL[2][0].receive(zero_payload) { log("CBSP: disabled ETWS PN broadcast on bts 2"); }
}
}
@@ -562,9 +562,9 @@
var template (present) RSL_Message tr := f_page2rsl(pages[0], g_cbsp_msg_id, g_cbsp_ser_no, expect_blocks := expect_blocks);
log("RSL[0,1,2] EXPECTING ", tr_ASP_RSL_UD(tr));
interleave {
- [] IPA_RSL[0].receive(tr_ASP_RSL_UD(tr)) { log("Got SMSCB CMD on RSL[0]"); }
- [] IPA_RSL[1].receive(tr_ASP_RSL_UD(tr)) { log("Got SMSCB CMD on RSL[1]"); }
- [] IPA_RSL[2].receive(tr_ASP_RSL_UD(tr)) { log("Got SMSCB CMD on RSL[2]"); }
+ [] IPA_RSL[0][0].receive(tr_ASP_RSL_UD(tr)) { log("Got SMSCB CMD on RSL[0]"); }
+ [] IPA_RSL[1][0].receive(tr_ASP_RSL_UD(tr)) { log("Got SMSCB CMD on RSL[1]"); }
+ [] IPA_RSL[2][0].receive(tr_ASP_RSL_UD(tr)) { log("Got SMSCB CMD on RSL[2]"); }
}
setverdict(pass);
@@ -609,7 +609,7 @@
f_cbsp_write(g_cbsp_msg_id, g_cbsp_ser_no, cell_list, content:=pages,
success_list:=cell_list, fail_list:=omit);
var template (present) RSL_Message tr := f_page2rsl(pages[0], g_cbsp_msg_id, g_cbsp_ser_no);
- IPA_RSL[0].receive(tr_ASP_RSL_UD(tr));
+ IPA_RSL[0][0].receive(tr_ASP_RSL_UD(tr));
f_sleep(5.0);
}
@@ -649,7 +649,7 @@
cell_list := ts_BSSMAP_CIL_LAC_CI({bssmap_lac_ci(mp_cgi_bts0)});
f_cbsp_write(g_cbsp_msg_id, g_cbsp_ser_no, cell_list, content:=pages,
success_list:=?, fail_list:=omit);
- IPA_RSL[0].receive(tr_ASP_RSL_UD(f_page2rsl(pages[0], g_cbsp_msg_id, g_cbsp_ser_no)));
+ IPA_RSL[0][0].receive(tr_ASP_RSL_UD(f_page2rsl(pages[0], g_cbsp_msg_id, g_cbsp_ser_no)));
f_sleep(5.0);
}
@@ -663,7 +663,7 @@
cell_list := ts_BSSMAP_CIL_CI({bssmap_ci(mp_cgi_bts0)});
f_cbsp_write(g_cbsp_msg_id, g_cbsp_ser_no, cell_list, content:=pages,
success_list:=?, fail_list:=omit);
- IPA_RSL[0].receive(tr_ASP_RSL_UD(f_page2rsl(pages[0], g_cbsp_msg_id, g_cbsp_ser_no)));
+ IPA_RSL[0][0].receive(tr_ASP_RSL_UD(f_page2rsl(pages[0], g_cbsp_msg_id, g_cbsp_ser_no)));
f_sleep(5.0);
}
@@ -681,7 +681,7 @@
cell_list := ts_BSSMAP_CIL_LAI({bssmap_lai(mp_cgi_bts2)});
f_cbsp_write(g_cbsp_msg_id, g_cbsp_ser_no, cell_list, content:=pages,
success_list:=?, fail_list:=omit);
- IPA_RSL[2].receive(tr_ASP_RSL_UD(f_page2rsl(pages[0], g_cbsp_msg_id, g_cbsp_ser_no)));
+ IPA_RSL[2][0].receive(tr_ASP_RSL_UD(f_page2rsl(pages[0], g_cbsp_msg_id, g_cbsp_ser_no)));
f_sleep(5.0);
}
@@ -697,8 +697,8 @@
success_list:=?, fail_list:=omit);
var template (present) RSL_Message tr := f_page2rsl(pages[0], g_cbsp_msg_id, g_cbsp_ser_no);
interleave {
- [] IPA_RSL[0].receive(tr_ASP_RSL_UD(tr));
- [] IPA_RSL[1].receive(tr_ASP_RSL_UD(tr));
+ [] IPA_RSL[0][0].receive(tr_ASP_RSL_UD(tr));
+ [] IPA_RSL[1][0].receive(tr_ASP_RSL_UD(tr));
}
f_sleep(5.0);
}
@@ -714,7 +714,7 @@
f_cbsp_write(g_cbsp_msg_id, g_cbsp_ser_no, cell_list, num_bcast_req:=10, content:=pages,
success_list:=?, fail_list:=omit);
- IPA_RSL[0].receive(tr_ASP_RSL_UD(f_page2rsl(pages[0], g_cbsp_msg_id, g_cbsp_ser_no)));
+ IPA_RSL[0][0].receive(tr_ASP_RSL_UD(f_page2rsl(pages[0], g_cbsp_msg_id, g_cbsp_ser_no)));
/* Replace: keep the same msg_id, use a new ser_no */
var uint16_t old_ser_no := g_cbsp_ser_no;
@@ -722,7 +722,7 @@
f_cbsp_replace(g_cbsp_msg_id, g_cbsp_ser_no, old_ser_no, cell_list, content:=pages,
success_list:=?, fail_list:=omit);
- IPA_RSL[0].receive(tr_ASP_RSL_UD(f_page2rsl(pages[0], g_cbsp_msg_id, g_cbsp_ser_no)));
+ IPA_RSL[0][0].receive(tr_ASP_RSL_UD(f_page2rsl(pages[0], g_cbsp_msg_id, g_cbsp_ser_no)));
f_sleep(1.0);
setverdict(pass);
}
@@ -747,7 +747,7 @@
/* Count SMSCB messages during N=rep_number+2 repetition periods */
T.start(int2float(rep_period * (rep_number + 2)) * 1.883);
alt {
- [] IPA_RSL[0].receive(tr_ASP_RSL_UD(f_page2rsl(page, g_cbsp_msg_id, g_cbsp_ser_no))) {
+ [] IPA_RSL[0][0].receive(tr_ASP_RSL_UD(f_page2rsl(page, g_cbsp_msg_id, g_cbsp_ser_no))) {
var float exp_period := int2float(rep_period) * 1.883;
var float calc_period := T.read - last_time;
@@ -829,7 +829,7 @@
f_cbsp_write(g_cbsp_msg_id, g_cbsp_ser_no, cell_list, num_bcast_req := 5, content:=pages, success_list:=?, fail_list:=omit);
/* expect to receive it once on the BTS */
var template (present) RSL_Message tr := f_page2rsl(pages[0], g_cbsp_msg_id, g_cbsp_ser_no);
- IPA_RSL[0].receive(tr_ASP_RSL_UD(tr));
+ IPA_RSL[0][0].receive(tr_ASP_RSL_UD(tr));
/* kill it, expecting non-empty completion list; success must be empty in case of CBS! */
f_cbsp_kill(g_cbsp_msg_id, g_cbsp_ser_no, 0, cell_list, success_list:=omit, compl_list:=?, fail_list:=omit);
}
@@ -874,7 +874,7 @@
timer T := 5.0;
T.start;
alt {
- [] IPA_RSL[0].receive(tr_ASP_RSL_UD(tr_RSL_DATA_REQ(dt.rsl_chan_nr, ?, ?))) -> value rx_rsl_ud {
+ [] IPA_RSL[0][0].receive(tr_ASP_RSL_UD(tr_RSL_DATA_REQ(dt.rsl_chan_nr, ?, ?))) -> value rx_rsl_ud {
var RSL_IE_Body l3_ie;
if (f_rsl_find_ie(rx_rsl_ud.rsl, RSL_IE_L3_INFO, l3_ie) == false) {
setverdict(fail, "RSL DATA REQ without L3?");
@@ -891,7 +891,7 @@
setverdict(pass);
}
}
- [] IPA_RSL[0].receive { repeat; }
+ [] IPA_RSL[0][0].receive { repeat; }
[] T.timeout {
setverdict(fail, "Waiting for APP INFO");
}
@@ -910,14 +910,14 @@
}
alt {
- [] IPA_RSL[rsl_idx].receive(tr_ASP_RSL_UD(tr_RSL_OSMO_ETWS_CMD(t_RslChanNr_PCH_AGCH(0), tr_apdu))) {
+ [] IPA_RSL[rsl_idx][0].receive(tr_ASP_RSL_UD(tr_RSL_OSMO_ETWS_CMD(t_RslChanNr_PCH_AGCH(0), tr_apdu))) {
setverdict(pass);
}
- [] IPA_RSL[rsl_idx].receive(tr_ASP_RSL_UD(tr_RSL_OSMO_ETWS_CMD(?,?))) {
+ [] IPA_RSL[rsl_idx][0].receive(tr_ASP_RSL_UD(tr_RSL_OSMO_ETWS_CMD(?,?))) {
setverdict(fail, "Received unexpected OSMO_ETWS_CMD");
mtc.stop;
}
- [] IPA_RSL[rsl_idx].receive { repeat; }
+ [] IPA_RSL[rsl_idx][0].receive { repeat; }
[] T.timeout {
if (enabled) {
setverdict(fail, "Timeout waiting for RSL_OSMO_ETWS_CMD (enable)");
@@ -1055,7 +1055,7 @@
success_list:=cell_list, fail_list:=omit);
var template (present) RSL_Message tr := f_page2rsl(pages[0], g_cbsp_msg_id, g_cbsp_ser_no);
/* wait for first transmission */
- IPA_RSL[0].receive(tr_ASP_RSL_UD(tr));
+ IPA_RSL[0][0].receive(tr_ASP_RSL_UD(tr));
var template (present) CBSP_IE_NumBcastComplList compl_list := {
len := ?,
spare1_4 := ?,
diff --git a/bsc/BSC_Tests_LCLS.ttcn b/bsc/BSC_Tests_LCLS.ttcn
index 9771087..82f6b11 100644
--- a/bsc/BSC_Tests_LCLS.ttcn
+++ b/bsc/BSC_Tests_LCLS.ttcn
@@ -160,15 +160,16 @@
}
/* 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() ?!?
+ * TODO: allow connecting to TRX1..N, not only TRX0 */
private function f_connect_handler(inout LCLS_MSC_ConnHdlr vc_conn, integer bssap_idx := 0) runs on lcls_test_CT {
connect(vc_conn:RAN, g_bssap[bssap_idx].vc_RAN: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_PROC, bts[0].rsl.vc_RSL:RSL_PROC);
- if (isvalue(bts[1])) {
- 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:RSL, bts[0][0].rsl.vc_RSL:CLIENT_PT);
+ connect(vc_conn:RSL_PROC, bts[0][0].rsl.vc_RSL:RSL_PROC);
+ if (isvalue(bts[1][0])) {
+ connect(vc_conn:RSL1, bts[1][0].rsl.vc_RSL:CLIENT_PT);
+ connect(vc_conn:RSL1_PROC, bts[1][0].rsl.vc_RSL:RSL_PROC);
}
connect(vc_conn:BSSAP, g_bssap[bssap_idx].vc_RAN:CLIENT);
connect(vc_conn:MGCP, vc_MGCP:MGCP_CLIENT);
diff --git a/bsc/BSC_Tests_VAMOS.ttcn b/bsc/BSC_Tests_VAMOS.ttcn
index 1958dc5..6074fb2 100644
--- a/bsc/BSC_Tests_VAMOS.ttcn
+++ b/bsc/BSC_Tests_VAMOS.ttcn
@@ -247,7 +247,7 @@
var RSL_Message rsl;
- rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
+ rsl := f_exp_ipa_rx(tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
var RSL_IE_Body chan_mode_ie;
if (f_rsl_find_ie(rsl, RSL_IE_CHAN_MODE, chan_mode_ie) == false) {
@@ -266,7 +266,7 @@
}
var RslChannelNr chan_nr := rsl.ies[0].body.chan_nr;
- f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, 23+10));
+ f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, 23+10));
f_sleep(1.0);
f_lchan_ensure_established(BSCVTY, 0, 0, chan_nr);
--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/28212
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Ic0fd97234464ef624010a5f01189aa61f3393b84
Gerrit-Change-Number: 28212
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-MessageType: newchange
1
0
Change in osmo-ttcn3-hacks[master]: library/RSL_Types: fix wrong comment near tr_RSL_MsgTypeT
by fixeria 31 May '22
by fixeria 31 May '22
31 May '22
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/28211 )
Change subject: library/RSL_Types: fix wrong comment near tr_RSL_MsgTypeT
......................................................................
library/RSL_Types: fix wrong comment near tr_RSL_MsgTypeT
Change-Id: Ic10e324375d1495d94352e7229e6be481106e8bb
---
M library/RSL_Types.ttcn
1 file changed, 1 insertion(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/11/28211/1
diff --git a/library/RSL_Types.ttcn b/library/RSL_Types.ttcn
index b04a13a..8a4d1fa 100644
--- a/library/RSL_Types.ttcn
+++ b/library/RSL_Types.ttcn
@@ -1123,7 +1123,7 @@
msg_disc := { RSL_MDISC_DCHAN, ? }
}
-/* Dedicated Channel Management */
+/* TRX Management */
template RSL_Message tr_RSL_MsgTypeT(template RSL_MessageType msg_type) modifies tr_RSL_MsgType := {
msg_disc := { RSL_MDISC_TRX_MGMT, ? }
}
--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/28211
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Ic10e324375d1495d94352e7229e6be481106e8bb
Gerrit-Change-Number: 28211
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-MessageType: newchange
1
0
Change in pysim[master]: pySim-shell: catch exceptions from walk() while exporting
by laforge 31 May '22
by laforge 31 May '22
31 May '22
Attention is currently required from: fixeria, dexter.
laforge has posted comments on this change. ( https://gerrit.osmocom.org/c/pysim/+/28162 )
Change subject: pySim-shell: catch exceptions from walk() while exporting
......................................................................
Patch Set 3: Code-Review+1
--
To view, visit https://gerrit.osmocom.org/c/pysim/+/28162
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I3edc250ef2a84550c5b821a72e207e4d685790a5
Gerrit-Change-Number: 28162
Gerrit-PatchSet: 3
Gerrit-Owner: dexter <pmaier(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Attention: dexter <pmaier(a)sysmocom.de>
Gerrit-Comment-Date: Tue, 31 May 2022 19:32:23 +0000
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
Gerrit-MessageType: comment
1
0
Change in pysim[master]: pySim-shell: extend walk() so that we can also have an action of ADF ...
by laforge 31 May '22
by laforge 31 May '22
31 May '22
Attention is currently required from: dexter.
laforge has posted comments on this change. ( https://gerrit.osmocom.org/c/pysim/+/28160 )
Change subject: pySim-shell: extend walk() so that we can also have an action of ADF or DF
......................................................................
Patch Set 4: Code-Review+1
--
To view, visit https://gerrit.osmocom.org/c/pysim/+/28160
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: Iabcd78552a14a2d3f8f31273dda7731e1f640cdb
Gerrit-Change-Number: 28160
Gerrit-PatchSet: 4
Gerrit-Owner: dexter <pmaier(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Attention: dexter <pmaier(a)sysmocom.de>
Gerrit-Comment-Date: Tue, 31 May 2022 19:31:38 +0000
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
Gerrit-MessageType: comment
1
0
Change in osmo-bsc[master]: fix performance for chan_counts and all_allocated stats
by pespin 31 May '22
by pespin 31 May '22
31 May '22
Attention is currently required from: neels.
pespin has posted comments on this change. ( https://gerrit.osmocom.org/c/osmo-bsc/+/28205 )
Change subject: fix performance for chan_counts and all_allocated stats
......................................................................
Patch Set 2:
(1 comment)
File src/osmo-bsc/chan_counts.c:
https://gerrit.osmocom.org/c/osmo-bsc/+/28205/comment/f17d4834_4dba7144
PS1, Line 233: case NM_OC_RADIO_CARRIER:
> The situation you are trying to catch ("the trx is enabled, just after trx_is_usable() starts to ret […]
"You should be using that one only in that case"
I meant:
"You should be using only that one in that case".
Sorry the order I used before could be confusing ;)
--
To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/28205
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Change-Id: I580bfae329aac8d4552723164741536af6512011
Gerrit-Change-Number: 28205
Gerrit-PatchSet: 2
Gerrit-Owner: neels <nhofmeyr(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-CC: pespin <pespin(a)sysmocom.de>
Gerrit-Attention: neels <nhofmeyr(a)sysmocom.de>
Gerrit-Comment-Date: Tue, 31 May 2022 17:16:16 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Comment-In-Reply-To: neels <nhofmeyr(a)sysmocom.de>
Comment-In-Reply-To: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: comment
1
0