Skip to content

Loading builds...

Changes

#92 (Feb 13, 2026, 1:14:00 PM)

msc: f_tc_ho_inter_bsc0(): catch BSSMAP HandoverRequiredReject

It may happen that the target BSC is not yet connected to the MSC.
In this case the MSC rejects handover with HandoverRequiredReject.
Let's catch this PDU to make the verdict cleaner in such case.

Change-Id: I5ba98e323e0c7794554ccb115d7697ad03ccbfa5
Related: OS#6951
Vadim Yanitskiy at
msc: TC_ho_inter_bsc: wait for the target BSC to become ready

A race condition may occur between the two testcase components
emulating BSCs: the source BSC initiates handover to the terget
BSC before the later completes connection establishment with the
MSC.  In this case, the MSC fails to find the target peer and
rejects our HandoverRequired with HandoverRequiredReject.

  Target RAN peer from neighbor config is not connected: Cell ID CGI:023-42-5-6 resolves to target address 0.24.2
  Cannot find target peer for cell ID CGI:023-42-5-6
  Attempted Handover to 1 cells without success

Let's avoid this by waiting for the target BSC to become available
before initiating the handover procedure.  Use the COORD port
("intercom") to signal readiness of the target BSC.

Change-Id: I00b8a8b89ec7bb15590d30aadf40055981375a5d
Related: OS#6951
Vadim Yanitskiy at

#88 (Feb 9, 2026, 1:14:00 PM)

bts: limit stderr logging to ERROR to avoid long write() to ext4 fs

Commit c3ab9ec33f37c6837fb8bcb0fa0bbd2e98781fb7 already decreased
verbosity to NOTICE, but that's not enough since we still get plenty of
logging and hence plenty of long write()s during test execution.

Let's try decreasing to ERROR and see if that's enough for now to
stabilize the tests.

Change-Id: I41982fd83a9f46609464afb6b7242240063d4d91
Pau Espin Pedrol at
hnbgw: expected-results.xml: Add missing TC_sccp_cr_limit

Change-Id: I4138cff311f82358f040290f3af483df8facc4cf
Pau Espin Pedrol at
bts: as_rsl_meas_res(): tolerate bad RxQual in early reports

Bit errors are expected during early stage of channel establishment.
Ignore bad RxQual in the very first reports (4 * 0.480s = 1.92s).

This reduces probability of sporadic failures.

Change-Id: Ie8acb15b66cd92092ec49bc8caeaf0ad4d471f1d
Related: OS#6933
laforge at
bts: as_rsl_meas_res(): do not expect dummy UL SACCH

We're now populating the UL SACCH cache before establishing a
decicated channel in f_est_dchan(), so this special case is
no longer needed and can be safely removed.

Change-Id: I6eeee2876a76d41ab453af4c7724173fea773b83
Related: I4781fe7539e64e77d594e84f905646c127f46b64
Related: OS#6933
laforge at
bts: f_verify_ramp_up(): fix RxLev / dBm mixup

Comparing RxLev and dBm values is comparing apples to oranges.  It's
just a lucky coincidence that fake_trx is using RF path loss value of
110 dB, which is also the offset between RxLev and dBm.

* Add `mp_rf_path_loss` matching the default value (110 dB) in fake_trx.
* Add `f_bts_max_rx_level_dbm()` calculating the expected Rx power level.
* Apply `rxlev2dbm()` on `l1_dl.dl_info.rx_level` whenever needed.
* Clarify the units in verdict / logging messages.

Change-Id: I818d18d6e0711247b73ee1f336133e2ed3f6e2cb
Related: OS#6939
laforge at
bts: fix TC_rsl_ms_pwr_dyn_ass_updown: simulate a good C/I value

Now that we populate the UL SACCH cache in advance, trxcon is sending
ms-pwr-lvl 7 in the first UL SACCH block (as expected).  This suddenly
makes the testcase fail, because now the MS power loop is perfectly
happy about the received input values and does not order any changes
to the current MS power level anymore, contrary to our expectations.

Why? Short answer: because of C/I (curr 6, avg 6) being outside of
the good range (thresh 13..17).  The MS power loop intentionally
avoids reducing Tx power because that would potentially degrade the
link quality (C/I) even further.  Solution: let's order fake_trx.py
to simulate a C/I value that is within the thresholds.

This alone does not fix the testcase yet, another fix follows.

Change-Id: I8926fc925e930bc2703210931b613988161a72da
Related: c246f207 ("bts: f_est_dchan(): populate UL SACCH cache")
Related: OS#6945
laforge at
bts: fix TC_rsl_ms_pwr_dyn_ass_updown: adjust the timers

