lists.osmocom.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
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
List overview
Download
gerrit-log
June 2022
----- 2025 -----
August 2025
July 2025
June 2025
May 2025
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
gerrit-log@lists.osmocom.org
3 participants
1374 discussions
Start a n
N
ew thread
Change in docker-playground[master]: ttcn3-bsc-test-sccplite/osmo-bsc.cfg: configure 3 additional TRX inst...
by fixeria
fixeria has submitted this change. (
https://gerrit.osmocom.org/c/docker-playground/+/28227
) Change subject: ttcn3-bsc-test-sccplite/osmo-bsc.cfg: configure 3 additional TRX instances for BTS2 ...................................................................... ttcn3-bsc-test-sccplite/osmo-bsc.cfg: configure 3 additional TRX instances for BTS2 This should have been done as part of [1] in order to avoid regressions in ttcn3-bsc-test-sccplite. Change-Id: I2d0045533814a2bacc384c06287066f2209a5f38 Fixes: [1] Iba4fbd5c9ed59783df4ac64e68b2beef73a812ff Related: SYS#5460 --- M ttcn3-bsc-test/sccplite/osmo-bsc.cfg 1 file changed, 90 insertions(+), 0 deletions(-) Approvals: Jenkins Builder: Verified pespin: Looks good to me, but someone else must approve fixeria: Looks good to me, approved diff --git a/ttcn3-bsc-test/sccplite/osmo-bsc.cfg b/ttcn3-bsc-test/sccplite/osmo-bsc.cfg index 564ebce..c7c6f90 100644 --- a/ttcn3-bsc-test/sccplite/osmo-bsc.cfg +++ b/ttcn3-bsc-test/sccplite/osmo-bsc.cfg @@ -346,6 +346,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 sysmobts band DCS1800 -- To view, visit
https://gerrit.osmocom.org/c/docker-playground/+/28227
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: docker-playground Gerrit-Branch: master Gerrit-Change-Id: I2d0045533814a2bacc384c06287066f2209a5f38 Gerrit-Change-Number: 28227 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
3 years, 2 months
1
0
0
0
Change in docker-playground[master]: ttcn3-bsc-test-sccplite/osmo-bsc.cfg: configure 3 additional TRX inst...
by fixeria
fixeria has posted comments on this change. (
https://gerrit.osmocom.org/c/docker-playground/+/28227
) Change subject: ttcn3-bsc-test-sccplite/osmo-bsc.cfg: configure 3 additional TRX instances for BTS2 ...................................................................... Patch Set 1: Code-Review+2 -- To view, visit
https://gerrit.osmocom.org/c/docker-playground/+/28227
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: docker-playground Gerrit-Branch: master Gerrit-Change-Id: I2d0045533814a2bacc384c06287066f2209a5f38 Gerrit-Change-Number: 28227 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-Comment-Date: Tue, 07 Jun 2022 10:28:27 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes Gerrit-MessageType: comment
3 years, 2 months
1
0
0
0
Change in docker-playground[master]: ttcn3-bsc-test-sccplite/osmo-bsc.cfg: configure 3 additional TRX inst...
by pespin
Attention is currently required from: fixeria. pespin has posted comments on this change. (
https://gerrit.osmocom.org/c/docker-playground/+/28227
) Change subject: ttcn3-bsc-test-sccplite/osmo-bsc.cfg: configure 3 additional TRX instances for BTS2 ...................................................................... Patch Set 1: Code-Review+1 -- To view, visit
https://gerrit.osmocom.org/c/docker-playground/+/28227
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: docker-playground Gerrit-Branch: master Gerrit-Change-Id: I2d0045533814a2bacc384c06287066f2209a5f38 Gerrit-Change-Number: 28227 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, 07 Jun 2022 10:13:11 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes Gerrit-MessageType: comment
3 years, 2 months
1
0
0
0
Change in docker-playground[master]: ttcn3-bsc-test-sccplite/osmo-bsc.cfg: configure 3 additional TRX inst...
by fixeria
fixeria has uploaded this change for review. (
https://gerrit.osmocom.org/c/docker-playground/+/28227
) Change subject: ttcn3-bsc-test-sccplite/osmo-bsc.cfg: configure 3 additional TRX instances for BTS2 ...................................................................... ttcn3-bsc-test-sccplite/osmo-bsc.cfg: configure 3 additional TRX instances for BTS2 This should have been done as part of [1] in order to avoid regressions in ttcn3-bsc-test-sccplite. Change-Id: I2d0045533814a2bacc384c06287066f2209a5f38 Fixes: [1] Iba4fbd5c9ed59783df4ac64e68b2beef73a812ff Related: SYS#5460 --- M ttcn3-bsc-test/sccplite/osmo-bsc.cfg 1 file changed, 90 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/docker-playground refs/changes/27/28227/1 diff --git a/ttcn3-bsc-test/sccplite/osmo-bsc.cfg b/ttcn3-bsc-test/sccplite/osmo-bsc.cfg index 564ebce..c7c6f90 100644 --- a/ttcn3-bsc-test/sccplite/osmo-bsc.cfg +++ b/ttcn3-bsc-test/sccplite/osmo-bsc.cfg @@ -346,6 +346,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 sysmobts band DCS1800 -- To view, visit
https://gerrit.osmocom.org/c/docker-playground/+/28227
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: docker-playground Gerrit-Branch: master Gerrit-Change-Id: I2d0045533814a2bacc384c06287066f2209a5f38 Gerrit-Change-Number: 28227 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-MessageType: newchange
3 years, 2 months
1
0
0
0
Change in osmo-upf[master]: api: add osmo_pfcp_ie_node_id_to_str_c()
by fixeria
Attention is currently required from: neels. fixeria has posted comments on this change. (
https://gerrit.osmocom.org/c/osmo-upf/+/28226
) Change subject: api: add osmo_pfcp_ie_node_id_to_str_c() ...................................................................... Patch Set 3: Code-Review+1 -- To view, visit
https://gerrit.osmocom.org/c/osmo-upf/+/28226
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-upf Gerrit-Branch: master Gerrit-Change-Id: I5c580bc510afce58a03dea0861db9630b063b2ae Gerrit-Change-Number: 28226 Gerrit-PatchSet: 3 Gerrit-Owner: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Attention: neels <nhofmeyr(a)sysmocom.de> Gerrit-Comment-Date: Tue, 07 Jun 2022 09:54:57 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes Gerrit-MessageType: comment
3 years, 2 months
1
0
0
0
Change in osmo-upf[master]: pfcp ie: tweak CP Function Features
by fixeria
Attention is currently required from: neels. fixeria has posted comments on this change. (
https://gerrit.osmocom.org/c/osmo-upf/+/28225
) Change subject: pfcp ie: tweak CP Function Features ...................................................................... Patch Set 2: Code-Review+1 -- To view, visit
https://gerrit.osmocom.org/c/osmo-upf/+/28225
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-upf Gerrit-Branch: master Gerrit-Change-Id: Icda891a2f3401e58f142f229465403d5dc8befe5 Gerrit-Change-Number: 28225 Gerrit-PatchSet: 2 Gerrit-Owner: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Attention: neels <nhofmeyr(a)sysmocom.de> Gerrit-Comment-Date: Tue, 07 Jun 2022 09:53:58 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes Gerrit-MessageType: comment
3 years, 2 months
1
0
0
0
Change in osmo-upf[master]: pfcp/Makefile.am: add missing pfcp_ies_auto.h entry
by fixeria
Attention is currently required from: neels. fixeria has posted comments on this change. (
https://gerrit.osmocom.org/c/osmo-upf/+/28224
) Change subject: pfcp/Makefile.am: add missing pfcp_ies_auto.h entry ...................................................................... Patch Set 2: Code-Review+1 -- To view, visit
https://gerrit.osmocom.org/c/osmo-upf/+/28224
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-upf Gerrit-Branch: master Gerrit-Change-Id: I6fbfe1fcd084f2d16334bb3e44d9891d9485d59f Gerrit-Change-Number: 28224 Gerrit-PatchSet: 2 Gerrit-Owner: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Attention: neels <nhofmeyr(a)sysmocom.de> Gerrit-Comment-Date: Tue, 07 Jun 2022 09:53:12 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes Gerrit-MessageType: comment
3 years, 2 months
1
0
0
0
Change in osmo-ttcn3-hacks[master]: BSC_Tests: configure 3 additional TRX instances for BTS2
by fixeria
fixeria has submitted this change. (
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: Iba4fbd5c9ed59783df4ac64e68b2beef73a812ff Related: SYS#5460 --- M bsc/BSC_Tests.ttcn M bsc/osmo-bsc.cfg 2 files changed, 91 insertions(+), 1 deletion(-) Approvals: laforge: Looks good to me, approved pespin: Looks good to me, but someone else must approve Jenkins Builder: Verified diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn index b7de157..b445709 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: 4 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
3 years, 2 months
1
0
0
0
Change in osmo-ttcn3-hacks[master]: BSC_Tests: add support for per-TRX RSL connections
by fixeria
fixeria has submitted this change. (
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. * Fix CTRL/statsd expectations in TC_stat_num_bts_connected_[123]. * Fix CTRL expectations in TC_ctrl_trx_rf_locked. 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, 471 insertions(+), 391 deletions(-) Approvals: laforge: Looks good to me, approved pespin: Looks good to me, but someone else must approve Jenkins Builder: Verified fixeria: Verified diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn index d9b178f..b7de157 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 * 1000 + 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; @@ -3036,18 +3067,32 @@ /* Verify correct stats on the number of configured and connected MSCs */ private function f_tc_stat_num_bts_connected_msc_connhdlr(integer expect_num_bts_connected) runs on MSC_ConnHdlr { - g_pars := f_gen_test_hdlr_pars(); + var integer num_trx_connected := 0; + var integer num_trx_total := 0; + + for (var integer i := 0; i < lengthof(c_BtsParams); i := i + 1) { + var integer trx_num := c_BtsParams[i].trx_num; + num_trx_total := num_trx_total + trx_num; + if (i < expect_num_bts_connected) { + num_trx_connected := num_trx_connected + trx_num; + } + } + var StatsDExpects expect := { { name := "TTCN3.bsc.0.num_bts.oml_connected", mtype := "g", min := expect_num_bts_connected, max := NUM_BTS_CFG }, { name := "TTCN3.bsc.0.num_bts.all_trx_rsl_connected", mtype := "g", min := expect_num_bts_connected, max := expect_num_bts_connected }, { name := "TTCN3.bsc.0.num_bts.total", mtype := "g", min := NUM_BTS_CFG, max := NUM_BTS_CFG }, - { name := "TTCN3.bsc.0.num_trx.rsl_connected", mtype := "g", min := expect_num_bts_connected, max := expect_num_bts_connected }, - { name := "TTCN3.bsc.0.num_trx.total", mtype := "g", min := NUM_BTS_CFG, max := NUM_BTS_CFG } + { name := "TTCN3.bsc.0.num_trx.rsl_connected", mtype := "g", min := num_trx_connected, max := num_trx_connected }, + { name := "TTCN3.bsc.0.num_trx.total", mtype := "g", min := num_trx_total, max := num_trx_total } }; + + g_pars := f_gen_test_hdlr_pars(); f_statsd_expect(expect); } private function f_tc_stat_num_bts_connected_test_ct(void_fn tc_fn, integer nr_bts) runs on test_CT { + var integer num_trx_connected := 0; + var integer num_trx_total := 0; var MSC_ConnHdlr vc_conn; f_init(nr_bts := nr_bts, handler_mode := true, nr_msc := 1); @@ -3055,30 +3100,43 @@ vc_conn := f_start_handler(tc_fn); vc_conn.done; + for (var integer i := 0; i < lengthof(c_BtsParams); i := i + 1) { + var integer trx_num := c_BtsParams[i].trx_num; + num_trx_total := num_trx_total + trx_num; + if (i < nr_bts) { + num_trx_connected := num_trx_connected + trx_num; + } + } + /* Also verify stat exposed on CTRL interface */ f_ctrl_get_exp(IPA_CTRL, "stat_item.last.bsc.0.num_bts:all_trx_rsl_connected", int2str(nr_bts)); f_ctrl_get_exp(IPA_CTRL, "stat_item.last.bsc.0.num_bts:total", int2str(NUM_BTS_CFG)); - f_ctrl_get_exp(IPA_CTRL, "stat_item.last.bsc.0.num_trx:rsl_connected", int2str(nr_bts)); - f_ctrl_get_exp(IPA_CTRL, "stat_item.last.bsc.0.num_trx:total", int2str(NUM_BTS_CFG)); + f_ctrl_get_exp(IPA_CTRL, "stat_item.last.bsc.0.num_trx:rsl_connected", int2str(num_trx_connected)); + f_ctrl_get_exp(IPA_CTRL, "stat_item.last.bsc.0.num_trx:total", int2str(num_trx_total)); /* Verify rf_states exposed on CTRL interface */ var charstring expect_net_rf_states := ""; for (var integer i := 0; i < NUM_BTS_CFG; i := i + 1) { - var charstring expect_bts_rf_states := int2str(i) & ",0,"; - if (i < NUM_BTS) { - /* In these tests, OML for the first NUM_BTS are always connected via osmo-bts-omldummy */ - expect_bts_rf_states := expect_bts_rf_states & "operational,unlocked,"; - } else { - /* For remaining i < NUM_BTS_CFG, OML is not connected, i.e. inoperational */ - expect_bts_rf_states := expect_bts_rf_states & "inoperational,locked,"; - } - /* The RF policy is still global in osmo-bsc, i.e. always "on" */ - expect_bts_rf_states := expect_bts_rf_states & "on,"; - if (i < nr_bts) { - /* For BTS where RSL is connected, the RSL state will be "up" */ - expect_bts_rf_states := expect_bts_rf_states & "rsl-up;"; - } else { - expect_bts_rf_states := expect_bts_rf_states & "rsl-down;"; + var charstring expect_bts_rf_states := ""; + + for (var integer j := 0; j < c_BtsParams[i].trx_num; j := j + 1) { + expect_bts_rf_states := expect_bts_rf_states & + int2str(i) & "," & int2str(j) & ","; + if (i < NUM_BTS) { + /* In these tests, OML for the first NUM_BTS are always connected via osmo-bts-omldummy */ + expect_bts_rf_states := expect_bts_rf_states & "operational,unlocked,"; + } else { + /* For remaining i < NUM_BTS_CFG, OML is not connected, i.e. inoperational */ + expect_bts_rf_states := expect_bts_rf_states & "inoperational,locked,"; + } + /* The RF policy is still global in osmo-bsc, i.e. always "on" */ + expect_bts_rf_states := expect_bts_rf_states & "on,"; + if (i < nr_bts) { + /* For BTS where RSL is connected, the RSL state will be "up" */ + expect_bts_rf_states := expect_bts_rf_states & "rsl-up;"; + } else { + expect_bts_rf_states := expect_bts_rf_states & "rsl-down;"; + } } f_ctrl_get_exp(IPA_CTRL, "bts." & int2str(i) & ".rf_states", expect_bts_rf_states); @@ -3213,7 +3271,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 +3291,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 +3310,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 +3477,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 +3570,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; } @@ -3557,9 +3615,10 @@ /* Send CHAN RQD and wait for allocation; acknowledge it */ dt.rsl_chan_nr := f_chreq_act_ack(); + dt.idx := {0, 0}; /* 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 +3659,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 +3675,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 +3691,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 +3731,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 +3742,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 +3808,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 +5188,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 +5507,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 +5537,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 +5550,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 +5632,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 +6134,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 +7045,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 +7057,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 +7119,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 +7175,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 +7367,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 +7482,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 +7525,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 +7535,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 +7559,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 +7576,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 +7640,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 +7686,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 +7720,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 +7737,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 +7763,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 +7792,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 +7824,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 +7841,20 @@ } /* 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; + dt.idx := {0, 0}; 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 +7862,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 +7902,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 +7962,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 +7979,20 @@ } /* 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; + dt.idx := {0, 0}; 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 +8000,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 +8040,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 +8057,17 @@ } /* 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; + dt.idx := {0, 0}; 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 +8076,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 +8138,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 +8262,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 +9105,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 +9121,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 +9137,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 +9404,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 +9445,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 +9505,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 +9575,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 +9688,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 +9718,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 +10213,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 +10609,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 +10832,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 +10848,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,31 +10918,30 @@ /* 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; - var DchanTuple dt; - dt.rsl_chan_nr := chan_nr; + var DchanTuple dt := {-, chan_nr, {0, 0}}; 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)); /* 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 +10965,11 @@ /* 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)); var RslChannelNr chan_nr := chan_act.ies[0].body.chan_nr; - var DchanTuple dt; - dt.rsl_chan_nr := chan_nr; + var DchanTuple dt := {-, chan_nr, {0, 0}}; 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"); @@ -10916,16 +10980,16 @@ f_vty_set_imm_ass(BSCVTY); /* *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 +11013,11 @@ /* 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)); var RslChannelNr chan_nr := chan_act.ies[0].body.chan_nr; - var DchanTuple dt; - dt.rsl_chan_nr := chan_nr; + var DchanTuple dt := {-, chan_nr, {0, 0}}; 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"); @@ -10965,16 +11028,16 @@ f_vty_set_imm_ass(BSCVTY); /* *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 +11060,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 +11082,20 @@ /* 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; + var DchanTuple dt := {-, chan_nr, {0, 0}}; - 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 +11103,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 +11135,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 +11157,38 @@ /* 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; + var DchanTuple dt := {-, chan_nr, {0, 0}}; - 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; @@ -11151,6 +11212,9 @@ "0,0,operational,unlocked,on,rsl-up;" & "1,0,operational,unlocked,on,rsl-up;" & "2,0,operational,unlocked,on,rsl-down;" & + "2,1,operational,unlocked,on,rsl-down;" & + "2,2,operational,unlocked,on,rsl-down;" & + "2,3,operational,unlocked,on,rsl-down;" & "3,0,inoperational,locked,on,rsl-down;"); f_logp(BSCVTY, "TC_ctrl_trx_rf_locked: lock BTS 1 TRX 0"); @@ -11165,6 +11229,9 @@ "0,0,operational,unlocked,on,rsl-up;" & "1,0,operational,locked,on,rsl-up;" & "2,0,operational,unlocked,on,rsl-down;" & + "2,1,operational,unlocked,on,rsl-down;" & + "2,2,operational,unlocked,on,rsl-down;" & + "2,3,operational,unlocked,on,rsl-down;" & "3,0,inoperational,locked,on,rsl-down;"); f_logp(BSCVTY, "TC_ctrl_trx_rf_locked: lock the already locked TRX, nothing should change"); @@ -11174,6 +11241,9 @@ "0,0,operational,unlocked,on,rsl-up;" & "1,0,operational,locked,on,rsl-up;" & "2,0,operational,unlocked,on,rsl-down;" & + "2,1,operational,unlocked,on,rsl-down;" & + "2,2,operational,unlocked,on,rsl-down;" & + "2,3,operational,unlocked,on,rsl-down;" & "3,0,inoperational,locked,on,rsl-down;"); f_logp(BSCVTY, "TC_ctrl_trx_rf_locked: unlock BTS 1 TRX 0"); @@ -11183,6 +11253,9 @@ "0,0,operational,unlocked,on,rsl-up;" & "1,0,operational,unlocked,on,rsl-up;" & "2,0,operational,unlocked,on,rsl-down;" & + "2,1,operational,unlocked,on,rsl-down;" & + "2,2,operational,unlocked,on,rsl-down;" & + "2,3,operational,unlocked,on,rsl-down;" & "3,0,inoperational,locked,on,rsl-down;"); f_logp(BSCVTY, "TC_ctrl_trx_rf_locked: unlock an already unlocked TRX, nothing should change"); @@ -11192,6 +11265,9 @@ "0,0,operational,unlocked,on,rsl-up;" & "1,0,operational,unlocked,on,rsl-up;" & "2,0,operational,unlocked,on,rsl-down;" & + "2,1,operational,unlocked,on,rsl-down;" & + "2,2,operational,unlocked,on,rsl-down;" & + "2,3,operational,unlocked,on,rsl-down;" & "3,0,inoperational,locked,on,rsl-down;"); f_logp(BSCVTY, "TC_ctrl_trx_rf_locked: unlock an inoperational TRX"); @@ -11201,6 +11277,9 @@ "0,0,operational,unlocked,on,rsl-up;" & "1,0,operational,unlocked,on,rsl-up;" & "2,0,operational,unlocked,on,rsl-down;" & + "2,1,operational,unlocked,on,rsl-down;" & + "2,2,operational,unlocked,on,rsl-down;" & + "2,3,operational,unlocked,on,rsl-down;" & "3,0,inoperational,locked,on,rsl-down;"); f_shutdown_helper(); @@ -11426,8 +11505,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: @@ -11469,7 +11548,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. */ @@ -11480,13 +11559,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: 4 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-CC: neels <nhofmeyr(a)sysmocom.de> Gerrit-MessageType: merged
3 years, 2 months
1
0
0
0
Change in docker-playground[master]: ttcn3-bsc-test/osmo-bsc.cfg: configure 3 additional TRX instances for...
by fixeria
fixeria has submitted this change. (
https://gerrit.osmocom.org/c/docker-playground/+/28215
) Change subject: ttcn3-bsc-test/osmo-bsc.cfg: configure 3 additional TRX instances for BTS2 ...................................................................... ttcn3-bsc-test/osmo-bsc.cfg: configure 3 additional TRX instances for BTS2 Change-Id: Iba4fbd5c9ed59783df4ac64e68b2beef73a812ff Related: Ie1241c54abac9a56906c525155cbf7482bca738e Related: SYS#5460 --- M ttcn3-bsc-test/jenkins.sh M ttcn3-bsc-test/osmo-bsc.cfg 2 files changed, 96 insertions(+), 5 deletions(-) Approvals: Jenkins Builder: Verified laforge: Looks good to me, approved diff --git a/ttcn3-bsc-test/jenkins.sh b/ttcn3-bsc-test/jenkins.sh index 5f3ba53..40b3f62 100755 --- a/ttcn3-bsc-test/jenkins.sh +++ b/ttcn3-bsc-test/jenkins.sh @@ -46,16 +46,17 @@ BTS_FEATURES="-fCCN,EGPRS,GPRS,IPv6_NSVC,PAGING_COORDINATION" -for i in `seq 0 2`; do - echo Starting container with OML for BTS$i +for i in "0 1" "1 1" "2 4"; do + set -- $i # convert the {BTS, TRXN} "tuple" into the param args $1 $2 + echo "Starting container with OML for BTS$1 (TRXN = $2)" docker run --rm \ - $(docker_network_params $SUBNET 10$i) \ + $(docker_network_params $SUBNET 10$1) \ --ulimit core=-1 \ -v $VOL_BASE_DIR/bts-omldummy:/data \ - --name ${BUILD_TAG}-bts$i -d \ + --name ${BUILD_TAG}-bts$1 -d \ $DOCKER_ARGS \ $REPO_USER/osmo-bts-$IMAGE_SUFFIX \ - /bin/sh -c "/usr/local/bin/respawn.sh osmo-bts-omldummy $BTS_FEATURES 172.18.2.20 $((i + 1234)) 1 >>/data/osmo-bts-omldummy-${i}.log 2>&1" + /bin/sh -c "/usr/local/bin/respawn.sh osmo-bts-omldummy $BTS_FEATURES 172.18.2.20 $(($1 + 1234)) $2 >>/data/osmo-bts-omldummy-$1.log 2>&1" done echo Starting container with BSC testsuite diff --git a/ttcn3-bsc-test/osmo-bsc.cfg b/ttcn3-bsc-test/osmo-bsc.cfg index cfc6186..eefcde4 100644 --- a/ttcn3-bsc-test/osmo-bsc.cfg +++ b/ttcn3-bsc-test/osmo-bsc.cfg @@ -369,6 +369,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 sysmobts band DCS1800 -- To view, visit
https://gerrit.osmocom.org/c/docker-playground/+/28215
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: docker-playground Gerrit-Branch: master Gerrit-Change-Id: Iba4fbd5c9ed59783df4ac64e68b2beef73a812ff Gerrit-Change-Number: 28215 Gerrit-PatchSet: 2 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
3 years, 2 months
1
0
0
0
← Newer
1
...
121
122
123
124
125
126
127
...
138
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
Results per page:
10
25
50
100
200