This testcase predates major changes to the MS power control logic
in osmo-bts and was passing thanks to a coincidence (broken UL SACCH
cache in trxcon).  Specifically, the MS power loop is now using
P_Con_INTERVAL=4 by default.  This means that the power control
decision is intentionally delayed and a change may occur only once
in a period of 4 SACCH blocks (N=4 is ~1.92s).

Adjust the timer values to take this into account.  Take a chance
to move comments in-place and expand them with more details.

This patch makes TC_rsl_ms_pwr_dyn_ass_updown pass again.

Change-Id: I36d87c12f49ec13003b708d768285aa6840e81eb
Related: OS#6945
laforge at
bts: TC_rsl_ms_pwr_dyn_ass_updown: misc improvements

Change-Id: Iae3fa5f09d68bd472f7236bf882f5b168d87384a
Related: OS#6945
laforge at

#87 (Feb 8, 2026, 1:14:00 PM)

{hnbap,ranap,rua,s1ap,sabp,sbcap}: use TITAN's ASN.1 PER codec

TITAN has built-in ASN.1 PER codec since version 10.0.0.
Drop libfftranscode dependency, use TTCN_EncDec::CT_PER / PER_ALIGNED.

Change-Id: I990a9c01d965e185fc64bd751ea0685e5d3b869c
Related: OS#6490
Vadim Yanitskiy at
s1ap: add {enc,dec}_S1AP_Global_ENB_ID() API

Change-Id: I83c314f4929a6eb749dfa8dbd1e1371a90481ed6
Related: OS#6490
Vadim Yanitskiy at

#84 (Feb 5, 2026, 1:14:00 PM)

bts: rename g_next_meas_res_nr / g_first_meas_res

These variables are used by as_rsl_meas_res() to track MEASurement
RESult PDUs on the A-bis/RSL link.  Clarify their names.

Change-Id: Iceb58bb636817afcd0fdf1eb3344d03153860a56
Related: OS#6933
laforge at
bts: as_rsl_meas_res(): move chan_est to ConnHdlr

Altstep local variables are reset when another altstep, executed
among with as_rsl_meas_res(), repeats.  Move the chan_est variable
to ConnHdlr, so that it does not get reset.

Change-Id: I3a31532494e123935fb2aede0e67e4271962ab5f
Related: OS#6933
laforge at
bts: f_est_dchan(): also reset g_rsl_meas_res_nr

This avoids unexpected failures if a dedicated channel is
established more than once by ConnHdlr.

Change-Id: Ia26413339c8c056e21661ae29bb2618b4a05ec70
Related: OS#6933
laforge at
bts: f_est_dchan(): populate UL SACCH cache

This ensures that UL SACCH blocks always contain the expected content
and a proper L1 SACCH header, rather than the dummy measurement report
hard-coded in trxcon/firmware.  As a result, the BTS receives
consistent and realistic UL SACCH from the very beginning.

Change-Id: I4781fe7539e64e77d594e84f905646c127f46b64
Related: OS#6933
laforge at
library: make ts_MEAS_REP accept MeasurementResults

This reduces code duplication and makes ts_MEAS_REP easier to use.

Change-Id: I12113360f52b0ce09aa9bc11472fdd04bf14f368
laforge at
bts: f_build_meas_res_tmpl(): expect specific L3 INFO

Change-Id: I1892d3ae3f72443ded6321487e9b191cd1948aac
Related: OS#6933
laforge at
hnbgw: Fix race condition in TC_stat_stp_sctp_disconnected

It can happen that first time check for sgsn/msc state they are still
connecting to stp (M3UA) or to ttcn3 process (SCCP/RANAP).
Use wait_converge=true to simply wait until they are conncted.

Change-Id: I15a6a9b9cf47f95d88bca75d0c6f88547f1dad40
laforge at
RAN_Emulation: Assume SCCP peer available if rx BSSAP/RANAP Reset

This way we speed up tests, and also avoid extra verbosity by avoiding
receiving and transmitting extra RESET.

Change-Id: Id9020320b61d89720e17e1024b629f0227445266
laforge at
bts: f_TC_tx_power_ramp_adm_state_change(): drop unused last_rx_lvl

Change-Id: I9cddc84265a53cb4fab3d887881e080ffe484db4
Vadim Yanitskiy at
bts: f_TC_acch_overpower(): use f_wait_ramp_up()

Change-Id: Id9b8bfc70cb26508e12ccd2b142bb458a3912c09
Vadim Yanitskiy at
bts: fix verdict string in f_verify_ramp_up()

Change-Id: I6e48c61ada7daa904734658709c1be384286041e
Vadim Yanitskiy at

#82 (Feb 3, 2026, 1:14:00 PM)

BSSAP_LE_Emulation: Handle N-PCSTATE.ind to wait for peer availability

Take the chance to explicitly log and discard other .ind primitives
which would otherwise block the processing of messages.

Related: OS#6907
Change-Id: I6a40d1ddcd3a7dbde9f6c8b51439e9ab4d1da469
Pau Espin Pedrol at
RAN_Emulation: Handle N-PCSTATE.ind to wait for peer availability

Take the chance to explicitly log and discard other .ind primitives
which would otherwise block the processing of messages.

Change-Id: I86b481fca9b7be84f3cda9fbce83e60820fe7fc1
Related: OS#6907
Pau Espin Pedrol at
bsc: Don't start virtual SMLC in TC_lcs_loc_req_without_smlc

The SMLC is not needed at all in that test. In fact, we want it to not
be available. Starting it now within that test, where the BSC Lb link is
torn down (f_vty_enable_smlc(false)) may create race conditions where
the SMLC ttcn3 code (BSSMAP_LE_Emulation) will try to get the RESET
procedure ongoing, which the BSC SCCP stack may reject (SCCP UDTS) due
to the SCCP User being unbound during the VTY command above to disable
the Lb Link.

Change-Id: Idb98e4d907feaafdaf3f5bf044c0c50b6d943d01
Pau Espin Pedrol at
bsc: expected-results.xml: Add missing test BSC_Tests.TC_lcs_loc_req_without_smlc

Change-Id: Iebae79d8b70d1200b45b9f86b1e0d63b9c52b952
Pau Espin Pedrol at
deps/Makefile: Fetch M3UA/MTP3/SCCP back from upstream

Patches in our fork have been merged and hence we can point back to
upstream.

Related: OS#6907
Change-Id: I1bcc6ddcd9f55866965f12fd3771ce6a8659d141
Pau Espin Pedrol at

#78 (Jan 30, 2026, 1:14:00 PM)

Revert "testenv: less cluttered output for failed cmds"

This reverts commit 648954ff1ab94620833b484d8131d001c61faa78.

Change-Id: I84f954e7f7d6c3b8051d29d8fc20060d7075852c
Related: OS#6935
Pau Espin Pedrol at
Expect and discard N-PCSTATE.ind with newer SCCP_Emulation

Newer titan.ProtocolEmulations.SCCP will generate N-PCSTATE.ind when
needed. Since our tests written so far don't expect those (yet), discard
them at the port level so the indications don't interfere with it.
Work to enable them will be done in follow-up patches.

Related: OS#6907
Change-Id: I532b9f839ab2c08e707fbd63a1e1058253f79b6c
Pau Espin Pedrol at
Osmocom_Types: Add API ro_integer_get_first_pos()

It is sometimes useful to find out the position of the 1st item (only
one if the list is expected to be a set of unique items), in order to
update extra state on an external list.t

Change-Id: Id70b2c7d6bf702489de03aed1c389ae892aee835
Pau Espin Pedrol at
stp: Handle N-PCSTATE.ind in STP_Tests_TCAP.ttcn

Make sure none of the peers we want to talk to is explicitly announced
as unavailable before starting the test.

Related: OS#6907
Change-Id: Ie1beb2cd69ce1847f3b3bd9917b42a2acaef57c8
Pau Espin Pedrol at
cosmetic: library/BSSAP_CodecPort.ttcn: Fix trailing whitespace

Change-Id: I3bbb035eda0690a862989a0ec4bda265b506db3a
Pau Espin Pedrol at
smlc: Drop unused port BSSAP_LE in test_CT

Change-Id: If9e45e890d595f6ee837b30b947456bcf39f67c1
Pau Espin Pedrol at

#76 (Jan 28, 2026, 1:14:01 PM)

deps/Makefile: Update titan.TestPorts.MTP3asp to upstream master

We used to point to an osmocom fork with a commit from 2018 fixing build without
MTP3asp_PT.cc/hh. That commit was merged upstream in 2020, so we can
point back to upstream.

Change-Id: Ieecb643db8bd3eb8739d960dfaaee183368b0c1d
Pau Espin Pedrol at
Use newer M3UA & MTP3 deps generating MTP-STATUS,PAUSE,RESUME.ind

* titan.TestPorts.MTP3asp pointer is changed to osmocom fork containing
  extra patch adding missing fields to MTP-STATUS,PAUSE,RESUME records.
  It also adds templates for them.
* titan.ProtocolEmulations.M3UA pointer is changed to osmocom fork
  containing extra patch improving M3UA_Emulation component to build
  MTP-STATUS,PAUSE,RESUME.ind primiives when receiving DAVA/DUNA/DUPU/SCON
  from M3UA link.

The upper layers building on top of MTP3asp_PT (ie. port MTP3asp_SCCP_PT
from SCCP_MApping.ttcnp) are fine because they explicitly discard
ASP_MTP3_PAUSE,RESUME,STATUS messages in the port defintion.
Hence, supporting those in SCCP layer is left as a subsequent task.

Related: OS#6907
Change-Id: I67cc2bcf3395a81fa8acee861af01e752984ebb3
Pau Espin Pedrol at

#75 (Jan 27, 2026, 1:14:01 PM)

sccp: Introduce test TC_local_unavailable_user_part_dupu

Related: OS#6907
Related: OS#6891
Change-Id: Ia0e71cc98c267692bc9230be8d15bbc861d5daad
Pau Espin Pedrol at

#74 (Jan 26, 2026, 1:14:00 PM)

bts: rename s/as_meas_res/as_rsl_meas_res/

Let's make it clear that this altstep is tracking measurements on
the A-bis/RSL link (MEASurement RESult PDUs).

Change-Id: Ie9dd0d06ac6fcaba5724c6a3eb7459d0971139f9
Related: OS#6933
Vadim Yanitskiy at

#73 (Jan 25, 2026, 1:14:00 PM)

bts: use existing API in as_l1_sacch_loop()

Change-Id: I5ab2988152b948e457c3cfa4930df484c170d053
Vadim Yanitskiy at

#71 (Jan 23, 2026, 1:14:00 PM)

bts: TC_rsl_chan_initial_ta: misc improvements

Change-Id: Ifc2c850104b3710679485042ab5b7a758d0ae000
Related: OS#6919
Vadim Yanitskiy at
bts: TC_rsl_chan_initial_ta: fix sporadic failures

It may happen that an UL SACCH block is received by the BTS before a DL
SACCH block is generated and delivered to the testcase.  In this case,
the Timing Advance control loop may update the initial TA value that
was set during RSL CHANnel ACTIVation.

By default, trxcon transmits UL SACCH blocks with TA=0, which is exactly
what triggers the TA control loop in this situation.

To avoid this, we explicitly signal the expected TA value to trxcon by
pre-populating the UL SACCH cache.  This is done by sending a DATA.req
containing a measurement report in advance, before establishing DCCH,
so that subsequent UL SACCH blocks carry the correct TA and do not
activate the control loop.

Additionally, take the opportunity to add missing f_L1CTL_PARAM().
This compensates for the artificial delay introduced by
f_trxc_fake_toffs256(), further reducing the risk of triggering
the TA control loop.

Change-Id: Iebb043ccc710750dff937e2281c23d343b85bda1
Related: OS#6919
Vadim Yanitskiy at
bts: limit stderr logging to NOTICE to avoid long write() to ext4 fs

stderr being redirected to a file in the ext4 filesystem sometimes ends
up in write() syscall taking >500ms, which means the entire osmo-bts
process stalls during that time and we miss clock updates up to a
threshold which makes osmo-bts process exit with an error.

Let's decrease logging verbosity to NOTICE for now with the aim to not
run into those stalls during normal operation, while we can re-eanble
this manually when debugging the write() issue.

Related: OS#6794
Change-Id: I74c4abf7571d2a0f9ee22402a949dbde02896d7d
Pau Espin Pedrol at

#68 (Jan 20, 2026, 1:14:35 PM)

s1gw: add MME pool related REST definitions

Change-Id: I76f1a5cf41331d021c08fbefdf78e34da4ac2121
Related: osmo-s1gw.git Iad249aed99face9e35fd19e0596cf2364ade4c77
Related: SYS#7052, SYS#7066
Vadim Yanitskiy at
bts: testenv: check ulimit -r in prepare=

Don't respawning over and over again if osmo-bts-trx fails to start up
because the user isn't allowed to set the rtpriority. Show instructions
for fixing it instead.

Change-Id: I7bc1414f95e4a54a40eb7c6f7b3d6c83ce3500c6
Oliver Smith at
testenv: less cluttered output for failed cmds

The testenv.cmd.run() already prints the command to run at the start,
prints the command output and blocks until the command is done.

If the command fails, do not print the command again, and do not print a
python stack trace. The reason for the failure is most likely in the
output shown by the program itself (e.g. a prepare= script that failed).
Make it easier for the user to spot this error by uncluttering the
output.

Change-Id: I508322b017e5ed9c21396384ef759a4c49c8d3da
Oliver Smith at