Skip to content

Loading builds...

Changes

#28513 (May 21, 2026, 10:37:57 AM)

Fix unhandled (un)mapping events

If a mapping event (create slotmap) and an unmapping event (delete
slotmap) exists at the same time, none of these events were handled.
These mappings stayed in 'NEW' state. Subsequent mappings of different
slots were then ignored.

This issue has been reproduced and is fixed with this patch.

Related: SYS#8032
Change-Id: I38da61cd8e9ccd5c79798bdd2196d39dfda8ebed
Andreas Eversberg at

#28512 (May 19, 2026, 3:56:49 PM)

ss7_as: fix indention

Related: SYS#5432
Change-Id: Id006f4fcbf9ae6b5b50be3d41fb216c7f9bb2dfb
lynxis at

#28511 (May 19, 2026, 3:56:46 PM)

TCAP loadshare: Rework initial selection of a node

The TCAP loadshare original used the OTID of a TCAP Begin to select
the node. To improve the load share across the nodes,
use a round robin as initial selection, but "stick" the session
on the particular node.

Related: SYS#5432
Change-Id: I151e6acb59e1f3c481487e76d2b01236fcee755f
lynxis at

#28510 (May 19, 2026, 3:56:43 PM)

TCAP loadshare: Add session miss counter

When a non-starting TCAP message (Continue, End, Abort) is received,
the no session could be associated with it, count these as session miss.

Those should not appear under normal operation, except after a restart of osmo-stp.

Related: SYS#5432
Change-Id: I23319294e899e6acb6421d89675ce456048f7475
lynxis at

#28509 (May 19, 2026, 3:55:45 PM)

TCAP loadshare: count all ENOKEY as a FAILED

The ASP should count all message which couldn't routed as failed.

Related: SYS#5432
Change-Id: I8bee6db5c75195855a3d378579e30886cd4d6fa8
lynxis at

#28508 (May 19, 2026, 12:53:30 PM)

tcap_as_loadshare: improve logging of lookup failures

Change-Id: I80878dfd080c705de28175260cb392186dafed6a
lynxis at

#28507 (May 19, 2026, 12:52:49 PM)

tcap_as_loadshare: improve log lines

Change-Id: Idffe9a02127c587aca4123f12f74b657d6911a80
lynxis at

#28506 (May 19, 2026, 12:37:40 PM)

tests: split tests into own functions

To improve the overview.

Related: SYS#5432
Change-Id: If9db94d17e288875fdaed52ec95b3785a78d5fa6
lynxis at

#28505 (May 19, 2026, 12:37:37 PM)

asn1: remove wireshark sepcific parts

The asn1 file was original copied from the wireshark
dissector.
Remove the wireshark specific parts.

Change-Id: Ie585c71fc14a20f609fa116b6858b9ca538054f5
lynxis at

#28504 (May 19, 2026, 12:37:34 PM)

tests: improve test infrastructure to support multiple test vectors

Related: SYS#5432
Change-Id: I4a69167647dd0a8eb650b4c7cc47fd97928ebf5d
lynxis at

#28503 (May 19, 2026, 12:37:32 PM)

tests: decoding: print the half decoded structure

When the decoding fails, the half decoded structure
also helps understanding the issue.

Realted: SYS#5432
Change-Id: I8f7ff9a8e457395aa12d1c7175f56cfdc5529590
lynxis at

#28502 (May 19, 2026, 12:37:28 PM)

tests: add decode tests for TCAP End tests

Related: SYS#5432
Change-Id: I5679c4a873176d73e973f5cfccff796fe6dbd941
lynxis at

#28501 (May 19, 2026, 10:13:49 AM)

asn1: remove wireshark sepcific parts

The asn1 file was original copied from the wireshark
dissector.
Remove the wireshark specific parts.

Change-Id: Ie585c71fc14a20f609fa116b6858b9ca538054f5
lynxis at

#28500 (May 19, 2026, 10:13:46 AM)

tests: split tests into own functions

To improve the overview.

Related: SYS#5432
Change-Id: If9db94d17e288875fdaed52ec95b3785a78d5fa6
lynxis at

#28499 (May 19, 2026, 10:13:44 AM)

tests: add decode tests for TCAP End tests

Related: SYS#5432
Change-Id: I5679c4a873176d73e973f5cfccff796fe6dbd941
lynxis at

#28498 (May 19, 2026, 10:13:42 AM)

tests: decoding: print the half decoded structure

When the decoding fails, the half decoded structure
also helps understanding the issue.

Realted: SYS#5432
Change-Id: I8f7ff9a8e457395aa12d1c7175f56cfdc5529590
lynxis at

#28497 (May 19, 2026, 10:13:35 AM)

tests: improve test infrastructure to support multiple test vectors

Related: SYS#5432
Change-Id: I4a69167647dd0a8eb650b4c7cc47fd97928ebf5d
lynxis at

#28496 (May 19, 2026, 10:09:20 AM)

tests: improve test infrastructure to support multiple test vectors

Related: SYS#5432
Change-Id: I4a69167647dd0a8eb650b4c7cc47fd97928ebf5d
lynxis at

#28495 (May 19, 2026, 10:09:17 AM)

asn1: remove wireshark sepcific parts

The asn1 file was original copied from the wireshark
dissector.
Remove the wireshark specific parts.

Change-Id: Ie585c71fc14a20f609fa116b6858b9ca538054f5
lynxis at

#28494 (May 19, 2026, 10:09:14 AM)

tests: add decode tests for TCAP End tests

Related: SYS#5432
Change-Id: I5679c4a873176d73e973f5cfccff796fe6dbd941
lynxis at

#28493 (May 19, 2026, 10:09:10 AM)

tests: split tests into own functions

To improve the overview.

Related: SYS#5432
Change-Id: If9db94d17e288875fdaed52ec95b3785a78d5fa6
lynxis at

#28492 (May 19, 2026, 10:09:07 AM)

tests: decoding: print the half decoded structure

When the decoding fails, the half decoded structure
also helps understanding the issue.

Realted: SYS#5432
Change-Id: I8f7ff9a8e457395aa12d1c7175f56cfdc5529590
lynxis at

#28491 (May 19, 2026, 10:08:46 AM)

asn1: Decode ErrorCode as Integer

The ErrorCode is an application 2 tag.

Related: SYS#5432
Change-Id: Ib8afe0dbe8d4436b80c71048f3b572fcda6cd33e
lynxis at

#28490 (May 15, 2026, 4:29:40 PM)

contrib: extend wireshark lua dissector

Still no reassembly, but enough to work with bug report pcaps

Change-Id: Ic78824d6122191c7d16152cea643a238c33f49b1
ewild at

#28489 (May 13, 2026, 4:28:36 PM)

pySim/ara_m: move code from do_aram_ to static methods

The method do_aram_store_ref_ar_do and do_aram_delete_all, which
are part of the nested AddlShellCommands class, may be moved into
the parent class as a static method, just like the already existing
get_config method.

This makes the functionality re-usable to callers that do not use
the CMD2 API.

Change-Id: Icd1b08ec707dd939bc9e8524d7f9431aa4daae7c
Related: SYS#6959
pmaier@sysmocom.de at

#28488 (May 13, 2026, 4:28:33 PM)

pySim/ara_m, cosmetic: swap --nfc-always and --nfc-never options

The commandline options --nfc-always and --nfc-never appear in the
opposite order when compared to --apdu-never and --apdu-always.

Let's swap the options to make the helpscreen and the code more
consistent.

Change-Id: I7289c3628b1b8dd3eec2f1c8f2132e3015422960
Related: SYS#6959
pmaier@sysmocom.de at

#28487 (May 13, 2026, 4:28:29 PM)

pySim/global_platform: make functionality available outside of cmd2

The nested class AddlShellCommands holds methods that encapsulate
the actual functionality from the related do_ method (e.g.
do_store_data calls self.store_data). This is already a good level
of separation but it does not allow us to call those methods from
programs that are not based on cmd2. Let's turn those methods into
functions so that non cmd2 applications have easy access to the
functionality of pySim.global_platform.

Let's also add a pySimLogger, so that we do not have to call
self._cmd.poutput

Related: SYS#6959
Change-Id: Idf4e4b58bf49ba62b2c22de4c49a2dcacfa872cb
pmaier@sysmocom.de at

#28486 (May 13, 2026, 4:04:10 PM)

tests: add decode tests for TCAP End tests

Change-Id: I5679c4a873176d73e973f5cfccff796fe6dbd941
lynxis at

#28485 (May 13, 2026, 4:04:08 PM)

tests: split tests into own functions

To improve overview.

Change-Id: If9db94d17e288875fdaed52ec95b3785a78d5fa6
lynxis at

#28484 (May 13, 2026, 4:04:05 PM)

Radical reduce the asn1 code to the essential parts

Previous it would try to parse the whole message including
the dialog and component.
But the tcap asn1 decode only needs to decode the otid, dtid
and the message type.

Currently the only user is osmo-stp, which doens't need
any other information.

Change-Id: Ib8afe0dbe8d4436b80c71048f3b572fcda6cd33e
lynxis at

#28483 (May 13, 2026, 4:04:00 PM)

tests: improve test infrastructure to support multiple test vectors

Change-Id: I4a69167647dd0a8eb650b4c7cc47fd97928ebf5d
lynxis at

#28482 (May 13, 2026, 3:55:11 PM)

tests: split tests into own functions

To improve overview.

Change-Id: If9db94d17e288875fdaed52ec95b3785a78d5fa6
lynxis at

#28481 (May 13, 2026, 3:55:06 PM)

tests: improve test infrastructure to support multiple test vectors

Change-Id: I4a69167647dd0a8eb650b4c7cc47fd97928ebf5d
lynxis at

#28480 (May 13, 2026, 3:55:03 PM)

tests: add decode tests for TCAP End tests

Change-Id: I5679c4a873176d73e973f5cfccff796fe6dbd941
lynxis at

#28479 (May 12, 2026, 10:37:09 AM)

RemsimServer Tests: give the remsim server some time to update the slotmap

The check of the slotmap can race if it is requests straight away,
because the slotmap might be still in the slotmap list as long the
bankd hasn't responded yet.

Change-Id: I6784e05380d844aa4bb9cde2bbe648ff37bee91b
lynxis at

#28478 (May 12, 2026, 9:01:48 AM)

pySim/global_platform: make functionality available outside of cmd2

The nested class AddlShellCommands holds methods that encapsulate
the actual functionality from the related do_ method (e.g.
do_store_data calls self.store_data). This is already a good level
of separation but it does not allow us to call those methods from
programs that are not based on cmd2. Let's turn those methods into
functions so that non cmd2 applications have easy access to the
functionality of pySim.global_platform.

Let's also add a pySimLogger, so that we do not have to call
self._cmd.poutput

Related: SYS#6959
Change-Id: Idf4e4b58bf49ba62b2c22de4c49a2dcacfa872cb
pmaier@sysmocom.de at

#28477 (May 10, 2026, 12:55:29 AM)

trx: add JSON stats export for WebSDR API

Introduce stats_json.c providing JSON serialization for:
- stats and counters
- rate counters
- BTS state
- TRX/transceiver state
- WebSDR runtime metrics

Add osmobts_get_stats() API to expose these via WebSDR
interface and export it in Emscripten build

This enables programmatic access to data previously available
via VTY (e.g. "show stats", "show bts")

Change-Id: Ifb82adfab879a65ecd222c45e06551983aa90a0f
dtv.comp at

#28476 (May 10, 2026, 12:55:23 AM)

trx, bts: add optional WebSDR backend (callback-based transport)

Introduce WebSDR backend enabled via ENABLE_WEBSDR,
adding an alternative callback-based transport alongside
existing socket-based TRX/OSMUX I/O

Implement:
- TRX control via osmotrxlib_process_command()
- TRXD data via apitrx_tx_call()/trx_data_read()
- clock handling via apibts_clock_ind() and external timers
- Osmux integration via ws_osmux_* helpers

Adapt scheduler to support API-based burst submission and
external timer callbacks in WebSDR mode

Disable signal handling, stats and socket I/O when building
with ENABLE_WEBSDR

Add WebSDR API entrypoint, Emscripten build target and
example configuration

Enables running BTS/TRX stack in WebAssembly environments

Change-Id: Idebd588f33afd85021813ad5821391781db683a9
dtv.comp at

#28475 (May 8, 2026, 3:56:32 PM)

card_key_provider: add a static method to parse --column-keys args

The contents of the --column-keys arguments are currently parsed
in init_card_key_provider. Let's add a static method in
CardKeyFieldCryptor to simplify re-usage of the CardKeyFieldCryptor

Related: SYS#6959
Change-Id: Ic955f271b1de1b1b855b21c82ed10343044e45fa
pmaier@sysmocom.de at

#28474 (May 8, 2026, 3:56:29 PM)

pySimLogger: fix default log format string

In format string we prepend when we log in verbose mode. We use %(module)s
as format string quaifier. This qualifier is replaced with the name of the
module from where the logger was called. This is mostly equal to the logger
name (__name__) we pass when we create the logger.

However, this is not the behavior we actually want. We want to log the
logger name that we passed when the logger was created. For this, we must
use %(name)s as qualifier.

Related: SYS#6959
Change-Id: I3951a70ad6ce864a7158b093cba46ae9fc1cb5bd
pmaier@sysmocom.de at

#28473 (May 8, 2026, 3:56:25 PM)

card_key_provider: pass CardKeyFieldCryptor to constructor

We currently create the CardKeyFieldCryptor object inside the constructor
of the concrete CardKeyProvider classes. There is currently no problem
with that, but when we create the CardKeyFieldCryptor object first and
then pass it as parameter to the constructor, we gain more flexibility
in case we want to support other CardKeyFieldCryptor variants in the
future.

Related: SYS#6959
Change-Id: If43552740aadacab9126f8a002749a9582eef8f4
pmaier@sysmocom.de at

#28472 (May 8, 2026, 3:56:21 PM)

pySim/scp: migrate to pySimLogger

The module scp.py predates the existence of the pySimLogger and still
uses an individually created logger. Let's migrate to pySimLogger to
avoid unexpected effects and to be uniform with the other modules.

Related: SYS#6959
Change-Id: I5db7180f93f116dd2d99c33da264f74ea16a1a37
pmaier@sysmocom.de at

#28471 (May 8, 2026, 3:56:18 PM)

pySim/filesystem: use pySimLogger instead of print

let's replace the stray print statements with proper logger calls.

Related: SYS#6959
Change-Id: I3a7188ad33706df66b2113e15cc7d06004c9bc39
pmaier@sysmocom.de at

#28470 (May 8, 2026, 3:56:15 PM)

pySim/app: use pySimLogger instead of print

let's replace the stray print statements with proper logger calls.

Related: SYS#6959
Change-Id: I95b4536cc8853e7ba6a5dd573b903dfb85e56b9a
pmaier@sysmocom.de at

#28469 (May 8, 2026, 3:56:11 PM)

card_key_provider: move boiler-plate code into helper functions

in pySim-shell.py we add the commandline options for the card key
provider and do the setup accordingly. Let's put this boilerplate
code into helper functions instead, so that we can re-use it in
other pySim programs as well. Let's use pySim.transport as a
pattern.

Related: SYS#6959
Change-Id: I6d095cbb644e608f4a751a1d0749b1484cdc781d
pmaier@sysmocom.de at

#28468 (May 8, 2026, 8:26:13 AM)

nokia: rename vty settings, drop _site

All Nokia-specific vty settings previously had names beginning
with nokia_site, creating needless confusion for operators of
Nokia BTS models that are newer than *Site family.  Rename these
vty settings to begin with just nokia, with nokia_site supported
as a backward compatibility alias.

Change-Id: I807c0ad14f4436a21f0be0a5ed291539cd4af7e8
falcon at

#28467 (May 8, 2026, 8:25:43 AM)

nokia: rename vty settings, drop _site

All Nokia-specific vty settings previously had names beginning
with nokia_site, creating needless confusion for operators of
Nokia BTS models that are newer than *Site family.  Rename these
vty settings to begin with just nokia, with nokia_site supported
as a backward compatibility alias.

Change-Id: I807c0ad14f4436a21f0be0a5ed291539cd4af7e8
falcon at

#28466 (May 7, 2026, 3:48:39 PM)

card_key_provider: add a static method to parse --column-keys args

The contents of the --column-keys arguments are currently parsed
in init_card_key_provider. Let's add a static method in
CardKeyFieldCryptor to simplify re-usage of the CardKeyFieldCryptor

Related: SYS#6959
Change-Id: Ic955f271b1de1b1b855b21c82ed10343044e45fa
pmaier@sysmocom.de at

#28465 (May 7, 2026, 3:48:36 PM)

card_key_provider: pass CardKeyFieldCryptor to constructor

We currently create the CardKeyFieldCryptor object inside the constructor
of the concrete CardKeyProvider classes. There is currently no problem
with that, but when we create the CardKeyFieldCryptor object first and
then pass it as parameter to the constructor, we gain more flexibility
in case we want to support other CardKeyFieldCryptor variants in the
future.

Related: SYS#6959
Change-Id: If43552740aadacab9126f8a002749a9582eef8f4
pmaier@sysmocom.de at

#28464 (May 7, 2026, 3:48:34 PM)

pySim/filesystem: use pySimLogger instead of print

let's replace the stray print statements with proper logger calls.

Related: SYS#6959
Change-Id: I3a7188ad33706df66b2113e15cc7d06004c9bc39
pmaier@sysmocom.de at

#28463 (May 7, 2026, 3:48:30 PM)

cosmetic: remove excess linebreaks

We should not use double-line breaks to separate things as it is very
difficult to maintain consistence with that scheme.

Change-Id: I2272abcdbba0e57c5118b69bc9398cd909a469b5
pmaier@sysmocom.de at

#28462 (May 7, 2026, 3:48:27 PM)

pySim/app: use pySimLogger instead of print

let's replace the stray print statements with proper logger calls.

Related: SYS#6959
Change-Id: I95b4536cc8853e7ba6a5dd573b903dfb85e56b9a
pmaier@sysmocom.de at

#28461 (May 7, 2026, 3:48:24 PM)

card_key_provider: move boiler-plate code into helper functions

in pySim-shell.py we add the commandline options for the card key
provider and do the setup accordingly. Let's put this boilerplate
code into helper functions instead, so that we can re-use it in
other pySim programs as well. Let's use pySim.transport as a
pattern.

Related: SYS#6959
Change-Id: I6d095cbb644e608f4a751a1d0749b1484cdc781d
pmaier@sysmocom.de at

#28460 (May 7, 2026, 3:48:21 PM)

pySim/scp: migrate to pySimLogger

The module scp.py predates the existence of the pySimLogger and still
uses an individually created logger. Let's migrate to pySimLogger to
avoid unexpected effects and to be uniform with the other modules.

Related: SYS#6959
Change-Id: I5db7180f93f116dd2d99c33da264f74ea16a1a37
pmaier@sysmocom.de at

#28459 (May 7, 2026, 3:48:17 PM)

pySimLogger: fix default log format string

In format string we prepend when we log in verbose mode. We use %(module)s
as format string quaifier. This qualifier is replaced with the name of the
module from where the logger was called. This is mostly equal to the logger
name (__name__) we pass when we create the logger.

However, this is not the behavior we actually want. We want to log the
logger name that we passed when the logger was created. For this, we must
use %(name)s as qualifier.

Related: SYS#6959
Change-Id: I3951a70ad6ce864a7158b093cba46ae9fc1cb5bd
pmaier@sysmocom.de at

#28458 (May 7, 2026, 3:48:14 PM)

pySim/global_platform: make functionality available outside of cmd2

The nested class AddlShellCommands holds methods that encapsulate
the actual functionality from the related do_ method (e.g.
do_store_data calls self.store_data). This is already a good level
of separation but it does not allow us to call those methods from
programs that are not based on cmd2. Let's turn those methods into
functions so that non cmd2 applications have easy access to the
functionality of pySim.global_platform.

Let's also add a pySimLogger, so that we do not have to call
self._cmd.poutput

Related: SYS#6959
Change-Id: Idf4e4b58bf49ba62b2c22de4c49a2dcacfa872cb
pmaier@sysmocom.de at

#28457 (May 6, 2026, 4:18:49 PM)

vty: update help string for nokia_site model

Original Nokia BTS support in OsmoBSC was limited to MetroSite,
UltraSite and InSite, aka the Site family.  After the recent series
of fixes, the same code also supports Flexi Multiradio (actively
used in the present) and will most likely also work on Flexi EDGE
(intermediate between UltraSite and Flexi MR), although that model
is currently untested.

BTS model name "nokia_site" is thus outdated and inaccurate now.
It has been decided (see https://gerrit.osmocom.org/c/osmo-bsc/+/42729)
to keep this model name unchanged for now, given the uncertainty
of how Nokia BTS support will evolve in the future if and when
we implement support for IP Abis on Flexi family, potentially
followed by future support for subsequent IP-only models.

In the meantime, change vty help string to reflect current support
for both Site and Flexi families with the same model selection.

Change-Id: I8a2d91aacc984e6a818f9782e728674306f4ebe4
falcon at

#28456 (May 6, 2026, 4:18:44 PM)

nokia: rename vty settings, drop _site

All Nokia-specific vty settings previously had names beginning
with nokia_site, creating needless confusion for operators of
Nokia BTS models that are newer than *Site family.  Rename these
vty settings to begin with just nokia, with nokia_site supported
as a backward compatibility alias.

Change-Id: I807c0ad14f4436a21f0be0a5ed291539cd4af7e8
falcon at

#28455 (May 6, 2026, 8:07:04 AM)

nokia: rename BTS model from nokia_site to nokia-e1

When Nokia BTS support was introduced into Osmocom in 2011, only
{Metro,Ultra,In}Site family was supported, and the name of this
BTS model in OsmoBSC was set to nokia_site.  However, we now
also support Flexi Multiradio in E1 Abis configuration with the
same code, automatically applying Site-specific or Flexi-MR-
specific handling based on the type code returned by the BTS
itself - hence calling the BTS model nokia_site and referring
strictly to *Site in docs and vty help is now misleading.

At the same time, these newer BTS models support both E1 and IP
Abis options, and there is a desire to support IP Abis operation
at some point in the future.  When/if Nokia IP support becomes a
reality, we will certainly need to know upfront which type of Abis
we are working with, similarly to how we currently distinguish
upfront between E1 and IPA types of BTS.  Therefore, the new BTS
model name is set to nokia-e1, rather than just "nokia", with the
expectation that we will also have nokia-ip in the future.

bts_nokia_site.c source file name is deliberately left unchanged.
Source file renames make it difficult to follow changes, hence a
slightly outdated source file name is deemed to be a lesser evil.
This source file may also be split in the future as Nokia BTS
support code grows.

Change-Id: I3e993bda577964922e29dbbaf9554fa53bb2d445
falcon at

#28454 (May 6, 2026, 6:20:29 AM)

lint/checkpatch: ignore STATIC_CONST_CHAR_ARRAY

include/osmocom/vty/command.h has the following:

  #define DEFUN_CMD_FUNC_DECL(funcname) \
    static int funcname (struct cmd_element *, struct vty *, int, const char *[]); \

  #define DEFUN_CMD_FUNC_TEXT(funcname) \
    static int funcname \
      (struct cmd_element *self, struct vty *vty, int argc, const char *argv[])

So the pointer to argv is const, but the elements in the array are not.
Functions can in theory modify the elements of argv (just like argv in
main()). I don't know if we have users of this API that are actually
doing that, but as long as the API is defined like this it doesn't make
sense for the linter to complain about using it correctly. Therefore,
ignore STATIC_CONST_CHAR_ARRAY.

Related: https://gerrit.osmocom.org/c/osmo-bsc/+/42729/comment/f3bc5254_5f30d1bb/
Change-Id: Iae0d3ff4ca648d6a3b6ca0f7805ec18e50befa80
Oliver Smith at

#28453 (May 6, 2026, 3:05:57 AM)

nokia: rename BTS model from nokia_site to nokia-e1

When Nokia BTS support was introduced into Osmocom in 2011, only
{Metro,Ultra,In}Site family was supported, and the name of this
BTS model in OsmoBSC was set to nokia_site.  However, we now
also support Flexi Multiradio in E1 Abis configuration with the
same code, automatically applying Site-specific or Flexi-MR-
specific handling based on the type code returned by the BTS
itself - hence calling the BTS model nokia_site and referring
strictly to *Site in docs and vty help is now misleading.

At the same time, these newer BTS models support both E1 and IP
Abis options, and there is a desire to support IP Abis operation
at some point in the future.  When/if Nokia IP support becomes a
reality, we will certainly need to know upfront which type of Abis
we are working with, similarly to how we currently distinguish
upfront between E1 and IPA types of BTS.  Therefore, the new BTS
model name is set to nokia-e1, rather than just "nokia", with the
expectation that we will also have nokia-ip in the future.

bts_nokia_site.c source file name is deliberately left unchanged.
Source file renames make it difficult to follow changes, hence a
slightly outdated source file name is deemed to be a lesser evil.
This source file may also be split in the future as Nokia BTS
support code grows.

Change-Id: I3e993bda577964922e29dbbaf9554fa53bb2d445
falcon at

#28452 (May 6, 2026, 3:05:51 AM)

nokia: rename vty settings, drop _site

All Nokia-specific vty settings previously had names beginning
with nokia_site, creating needless confusion for operators of
Nokia BTS models that are newer than *Site family.  Rename these
vty settings to begin with just nokia, with nokia_site supported
as a backward compatibility alias.

Change-Id: I807c0ad14f4436a21f0be0a5ed291539cd4af7e8
falcon at

#28451 (May 6, 2026, 2:53:11 AM)

nokia: rename BTS model from nokia_site to nokia-e1

When Nokia BTS support was introduced into Osmocom in 2011, only
{Metro,Ultra,In}Site family was supported, and the name of this
BTS model in OsmoBSC was set to nokia_site.  However, we now
also support Flexi Multiradio in E1 Abis configuration with the
same code, automatically applying Site-specific or Flexi-MR-
specific handling based on the type code returned by the BTS
itself - hence calling the BTS model nokia_site and referring
strictly to *Site in docs and vty help is now misleading.

At the same time, these newer BTS models support both E1 and IP
Abis options, and there is a desire to support IP Abis operation
at some point in the future.  When/if Nokia IP support becomes a
reality, we will certainly need to know upfront which type of Abis
we are working with, similarly to how we currently distinguish
upfront between E1 and IPA types of BTS.  Therefore, the new BTS
model name is set to nokia-e1, rather than just "nokia", with the
expectation that we will also have nokia-ip in the future.

bts_nokia_site.c source file name is deliberately left unchanged.
Source file renames make it difficult to follow changes, hence a
slightly outdated source file name is deemed to be a lesser evil.
This source file may also be split in the future as Nokia BTS
support code grows.

Change-Id: I3e993bda577964922e29dbbaf9554fa53bb2d445
falcon at

#28450 (May 6, 2026, 2:53:07 AM)

nokia: rename vty settings, drop _site

All Nokia-specific vty settings previously had names beginning
with nokia_site, creating needless confusion for operators of
Nokia BTS models that are newer than *Site family.  Rename these
vty settings to begin with just nokia, with nokia_site supported
as a backward compatibility alias.

Change-Id: I807c0ad14f4436a21f0be0a5ed291539cd4af7e8
falcon at

#28449 (May 6, 2026, 2:53:00 AM)

gsm_set_bts_type(): fix switch statement

The switch statement on (bts->type) in this function exhibited
two defects:

1) From the beginning, each unhandled BTS type was listed explicitly,
   instead of providing a default case;

2) When Nokia-specific initialization was added in 2015,
   the addition was erroneously applied to GSM_BTS_TYPE_BS11
   and GSM_BTS_TYPE_UNKNOWN cases, besides the intended case
   of GSM_BTS_TYPE_NOKIA_SITE.

Fixes: 56e1766dba1a03e304e51d079e65406542e7887c
Change-Id: Ibf500c373b69a69182885d5e700abc6fb1b03ccd
falcon at

#28448 (May 5, 2026, 9:14:45 PM)

transceiver: add optional Laurent burst LUT modulation (int16)

Introduce an optional Burst LUT optimization for Laurent-based burst
modulation, enabled via --with-burst-lut.

- Add precomputed Laurent LUT tables (float and int16 I/Q variants)
- Generate LUT at initialization (prepareBurstLUT)
- Use LUT-based modulation for sps=4 when enabled
- Add configure.ac option and USE_BURST_LUT define

This reduces runtime computation by replacing per-burst Laurent
processing with memcpy-based LUT lookups.

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#28447 (May 5, 2026, 6:44:08 AM)

nokia cosmetic: add bts_is_insite() function

Nokia InSite gets a different config than the larger Nokia BTS models,
and make_bts_config() function checks the BTS type to decide which
config to send.  Change the BTS type check from a long 'if' line that
compares against 3 different InSite BTS type codes to bts_is_insite()
helper function that encapsulates a switch statement.

Upcoming code additions will need to check for Flexi Multiradio BTS
family in a similar manner - so be consistent.

Change-Id: I44bbcd79d9741f1df280b6b2391f04f754598035
falcon at

#28446 (May 5, 2026, 6:44:04 AM)

nokia cosmetic: factor out BTS_CONF_COMPL handling

When the BTS accepts the config sent to it via BTS_CONF_DATA, it
responds with BTS_CONF_COMPL.  Upon receiving the latter message,
we have to send TRX unlock and TRX reset commands, and we have to
start LAPD for RSL.  Factor out this logic into a helper function,
to reduce the level of indentation and make it easier to extend.

Change-Id: I26e9b25ba4e68e945f7dd8a632009cc3683a322c
falcon at

#28445 (May 5, 2026, 6:43:51 AM)

Nokia Flexi Multiradio: reset non-BCCH TRX

In the case of MetroSite and UltraSite BTS, it has been determined
empirically that TRX reset needs to be skipped for non-BCCH TRX.
However, the opposite situation holds on Flexi MR: non-BCCH TRX
do need to be reset, or they fail to come up.  Solution:
conditionalize reset of non-BCCH TRX on Nokia BTS type.

Change-Id: I270c1ffab074c1e5a43ab9dfa103725a1518f718
falcon at

#28444 (May 4, 2026, 12:49:05 PM)

Fix: Reject TPDUs fromm host with less than 5 bytes

Each TPDU includes a header with at least 5 bytes. tpdu_s_init_action()
expects at least 5 bytes, so we need to reject Transfer Block commands
with less than 5 bytes payload.

Change-Id: Iba01c29fb0aa3ab2ce7270bf12cb29c8ba59b389
Andreas Eversberg at

#28443 (May 4, 2026, 12:47:14 PM)

trx: add JSON stats export for WebSDR API

Introduce stats_json.c providing JSON serialization for:
- stats and counters
- rate counters
- BTS state
- TRX/transceiver state
- WebSDR runtime metrics

Add osmobts_get_stats() API to expose these via WebSDR
interface and export it in Emscripten build

This enables programmatic access to data previously available
via VTY (e.g. "show stats", "show bts")

Change-Id: Ifb82adfab879a65ecd222c45e06551983aa90a0f
dtv.comp at

#28442 (May 4, 2026, 12:46:59 PM)

trx, bts: add optional WebSDR backend (callback-based transport)

Introduce WebSDR backend enabled via ENABLE_WEBSDR,
adding an alternative callback-based transport alongside
existing socket-based TRX/OSMUX I/O

Implement:
- TRX control via osmotrxlib_process_command()
- TRXD data via apitrx_tx_call()/trx_data_read()
- clock handling via apibts_clock_ind() and external timers
- Osmux integration via ws_osmux_* helpers

Adapt scheduler to support API-based burst submission and
external timer callbacks in WebSDR mode

Disable signal handling, stats and socket I/O when building
with ENABLE_WEBSDR

Add WebSDR API entrypoint, Emscripten build target and
example configuration

Enables running BTS/TRX stack in WebAssembly environments

Change-Id: Idebd588f33afd85021813ad5821391781db683a9
dtv.comp at

#28441 (May 4, 2026, 12:37:21 PM)

trx: add JSON stats export for WebSDR API

Introduce stats_json.c providing JSON serialization for:
- stats and counters
- rate counters
- BTS state
- TRX/transceiver state
- WebSDR runtime metrics

Add osmobts_get_stats() API to expose these via WebSDR
interface and export it in Emscripten build

This enables programmatic access to data previously available
via VTY (e.g. "show stats", "show bts")

Change-Id: Ifb82adfab879a65ecd222c45e06551983aa90a0f
dtv.comp at

#28440 (May 4, 2026, 12:34:13 PM)

trx, bts: add optional WebSDR backend (callback-based transport)

Introduce WebSDR backend enabled via ENABLE_WEBSDR,
adding an alternative callback-based transport alongside
existing socket-based TRX/OSMUX I/O

Implement:
- TRX control via osmotrxlib_process_command()
- TRXD data via apitrx_tx_call()/trx_data_read()
- clock handling via apibts_clock_ind() and external timers
- Osmux integration via ws_osmux_* helpers

Adapt scheduler to support API-based burst submission and
external timer callbacks in WebSDR mode

Disable signal handling, stats and socket I/O when building
with ENABLE_WEBSDR

Add WebSDR API entrypoint, Emscripten build target and
example configuration

Enables running BTS/TRX stack in WebAssembly environments

Change-Id: Idebd588f33afd85021813ad5821391781db683a9
dtv.comp at

#28439 (May 4, 2026, 7:57:32 AM)

ansible/coverity: upgrade to 2024.12.1

Related: OS#7005
Change-Id: If4f117adcaec67a79f5ee715e063621c7c897e57
Oliver Smith at

#28438 (May 4, 2026, 7:57:29 AM)

ansible/README: mention how to update coverity

Change-Id: Icab33640e0b8c62c5808d918efb6877bc1fdf1f6
Oliver Smith at

#28437 (May 1, 2026, 5:18:45 PM)

build: detect pthread_setname_np and sched_* APIs, guard usage

Add configure checks for pthread_setname_np and sched_* functions.
Wrap their usage with HAVE_* guards to avoid build failures on
platforms where they are unavailable.

Return -ENOTSUP for unsupported scheduler operations.

Improves portability across non-Linux and restricted environments
(e.g. WebAssembly).

Change-Id: Ic3f1492544439d88c5e6683330c6696de1c2f85b
dtv.comp at

#28436 (May 1, 2026, 5:18:36 PM)

transceiver: add optional WebSDR device support

- Add support for WebSDR devices enabled via the --with-websdr
configure flag.
- add libosmo-trx-websdr library and pkg-config file
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#28435 (May 1, 2026, 5:18:31 PM)

device: add WebSDR radio backend

Introduce a new optional WebSDR device backend, enabled via
--with-websdr.

Add WebSDRDevice implementation and build integration, providing
a RadioDevice interface backed by callback hooks for control and
sample I/O.

Intended for Web-based deployments where osmo-trx interacts with
SDR hardware via a WebSDR/WebUSB frontend.

Change-Id: Ie459cbd70388dd8ff5b89221d30770bab0bd9014
dtv.comp at

#28434 (May 1, 2026, 5:18:27 PM)

convolve: avoid function pointer casts by adding wrapper functions

Introduce _base_convolve_*_void() wrappers matching the expected
function pointer signatures and use them instead of casting
_base_convolve_* functions to (void *).

This removes unsafe function pointer casts and improves
type safety, which is required for stricter toolchains and
non-native targets (e.g. WebAssembly)

Change-Id: Idecb118be285eb3e4691d1761d0d8fa24fd80c75
dtv.comp at

#28433 (May 1, 2026, 5:18:23 PM)

trx: add JSON serialization for 'show trx'

Introduce trx_to_json() helper to serialize the output of
'show trx' into JSON format.

Also initialize talloc/VTY context in websdr entrypoint to
allow accessing TRX configuration programmatically.

Intended for external consumers (e.g. WebSDR frontend).

Change-Id: Icbfb754580daa6db9b5646cc6698a6a6ee1c1610
dtv.comp at

#28432 (May 1, 2026, 5:18:17 PM)

device: add WebSDR radio backend

Introduce a new optional WebSDR device backend, enabled via
--with-websdr.

Add WebSDRDevice implementation and build integration, providing
a RadioDevice interface backed by callback hooks for control and
sample I/O.

Intended for Web-based deployments where osmo-trx interacts with
SDR hardware via a WebSDR/WebUSB frontend.

Change-Id: Ie459cbd70388dd8ff5b89221d30770bab0bd9014
dtv.comp at

#28431 (May 1, 2026, 5:17:47 PM)

trx: add JSON serialization for 'show trx'

Introduce trx_to_json() helper to serialize the output of
'show trx' into JSON format.

Also initialize talloc/VTY context in websdr entrypoint to
allow accessing TRX configuration programmatically.

Intended for external consumers (e.g. WebSDR frontend).

Change-Id: Icbfb754580daa6db9b5646cc6698a6a6ee1c1610
dtv.comp at

#28430 (May 1, 2026, 5:14:06 PM)

transceiver: add optional WebSDR device support

- Add support for WebSDR devices enabled via the --with-websdr
configure flag.
- add libosmo-trx-websdr library and pkg-config file
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#28429 (May 1, 2026, 5:07:54 PM)

build: detect pthread_setname_np and sched_* APIs, guard usage

Add configure checks for pthread_setname_np and sched_* functions.
Wrap their usage with HAVE_* guards to avoid build failures on
platforms where they are unavailable.

Return -ENOTSUP for unsupported scheduler operations.

Improves portability across non-Linux and restricted environments
(e.g. WebAssembly).

Change-Id: Ic3f1492544439d88c5e6683330c6696de1c2f85b
dtv.comp at

#28428 (May 1, 2026, 5:01:55 PM)

convolve: avoid function pointer casts by adding wrapper functions

Introduce _base_convolve_*_void() wrappers matching the expected
function pointer signatures and use them instead of casting
_base_convolve_* functions to (void *).

This removes unsafe function pointer casts and improves
type safety, which is required for stricter toolchains and
non-native targets (e.g. WebAssembly)

Change-Id: Idecb118be285eb3e4691d1761d0d8fa24fd80c75
dtv.comp at

#28427 (May 1, 2026, 4:38:07 PM)

trx: split TRXD parsing from socket callback

Extract TRXD message parsing into trx_data_read() and
reuse it from trx_data_read_cb()

This decouples parsing from socket I/O and allows reuse
with alternative transports

No functional changes intended

Change-Id: I50ad8b6d2edfd91f2d569cd8badf5c036fbf87ed
dtv.comp at

#28426 (May 1, 2026, 4:38:03 PM)

trx: factor out clock indication handling into helper

Extract clock indication handling logic into trx_clk_phy()
and reuse it from trx_clk_read_cb()

This separates core FN processing from socket-specific code
and prepares for alternative clock sources (e.g. non-UDP /
in-memory callbacks used in WebSDR/WASM builds).

No functional changes intended

Change-Id: I0e6b3e25da14ada4d0ef86fd4c4e6bbc12e447d2
dtv.comp at

#28425 (May 1, 2026, 4:37:59 PM)

smux: allow lchan lookup without remote address

Make rem_addr optional in osmux_lchan_find() by skipping
address comparison when it is NULL

This allows callers without socket-based addressing to
locate lchans by CID only (e.g. callback-based transports)

Change-Id: I7a275dad2353241c7b04cdb5d6cc1436a175c1f3
dtv.comp at

#28424 (May 1, 2026, 4:37:56 PM)

trx: factor out FN timer processing into common helper

Extract core FN timer handling logic into trx_fn_timer_process()
to decouple it from timerfd-specific code.

This allows reusing the same scheduling logic for alternative
timer backends (e.g. WebSDR) while keeping timerfd integration
as a thin wrapper.

No functional changes intended.

Change-Id: Ia28cce57afb3dc97c8655e855ebd5ace7e096648
dtv.comp at

#28423 (May 1, 2026, 4:37:53 PM)

build: make sched_* usage optional

Add configure checks for sched_* APIs and guard usage of
sched_setscheduler with HAVE_SCHED_SETSCHEDULER.

This avoids build/runtime issues on platforms without
scheduler support.

Change-Id: I5af357c1e2074fa1e05ac6bc20af8535c474d906
dtv.comp at

#28422 (May 1, 2026, 4:37:50 PM)

trx: factor out burst submission into helper

Extract TRXD burst submission logic from bts_sched_flush_buffers()
into trx_sched_submit_bursts()

No functional changes intended, this prepares for alternative
backends reusing the same scheduling logic

Change-Id: I7ce61bee4ca7ca50ef190982f1a0e4ce57c8c838
dtv.comp at

#28421 (May 1, 2026, 4:37:47 PM)

abis: add helper to update BTS identity

Introduce abis_update_bts_info() to update site_id and bts_id in
bts_dev_info at runtime

This allows adjusting BTS identity after initialization,
e.g. from external control interfaces

Change-Id: Ibafd66a1e1dc42ad0063c412087bee10d212fe33
dtv.comp at

#28420 (May 1, 2026, 4:37:44 PM)

trx: factor out TRXD data submission helper

Extract TRXD data sending into trx_data_submit_msg() and
reuse it from trx_if_send_burst()

This separates transport-specific I/O from message construction
and prepares for alternative backends

No functional changes intended

Change-Id: Ie89ac6efe2f5af0b4cbe5a259a18770b8d2de859
dtv.comp at

#28419 (May 1, 2026, 4:37:39 PM)

trx: add JSON stats export for WebSDR API

Introduce stats_json.c providing JSON serialization for:
- stats and counters
- rate counters
- BTS state
- TRX/transceiver state
- WebSDR runtime metrics

Add osmobts_get_stats() API to expose these via WebSDR
interface and export it in Emscripten build

This enables programmatic access to data previously available
via VTY (e.g. "show stats", "show bts")

Change-Id: Ifb82adfab879a65ecd222c45e06551983aa90a0f
dtv.comp at

#28418 (May 1, 2026, 4:37:35 PM)

trx: handle synchronous TRX control callbacks in provision FSM

Set *_sent flags before issuing TRX control commands to ensure
correct state when responses are delivered synchronously
(e.g. WebUSB callback path)

Also guard FSM state handling in st_open_poweroff() to avoid
duplicate transitions if state was already changed by a
synchronous response

No functional change for asynchronous (socket-based) backends

Change-Id: I50c95e3796839e9fe721bff6f96fed4c490c6018
dtv.comp at

#28417 (May 1, 2026, 4:37:27 PM)

trx, bts: add optional WebSDR backend (callback-based transport)

Introduce WebSDR backend enabled via ENABLE_WEBSDR,
adding an alternative callback-based transport alongside
existing socket-based TRX/OSMUX I/O

Implement:
- TRX control via osmotrxlib_process_command()
- TRXD data via apitrx_tx_call()/trx_data_read()
- clock handling via apibts_clock_ind() and external timers
- Osmux integration via ws_osmux_* helpers

Adapt scheduler to support API-based burst submission and
external timer callbacks in WebSDR mode

Disable signal handling, stats and socket I/O when building
with ENABLE_WEBSDR

Add WebSDR API entrypoint, Emscripten build target and
example configuration

Enables running BTS/TRX stack in WebAssembly environments

Change-Id: Idebd588f33afd85021813ad5821391781db683a9
dtv.comp at

#28416 (May 1, 2026, 4:37:21 PM)

trx: factor out TRX ctrl message submission

Extract TRX control message sending logic into
trx_ctrl_submit_msg() and reuse it from trx_ctrl_send()

This separates message construction from transport-specific
submission and prepares for alternative backends

No functional changes intended

Change-Id: Ibbd50117db4531efbc374e43e3802f9f995362cd
dtv.comp at

#28415 (May 1, 2026, 4:37:14 PM)

build: add WebSDR configure option and Emscripten detection

Detect Emscripten toolchain and introduce --with-websdr
configure option

When enabled, check for libosmo-trx-websdr and required
symbol modulateBits, failing configure if missing

Change-Id: Iff4b76e339e2873686c8c15885dd498458ceb546
dtv.comp at

#28414 (May 1, 2026, 4:37:10 PM)

trx: split TRX ctrl response parsing from socket callback

Extract TRX control response parsing logic into
trx_ctrl_parse_rsp() and call it from trx_ctrl_read_cb()

This decouples parsing from socket I/O and allows reuse
with alternative transports

No functional changes intended

Change-Id: I255c7d554aad3ac6df2c66716fae1c1fb512110e
dtv.comp at

#28413 (May 1, 2026, 4:35:40 PM)

bts: guard AMR RTP decoder stub with HAVE_LIBOSMOCODEC_STATIC

Disable dummy osmo_amr_rtp_dec() implementation when
linking against static libosmocodec to avoid symbol
conflicts

Apply to omldummy and virtual BTS models

Change-Id: Ie19ae2013893575a2f74a87af2151034abf57870
dtv.comp at

#28412 (Apr 30, 2026, 3:52:49 PM)

tcap_as_loadshare: Clarify name of tcap asp selection function

Change-Id: I327ad282d2689be2bcf7d3da23026717923c9325
dwillmann at

#28411 (Apr 30, 2026, 3:52:36 PM)

tcap_as_loadshare: Route msg based on TCAP route if cache lookup fails

Related: SYS#5423
Change-Id: I2fd9068be8a0a512b17c8bd2365aa87c266e5669
dwillmann at

#28410 (Apr 30, 2026, 2:19:02 PM)

stp: Make TCAP tests more realistic

* Use a TCAP id outside of the TCAP routing range for the M3UA TCAP id.
* Test both directions IPA -> M3UA and M3UA -> IPA.
* Test TCAP routing with a different called address answering

Change-Id: Ia807c2b26e5188b700365650311cabc0f9095674
Related: SYS#5423
dwillmann at

#28409 (Apr 30, 2026, 2:18:53 PM)

cosmetic: Rename TCAP Being->Begin

Change-Id: I19de8da6ee72a04365896c7fb7730be4f3ea01d4
dwillmann at

#28408 (Apr 29, 2026, 9:32:09 PM)

smux: allow lchan lookup without remote address

Make rem_addr optional in osmux_lchan_find() by skipping
address comparison when it is NULL

This allows callers without socket-based addressing to
locate lchans by CID only (e.g. callback-based transports)

Change-Id: I7a275dad2353241c7b04cdb5d6cc1436a175c1f3
dtv.comp at

#28407 (Apr 29, 2026, 9:31:54 PM)

build: make sched_* usage optional

Add configure checks for sched_* APIs and guard usage of
sched_setscheduler with HAVE_SCHED_SETSCHEDULER.

This avoids build/runtime issues on platforms without
scheduler support.

Change-Id: I5af357c1e2074fa1e05ac6bc20af8535c474d906
dtv.comp at

#28406 (Apr 29, 2026, 9:31:45 PM)

trx: handle synchronous TRX control callbacks in provision FSM

Set *_sent flags before issuing TRX control commands to ensure
correct state when responses are delivered synchronously
(e.g. WebUSB callback path)

Also guard FSM state handling in st_open_poweroff() to avoid
duplicate transitions if state was already changed by a
synchronous response

No functional change for asynchronous (socket-based) backends

Change-Id: I50c95e3796839e9fe721bff6f96fed4c490c6018
dtv.comp at

#28405 (Apr 29, 2026, 9:31:37 PM)

abis: add helper to update BTS identity

Introduce abis_update_bts_info() to update site_id and bts_id in
bts_dev_info at runtime

This allows adjusting BTS identity after initialization,
e.g. from external control interfaces

Change-Id: Ibafd66a1e1dc42ad0063c412087bee10d212fe33
dtv.comp at

#28404 (Apr 29, 2026, 9:31:27 PM)

trx: add JSON stats export for WebSDR API

Introduce stats_json.c providing JSON serialization for:
- stats and counters
- rate counters
- BTS state
- TRX/transceiver state
- WebSDR runtime metrics

Add osmobts_get_stats() API to expose these via WebSDR
interface and export it in Emscripten build

This enables programmatic access to data previously available
via VTY (e.g. "show stats", "show bts")

Change-Id: Ifb82adfab879a65ecd222c45e06551983aa90a0f
dtv.comp at

#28403 (Apr 29, 2026, 9:31:19 PM)

trx: factor out clock indication handling into helper

Extract clock indication handling logic into trx_clk_phy()
and reuse it from trx_clk_read_cb()

This separates core FN processing from socket-specific code
and prepares for alternative clock sources (e.g. non-UDP /
in-memory callbacks used in WebSDR/WASM builds).

No functional changes intended

Change-Id: I0e6b3e25da14ada4d0ef86fd4c4e6bbc12e447d2
dtv.comp at

#28402 (Apr 29, 2026, 9:31:05 PM)

trx, bts: add optional WebSDR backend (callback-based transport)

Introduce WebSDR backend enabled via ENABLE_WEBSDR,
adding an alternative callback-based transport alongside
existing socket-based TRX/OSMUX I/O

Implement:
- TRX control via osmotrxlib_process_command()
- TRXD data via apitrx_tx_call()/trx_data_read()
- clock handling via apibts_clock_ind() and external timers
- Osmux integration via ws_osmux_* helpers

Adapt scheduler to support API-based burst submission and
external timer callbacks in WebSDR mode

Disable signal handling, stats and socket I/O when building
with ENABLE_WEBSDR

Add WebSDR API entrypoint, Emscripten build target and
example configuration

Enables running BTS/TRX stack in WebAssembly environments

Change-Id: Idebd588f33afd85021813ad5821391781db683a9
dtv.comp at

#28401 (Apr 29, 2026, 9:30:56 PM)

trx: factor out FN timer processing into common helper

Extract core FN timer handling logic into trx_fn_timer_process()
to decouple it from timerfd-specific code.

This allows reusing the same scheduling logic for alternative
timer backends (e.g. WebSDR) while keeping timerfd integration
as a thin wrapper.

No functional changes intended.

Change-Id: Ia28cce57afb3dc97c8655e855ebd5ace7e096648
dtv.comp at

#28400 (Apr 29, 2026, 9:30:21 PM)

trx: factor out burst submission into helper

Extract TRXD burst submission logic from bts_sched_flush_buffers()
into trx_sched_submit_bursts()

No functional changes intended, this prepares for alternative
backends reusing the same scheduling logic

Change-Id: I7ce61bee4ca7ca50ef190982f1a0e4ce57c8c838
dtv.comp at

#28399 (Apr 29, 2026, 9:30:05 PM)

trx: split TRXD parsing from socket callback

Extract TRXD message parsing into trx_data_read() and
reuse it from trx_data_read_cb()

This decouples parsing from socket I/O and allows reuse
with alternative transports

No functional changes intended

Change-Id: I50ad8b6d2edfd91f2d569cd8badf5c036fbf87ed
dtv.comp at

#28398 (Apr 29, 2026, 9:29:47 PM)

trx: factor out TRXD data submission helper

Extract TRXD data sending into trx_data_submit_msg() and
reuse it from trx_if_send_burst()

This separates transport-specific I/O from message construction
and prepares for alternative backends

No functional changes intended

Change-Id: Ie89ac6efe2f5af0b4cbe5a259a18770b8d2de859
dtv.comp at

#28397 (Apr 29, 2026, 9:29:30 PM)

build: add WebSDR configure option and Emscripten detection

Detect Emscripten toolchain and introduce --with-websdr
configure option

When enabled, check for libosmo-trx-websdr and required
symbol modulateBits, failing configure if missing

Change-Id: Iff4b76e339e2873686c8c15885dd498458ceb546
dtv.comp at

#28396 (Apr 29, 2026, 9:29:17 PM)

trx: split TRX ctrl response parsing from socket callback

Extract TRX control response parsing logic into
trx_ctrl_parse_rsp() and call it from trx_ctrl_read_cb()

This decouples parsing from socket I/O and allows reuse
with alternative transports

No functional changes intended

Change-Id: I255c7d554aad3ac6df2c66716fae1c1fb512110e
dtv.comp at

#28395 (Apr 29, 2026, 9:29:05 PM)

bts: guard AMR RTP decoder stub with HAVE_LIBOSMOCODEC_STATIC

Disable dummy osmo_amr_rtp_dec() implementation when
linking against static libosmocodec to avoid symbol
conflicts

Apply to omldummy and virtual BTS models

Change-Id: Ie19ae2013893575a2f74a87af2151034abf57870
dtv.comp at

#28394 (Apr 29, 2026, 9:26:42 PM)

trx: factor out TRX ctrl message submission

Extract TRX control message sending logic into
trx_ctrl_submit_msg() and reuse it from trx_ctrl_send()

This separates message construction from transport-specific
submission and prepares for alternative backends

No functional changes intended

Change-Id: Ibbd50117db4531efbc374e43e3802f9f995362cd
dtv.comp at

#28393 (Apr 29, 2026, 9:20:24 PM)

transceiver: add optional Laurent burst LUT modulation (int16)

Introduce an optional Burst LUT optimization for Laurent-based burst
modulation, enabled via --with-burst-lut.

- Add precomputed Laurent LUT tables (float and int16 I/Q variants)
- Generate LUT at initialization (prepareBurstLUT)
- Use LUT-based modulation for sps=4 when enabled
- Add configure.ac option and USE_BURST_LUT define

This reduces runtime computation by replacing per-burst Laurent
processing with memcpy-based LUT lookups.

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#28392 (Apr 29, 2026, 8:44:29 PM)

bts: guard AMR RTP decoder stub with HAVE_LIBOSMOCODEC_STATIC

Disable dummy osmo_amr_rtp_dec() implementation when
linking against static libosmocodec to avoid symbol
conflicts

Apply to omldummy and virtual BTS models

Change-Id: Ie19ae2013893575a2f74a87af2151034abf57870
dtv.comp at

#28391 (Apr 29, 2026, 8:44:25 PM)

trx: factor out clock indication handling into helper

Extract clock indication handling logic into trx_clk_phy()
and reuse it from trx_clk_read_cb()

This separates core FN processing from socket-specific code
and prepares for alternative clock sources (e.g. non-UDP /
in-memory callbacks used in WebSDR/WASM builds).

No functional changes intended

Change-Id: I0e6b3e25da14ada4d0ef86fd4c4e6bbc12e447d2
dtv.comp at

#28390 (Apr 29, 2026, 8:44:21 PM)

build: make sched_* usage optional

Add configure checks for sched_* APIs and guard usage of
sched_setscheduler with HAVE_SCHED_SETSCHEDULER.

This avoids build/runtime issues on platforms without
scheduler support.

Change-Id: I5af357c1e2074fa1e05ac6bc20af8535c474d906
dtv.comp at

#28389 (Apr 29, 2026, 8:44:18 PM)

trx: handle synchronous TRX control callbacks in provision FSM

Set *_sent flags before issuing TRX control commands to ensure
correct state when responses are delivered synchronously
(e.g. WebUSB callback path)

Also guard FSM state handling in st_open_poweroff() to avoid
duplicate transitions if state was already changed by a
synchronous response

No functional change for asynchronous (socket-based) backends

Change-Id: I50c95e3796839e9fe721bff6f96fed4c490c6018
dtv.comp at

#28388 (Apr 29, 2026, 8:44:14 PM)

trx: factor out burst submission into helper

Extract TRXD burst submission logic from bts_sched_flush_buffers()
into trx_sched_submit_bursts()

No functional changes intended, this prepares for alternative
backends reusing the same scheduling logic

Change-Id: I7ce61bee4ca7ca50ef190982f1a0e4ce57c8c838
dtv.comp at

#28387 (Apr 29, 2026, 8:44:10 PM)

trx: factor out FN timer processing into common helper

Extract core FN timer handling logic into trx_fn_timer_process()
to decouple it from timerfd-specific code.

This allows reusing the same scheduling logic for alternative
timer backends (e.g. WebSDR) while keeping timerfd integration
as a thin wrapper.

No functional changes intended.

Change-Id: Ia28cce57afb3dc97c8655e855ebd5ace7e096648
dtv.comp at

#28386 (Apr 29, 2026, 8:44:06 PM)

trx: split TRXD parsing from socket callback

Extract TRXD message parsing into trx_data_read() and
reuse it from trx_data_read_cb()

This decouples parsing from socket I/O and allows reuse
with alternative transports

No functional changes intended

Change-Id: I50ad8b6d2edfd91f2d569cd8badf5c036fbf87ed
dtv.comp at

#28385 (Apr 29, 2026, 8:44:01 PM)

trx: factor out TRXD data submission helper

Extract TRXD data sending into trx_data_submit_msg() and
reuse it from trx_if_send_burst()

This separates transport-specific I/O from message construction
and prepares for alternative backends

No functional changes intended

Change-Id: Ie89ac6efe2f5af0b4cbe5a259a18770b8d2de859
dtv.comp at

#28384 (Apr 29, 2026, 8:43:58 PM)

trx: add JSON stats export for WebSDR API

Introduce stats_json.c providing JSON serialization for:
- stats and counters
- rate counters
- BTS state
- TRX/transceiver state
- WebSDR runtime metrics

Add osmobts_get_stats() API to expose these via WebSDR
interface and export it in Emscripten build

This enables programmatic access to data previously available
via VTY (e.g. "show stats", "show bts")

Change-Id: Ifb82adfab879a65ecd222c45e06551983aa90a0f
dtv.comp at

#28383 (Apr 29, 2026, 8:43:54 PM)

smux: allow lchan lookup without remote address

Make rem_addr optional in osmux_lchan_find() by skipping
address comparison when it is NULL

This allows callers without socket-based addressing to
locate lchans by CID only (e.g. callback-based transports)

Change-Id: I7a275dad2353241c7b04cdb5d6cc1436a175c1f3
dtv.comp at

#28382 (Apr 29, 2026, 8:43:51 PM)

trx: split TRX ctrl response parsing from socket callback

Extract TRX control response parsing logic into
trx_ctrl_parse_rsp() and call it from trx_ctrl_read_cb()

This decouples parsing from socket I/O and allows reuse
with alternative transports

No functional changes intended

Change-Id: I255c7d554aad3ac6df2c66716fae1c1fb512110e
dtv.comp at

#28381 (Apr 29, 2026, 8:43:47 PM)

abis: add helper to update BTS identity

Introduce abis_update_bts_info() to update site_id and bts_id in
bts_dev_info at runtime

This allows adjusting BTS identity after initialization,
e.g. from external control interfaces

Change-Id: Ibafd66a1e1dc42ad0063c412087bee10d212fe33
dtv.comp at

#28380 (Apr 29, 2026, 8:43:43 PM)

build: add WebSDR configure option and Emscripten detection

Detect Emscripten toolchain and introduce --with-websdr
configure option

When enabled, check for libosmo-trx-websdr and required
symbol modulateBits, failing configure if missing

Change-Id: Iff4b76e339e2873686c8c15885dd498458ceb546
dtv.comp at

#28379 (Apr 29, 2026, 8:43:37 PM)

trx, bts: add optional WebSDR backend (callback-based transport)

Introduce WebSDR backend enabled via ENABLE_WEBSDR,
adding an alternative callback-based transport alongside
existing socket-based TRX/OSMUX I/O

Implement:
- TRX control via osmotrxlib_process_command()
- TRXD data via apitrx_tx_call()/trx_data_read()
- clock handling via apibts_clock_ind() and external timers
- Osmux integration via ws_osmux_* helpers

Adapt scheduler to support API-based burst submission and
external timer callbacks in WebSDR mode

Disable signal handling, stats and socket I/O when building
with ENABLE_WEBSDR

Add WebSDR API entrypoint, Emscripten build target and
example configuration

Enables running BTS/TRX stack in WebAssembly environments

Change-Id: Idebd588f33afd85021813ad5821391781db683a9
dtv.comp at

#28378 (Apr 29, 2026, 8:43:33 PM)

trx: factor out TRX ctrl message submission

Extract TRX control message sending logic into
trx_ctrl_submit_msg() and reuse it from trx_ctrl_send()

This separates message construction from transport-specific
submission and prepares for alternative backends

No functional changes intended

Change-Id: Ibbd50117db4531efbc374e43e3802f9f995362cd
dtv.comp at

#28377 (Apr 29, 2026, 8:43:29 PM)

trx: split TRXD parsing from socket callback

Extract TRXD message parsing into trx_data_read() and
reuse it from trx_data_read_cb()

This decouples parsing from socket I/O and allows reuse
with alternative transports

No functional changes intended

Change-Id: I50ad8b6d2edfd91f2d569cd8badf5c036fbf87ed
dtv.comp at

#28376 (Apr 29, 2026, 8:43:25 PM)

trx: add JSON stats export for WebSDR API

Introduce stats_json.c providing JSON serialization for:
- stats and counters
- rate counters
- BTS state
- TRX/transceiver state
- WebSDR runtime metrics

Add osmobts_get_stats() API to expose these via WebSDR
interface and export it in Emscripten build

This enables programmatic access to data previously available
via VTY (e.g. "show stats", "show bts")

Change-Id: Ifb82adfab879a65ecd222c45e06551983aa90a0f
dtv.comp at

#28375 (Apr 29, 2026, 8:43:18 PM)

bts: guard AMR RTP decoder stub with HAVE_LIBOSMOCODEC_STATIC

Disable dummy osmo_amr_rtp_dec() implementation when
linking against static libosmocodec to avoid symbol
conflicts

Apply to omldummy and virtual BTS models

Change-Id: Ie19ae2013893575a2f74a87af2151034abf57870
dtv.comp at

#28374 (Apr 29, 2026, 8:43:09 PM)

trx: factor out burst submission into helper

Extract TRXD burst submission logic from bts_sched_flush_buffers()
into trx_sched_submit_bursts()

No functional changes intended, this prepares for alternative
backends reusing the same scheduling logic

Change-Id: I7ce61bee4ca7ca50ef190982f1a0e4ce57c8c838
dtv.comp at

#28373 (Apr 29, 2026, 8:42:59 PM)

trx: factor out FN timer processing into common helper

Extract core FN timer handling logic into trx_fn_timer_process()
to decouple it from timerfd-specific code.

This allows reusing the same scheduling logic for alternative
timer backends (e.g. WebSDR) while keeping timerfd integration
as a thin wrapper.

No functional changes intended.

Change-Id: Ia28cce57afb3dc97c8655e855ebd5ace7e096648
dtv.comp at

#28372 (Apr 29, 2026, 8:42:52 PM)

trx, bts: add optional WebSDR backend (callback-based transport)

Introduce WebSDR backend enabled via ENABLE_WEBSDR,
adding an alternative callback-based transport alongside
existing socket-based TRX/OSMUX I/O

Implement:
- TRX control via osmotrxlib_process_command()
- TRXD data via apitrx_tx_call()/trx_data_read()
- clock handling via apibts_clock_ind() and external timers
- Osmux integration via ws_osmux_* helpers

Adapt scheduler to support API-based burst submission and
external timer callbacks in WebSDR mode

Disable signal handling, stats and socket I/O when building
with ENABLE_WEBSDR

Add WebSDR API entrypoint, Emscripten build target and
example configuration

Enables running BTS/TRX stack in WebAssembly environments

Change-Id: Idebd588f33afd85021813ad5821391781db683a9
dtv.comp at

#28371 (Apr 29, 2026, 8:42:46 PM)

trx: split TRX ctrl response parsing from socket callback

Extract TRX control response parsing logic into
trx_ctrl_parse_rsp() and call it from trx_ctrl_read_cb()

This decouples parsing from socket I/O and allows reuse
with alternative transports

No functional changes intended

Change-Id: I255c7d554aad3ac6df2c66716fae1c1fb512110e
dtv.comp at

#28370 (Apr 29, 2026, 8:42:42 PM)

abis: add helper to update BTS identity

Introduce abis_update_bts_info() to update site_id and bts_id in
bts_dev_info at runtime

This allows adjusting BTS identity after initialization,
e.g. from external control interfaces

Change-Id: Ibafd66a1e1dc42ad0063c412087bee10d212fe33
dtv.comp at

#28369 (Apr 29, 2026, 8:42:37 PM)

build: make sched_* usage optional

Add configure checks for sched_* APIs and guard usage of
sched_setscheduler with HAVE_SCHED_SETSCHEDULER.

This avoids build/runtime issues on platforms without
scheduler support.

Change-Id: I5af357c1e2074fa1e05ac6bc20af8535c474d906
dtv.comp at

#28368 (Apr 29, 2026, 8:42:32 PM)

build: remove unused sys/timerfd.h include

The header is not used in scheduler_trx.c and breaks builds on
platforms where timerfd is not available (e.g. Web/emscripten).

Remove the unused include.

Change-Id: Id5a700c865f984e8f99199a1e365bb7f1462030a
dtv.comp at

#28367 (Apr 29, 2026, 8:42:27 PM)

smux: allow lchan lookup without remote address

Make rem_addr optional in osmux_lchan_find() by skipping
address comparison when it is NULL

This allows callers without socket-based addressing to
locate lchans by CID only (e.g. callback-based transports)

Change-Id: I7a275dad2353241c7b04cdb5d6cc1436a175c1f3
dtv.comp at

#28366 (Apr 29, 2026, 8:42:19 PM)

trx: factor out TRXD data submission helper

Extract TRXD data sending into trx_data_submit_msg() and
reuse it from trx_if_send_burst()

This separates transport-specific I/O from message construction
and prepares for alternative backends

No functional changes intended

Change-Id: Ie89ac6efe2f5af0b4cbe5a259a18770b8d2de859
dtv.comp at

#28365 (Apr 29, 2026, 8:42:06 PM)

trx: handle synchronous TRX control callbacks in provision FSM

Set *_sent flags before issuing TRX control commands to ensure
correct state when responses are delivered synchronously
(e.g. WebUSB callback path)

Also guard FSM state handling in st_open_poweroff() to avoid
duplicate transitions if state was already changed by a
synchronous response

No functional change for asynchronous (socket-based) backends

Change-Id: I50c95e3796839e9fe721bff6f96fed4c490c6018
dtv.comp at

#28364 (Apr 29, 2026, 8:39:50 PM)

trx: factor out clock indication handling into helper

Extract clock indication handling logic into trx_clk_phy()
and reuse it from trx_clk_read_cb()

This separates core FN processing from socket-specific code
and prepares for alternative clock sources (e.g. non-UDP /
in-memory callbacks used in WebSDR/WASM builds).

No functional changes intended

Change-Id: I0e6b3e25da14ada4d0ef86fd4c4e6bbc12e447d2
dtv.comp at

#28363 (Apr 29, 2026, 8:35:16 PM)

trx: factor out TRX ctrl message submission

Extract TRX control message sending logic into
trx_ctrl_submit_msg() and reuse it from trx_ctrl_send()

This separates message construction from transport-specific
submission and prepares for alternative backends

No functional changes intended

Change-Id: Ibbd50117db4531efbc374e43e3802f9f995362cd
dtv.comp at

#28362 (Apr 29, 2026, 8:33:06 PM)

build: add WebSDR configure option and Emscripten detection

Detect Emscripten toolchain and introduce --with-websdr
configure option

When enabled, check for libosmo-trx-websdr and required
symbol modulateBits, failing configure if missing

Change-Id: Iff4b76e339e2873686c8c15885dd498458ceb546
dtv.comp at

#28361 (Apr 29, 2026, 8:02:41 PM)

convolve: avoid function pointer casts by adding wrapper functions

Introduce _base_convolve_*_void() wrappers matching the expected
function pointer signatures and use them instead of casting
_base_convolve_* functions to (void *).

This removes unsafe function pointer casts and improves
type safety, which is required for stricter toolchains and
non-native targets (e.g. WebAssembly)

Change-Id: Idecb118be285eb3e4691d1761d0d8fa24fd80c75
dtv.comp at

#28360 (Apr 29, 2026, 8:02:27 PM)

trx: add JSON serialization for 'show trx'

Introduce trx_to_json() helper to serialize the output of
'show trx' into JSON format.

Also initialize talloc/VTY context in websdr entrypoint to
allow accessing TRX configuration programmatically.

Intended for external consumers (e.g. WebSDR frontend).

Change-Id: Icbfb754580daa6db9b5646cc6698a6a6ee1c1610
dtv.comp at

#28359 (Apr 29, 2026, 8:02:13 PM)

device: add WebSDR radio backend

Introduce a new optional WebSDR device backend, enabled via
--with-websdr.

Add WebSDRDevice implementation and build integration, providing
a RadioDevice interface backed by callback hooks for control and
sample I/O.

Intended for Web-based deployments where osmo-trx interacts with
SDR hardware via a WebSDR/WebUSB frontend.

Change-Id: Ie459cbd70388dd8ff5b89221d30770bab0bd9014
dtv.comp at

#28358 (Apr 29, 2026, 7:57:16 PM)

build: detect pthread_setname_np and sched_* APIs, guard usage

Add configure checks for pthread_setname_np and sched_* functions.
Wrap their usage with HAVE_* guards to avoid build failures on
platforms where they are unavailable.

Return -ENOTSUP for unsupported scheduler operations.

Improves portability across non-Linux and restricted environments
(e.g. WebAssembly).

Change-Id: Ic3f1492544439d88c5e6683330c6696de1c2f85b
dtv.comp at

#28357 (Apr 29, 2026, 7:57:04 PM)

transceiver: add optional WebSDR device support

- Add support for WebSDR devices enabled via the --with-websdr
configure flag.
- add libosmo-trx-websdr library and pkg-config file
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#28356 (Apr 29, 2026, 5:56:12 PM)

nokia: respond to BTS_COMMISS_TEST_REQ

In some cases, Flexi Multiradio BTS sends us BTS_COMMISS_TEST_REQ
during its init process, and expects us to respond with
BTS_COMMISS_TEST_COMPL, indicating that we did the requested
commissioning tests.  While we don't do any actual tests currently,
and we have not yet reached an understanding of the exact conditions
as to when the BTS makes this query of us, if it does send us
BTS_COMMISS_TEST_REQ, we need to respond with BTS_COMMISS_TEST_COMPL
to make it happy.

Change-Id: I0f2710c3cdb38a9e5b37e40ca5584237a730a902
falcon at

#28355 (Apr 29, 2026, 5:56:05 PM)

nokia vty: change help strings away from "*Site"

Support for Nokia BTS in OsmoBSC is being expanded from just *Site
family to also include Flexi Multiradio - therefore, help strings
and error messages in vty should be changed accordingly.

FIXME: names of Nokia-specific vty settings still begin with
nokia_site, ditto for the name of the BTS model.  TODO: decide
on a proper long-term solution.

Change-Id: I55556b7b5aa5bc6efcbee815e9011497a933697c
falcon at

#28354 (Apr 29, 2026, 5:55:58 PM)

nokia: make Rx diversity configurable

The config structure sent to the BTS with BTS_CONF_DATA includes
an IE that enables or disables Rx diversity.  In the original code
this setting was hard-coded to enabled state; make it configurable
via vty.

Change-Id: I73bd91b717a8c8b338bacb6ed9db73bb07245c12
falcon at

#28353 (Apr 29, 2026, 5:55:47 PM)

nokia skip-reset: make consistent with other vty settings

All other Nokia-specific vty settings use is_nokia_bts() helper
function, while the code for skip-reset directly compares
bts->type against GSM_BTS_TYPE_NOKIA_SITE.  Change to use the
helper function: it is consistent with other vty settings,
and avoids one more place that erroneously refers to *Site
instead of all Nokia BTS.

Change-Id: Ie8cdac51f82185e2d4f37a8da00acba633670052
falcon at

#28352 (Apr 29, 2026, 5:55:38 PM)

nokia: add support for Flexi Multiradio

Previous support existed for Nokia MetroSite, UltraSite and InSite
models, resulting in BTS model name "nokia_site".  However, there
exist newer Nokia BTS models that also support E1 Abis and can be
supported by OsmoBSC with relatively small changes: Flexi EDGE,
Flexi Multiradio and Flexi Multiradio 10.  Out of these newer
models, American 2G Cooperative (the present patch author's current
organization) has only Flexi MR at the present time - hence this
model shall be the first "new" Nokia BTS to be supported.

The first change required in order to support Flexi MR is ability
to receive long OML messages that have been segmented by the BTS:
the new BTS sends a much longer BTS_CONF_REQ message, and we have
to handle it correctly.

Change-Id: Icd429552c3b5e90d6c5d3ae5f52afd6550e3cebc
falcon at

#28351 (Apr 29, 2026, 5:55:25 PM)

nokia bts-reset-timer: raise the maximum to 300 s

The previous vty tuning range for this timer (allowing up to 100 s)
is not sufficient for Flexi Multiradio BTS, where we need 120 s
minimum or 130 s for some margin.  Raise the upper limit for vty
config of this parameter to 5 min, which should be long enough
to not require further revisiting.

Change-Id: Ie5b784c9cce56e27800084471a7fb0b867cc0c69
falcon at

#28350 (Apr 29, 2026, 5:53:58 PM)

rsl: don't send legacy Chan Ident IE for Nokia BTS

The description of CHAN ACTIV command message in TS 48.058
section 8.4.1 lists Channel Identification as an optional IE,
with a note that reads "Included if compatibility with phase1
is required."  This note may have been misinterpreted as
referring to compatibility with Phase 1 phones - but since
this network-internal Abis detail is invisible to phones,
the real intent of GSM spec authors here must have been
compatibility with Phase 1 BTS.

Previous versions of OsmoBSC would always include this IE,
and it appears that all previously supported BTS models
would simply ignore it.  However, newer Nokia BTS models
(observed on Flexi Multiradio at least) dislike this IE
and return CHAN ACTIV NACK with an optional IE error cause
if it is included.

To avoid changing OsmoBSC behavior for other users, let us
conditionalize removal of this legacy IE on Nokia BTS for now.
This change has been tested on InSite, MetroSite and Flexi
Multiradio - no adverse effects on previously supported
*Site models.

Change-Id: Ibce7a841907ac87ae378ded3ddb174d38b70b7b7
falcon at

#28349 (Apr 29, 2026, 7:12:56 AM)

Cosmetic: bts_nokia_site: fix comment formatting

Ensure each line of a multiline comment starts with " * ".

Related: https://gerrit.osmocom.org/c/osmo-bsc/+/42712/comment/6aa80188_f56f2265/
Change-Id: I83ed16ec09fb66076dc2ba6a49ef272657b09407
Oliver Smith at

#28348 (Apr 29, 2026, 6:57:50 AM)

lint/checkpatch: ignore MULTILINE_DEREFERENCE

This linting rule gives false positives, e.g. for this snippet:

static int abis_nm_rcvmsg_fom(struct e1inp_sign_link *sign_link,
      uint8_t *l3_msg, unsigned l3_msg_len)

It complains with:
src/osmo-bsc/bts_nokia_site.c:1785: WARNING:MULTILINE_DEREFERENCE: Avoid multiple line dereference - prefer 'run.static'

Related: https://gerrit.osmocom.org/c/osmo-bsc/+/42712/comment/fd3a38ef_a59f616f/
Change-Id: If2a1972fe333f51d534a924fd5ac1c1f7eb65b01
Oliver Smith at

#28347 (Apr 28, 2026, 11:52:32 PM)

nokia: respond to BTS_COMMISS_TEST_REQ

In some cases, Flexi Multiradio BTS sends us BTS_COMMISS_TEST_REQ
during its init process, and expects us to respond with
BTS_COMMISS_TEST_COMPL, indicating that we did the requested
commissioning tests.  While we don't do any actual tests currently,
and we have not yet reached an understanding of the exact conditions
as to when the BTS makes this query of us, if it does send us
BTS_COMMISS_TEST_REQ, we need to respond with BTS_COMMISS_TEST_COMPL
to make it happy.

Change-Id: I0f2710c3cdb38a9e5b37e40ca5584237a730a902
falcon at

#28346 (Apr 28, 2026, 11:52:27 PM)

nokia bts-reset-timer: raise the maximum to 300 s

The previous vty tuning range for this timer (allowing up to 100 s)
is not sufficient for Flexi Multiradio BTS, where we need 120 s
minimum or 130 s for some margin.  Raise the upper limit for vty
config of this parameter to 5 min, which should be long enough
to not require further revisiting.

Change-Id: Ie5b784c9cce56e27800084471a7fb0b867cc0c69
falcon at

#28345 (Apr 28, 2026, 11:52:22 PM)

nokia: make Rx diversity configurable

The config structure sent to the BTS with BTS_CONF_DATA includes
an IE that enables or disables Rx diversity.  In the original code
this setting was hard-coded to enabled state; make it configurable
via vty.

Change-Id: I73bd91b717a8c8b338bacb6ed9db73bb07245c12
falcon at

#28344 (Apr 28, 2026, 11:52:17 PM)

nokia vty: change help strings away from "*Site"

Support for Nokia BTS in OsmoBSC is being expanded from just *Site
family to also include Flexi Multiradio - therefore, help strings
and error messages in vty should be changed accordingly.

FIXME: names of Nokia-specific vty settings still begin with
nokia_site, ditto for the name of the BTS model.  TODO: decide
on a proper long-term solution.

Change-Id: I55556b7b5aa5bc6efcbee815e9011497a933697c
falcon at

#28343 (Apr 28, 2026, 11:52:01 PM)

nokia: add support for Flexi Multiradio

Previous support existed for Nokia MetroSite, UltraSite and InSite
models, resulting in BTS model name "nokia_site".  However, there
exist newer Nokia BTS models that also support E1 Abis and can be
supported by OsmoBSC with relatively small changes: Flexi EDGE,
Flexi Multiradio and Flexi Multiradio 10.  Out of these newer
models, American 2G Cooperative (the present patch author's current
organization) has only Flexi MR at the present time - hence this
model shall be the first "new" Nokia BTS to be supported.

The first change required in order to support Flexi MR is ability
to receive long OML messages that have been segmented by the BTS:
the new BTS sends a much longer BTS_CONF_REQ message, and we have
to handle it correctly.

Change-Id: Icd429552c3b5e90d6c5d3ae5f52afd6550e3cebc
falcon at

#28342 (Apr 28, 2026, 11:51:51 PM)

nokia skip-reset: make consistent with other vty settings

All other Nokia-specific vty settings use is_nokia_bts() helper
function, while the code for skip-reset directly compares
bts->type against GSM_BTS_TYPE_NOKIA_SITE.  Change to use the
helper function: it is consistent with other vty settings,
and avoids one more place that erroneously refers to *Site
instead of all Nokia BTS.

Change-Id: Ie8cdac51f82185e2d4f37a8da00acba633670052
falcon at

#28341 (Apr 28, 2026, 11:51:34 PM)

rsl: don't send legacy Chan Ident IE for Nokia BTS

The description of CHAN ACTIV command message in TS 48.058
section 8.4.1 lists Channel Identification as an optional IE,
with a note that reads "Included if compatibility with phase1
is required."  This note may have been misinterpreted as
referring to compatibility with Phase 1 phones - but since
this network-internal Abis detail is invisible to phones,
the real intent of GSM spec authors here must have been
compatibility with Phase 1 BTS.

Previous versions of OsmoBSC would always include this IE,
and it appears that all previously supported BTS models
would simply ignore it.  However, newer Nokia BTS models
(observed on Flexi Multiradio at least) dislike this IE
and return CHAN ACTIV NACK with an optional IE error cause
if it is included.

To avoid changing OsmoBSC behavior for other users, let us
conditionalize removal of this legacy IE on Nokia BTS for now.
This change has been tested on InSite, MetroSite and Flexi
Multiradio - no adverse effects on previously supported
*Site models.

Change-Id: Ibce7a841907ac87ae378ded3ddb174d38b70b7b7
falcon at

#28340 (Apr 28, 2026, 8:28:00 PM)

esim/http_json_api.py: support text/plain response Content-Type

Allow returning text/plain Content-Types as 'data' output argument.

So far, all the esim/http_json_api functions require a JSON response.
However, a specific vendor has a list function where the request is JSON
but the response is text/plain CSV data. Allow and return in a dict.

Change-Id: Iba6e4cef1048b376050a435a900c0f395655a790
Jenkins: skip-card-test
Vadim Yanitskiy at

#28339 (Apr 28, 2026, 5:44:37 PM)

nokia bts-reset-timer: raise the maximum to 300 s

The previous vty tuning range for this timer (allowing up to 100 s)
is not sufficient for Flexi Multiradio BTS, where we need 120 s
minimum or 130 s for some margin.  Raise the upper limit for vty
config of this parameter to 5 min, which should be long enough
to not require further revisiting.

Change-Id: Ie5b784c9cce56e27800084471a7fb0b867cc0c69
falcon at

#28338 (Apr 28, 2026, 5:44:33 PM)

rsl: don't send legacy Chan Ident IE for Nokia BTS

The description of CHAN ACTIV command message in TS 48.058
section 8.4.1 lists Channel Identification as an optional IE,
with a note that reads "Included if compatibility with phase1
is required."  This note may have been misinterpreted as
referring to compatibility with Phase 1 phones - but since
this network-internal Abis detail is invisible to phones,
the real intent of GSM spec authors here must have been
compatibility with Phase 1 BTS.

Previous versions of OsmoBSC would always include this IE,
and it appears that all previously supported BTS models
would simply ignore it.  However, newer Nokia BTS models
(observed on Flexi Multiradio at least) dislike this IE
and return CHAN ACTIV NACK with an optional IE error cause
if it is included.

To avoid changing OsmoBSC behavior for other users, let us
conditionalize removal of this legacy IE on Nokia BTS for now.
This change has been tested on InSite, MetroSite and Flexi
Multiradio - no adverse effects on previously supported
*Site models.

Change-Id: Ibce7a841907ac87ae378ded3ddb174d38b70b7b7
falcon at

#28337 (Apr 28, 2026, 5:44:28 PM)

nokia vty: change help strings away from "*Site"

Support for Nokia BTS in OsmoBSC is being expanded from just *Site
family to also include Flexi Multiradio - therefore, help strings
and error messages in vty should be changed accordingly.

Change-Id: I55556b7b5aa5bc6efcbee815e9011497a933697c
falcon at

#28336 (Apr 28, 2026, 5:44:22 PM)

nokia: add support for Flexi Multiradio

Previous support existed for Nokia MetroSite, UltraSite and InSite
models, resulting in BTS model name "nokia_site".  However, there
exist newer Nokia BTS models that also support E1 Abis and can be
supported by OsmoBSC with relatively small changes: Flexi EDGE,
Flexi Multiradio and Flexi Multiradio 10.  Out of these newer
models, American 2G Cooperative (the present patch author's current
organization) has only Flexi MR at the present time - hence this
model shall be the first "new" Nokia BTS to be supported.

The first change required in order to support Flexi MR is ability
to receive long OML messages that have been segmented by the BTS:
the new BTS sends a much longer BTS_CONF_REQ message, and we have
to handle it correctly.

Change-Id: Icd429552c3b5e90d6c5d3ae5f52afd6550e3cebc
falcon at

#28335 (Apr 28, 2026, 5:44:17 PM)

nokia: make Rx diversity configurable

The config structure sent to the BTS with BTS_CONF_DATA includes
an IE that enables or disables Rx diversity.  In the original code
this setting was hard-coded to enabled state; make it configurable
via vty.

Change-Id: I73bd91b717a8c8b338bacb6ed9db73bb07245c12
falcon at

#28334 (Apr 28, 2026, 5:43:57 PM)

nokia: respond to BTS_COMMISS_TEST_REQ

In some cases, Flexi Multiradio BTS sends us BTS_COMMISS_TEST_REQ
during its init process, and expects us to respond with
BTS_COMMISS_TEST_COMPL, indicating that we did the requested
commissioning tests.  While we don't do any actual tests currently,
and we have not yet reached an understanding of the exact conditions
as to when the BTS makes this query of us, if it does send us
BTS_COMMISS_TEST_REQ, we need to respond with BTS_COMMISS_TEST_COMPL
to make it happy.

Change-Id: I0f2710c3cdb38a9e5b37e40ca5584237a730a902
falcon at

#28333 (Apr 28, 2026, 5:18:26 PM)

fw: add git blame ignore file

Reformatting should not pollute blame, so ignore those revs.

Change-Id: I35b86f52d491c9e28ab0af9e3e3d4fd5f6dbd119
ewild at

#28332 (Apr 28, 2026, 5:18:10 PM)

fw source: force reformat once and for all

This commit applies the rules to all files that matter
(obv excluding asf4 code) since it is impossible to modify code
because the code never used the code style enforced by the
linter/clang-format and
1) changing code
2) reformatting code
3) extracting the reformatting changes for the modified lines as a
separate commit
4) commiting standalone reformatting changes
4) commiting the actual code change on top
is a workflow that takes forever and is completely ridiculous because
the whole point of formatter rules is to apply them.

This needs a second commit with .git-blame-ignore-revs to not pollute blame.

Change-Id: Iacc086bb566551225e7a21b639a1ad2ec257484f
ewild at

#28331 (Apr 28, 2026, 4:54:36 PM)

formatting: update .clang-format

Updates the formatting rules derived from linux kernel
098b6e44cbaa2d526d06af90c862d13fb414a0ec

At the same time tell clang-format to keep the bespoke formatting
used for the fsm and usb descs.

Change-Id: I1fd4d38897946693b5495fa4d0b61925eb9d07f7
ewild at

#28330 (Apr 28, 2026, 4:54:22 PM)

fw source: force reformat once and for all

This commit applies the rules to all files that matter
(obv excluding asf4 code) since it is impossible to modify code
because the code never used the code style enforced by the
linter/clang-format and
1) changing code
2) reformatting code
3) extracting the reformatting changes for the modified lines as a
separate commit
4) commiting standalone reformatting changes
4) commiting the actual code change on top
is a workflow that takes forever and is completely ridiculous because
the whole point of formatter rules is to apply them.

This needs a second commit with .git-blame-ignore-revs to not pollute blame.

Change-Id: Iacc086bb566551225e7a21b639a1ad2ec257484f
ewild at

#28329 (Apr 28, 2026, 4:54:15 PM)

fw: add git blame ignore file

Reformatting should not pollute blame, so ignore those revs.

Change-Id: I35b86f52d491c9e28ab0af9e3e3d4fd5f6dbd119
ewild at

#28328 (Apr 28, 2026, 3:47:30 PM)

transceiver: add optional Laurent burst LUT modulation (int16)

Introduce an optional Burst LUT optimization for Laurent-based burst
modulation, enabled via --with-burst-lut.

- Add precomputed Laurent LUT tables (float and int16 I/Q variants)
- Generate LUT at initialization (prepareBurstLUT)
- Use LUT-based modulation for sps=4 when enabled
- Add configure.ac option and USE_BURST_LUT define

This reduces runtime computation by replacing per-burst Laurent
processing with memcpy-based LUT lookups.

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#28327 (Apr 28, 2026, 9:38:37 AM)

Fix: Only run pcscd with "--diable-polkit" if supported

For example, if bankd tests run on Debian Bookwork, pcscd does not have
the "--disable-polkit" option. This option is not required, because it
does not support Polit anyway.

Only add "--disable-polkit" to the command line if supported by pcscd.

Change-Id: Ib2cdf7fcd698c33810ebfbb1db2fa666b9d7dbb3
Andreas Eversberg at

#28326 (Apr 28, 2026, 9:16:24 AM)

jobs/ttcn3-testsuites-testenv: fix rm apt partial

Fix that testenv jobs may fail to remove the cache at the beginning:

  rm: cannot remove '_cache/podman/var-lib-apt-debian-trixie/lists/partial': Permission denied

This happens when the partial directory still exists:

  $ ls -lah ~/jenkins/workspace/ttcn3-bsc-test-sccplite/_cache/podman/var-lib-apt-debian-trixie/lists
  total 12K
  drwxr-xr-x 3 osmocom-build osmocom-build 4.0K Apr 27 08:48 .
  drwxr-xr-x 3 osmocom-build osmocom-build 4.0K Apr 26 08:48 ..
  drwx------ 2        100041 osmocom-build 4.0K Apr 26 08:48 partial

Which in turn is the result of "apt update" failing to download files in
an earlier job:

  E: Failed to fetch https://downloads.osmocom.org/packages/osmocom:/nightly/Debian_13/./Packages.gz  File has unexpected size (210767 != 210491). Mirror sync in progress? [IP: 148.251.236.141 443]
     Hashes of expected file:
      - Filesize:210491 [weak]
      - SHA256:a0cdea838b724880f455d68eb433f6331a7d4113c2eb677ca2f7f6dbdf9a72e1
      - SHA1:71780896257ca550e51b95e77fee4c63fcc9980c [weak]
      - MD5Sum:531a2d49d4e9f3ff121ca6aa5be602fc [weak]
     Release file created at: Sun, 26 Apr 2026 08:48:04 +0000
  E: Some index files failed to download. They have been ignored, or old ones used instead.

Change-Id: I35b9e42b754805b42f0a868a5d0c20c1f1c01731
Oliver Smith at

#28325 (Apr 27, 2026, 9:45:46 PM)

build: add WebSDR configure option and Emscripten detection

Detect Emscripten toolchain and introduce --with-websdr
configure option

When enabled, check for libosmo-trx-websdr and required
symbol modulateBits, failing configure if missing

Change-Id: Iff4b76e339e2873686c8c15885dd498458ceb546
dtv.comp at

#28324 (Apr 27, 2026, 9:45:42 PM)

trx: handle synchronous TRX control callbacks in provision FSM

Set *_sent flags before issuing TRX control commands to ensure
correct state when responses are delivered synchronously
(e.g. WebUSB callback path)

Also guard FSM state handling in st_open_poweroff() to avoid
duplicate transitions if state was already changed by a
synchronous response

No functional change for asynchronous (socket-based) backends

Change-Id: I50c95e3796839e9fe721bff6f96fed4c490c6018
dtv.comp at

#28323 (Apr 27, 2026, 9:45:37 PM)

trx, bts: add optional WebSDR backend (callback-based transport)

Introduce WebSDR backend enabled via ENABLE_WEBSDR,
adding an alternative callback-based transport alongside
existing socket-based TRX/OSMUX I/O

Implement:
- TRX control via osmotrxlib_process_command()
- TRXD data via apitrx_tx_call()/trx_data_read()
- clock handling via apibts_clock_ind() and external timers
- Osmux integration via ws_osmux_* helpers

Adapt scheduler to support API-based burst submission and
external timer callbacks in WebSDR mode

Disable signal handling, stats and socket I/O when building
with ENABLE_WEBSDR

Add WebSDR API entrypoint, Emscripten build target and
example configuration

Enables running BTS/TRX stack in WebAssembly environments

Change-Id: Idebd588f33afd85021813ad5821391781db683a9
dtv.comp at

#28322 (Apr 27, 2026, 9:45:33 PM)

trx: factor out TRX ctrl message submission

Extract TRX control message sending logic into
trx_ctrl_submit_msg() and reuse it from trx_ctrl_send()

This separates message construction from transport-specific
submission and prepares for alternative backends

No functional changes intended

Change-Id: Ibbd50117db4531efbc374e43e3802f9f995362cd
dtv.comp at

#28321 (Apr 27, 2026, 9:45:27 PM)

smux: allow lchan lookup without remote address

Make rem_addr optional in osmux_lchan_find() by skipping
address comparison when it is NULL

This allows callers without socket-based addressing to
locate lchans by CID only (e.g. callback-based transports)

Change-Id: I7a275dad2353241c7b04cdb5d6cc1436a175c1f3
dtv.comp at

#28320 (Apr 27, 2026, 9:45:22 PM)

trx: split TRX ctrl response parsing from socket callback

Extract TRX control response parsing logic into
trx_ctrl_parse_rsp() and call it from trx_ctrl_read_cb()

This decouples parsing from socket I/O and allows reuse
with alternative transports

No functional changes intended

Change-Id: I255c7d554aad3ac6df2c66716fae1c1fb512110e
dtv.comp at

#28319 (Apr 27, 2026, 9:45:16 PM)

trx: factor out clock indication handling into helper

Extract clock indication handling logic into trx_clk_phy()
and reuse it from trx_clk_read_cb()

This separates core FN processing from socket-specific code
and prepares for alternative clock sources (e.g. non-UDP /
in-memory callbacks used in WebSDR/WASM builds).

No functional changes intended

Change-Id: I0e6b3e25da14ada4d0ef86fd4c4e6bbc12e447d2
dtv.comp at

#28318 (Apr 27, 2026, 9:45:09 PM)

trx: factor out FN timer processing into common helper

Extract core FN timer handling logic into trx_fn_timer_process()
to decouple it from timerfd-specific code.

This allows reusing the same scheduling logic for alternative
timer backends (e.g. WebSDR) while keeping timerfd integration
as a thin wrapper.

No functional changes intended.

Change-Id: Ia28cce57afb3dc97c8655e855ebd5ace7e096648
dtv.comp at

#28317 (Apr 27, 2026, 9:45:01 PM)

trx: add JSON stats export for WebSDR API

Introduce stats_json.c providing JSON serialization for:
- stats and counters
- rate counters
- BTS state
- TRX/transceiver state
- WebSDR runtime metrics

Add osmobts_get_stats() API to expose these via WebSDR
interface and export it in Emscripten build

This enables programmatic access to data previously available
via VTY (e.g. "show stats", "show bts")

Change-Id: Ifb82adfab879a65ecd222c45e06551983aa90a0f
dtv.comp at

#28316 (Apr 27, 2026, 9:44:51 PM)

bts: guard AMR RTP decoder stub with HAVE_LIBOSMOCODEC_STATIC

Disable dummy osmo_amr_rtp_dec() implementation when
linking against static libosmocodec to avoid symbol
conflicts

Apply to omldummy and virtual BTS models

Change-Id: Ie19ae2013893575a2f74a87af2151034abf57870
dtv.comp at

#28315 (Apr 27, 2026, 9:44:39 PM)

abis: add helper to update BTS identity

Introduce abis_update_bts_info() to update site_id and bts_id in
bts_dev_info at runtime

This allows adjusting BTS identity after initialization,
e.g. from external control interfaces

Change-Id: Ibafd66a1e1dc42ad0063c412087bee10d212fe33
dtv.comp at

#28314 (Apr 27, 2026, 9:44:31 PM)

trx: split TRXD parsing from socket callback

Extract TRXD message parsing into trx_data_read() and
reuse it from trx_data_read_cb()

This decouples parsing from socket I/O and allows reuse
with alternative transports

No functional changes intended

Change-Id: I50ad8b6d2edfd91f2d569cd8badf5c036fbf87ed
dtv.comp at

#28313 (Apr 27, 2026, 9:44:25 PM)

build: make timerfd usage optional

Check for sys/timerfd.h in configure and guard its usage
with HAVE_SYS_TIMERFD_H.

This avoids build failures on platforms where timerfd is
not available.

Change-Id: Id5a700c865f984e8f99199a1e365bb7f1462030a
dtv.comp at

#28312 (Apr 27, 2026, 9:44:17 PM)

trx: factor out burst submission into helper

Extract TRXD burst submission logic from bts_sched_flush_buffers()
into trx_sched_submit_bursts()

No functional changes intended, this prepares for alternative
backends reusing the same scheduling logic

Change-Id: I7ce61bee4ca7ca50ef190982f1a0e4ce57c8c838
dtv.comp at

#28311 (Apr 27, 2026, 9:44:11 PM)

build: make sched_* usage optional

Add configure checks for sched_* APIs and guard usage of
sched_setscheduler with HAVE_SCHED_SETSCHEDULER.

This avoids build/runtime issues on platforms without
scheduler support.

Change-Id: I5af357c1e2074fa1e05ac6bc20af8535c474d906
dtv.comp at

#28310 (Apr 27, 2026, 9:42:18 PM)

trx: factor out TRXD data submission helper

Extract TRXD data sending into trx_data_submit_msg() and
reuse it from trx_if_send_burst()

This separates transport-specific I/O from message construction
and prepares for alternative backends

No functional changes intended

Change-Id: Ie89ac6efe2f5af0b4cbe5a259a18770b8d2de859
dtv.comp at

#28309 (Apr 27, 2026, 8:47:13 PM)

vty: fix osmo_cpu_sched_vty_init() prototype

Change return type of osmo_cpu_sched_vty_init() from void to int
to match its implementation.

This fixes a prototype mismatch rejected by stricter compilers
(e.g. Emscripten).

Change-Id: Ia86e8063178ad82de098c2ff693cfbcd7e9f2192
dtv.comp at

#28308 (Apr 27, 2026, 8:47:05 PM)

vty: make CPU scheduling optional based on platform support

Add configure checks for sched_* APIs and guard their usage
in cpu_sched_vty with HAVE_SCHED_* macros.

If scheduler functions are not available, return -ENOTSUP
instead of failing at build time.

This improves portability on platforms lacking full sched
support (e.g. non-Linux or restricted environments).

Change-Id: Ic5b7e39fac16531d370cb81f769ba87fef18cb81
dtv.comp at

#28307 (Apr 27, 2026, 4:15:25 PM)

rspro_util: asn1 decode: fix memleak when decoding fails

Change-Id: I071343d0134dbffb1bb71ea26a5b514be1b5bb27
lynxis at

#28306 (Apr 27, 2026, 3:09:33 PM)

Fix: Prevent bankd from exiting upon SIGPIPE

If a client disconnects from a worker thread while the worker is
responding to a to a request from that client, the socket is closed and
SIGPIPE is sent to the worker, causing the application to exit.

To prevent this, all workers have a dummy handler to prevent this. Now
the worker can handle the closing of the socket.

Change-Id: I13d6e9da48d12f93c00bd2d021789bde71aca7cf
Andreas Eversberg at

#28305 (Apr 27, 2026, 2:13:31 PM)

Remove unconditional assignment of asn_debug = 0

It is now the default and there is no code to set it.
Remove the assignment

Change-Id: I114e9773a1d0aa3c16990a946cf91c69b9c2498a
lynxis at

#28304 (Apr 27, 2026, 2:13:29 PM)

asn1: move asn_debug into librspro

To allow compiling the asn code with `-DEMIT_ASN_DEBUG=1`.
Otherwise it will fail with an unresolved symbol because
librspro is compiled as shared-object.
Further initialize it as disable (0).

Change-Id: Icb03e8905f3b38ecebfcf294727a01f994511cce
lynxis at

#28303 (Apr 27, 2026, 1:52:54 PM)

Remove unconditional assignment of asb_debug = 0

It is now the default and there is no code to set it.
Remove the assignment

Change-Id: I114e9773a1d0aa3c16990a946cf91c69b9c2498a
lynxis at

#28302 (Apr 27, 2026, 1:52:51 PM)

asn1: move asn_debug into librspro

To allow compiling the asn code with `-DEMIT_ASN_DEBUG=1`.
Otherwise it will fail with an unresolved symbol because
librspro is compiled as shared-object.
Further initialize it as disable (0).

Change-Id: Icb03e8905f3b38ecebfcf294727a01f994511cce
lynxis at

#28301 (Apr 27, 2026, 1:52:07 PM)

rspro_util: asn1 decode: fix memleak when decoding fails

Change-Id: I071343d0134dbffb1bb71ea26a5b514be1b5bb27
lynxis at

#28300 (Apr 27, 2026, 1:52:01 PM)

asn1: ber_decoder: disable stack size check on ctx = NULL

The stack size check is triggering when using asan or
when compile with -O1.
It is unclear why this is problematic.
This is a not a leak.

Related: OS#7002
Change-Id: Id99531f62ccdf73497bb08483ca6adbabe1a7cd7
lynxis at

#28299 (Apr 27, 2026, 1:16:34 PM)

Fix: Prevent race conditions when accessing slotmap in bankd

All threads (main and workers) can use slotmap_by_bank() and
slotmap_by_client() to get a mapping entry from the slot map. While
working with this entry (reading values), it could be deleted by a
different thread.

For example, if a client connects to a worker, the worker will check if
there is an existing mapping between a reader and this client. If it
exists, slotmap_by_client() will return a pointer. If the mapping is
deleted at this time by the server, the worker uses a pointer to a
mapping entry that has just been freed.

Change-Id: I3464726f37beb7c47b4e1f00c018ffa4f3948906
Andreas Eversberg at

#28298 (Apr 27, 2026, 1:16:25 PM)

Fix: Prevent bankd from exiting upon SIGPIPE

If a client disconnects from a worker thread while the worker is
responding to a to a request from that client, the socket is closed and
SIGPIPE is sent to the worker, causing the application to exit.

To prevent this, all workers have a dummy handler to prevent this. Now
the worker can handle the closing of the socket.

Change-Id: I13d6e9da48d12f93c00bd2d021789bde71aca7cf
Andreas Eversberg at

#28297 (Apr 27, 2026, 1:16:17 PM)

Fix: Remove slot mapping at bankd when client disconnects

If a client disconnects before removing the slot mapping, the worker
must undefine its 'bank_id' and 'slot_nr' and must change its state to
'UNMAPPED'.

send_signal_to_worker() searches for a worker that has a given bank and
slot. If a client re-connects to a different worker and if the bank and
slot would be still assigned to the old worker, the old worker could
receive signals when assigning or removing slot mapping. The new worker
would not be mapped.

Change-Id: I2fd03490e2506c55104309a0ef952389119023b8
Andreas Eversberg at

#28296 (Apr 27, 2026, 9:23:18 AM)

Fix: Prevent bankd from exiting upon SIGPIPE

If a client disconnects from a worker thread while the worker is
responding to a to a request from that client, the socket is closed and
SIGPIPE is sent to the worker, causing the application to exit.

To prevent this, all workers have a dummy handler to prevent this. Now
the worker can handle the closing of the socket.

Change-Id: I13d6e9da48d12f93c00bd2d021789bde71aca7cf
Andreas Eversberg at

#28295 (Apr 27, 2026, 9:21:06 AM)

ts_51_011/EF.SMSP: fix handling of 'alpha_id' field

The field 'alpha_id' is technically not an optional field, even though
the specification describes it as optional. Once the card manufacturer
decides that the field should be present, it must be always present and
vice versa.

(see code comment for a more detailed description)

Related: SYS#7765
Change-Id: I0ec99b2648b22c56f9145345e4cd8776f9217701
pmaier@sysmocom.de at

#28294 (Apr 27, 2026, 9:20:59 AM)

pySim-prog/cards: fix programming of EF.SMSP

The legacy code found in legacy/cards.py does not use the modern
construct based encoder (pySim-read uses it). The card classes either
use their own implementation of update_smsp or use the generic method
provided by the SimCard class. The latter one is true for FairwavesSIM
and WavemobileSim.

Unfortunately the implementation found in the SimCard is wrong. It
adds padding at the end of the file instead of the beginning. This
completely messes up the contents of EF.SMSP for the cards using this
method. To fix this, let's use the leftpad feature provided by
the update_record. This will ensure a correct alignment of the file
contents.

Related: SYS#7765
Change-Id: Ie112418f1f1461762d61365d3863181ca6be7245
pmaier@sysmocom.de at

#28293 (Apr 27, 2026, 8:04:33 AM)

pySim/transport: fix GET RESPONSE behaviour

The current behavior we implement in the method __send_apdu_T0 is
incomplete. Some details discussed in ETSI TS 102 221,
section 7.3.1.1.4, clause 4 seem to be not fully implemented. We
may also end up sending a GET RESPONSE in other APDU cases than
case 4 (the only case that uses the GET RESPONSE command).

Related: OS#6970
Change-Id: I26f0566af0cdd61dcc97f5f502479dc76adc37cc
pmaier@sysmocom.de at

#28292 (Apr 27, 2026, 2:18:41 AM)

trx, bts: add optional WebSDR backend (callback-based transport)

Introduce WebSDR backend enabled via ENABLE_WEBSDR,
adding an alternative callback-based transport alongside
existing socket-based TRX/OSMUX I/O

Implement:
- TRX control via osmotrxlib_process_command()
- TRXD data via apitrx_tx_call()/trx_data_read()
- clock handling via apibts_clock_ind() and external timers
- Osmux integration via ws_osmux_* helpers

Adapt scheduler to support API-based burst submission and
external timer callbacks in WebSDR mode

Disable signal handling, stats and socket I/O when building
with ENABLE_WEBSDR

Add WebSDR API entrypoint, Emscripten build target and
example configuration

Enables running BTS/TRX stack in WebAssembly environments

Change-Id: Idebd588f33afd85021813ad5821391781db683a9
dtv.comp at

#28291 (Apr 27, 2026, 2:18:36 AM)

trx: add JSON stats export for WebSDR API

Introduce stats_json.c providing JSON serialization for:
- stats and counters
- rate counters
- BTS state
- TRX/transceiver state
- WebSDR runtime metrics

Add osmobts_get_stats() API to expose these via WebSDR
interface and export it in Emscripten build

This enables programmatic access to data previously available
via VTY (e.g. "show stats", "show bts")

Change-Id: Ifb82adfab879a65ecd222c45e06551983aa90a0f
dtv.comp at

#28290 (Apr 27, 2026, 2:13:35 AM)

trx: add JSON stats export for WebSDR API

Introduce stats_json.c providing JSON serialization for:
- stats and counters
- rate counters
- BTS state
- TRX/transceiver state
- WebSDR runtime metrics

Add osmobts_get_stats() API to expose these via WebSDR
interface and export it in Emscripten build

This enables programmatic access to data previously available
via VTY (e.g. "show stats", "show bts")

Change-Id: Ifb82adfab879a65ecd222c45e06551983aa90a0f
dtv.comp at

#28289 (Apr 27, 2026, 2:13:32 AM)

trx, bts: add optional WebSDR backend (callback-based transport)

Introduce WebSDR backend enabled via ENABLE_WEBSDR,
adding an alternative callback-based transport alongside
existing socket-based TRX/OSMUX I/O

Implement:
- TRX control via osmotrxlib_process_command()
- TRXD data via apitrx_tx_call()/trx_data_read()
- clock handling via apibts_clock_ind() and external timers
- Osmux integration via ws_osmux_* helpers

Adapt scheduler to support API-based burst submission and
external timer callbacks in WebSDR mode

Disable signal handling, stats and socket I/O when building
with ENABLE_WEBSDR

Add WebSDR API entrypoint, Emscripten build target and
example configuration

Enables running BTS/TRX stack in WebAssembly environments

Change-Id: Idebd588f33afd85021813ad5821391781db683a9
dtv.comp at

#28288 (Apr 27, 2026, 12:57:46 AM)

build: make linux/if_packet.h usage optional

Check for presence of linux/if_packet.h in configure and
guard its usage with HAVE_LINUX_IF_PACKET_H.

This avoids build failures on non-Linux platforms or
environments where the header is unavailable.

Change-Id: I8a02b0676e65fa4b6191073c84e0646a2e67a010
dtv.comp at

#28287 (Apr 27, 2026, 12:57:40 AM)

trx: factor out TRXD data submission helper

Extract TRXD data sending into trx_data_submit_msg() and
reuse it from trx_if_send_burst()

This separates transport-specific I/O from message construction
and prepares for alternative backends

No functional changes intended

Change-Id: Ie89ac6efe2f5af0b4cbe5a259a18770b8d2de859
dtv.comp at

#28286 (Apr 27, 2026, 12:57:37 AM)

trx: handle synchronous TRX control callbacks in provision FSM

Set *_sent flags before issuing TRX control commands to ensure
correct state when responses are delivered synchronously
(e.g. WebUSB callback path)

Also guard FSM state handling in st_open_poweroff() to avoid
duplicate transitions if state was already changed by a
synchronous response

No functional change for asynchronous (socket-based) backends

Change-Id: I50c95e3796839e9fe721bff6f96fed4c490c6018
dtv.comp at

#28285 (Apr 27, 2026, 12:57:33 AM)

trx: split TRXD parsing from socket callback

Extract TRXD message parsing into trx_data_read() and
reuse it from trx_data_read_cb()

This decouples parsing from socket I/O and allows reuse
with alternative transports

No functional changes intended

Change-Id: I50ad8b6d2edfd91f2d569cd8badf5c036fbf87ed
dtv.comp at

#28284 (Apr 27, 2026, 12:57:29 AM)

bts: guard AMR RTP decoder stub with HAVE_LIBOSMOCODEC_STATIC

Disable dummy osmo_amr_rtp_dec() implementation when
linking against static libosmocodec to avoid symbol
conflicts

Apply to omldummy and virtual BTS models

Change-Id: Ie19ae2013893575a2f74a87af2151034abf57870
dtv.comp at

#28283 (Apr 27, 2026, 12:57:22 AM)

smux: allow lchan lookup without remote address

Make rem_addr optional in osmux_lchan_find() by skipping
address comparison when it is NULL

This allows callers without socket-based addressing to
locate lchans by CID only (e.g. callback-based transports)

Change-Id: I7a275dad2353241c7b04cdb5d6cc1436a175c1f3
dtv.comp at

#28282 (Apr 27, 2026, 12:57:19 AM)

trx: factor out TRX ctrl message submission

Extract TRX control message sending logic into
trx_ctrl_submit_msg() and reuse it from trx_ctrl_send()

This separates message construction from transport-specific
submission and prepares for alternative backends

No functional changes intended

Change-Id: Ibbd50117db4531efbc374e43e3802f9f995362cd
dtv.comp at

#28281 (Apr 27, 2026, 12:57:16 AM)

trx: factor out FN timer processing into common helper

Extract core FN timer handling logic into trx_fn_timer_process()
to decouple it from timerfd-specific code.

This allows reusing the same scheduling logic for alternative
timer backends (e.g. WebSDR) while keeping timerfd integration
as a thin wrapper.

No functional changes intended.

Change-Id: Ia28cce57afb3dc97c8655e855ebd5ace7e096648
dtv.comp at

#28280 (Apr 27, 2026, 12:57:12 AM)

build: make timerfd usage optional

Check for sys/timerfd.h in configure and guard its usage
with HAVE_SYS_TIMERFD_H.

This avoids build failures on platforms where timerfd is
not available.

Change-Id: Id5a700c865f984e8f99199a1e365bb7f1462030a
dtv.comp at

#28279 (Apr 27, 2026, 12:57:08 AM)

trx: split TRX ctrl response parsing from socket callback

Extract TRX control response parsing logic into
trx_ctrl_parse_rsp() and call it from trx_ctrl_read_cb()

This decouples parsing from socket I/O and allows reuse
with alternative transports

No functional changes intended

Change-Id: I255c7d554aad3ac6df2c66716fae1c1fb512110e
dtv.comp at

#28278 (Apr 27, 2026, 12:57:02 AM)

trx: add JSON stats export for WebSDR API

Introduce stats_json.c providing JSON serialization for:
- stats and counters
- rate counters
- BTS state
- TRX/transceiver state
- WebSDR runtime metrics

Add osmobts_get_stats() API to expose these via WebSDR
interface and export it in Emscripten build

This enables programmatic access to data previously available
via VTY (e.g. "show stats", "show bts")

Change-Id: Ifb82adfab879a65ecd222c45e06551983aa90a0f
dtv.comp at

#28277 (Apr 27, 2026, 12:56:57 AM)

build: add WebSDR configure option and Emscripten detection

Detect Emscripten toolchain and introduce --with-websdr
configure option

When enabled, check for libosmo-trx-websdr and required
symbol modulateBits, failing configure if missing

Change-Id: Iff4b76e339e2873686c8c15885dd498458ceb546
dtv.comp at

#28276 (Apr 27, 2026, 12:56:50 AM)

trx, bts: add optional WebSDR backend (callback-based transport)

Introduce WebSDR backend enabled via ENABLE_WEBSDR,
adding an alternative callback-based transport alongside
existing socket-based TRX/OSMUX I/O

Implement:
- TRX control via osmotrxlib_process_command()
- TRXD data via apitrx_tx_call()/trx_data_read()
- clock handling via apibts_clock_ind() and external timers
- Osmux integration via ws_osmux_* helpers

Adapt scheduler to support API-based burst submission and
external timer callbacks in WebSDR mode

Disable signal handling, stats and socket I/O when building
with ENABLE_WEBSDR

Add WebSDR API entrypoint, Emscripten build target and
example configuration

Enables running BTS/TRX stack in WebAssembly environments

Change-Id: Idebd588f33afd85021813ad5821391781db683a9
dtv.comp at

#28275 (Apr 27, 2026, 12:56:34 AM)

build: make sched_* usage optional

Add configure checks for sched_* APIs and guard usage of
sched_setscheduler with HAVE_SCHED_SETSCHEDULER.

This avoids build/runtime issues on platforms without
scheduler support.

Change-Id: I5af357c1e2074fa1e05ac6bc20af8535c474d906
dtv.comp at

#28274 (Apr 27, 2026, 12:54:39 AM)

abis: add helper to update BTS identity

Introduce abis_update() to update site_id and bts_id in
bts_dev_info at runtime

This allows adjusting BTS identity after initialization,
e.g. from external control interfaces

Change-Id: Ibafd66a1e1dc42ad0063c412087bee10d212fe33
dtv.comp at

#28273 (Apr 27, 2026, 12:54:33 AM)

trx: factor out clock indication handling into helper

Extract clock indication handling logic into trx_clk_phy()
and reuse it from trx_clk_read_cb()

This separates core FN processing from socket-specific code
and prepares for alternative clock sources

No functional changes intended

Change-Id: I0e6b3e25da14ada4d0ef86fd4c4e6bbc12e447d2
dtv.comp at

#28272 (Apr 27, 2026, 12:52:53 AM)

trx: factor out burst submission into helper

Extract TRXD burst submission logic from bts_sched_flush_buffers()
into trx_sched_submit_bursts()

No functional changes intended, this prepares for alternative
backends reusing the same scheduling logic

Change-Id: I7ce61bee4ca7ca50ef190982f1a0e4ce57c8c838
dtv.comp at

#28271 (Apr 27, 2026, 12:16:51 AM)

build: make timerfd usage optional

Check for sys/timerfd.h in configure and guard its usage
with HAVE_SYS_TIMERFD_H.

This avoids build failures on platforms where timerfd is
not available.

Change-Id: Id5a700c865f984e8f99199a1e365bb7f1462030a
dtv.comp at

#28270 (Apr 27, 2026, 12:16:48 AM)

trx: factor out burst submission into helper

Extract TRXD burst submission logic from bts_sched_flush_buffers()
into trx_sched_submit_bursts()

No functional changes intended, this prepares for alternative
backends reusing the same scheduling logic

Change-Id: I7ce61bee4ca7ca50ef190982f1a0e4ce57c8c838
dtv.comp at

#28269 (Apr 27, 2026, 12:16:46 AM)

trx: handle synchronous TRX control callbacks in provision FSM

Set *_sent flags before issuing TRX control commands to ensure
correct state when responses are delivered synchronously
(e.g. WebUSB callback path)

Also guard FSM state handling in st_open_poweroff() to avoid
duplicate transitions if state was already changed by a
synchronous response

No functional change for asynchronous (socket-based) backends

Change-Id: I50c95e3796839e9fe721bff6f96fed4c490c6018
dtv.comp at

#28268 (Apr 27, 2026, 12:16:42 AM)

build: make sched_* usage optional

Add configure checks for sched_* APIs and guard usage of
sched_setscheduler with HAVE_SCHED_SETSCHEDULER.

This avoids build/runtime issues on platforms without
scheduler support.

Change-Id: I5af357c1e2074fa1e05ac6bc20af8535c474d906
dtv.comp at

#28267 (Apr 27, 2026, 12:16:39 AM)

smux: allow lchan lookup without remote address

Make rem_addr optional in osmux_lchan_find() by skipping
address comparison when it is NULL

This allows callers without socket-based addressing to
locate lchans by CID only (e.g. callback-based transports)

Change-Id: I7a275dad2353241c7b04cdb5d6cc1436a175c1f3
dtv.comp at

#28266 (Apr 27, 2026, 12:16:36 AM)

trx: factor out clock indication handling into helper

Extract clock indication handling logic into trx_clk_phy()
and reuse it from trx_clk_read_cb()

This separates core FN processing from socket-specific code
and prepares for alternative clock sources

No functional changes intended

Change-Id: I0e6b3e25da14ada4d0ef86fd4c4e6bbc12e447d2
dtv.comp at

#28265 (Apr 27, 2026, 12:16:33 AM)

trx: factor out TRXD data submission helper

Extract TRXD data sending into trx_data_submit_msg() and
reuse it from trx_if_send_burst()

This separates transport-specific I/O from message construction
and prepares for alternative backends

No functional changes intended

Change-Id: Ie89ac6efe2f5af0b4cbe5a259a18770b8d2de859
dtv.comp at

#28264 (Apr 27, 2026, 12:16:31 AM)

trx: factor out FN timer processing into common helper

Extract core FN timer handling logic into trx_fn_timer_process()
to decouple it from timerfd-specific code.

This allows reusing the same scheduling logic for alternative
timer backends (e.g. WebSDR) while keeping timerfd integration
as a thin wrapper.

No functional changes intended.

Change-Id: Ia28cce57afb3dc97c8655e855ebd5ace7e096648
dtv.comp at

#28263 (Apr 27, 2026, 12:16:28 AM)

trx: split TRXD parsing from socket callback

Extract TRXD message parsing into trx_data_read() and
reuse it from trx_data_read_cb()

This decouples parsing from socket I/O and allows reuse
with alternative transports

No functional changes intended

Change-Id: I50ad8b6d2edfd91f2d569cd8badf5c036fbf87ed
dtv.comp at

#28262 (Apr 27, 2026, 12:16:24 AM)

trx: split TRX ctrl response parsing from socket callback

Extract TRX control response parsing logic into
trx_ctrl_parse_rsp() and call it from trx_ctrl_read_cb()

This decouples parsing from socket I/O and allows reuse
with alternative transports

No functional changes intended

Change-Id: I255c7d554aad3ac6df2c66716fae1c1fb512110e
dtv.comp at

#28261 (Apr 27, 2026, 12:16:20 AM)

bts: guard AMR RTP decoder stub with HAVE_LIBOSMOCODEC_STATIC

Disable dummy osmo_amr_rtp_dec() implementation when
linking against static libosmocodec to avoid symbol
conflicts

Apply to omldummy and virtual BTS models

Change-Id: Ie19ae2013893575a2f74a87af2151034abf57870
dtv.comp at

#28260 (Apr 27, 2026, 12:16:17 AM)

build: add WebSDR configure option and Emscripten detection

Detect Emscripten toolchain and introduce --with-websdr
configure option

When enabled, check for libosmo-trx-websdr and required
symbol modulateBits, failing configure if missing

Change-Id: Iff4b76e339e2873686c8c15885dd498458ceb546
dtv.comp at

#28259 (Apr 27, 2026, 12:16:14 AM)

abis: add helper to update BTS identity

Introduce abis_update() to update site_id and bts_id in
bts_dev_info at runtime

This allows adjusting BTS identity after initialization,
e.g. from external control interfaces

Change-Id: Ibafd66a1e1dc42ad0063c412087bee10d212fe33
dtv.comp at

#28258 (Apr 27, 2026, 12:16:11 AM)

build: make linux/if_packet.h usage optional

Check for presence of linux/if_packet.h in configure and
guard its usage with HAVE_LINUX_IF_PACKET_H.

This avoids build failures on non-Linux platforms or
environments where the header is unavailable.

Change-Id: I8a02b0676e65fa4b6191073c84e0646a2e67a010
dtv.comp at

#28257 (Apr 27, 2026, 12:16:07 AM)

trx: add JSON stats export for WebSDR API

Introduce stats_json.c providing JSON serialization for:
- stats and counters
- rate counters
- BTS state
- TRX/transceiver state
- WebSDR runtime metrics

Add osmobts_get_stats() API to expose these via WebSDR
interface and export it in Emscripten build

This enables programmatic access to data previously available
via VTY (e.g. "show stats", "show bts")

Change-Id: Ifb82adfab879a65ecd222c45e06551983aa90a0f
dtv.comp at

#28256 (Apr 27, 2026, 12:16:02 AM)

trx, bts: add optional WebSDR backend (callback-based transport)

Introduce WebSDR backend enabled via ENABLE_WEBSDR,
adding an alternative callback-based transport alongside
existing socket-based TRX/OSMUX I/O

Implement:
- TRX control via osmotrxlib_process_command()
- TRXD data via apitrx_tx_call()/trx_data_read()
- clock handling via apibts_clock_ind() and external timers
- Osmux integration via ws_osmux_* helpers

Adapt scheduler to support API-based burst submission and
external timer callbacks in WebSDR mode

Disable signal handling, stats and socket I/O when building
with ENABLE_WEBSDR

Add WebSDR API entrypoint, Emscripten build target and
example configuration

Enables running BTS/TRX stack in WebAssembly environments

Change-Id: Idebd588f33afd85021813ad5821391781db683a9
dtv.comp at

#28255 (Apr 27, 2026, 12:14:55 AM)

trx: factor out TRX ctrl message submission

Extract TRX control message sending logic into
trx_ctrl_submit_msg() and reuse it from trx_ctrl_send()

This separates message construction from transport-specific
submission and prepares for alternative backends

No functional changes intended

Change-Id: Ibbd50117db4531efbc374e43e3802f9f995362cd
dtv.comp at

#28254 (Apr 26, 2026, 8:47:41 AM)

tcap_as_loadshare: Clarify name of tcap asp selection function

Change-Id: I327ad282d2689be2bcf7d3da23026717923c9325
dwillmann at

#28253 (Apr 26, 2026, 8:47:33 AM)

tcap_as_loadshare: Route msg based on TCAP route if cache lookup fails

Related: SYS#5423
Change-Id: I2fd9068be8a0a512b17c8bd2365aa87c266e5669
dwillmann at

#28252 (Apr 26, 2026, 8:46:03 AM)

tcap_as_loadshare: Don't fill in PC from M3UA

If both calling and called_addr are not point codes then the compare in
tcap_trans_track_entry_find() will ignore them. It still matches on
otid/dtid.

Related: SYS#5423
Change-Id: I4f99fc87cd33ee3f2aad531710cc39a9b9c7e6d9
dwillmann at

#28251 (Apr 26, 2026, 8:45:42 AM)

tcap_as_loadshare: Use tcap_trans_track_begin instead of *_entry_create

*_begin checks for a matching entry and reuses that (with an updated
timestamp). This avoids duplicate entries in the tcap cache.

Related: SYS#5423
Change-Id: Icbaab976ed8207843129291494176679db574304
dwillmann at

#28250 (Apr 26, 2026, 8:44:13 AM)

stp: Test TCAP routing with a different called address answering

Change-Id: I6d586b17b767219d20646f7cd1b59d6719cdbcdb
Related: SYS#5423
dwillmann at

#28249 (Apr 26, 2026, 8:44:07 AM)

stp: Make TCAP tests more realistic

Use a TCAP id outside of the TCAP routing range for the M3UA TCAP id.
Test both directions IPA -> M3UA and M3UA -> IPA.

Change-Id: Ia807c2b26e5188b700365650311cabc0f9095674
Related: SYS#5423
dwillmann at

#28248 (Apr 26, 2026, 2:23:57 AM)

HDLC timeslots: fix Rx of maximum-sized frames

E1D protocol sets the maximum permitted size of an HDLC frame to
264 bytes of useful payload, not counting the 2 bytes of FCS.
This limit is fair enough, as it matches GSM TS 08.56, the primary
intended application.  However, osmo_isdnhdlc engine used internally
by the daemon requires an Rx buffer 2 bytes larger than the maximum
payload length, for temporary storage of FCS bytes: by the nature
of HDLC, a receiver has no way of identifying FCS bytes as such
until after they have been received and stored in the Rx buffer.

This bug was caught when bringing up OsmoBSC with Nokia Flexi
Multiradio BTS.  This BTS emits some long OML messages that get
broken into segments, with each not-last segment traveling over
HDLC as a maximum-sized frame - and these frames then get dropped
by osmo-e1d, causing further breakage downstream.

Change-Id: I479e8fe5118c8eb7d4e6b16b49047a3278bc9808
falcon at

#28247 (Apr 26, 2026, 2:22:57 AM)

cosmetic: fix white space in lapd_sap_{start,stop}()

Change-Id: Iadf8629bc3bdf18260b1b83290ce95483d8aac2c
falcon at

#28246 (Apr 26, 2026, 2:22:46 AM)

lapd_sap_stop(): fix use of uninitialized stack memory

DL-RELEASE in lapd_core can be done in two ways: by sending DISC
and waiting for UA, or a purely local clearing of state.  The
selection between these two modes is communicated via an extended
field in struct osmo_dlsap_prim that extends beyond the standard
struct osmo_prim_hdr.  lapd_sap_stop() is a wrapper function that
sends DL-RELEASE to lapd_core; its only current users are the
vendor-specific E1 BTS handlers for Ericsson and Nokia in OsmoBSC,
and both of those need local release handling.  This wrapper
function does allocate correctly-sized struct osmo_dlsap_prim
on the stack, but until now it failed to initialize the extended
field - hence the actual behavior was subject to laws of chance,
depending on uninitialized content of stack memory.

Change-Id: Ic1469698ee8edf9b6fb55df8f79cc062be711f61
falcon at

#28245 (Apr 25, 2026, 9:56:36 PM)

UppAudit: better indicate exception cause

Change-Id: I4d986b89a473a5b12ed56b4710263b034876a33e
Jenkins: skip-card-test
Vadim Yanitskiy at

#28244 (Apr 25, 2026, 9:56:31 PM)

test_configurable_parameters.py: add tests for new parameters

For:
SmspTpScAddr
MilenageRotation
MilenageXoringConstants
TuakNrOfKeccak

Change-Id: Iecbea14fe31a9ee08d871dcde7f295d26d7bd001
Jenkins: skip-card-test
Vadim Yanitskiy at

#28243 (Apr 25, 2026, 9:56:09 PM)

generate sdkey classes from a list

Change-Id: Ic92ddea6e1fad8167ea75baf78ffc3eb419838c4
Jenkins: skip-card-test
Vadim Yanitskiy at

#28242 (Apr 25, 2026, 9:55:54 PM)

ConfigurableParameter: safer val length check

validate_val() calls len() to check the value against allow_len,
min_len and max_len. len() requires the object to have a __len__()
method, which integers do not — calling len() on an int raises
TypeError.

Fix this by checking for __len__ first: if present, use len(val) as
usual; otherwise fall back to len(str(val)), which gives the number
of decimal digits for integer values.

Change-Id: Ibe91722ed1477b00d20ef5e4e7abd9068ff2f3e4
Jenkins: skip-card-test
Vadim Yanitskiy at

#28241 (Apr 25, 2026, 9:41:05 PM)

trx: add JSON serialization for 'show trx'

Introduce trx_to_json() helper to serialize the output of
'show trx' into JSON format.

Also initialize talloc/VTY context in websdr entrypoint to
allow accessing TRX configuration programmatically.

Intended for external consumers (e.g. WebSDR frontend).

Change-Id: Icbfb754580daa6db9b5646cc6698a6a6ee1c1610
dtv.comp at

#28240 (Apr 25, 2026, 9:38:21 PM)

saip/param_source: try to not repeat random values

Change-Id: I4fa743ef5677580f94b9df16a5051d1d178edeb0
Jenkins: skip-card-test
Vadim Yanitskiy at

#28239 (Apr 25, 2026, 9:38:11 PM)

personalization.ConfigurableParameter: fix BytesIO() input

Change-Id: I0ad160eef9015e76eef10baee7c6b606fe249123
Jenkins: skip-card-test
Vadim Yanitskiy at

#28238 (Apr 25, 2026, 9:38:04 PM)

use secrets.SystemRandom as secure random nr source

secrets.SystemRandom is defined as the most secure random source
available on the given operating system.

Change-Id: I8049cd1292674b3ced82b0926569128535af6efe
Jenkins: skip-card-test
Vadim Yanitskiy at

#28237 (Apr 25, 2026, 9:37:58 PM)

personalization: fix EF_SMSP length, alpha_id padding

The efFileSize needs to be updated and the alpha_id needs to be != None.

Change-Id: Ief6e02517f3e96158a2509d763b88aec4bd5a296
Jenkins: skip-card-test
Vadim Yanitskiy at

#28236 (Apr 25, 2026, 9:37:49 PM)

add test_param_src.py

Change-Id: I03087b84030fddae98b965e0075d44e04ec6ba5c
Jenkins: skip-card-test
Vadim Yanitskiy at

#28235 (Apr 25, 2026, 9:37:45 PM)

saip SmspTpScAddr.get_values_from_pes: allow empty values

Change-Id: Ibbdd08f96160579238b50699091826883f2e9f5a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28234 (Apr 25, 2026, 9:37:39 PM)

param_source: allow plugging a random implementation (for testing)

Change-Id: Idce2b18af70c17844d6f09f7704efc869456ac39
Jenkins: skip-card-test
Vadim Yanitskiy at

#28233 (Apr 25, 2026, 9:37:32 PM)

UppAudit: better indicate exception cause

Change-Id: I4d986b89a473a5b12ed56b4710263b034876a33e
Jenkins: skip-card-test
Vadim Yanitskiy at

#28232 (Apr 25, 2026, 9:37:24 PM)

personalization: add int as input type for BinaryParameter

Change-Id: I31d8142cb0847a8b291f8dc614d57cb4734f0190
Jenkins: skip-card-test
Vadim Yanitskiy at

#28231 (Apr 25, 2026, 9:37:10 PM)

add comment about not updating existing key_usage_qualifier

Change-Id: Ie23ae5fde17be6b37746784bf1601b4d0874397a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28230 (Apr 25, 2026, 9:37:00 PM)

ConfigurableParameter: safer val length check

validate_val() calls len() to check the value against allow_len,
min_len and max_len. len() requires the object to have a __len__()
method, which integers do not — calling len() on an int raises
TypeError.

Fix this by checking for __len__ first: if present, use len(val) as
usual; otherwise fall back to len(str(val)), which gives the number
of decimal digits for integer values.

Change-Id: Ibe91722ed1477b00d20ef5e4e7abd9068ff2f3e4
Jenkins: skip-card-test
Vadim Yanitskiy at

#28229 (Apr 25, 2026, 9:36:50 PM)

MncLen

Change-Id: I6c600faeab00ffb072acbe94c9a8b2d1397c07d3
Jenkins: skip-card-test
Vadim Yanitskiy at

#28228 (Apr 25, 2026, 9:36:43 PM)

ConfigurableParameter: do not magically overwrite the 'name' attribute

Change-Id: I6f631444c6addeb7ccc5f6c55b9be3dc83409169
Jenkins: skip-card-test
Vadim Yanitskiy at

#28227 (Apr 25, 2026, 9:36:36 PM)

generate sdkey classes from a list

Change-Id: Ic92ddea6e1fad8167ea75baf78ffc3eb419838c4
Jenkins: skip-card-test
Vadim Yanitskiy at

#28226 (Apr 25, 2026, 9:36:29 PM)

test_configurable_parameters.py: add tests for new parameters

For:
SmspTpScAddr
MilenageRotation
MilenageXoringConstants
TuakNrOfKeccak

Change-Id: Iecbea14fe31a9ee08d871dcde7f295d26d7bd001
Jenkins: skip-card-test
Vadim Yanitskiy at

#28225 (Apr 25, 2026, 9:36:21 PM)

add test_configurable_parameters.py

Add ConfigurableParameterTest, which applies each parameter to a real
UPP DER template and reads it back, comparing results against a stored
expected-output snapshot (xo/test_configurable_parameters).

Add TestValidateVal covering validate_val() for Iccid, Imsi, Pin1, Puk1
and K, testing both valid inputs and invalid ones expected to raise
ValueError.

Add TestEnumParam covering the EnumParam methods (validate_val,
map_name_to_val, map_val_to_name, name_normalize, clean_name_str) using
AlgorithmID as the concrete subclass, including fuzzy name matching.

Also add get_value_from_pes() to ConfigurableParameter as a convenience
wrapper around get_values_from_pes() that asserts all returned values
are identical and returns the single result.

Change-Id: Ia55f0d11f8197ca15a948a83a34b3488acf1a0b4
Co-authored-by: Vadim Yanitskiy <vyanitskiy@sysmocom.de>
Jenkins: skip-card-test
Vadim Yanitskiy at

#28224 (Apr 25, 2026, 9:36:14 PM)

use random.SystemRandom as random nr source (/dev/urandom)

/dev/urandom is somewhat better than python's PRNG

Change-Id: I6de38c14ac6dd55bc84d53974192509c18d02bfa
Jenkins: skip-card-test
Vadim Yanitskiy at

#28223 (Apr 25, 2026, 9:36:08 PM)

saip: add numeric_base indicator to ConfigurableParameter

By default, numeric_base = None, to indicate that there are no explicit
limitations on the number space.

For parameters that are definitely decimal, set numeric_base = 10.
For definitely hexadecimal, set numeric_base = 16.

Do the same for ConfigurableParameter as well as ParamSource, so callers
can match them up: if a parameter is numeric_base = 10, then omit
sources that are numeric_base = 16, and vice versa.

Change-Id: Ib0977bbdd9a85167be7eb46dd331fedd529dae01
Jenkins: skip-card-test
Vadim Yanitskiy at

#28222 (Apr 25, 2026, 9:35:59 PM)

personalization audit: optionally audit all (unknown) SD keys

By a flag, allow to audit also all Security Domain KVN that we have
*not* created ConfigurableParameter subclasses for.

For example, SCP80 has reserved kvn 0x01..0x0f, but we offer only
Scp80Kvn01, Scp80Kvn02, Scp80Kvn03. So we would not show kvn
0x03..0x0f in an audit.

This patch includes audits of all SD key kvn there may be in the UPP.
This will help to spot SD keys that may already be present in a UPP
template, with unexpected / unusual kvn.

Change-Id: Icaf6f7b589f117868633c0968a99f2f0252cf612
Jenkins: skip-card-test
Vadim Yanitskiy at

#28221 (Apr 24, 2026, 10:20:41 PM)

sdkeys kv40 aes

Change-Id: If5b53c840ebd1f224f9bb4706a602b415194f47b
Jenkins: skip-card-test
Vadim Yanitskiy at

#28220 (Apr 24, 2026, 10:20:37 PM)

personalization: implement UppAudit and BatchAudit

Change-Id: Iaab336ca91b483ecdddd5c6c8e08dc475dc6bd0a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28219 (Apr 24, 2026, 10:20:33 PM)

transitional name mapping

To help existing applications transition to a common naming scheme for
the SdKey classes, offer this intermediate result, where the SdKey
classes' .name are still unchanged as before generating them.

Change-Id: I974cb6c393a2ed2248a6240c2722d157e9235c33
Jenkins: skip-card-test
Vadim Yanitskiy at

#28218 (Apr 24, 2026, 10:20:29 PM)

SdKey KVN4X ID02: set key_usage_qual=0x48

Related: SYS#7865
Change-Id: Idc5d33a4a003801f60c95fff6931706a9aeb6692
Jenkins: skip-card-test
Vadim Yanitskiy at

#28217 (Apr 24, 2026, 10:20:22 PM)

saip SmspTpScAddr.get_values_from_pes: allow empty values

Change-Id: Ibbdd08f96160579238b50699091826883f2e9f5a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28216 (Apr 24, 2026, 10:20:16 PM)

add comment about not updating existing key_usage_qualifier

Change-Id: Ie23ae5fde17be6b37746784bf1601b4d0874397a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28215 (Apr 24, 2026, 10:20:08 PM)

saip SmspTpScAddr: safeguard against decoding error

Reading the TS48 V6.0 eSIM_GTP_SAIP2.1A_NoBERTLV profile results in an
exception [1] in SmspTpScAddr. I have a caller that needs to skip
erratic values instead of raising.

The underlying issue, I presume, is that either the data needs
validation before decode_record_bin(), or decode_record_bin() needs
well-defined error handling.

So far I know only of this IndexError, so, as a workaround, catch that.

[1]
  File "/pysim/pySim/esim/saip/personalization.py", line 617, in get_values_from_pes
    ef_smsp_dec = ef_smsp.decode_record_bin(f_smsp.body, 1)
  File "/pysim/pySim/filesystem.py", line 1047, in decode_record_bin
    return parse_construct(self._construct, raw_bin_data)
  File "/application/venv/lib/python3.13/site-packages/osmocom/construct.py", line 550, in parse_construct
    parsed = c.parse(raw_bin_data, total_len=length, **context)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 404, in parse
    return self.parse_stream(io.BytesIO(data), **contextkw)
           ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 416, in parse_stream
    return self._parsereport(stream, context, "(parsing)")
           ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 428, in _parsereport
    obj = self._parse(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 2236, in _parse
    subobj = sc._parsereport(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 428, in _parsereport
    obj = self._parse(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 2770, in _parse
    return self.subcon._parsereport(stream, context, path)
           ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 428, in _parsereport
    obj = self._parse(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 2236, in _parse
    subobj = sc._parsereport(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 428, in _parsereport
    obj = self._parse(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 2770, in _parse
    return self.subcon._parsereport(stream, context, path)
           ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 428, in _parsereport
    obj = self._parse(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 820, in _parse
    return self._decode(obj, context, path)
           ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/application/venv/lib/python3.13/site-packages/osmocom/construct.py", line 268, in _decode
    if r[-1] == 'f':
       ~^^^^
  File "/application/venv/lib/python3.13/site-packages/osmocom/utils.py", line 50, in __getitem__
    return hexstr(super().__getitem__(val))
                  ~~~~~~~~~~~~~~~~~~~^^^^^
IndexError: string index out of range

Change-Id: Ic436e206776b81f24de126e8ee0ae8bf5f3e8d7a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28214 (Apr 24, 2026, 10:19:58 PM)

personalization audit: optionally audit all (unknown) SD keys

By a flag, allow to audit also all Security Domain KVN that we have
*not* created ConfigurableParameter subclasses for.

For example, SCP80 has reserved kvn 0x01..0x0f, but we offer only
Scp80Kvn01, Scp80Kvn02, Scp80Kvn03. So we would not show kvn
0x03..0x0f in an audit.

This patch includes audits of all SD key kvn there may be in the UPP.
This will help to spot SD keys that may already be present in a UPP
template, with unexpected / unusual kvn.

Change-Id: Icaf6f7b589f117868633c0968a99f2f0252cf612
Jenkins: skip-card-test
Vadim Yanitskiy at

#28213 (Apr 24, 2026, 10:19:50 PM)

personalization: fix SdKey.apply_val() implementation

'securityDomain' elements are decoded to ProfileElementSD instances,
which keep higher level representations of the key data apart from the
decoded[] lists.

So far, apply_val() was dropping binary values in decoded[], which does
not work, because ProfileElementSD._pre_encode() overwrites
self.decoded[] from the higher level representation.

Implement using
- ProfileElementSD.find_key() and SecurityDomainKeyComponent to modify
  an exsiting entry, or
- ProfileElementSD.add_key() to create a new entry.

Before this patch, SdKey parameters seemed to patch PES successfully,
but their modifications did not end up in the encoded DER.

(BTW, this does not fix any other errors that may still be present in
the various SdKey subclasses, patches coming up.)

Related: SYS#6768
Change-Id: I07dfc378705eba1318e9e8652796cbde106c6a52
Jenkins: skip-card-test
Vadim Yanitskiy at

#28212 (Apr 24, 2026, 10:19:43 PM)

personalization.ConfigurableParameter: fix BytesIO() input

Change-Id: I0ad160eef9015e76eef10baee7c6b606fe249123
Jenkins: skip-card-test
Vadim Yanitskiy at

#28211 (Apr 24, 2026, 10:19:24 PM)

add test_param_src.py

Change-Id: I03087b84030fddae98b965e0075d44e04ec6ba5c
Jenkins: skip-card-test
Vadim Yanitskiy at

#28210 (Apr 24, 2026, 10:19:19 PM)

generate sdkey classes from a list

Change-Id: Ic92ddea6e1fad8167ea75baf78ffc3eb419838c4
Jenkins: skip-card-test
Vadim Yanitskiy at

#28209 (Apr 24, 2026, 10:19:17 PM)

remove transitional name mapping

This reverts commit I974cb6c393a2ed2248a6240c2722d157e9235c33

Now, finally, all SdKey classes have a unified logical naming scheme.

Change-Id: Ic185af4a903c2211a5361d023af9e7c6fc57ae78
Jenkins: skip-card-test
Vadim Yanitskiy at

#28208 (Apr 24, 2026, 10:19:13 PM)

ConfigurableParameter: do not magically overwrite the 'name' attribute

Change-Id: I6f631444c6addeb7ccc5f6c55b9be3dc83409169
Jenkins: skip-card-test
Vadim Yanitskiy at

#28207 (Apr 24, 2026, 10:19:10 PM)

saip/param_source: try to not repeat random values

Change-Id: I4fa743ef5677580f94b9df16a5051d1d178edeb0
Jenkins: skip-card-test
Vadim Yanitskiy at

#28206 (Apr 24, 2026, 10:19:04 PM)

add test_configurable_parameters.py

Add ConfigurableParameterTest, which applies each parameter to a real
UPP DER template and reads it back, comparing results against a stored
expected-output snapshot (xo/test_configurable_parameters).

Add TestValidateVal covering validate_val() for Iccid, Imsi, Pin1, Puk1
and K, testing both valid inputs and invalid ones expected to raise
ValueError.

Add TestEnumParam covering the EnumParam methods (validate_val,
map_name_to_val, map_val_to_name, name_normalize, clean_name_str) using
AlgorithmID as the concrete subclass, including fuzzy name matching.

Also add get_value_from_pes() to ConfigurableParameter as a convenience
wrapper around get_values_from_pes() that asserts all returned values
are identical and returns the single result.

Change-Id: Ia55f0d11f8197ca15a948a83a34b3488acf1a0b4
Co-authored-by: Vadim Yanitskiy <vyanitskiy@sysmocom.de>
Jenkins: skip-card-test
Vadim Yanitskiy at

#28205 (Apr 24, 2026, 10:19:01 PM)

esim.saip.personalization: fix TLSPSK keys

Add AES variant of TLSPSK DEK (SCP81 KVN40 key_id=0x02).

Change-Id: I713a008fd26bbfcf437e0f29717b753f058ce76a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28204 (Apr 24, 2026, 10:18:57 PM)

use random.SystemRandom as random nr source (/dev/urandom)

/dev/urandom is somewhat better than python's PRNG

Change-Id: I6de38c14ac6dd55bc84d53974192509c18d02bfa
Jenkins: skip-card-test
Vadim Yanitskiy at

#28203 (Apr 24, 2026, 10:18:54 PM)

personalization: fix EF_SMSP length, alpha_id padding

The efFileSize needs to be updated and the alpha_id needs to be != None.

Change-Id: Ief6e02517f3e96158a2509d763b88aec4bd5a296
Jenkins: skip-card-test
Vadim Yanitskiy at

#28202 (Apr 24, 2026, 10:18:50 PM)

personalization: add get_typical_input_len() to ConfigurableParameter

The aim is to tell a user interface how wide an input text field should
be chosen to be convenient -- ideally showing the entire value in all
cases, but not too huge for fields that have no sane size limit.

Change-Id: I2568a032167a10517d4d75d8076a747be6e21890
Jenkins: skip-card-test
Vadim Yanitskiy at

#28201 (Apr 24, 2026, 10:18:47 PM)

saip: SdKey.__doc__: update SdKey listing

Change-Id: Ib5011b0c7d76b082231744cf09077628dc4e69b7
Jenkins: skip-card-test
Vadim Yanitskiy at

#28200 (Apr 24, 2026, 10:18:43 PM)

MncLen

Change-Id: I6c600faeab00ffb072acbe94c9a8b2d1397c07d3
Jenkins: skip-card-test
Vadim Yanitskiy at

#28199 (Apr 24, 2026, 10:18:39 PM)

personalization: add int as input type for BinaryParameter

Change-Id: I31d8142cb0847a8b291f8dc614d57cb4734f0190
Jenkins: skip-card-test
Vadim Yanitskiy at

#28198 (Apr 24, 2026, 10:18:35 PM)

comment in uicc.py on Security Domain Keys: add SCP81

Change-Id: Ib0205880f58e78c07688b4637abd5f67ea0570d1
Jenkins: skip-card-test
Vadim Yanitskiy at

#28197 (Apr 24, 2026, 10:18:30 PM)

test_configurable_parameters.py: add tests for new parameters

For:
SmspTpScAddr
MilenageRotation
MilenageXoringConstants
TuakNrOfKeccak

Change-Id: Iecbea14fe31a9ee08d871dcde7f295d26d7bd001
Jenkins: skip-card-test
Vadim Yanitskiy at

#28196 (Apr 24, 2026, 10:18:27 PM)

use secrets.SystemRandom as secure random nr source

secrets.SystemRandom is defined as the most secure random source
available on the given operating system.

Change-Id: I8049cd1292674b3ced82b0926569128535af6efe
Jenkins: skip-card-test
Vadim Yanitskiy at

#28195 (Apr 24, 2026, 10:18:23 PM)

param_source: allow plugging a random implementation (for testing)

Change-Id: Idce2b18af70c17844d6f09f7704efc869456ac39
Jenkins: skip-card-test
Vadim Yanitskiy at

#28194 (Apr 24, 2026, 10:18:19 PM)

ConfigurableParameter: safer val length check

Change-Id: Ibe91722ed1477b00d20ef5e4e7abd9068ff2f3e4
Jenkins: skip-card-test
Vadim Yanitskiy at

#28193 (Apr 24, 2026, 10:18:15 PM)

saip: add numeric_base indicator to ConfigurableParameter

By default, numeric_base = None, to indicate that there are no explicit
limitations on the number space.

For parameters that are definitely decimal, set numeric_base = 10.
For definitely hexadecimal, set numeric_base = 16.

Do the same for ConfigurableParameter as well as ParamSource, so callers
can match them up: if a parameter is numeric_base = 10, then omit
sources that are numeric_base = 16, and vice versa.

Change-Id: Ib0977bbdd9a85167be7eb46dd331fedd529dae01
Jenkins: skip-card-test
Vadim Yanitskiy at

#28192 (Apr 24, 2026, 10:18:12 PM)

UppAudit: better indicate exception cause

Change-Id: I4d986b89a473a5b12ed56b4710263b034876a33e
Jenkins: skip-card-test
Vadim Yanitskiy at

#28191 (Apr 24, 2026, 10:18:08 PM)

personalization: make AlgorithmID a new EnumParam

The AlgorithmID has a few preset values, and hardly anyone knows which
is which. So instead of entering '1', '2' or '3', make it work with
prededined values 'Milenage', 'TUAK' and 'usim-test'.

Implement the enum value part abstractly in new EnumParam.

Make AlgorithmID a subclass of EnumParam and define the values as from
pySim/esim/asn1/saip/PE_Definitions-3.3.1.asn

Related: SYS#6768
Change-Id: I71c2ec1b753c66cb577436944634f32792353240
Jenkins: skip-card-test
Vadim Yanitskiy at

#28190 (Apr 24, 2026, 10:18:03 PM)

personalization: add param_source.py, add batch.py

Implement pySim.esim.saip.batch.BatchPersonalization,
generating N eSIM profiles from a preset configuration.

Batch parameters can be fed by a constant, incrementing, random or from
CSV rows: add pySim.esim.saip.param_source.* classes to feed such input
to each of the BatchPersonalization's ConfigurableParameter instances.

Related: SYS#6768
Change-Id: I01ae40a06605eb205bfb409189fcd2b3a128855a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28189 (Apr 24, 2026, 10:17:56 PM)

personalization: implement reading back values from a PES

Implement get_values_from_pes(), the reverse direction of apply_val():
read back and return values from a ProfileElementSequence. Implement for
all ConfigurableParameter subclasses.

Future: SdKey.get_values_from_pes() is reading pe.decoded[], which works
fine, but I07dfc378705eba1318e9e8652796cbde106c6a52 will change this
implementation to use the higher level ProfileElementSD members.

Implementation detail:

Implement get_values_from_pes() as classmethod that returns a generator.
Subclasses should yield all occurences of their parameter in a given
PES.

For example, the ICCID can appear in multiple places.
Iccid.get_values_from_pes() yields all of the individual values. A set()
of the results quickly tells whether the PES is consistent.

Rationales for reading back values:

This allows auditing an eSIM profile, particularly for producing an
output.csv from a batch personalization (that generated lots of random
key material which now needs to be fed to an HLR...).

Reading back from a binary result is more reliable than storing the
values that were fed into a personalization.
By auditing final DER results with this code, I discovered:
- "oh, there already was some key material in my UPP template."
- "all IMSIs ended up the same, forgot to set up the parameter."
- the SdKey.apply() implementations currently don't work, see
  I07dfc378705eba1318e9e8652796cbde106c6a52 for a fix.

Change-Id: I234fc4317f0bdc1a486f0cee4fa432c1dce9b463
Jenkins: skip-card-test
Vadim Yanitskiy at

#28188 (Apr 24, 2026, 10:17:51 PM)

personalization: indicate default ParamSource per ConfigurableParameter

Add default_source class members pointing to ParamSource classes to all
ConfigurableParameter subclasses.

This is useful to automatically set up a default ParamSource for a given
ConfigurableParameter subclass, during user interaction to produce a
batch personalization.

For example, if the user selects a Pin1 parameter, a calling program can
implicitly set this to a RandomDigitSource, which will magically make it
work the way that most users need.

BTW, default_source and default_value can be combined to configure a
matching ParamSource instance:

  my_source = MyParam.default_source.from_str( MyParam.default_value )

Change-Id: Ie58d13bce3fa1aa2547cf3cee918c2f5b30a8b32
Jenkins: skip-card-test
Vadim Yanitskiy at

#28187 (Apr 24, 2026, 6:37:32 PM)

abis: align e1 input init prototypes for stricter compilers

Change return types of e1inp_dahdi_init(), e1inp_e1d_init() and
e1inp_rs232_init() from void to int to match their implementations.

Required for stricter compilers (e.g. Emscripten) which reject
mismatched function prototypes.

Change-Id: I93cd079003abb5665f1995647cfa94dc8e901ed9
dtv.comp at

#28186 (Apr 24, 2026, 6:37:21 PM)

abis: add optional WebSDR E1 input driver

Add a new optional E1 input backend for WebSDR, enabled via
--with-websdr.

Introduce input/websdr.c and public callback API to replace
socket-based IPA transport with a callback-driven interface
for OML/RSL and OSMUX.

Intended for WebAssembly builds where Osmocom components run
in a browser and communicate with SDR via WebUSB.

Change-Id: Ib804dc8eb67a91678603f54ea0beccd5c61e4a80
dtv.comp at

#28185 (Apr 24, 2026, 5:12:10 PM)

remsim: server: add a client timeout test

1. Connect to the server
2. Don't answer to IPA PINGs
3. Server closes the connection
4. Client reconnects
5. Older server versions will crash

Related: OS#6957
Change-Id: Iec52d3ce229c2ab84ab0ff9d8dbbff59b7f3fbd9
lynxis at

#28184 (Apr 24, 2026, 5:11:29 PM)

remsim: server: add a client timeout test

1. Connect to the server
2. Don't answer to IPA PINGs
3. Server closes the connection
4. Client reconnects
5. Older server versions will crash

Related: OS#6957
Change-Id: Iec52d3ce229c2ab84ab0ff9d8dbbff59b7f3fbd9
lynxis at

#28183 (Apr 24, 2026, 4:26:04 PM)

jenkins.sh: pin libosmocore version to current version v1.14

Change-Id: I678957099348e067d62a4abd04cbdac822463cf4
lynxis at

#28182 (Apr 24, 2026, 3:21:16 PM)

personalization: fix SdKey.apply_val() implementation

'securityDomain' elements are decoded to ProfileElementSD instances,
which keep higher level representations of the key data apart from the
decoded[] lists.

So far, apply_val() was dropping binary values in decoded[], which does
not work, because ProfileElementSD._pre_encode() overwrites
self.decoded[] from the higher level representation.

Implement using
- ProfileElementSD.find_key() and SecurityDomainKeyComponent to modify
  an exsiting entry, or
- ProfileElementSD.add_key() to create a new entry.

Before this patch, SdKey parameters seemed to patch PES successfully,
but their modifications did not end up in the encoded DER.

(BTW, this does not fix any other errors that may still be present in
the various SdKey subclasses, patches coming up.)

Related: SYS#6768
Change-Id: I07dfc378705eba1318e9e8652796cbde106c6a52
Jenkins: skip-card-test
Vadim Yanitskiy at

#28181 (Apr 24, 2026, 3:21:12 PM)

saip SmspTpScAddr: safeguard against decoding error

Reading the TS48 V6.0 eSIM_GTP_SAIP2.1A_NoBERTLV profile results in an
exception [1] in SmspTpScAddr. I have a caller that needs to skip
erratic values instead of raising.

The underlying issue, I presume, is that either the data needs
validation before decode_record_bin(), or decode_record_bin() needs
well-defined error handling.

So far I know only of this IndexError, so, as a workaround, catch that.

[1]
  File "/pysim/pySim/esim/saip/personalization.py", line 617, in get_values_from_pes
    ef_smsp_dec = ef_smsp.decode_record_bin(f_smsp.body, 1)
  File "/pysim/pySim/filesystem.py", line 1047, in decode_record_bin
    return parse_construct(self._construct, raw_bin_data)
  File "/application/venv/lib/python3.13/site-packages/osmocom/construct.py", line 550, in parse_construct
    parsed = c.parse(raw_bin_data, total_len=length, **context)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 404, in parse
    return self.parse_stream(io.BytesIO(data), **contextkw)
           ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 416, in parse_stream
    return self._parsereport(stream, context, "(parsing)")
           ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 428, in _parsereport
    obj = self._parse(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 2236, in _parse
    subobj = sc._parsereport(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 428, in _parsereport
    obj = self._parse(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 2770, in _parse
    return self.subcon._parsereport(stream, context, path)
           ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 428, in _parsereport
    obj = self._parse(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 2236, in _parse
    subobj = sc._parsereport(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 428, in _parsereport
    obj = self._parse(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 2770, in _parse
    return self.subcon._parsereport(stream, context, path)
           ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 428, in _parsereport
    obj = self._parse(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 820, in _parse
    return self._decode(obj, context, path)
           ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/application/venv/lib/python3.13/site-packages/osmocom/construct.py", line 268, in _decode
    if r[-1] == 'f':
       ~^^^^
  File "/application/venv/lib/python3.13/site-packages/osmocom/utils.py", line 50, in __getitem__
    return hexstr(super().__getitem__(val))
                  ~~~~~~~~~~~~~~~~~~~^^^^^
IndexError: string index out of range

Change-Id: Ic436e206776b81f24de126e8ee0ae8bf5f3e8d7a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28180 (Apr 24, 2026, 3:21:07 PM)

transitional name mapping

To help existing applications transition to a common naming scheme for
the SdKey classes, offer this intermediate result, where the SdKey
classes' .name are still unchanged as before generating them.

Change-Id: I974cb6c393a2ed2248a6240c2722d157e9235c33
Jenkins: skip-card-test
Vadim Yanitskiy at

#28179 (Apr 24, 2026, 3:20:56 PM)

remove transitional name mapping

This reverts commit I974cb6c393a2ed2248a6240c2722d157e9235c33

Now, finally, all SdKey classes have a unified logical naming scheme.

Change-Id: Ic185af4a903c2211a5361d023af9e7c6fc57ae78
Jenkins: skip-card-test
Vadim Yanitskiy at

#28178 (Apr 24, 2026, 3:20:48 PM)

add test_configurable_parameters.py

Change-Id: Ia55f0d11f8197ca15a948a83a34b3488acf1a0b4
Jenkins: skip-card-test
Vadim Yanitskiy at

#28177 (Apr 24, 2026, 3:20:41 PM)

personalization: implement reading back values from a PES

Implement get_values_from_pes(), the reverse direction of apply_val():
read back and return values from a ProfileElementSequence. Implement for
all ConfigurableParameter subclasses.

Future: SdKey.get_values_from_pes() is reading pe.decoded[], which works
fine, but I07dfc378705eba1318e9e8652796cbde106c6a52 will change this
implementation to use the higher level ProfileElementSD members.

Implementation detail:

Implement get_values_from_pes() as classmethod that returns a generator.
Subclasses should yield all occurences of their parameter in a given
PES.

For example, the ICCID can appear in multiple places.
Iccid.get_values_from_pes() yields all of the individual values. A set()
of the results quickly tells whether the PES is consistent.

Rationales for reading back values:

This allows auditing an eSIM profile, particularly for producing an
output.csv from a batch personalization (that generated lots of random
key material which now needs to be fed to an HLR...).

Reading back from a binary result is more reliable than storing the
values that were fed into a personalization.
By auditing final DER results with this code, I discovered:
- "oh, there already was some key material in my UPP template."
- "all IMSIs ended up the same, forgot to set up the parameter."
- the SdKey.apply() implementations currently don't work, see
  I07dfc378705eba1318e9e8652796cbde106c6a52 for a fix.

Change-Id: I234fc4317f0bdc1a486f0cee4fa432c1dce9b463
Jenkins: skip-card-test
Vadim Yanitskiy at

#28176 (Apr 24, 2026, 3:20:33 PM)

use random.SystemRandom as random nr source (/dev/urandom)

/dev/urandom is somewhat better than python's PRNG

Change-Id: I6de38c14ac6dd55bc84d53974192509c18d02bfa
Jenkins: skip-card-test
Vadim Yanitskiy at

#28175 (Apr 24, 2026, 3:20:23 PM)

personalization: add get_typical_input_len() to ConfigurableParameter

The aim is to tell a user interface how wide an input text field should
be chosen to be convenient -- ideally showing the entire value in all
cases, but not too huge for fields that have no sane size limit.

Change-Id: I2568a032167a10517d4d75d8076a747be6e21890
Jenkins: skip-card-test
Vadim Yanitskiy at

#28174 (Apr 24, 2026, 3:20:20 PM)

personalization.ConfigurableParameter: fix BytesIO() input

Change-Id: I0ad160eef9015e76eef10baee7c6b606fe249123
Jenkins: skip-card-test
Vadim Yanitskiy at

#28173 (Apr 24, 2026, 3:20:18 PM)

saip: add numeric_base indicator to ConfigurableParameter

By default, numeric_base = None, to indicate that there are no explicit
limitations on the number space.

For parameters that are definitely decimal, set numeric_base = 10.
For definitely hexadecimal, set numeric_base = 16.

Do the same for ConfigurableParameter as well as ParamSource, so callers
can match them up: if a parameter is numeric_base = 10, then omit
sources that are numeric_base = 16, and vice versa.

Change-Id: Ib0977bbdd9a85167be7eb46dd331fedd529dae01
Jenkins: skip-card-test
Vadim Yanitskiy at

#28172 (Apr 24, 2026, 3:20:14 PM)

esim.saip.personalization: fix TLSPSK keys

Add AES variant of TLSPSK DEK (SCP81 KVN40 key_id=0x02).

Change-Id: I713a008fd26bbfcf437e0f29717b753f058ce76a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28171 (Apr 24, 2026, 3:20:11 PM)

param_source: allow plugging a random implementation (for testing)

Change-Id: Idce2b18af70c17844d6f09f7704efc869456ac39
Jenkins: skip-card-test
Vadim Yanitskiy at

#28170 (Apr 24, 2026, 3:20:05 PM)

ConfigurableParameter: safer val length check

Change-Id: Ibe91722ed1477b00d20ef5e4e7abd9068ff2f3e4
Jenkins: skip-card-test
Vadim Yanitskiy at

#28169 (Apr 24, 2026, 3:20:01 PM)

MncLen

Change-Id: I6c600faeab00ffb072acbe94c9a8b2d1397c07d3
Jenkins: skip-card-test
Vadim Yanitskiy at

#28168 (Apr 24, 2026, 3:19:57 PM)

personalization: make AlgorithmID a new EnumParam

The AlgorithmID has a few preset values, and hardly anyone knows which
is which. So instead of entering '1', '2' or '3', make it work with
prededined values 'Milenage', 'TUAK' and 'usim-test'.

Implement the enum value part abstractly in new EnumParam.

Make AlgorithmID a subclass of EnumParam and define the values as from
pySim/esim/asn1/saip/PE_Definitions-3.3.1.asn

Related: SYS#6768
Change-Id: I71c2ec1b753c66cb577436944634f32792353240
Jenkins: skip-card-test
Vadim Yanitskiy at

#28167 (Apr 24, 2026, 3:19:53 PM)

generate sdkey classes from a list

Change-Id: Ic92ddea6e1fad8167ea75baf78ffc3eb419838c4
Jenkins: skip-card-test
Vadim Yanitskiy at

#28166 (Apr 24, 2026, 3:19:48 PM)

saip SmspTpScAddr.get_values_from_pes: allow empty values

Change-Id: Ibbdd08f96160579238b50699091826883f2e9f5a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28165 (Apr 24, 2026, 3:19:44 PM)

saip: SdKey.__doc__: update SdKey listing

Change-Id: Ib5011b0c7d76b082231744cf09077628dc4e69b7
Jenkins: skip-card-test
Vadim Yanitskiy at

#28164 (Apr 24, 2026, 3:19:38 PM)

test_configurable_parameters.py: add tests for new parameters

For:
SmspTpScAddr
MilenageRotation
MilenageXoringConstants
TuakNrOfKeccak

Change-Id: Iecbea14fe31a9ee08d871dcde7f295d26d7bd001
Jenkins: skip-card-test
Vadim Yanitskiy at

#28163 (Apr 24, 2026, 3:19:33 PM)

personalization: fix EF_SMSP length, alpha_id padding

The efFileSize needs to be updated and the alpha_id needs to be != None.

Change-Id: Ief6e02517f3e96158a2509d763b88aec4bd5a296
Jenkins: skip-card-test
Vadim Yanitskiy at

#28162 (Apr 24, 2026, 3:19:28 PM)

personalization: add int as input type for BinaryParameter

Change-Id: I31d8142cb0847a8b291f8dc614d57cb4734f0190
Jenkins: skip-card-test
Vadim Yanitskiy at

#28161 (Apr 24, 2026, 3:19:23 PM)

personalization: add param_source.py, add batch.py

Implement pySim.esim.saip.batch.BatchPersonalization,
generating N eSIM profiles from a preset configuration.

Batch parameters can be fed by a constant, incrementing, random or from
CSV rows: add pySim.esim.saip.param_source.* classes to feed such input
to each of the BatchPersonalization's ConfigurableParameter instances.

Related: SYS#6768
Change-Id: I01ae40a06605eb205bfb409189fcd2b3a128855a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28160 (Apr 24, 2026, 3:19:15 PM)

add comment about not updating existing key_usage_qualifier

Change-Id: Ie23ae5fde17be6b37746784bf1601b4d0874397a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28159 (Apr 24, 2026, 3:19:08 PM)

saip/param_source: try to not repeat random values

Change-Id: I4fa743ef5677580f94b9df16a5051d1d178edeb0
Jenkins: skip-card-test
Vadim Yanitskiy at

#28158 (Apr 24, 2026, 3:19:00 PM)

sdkeys kv40 aes

Change-Id: If5b53c840ebd1f224f9bb4706a602b415194f47b
Jenkins: skip-card-test
Vadim Yanitskiy at

#28157 (Apr 24, 2026, 3:18:55 PM)

SdKey KVN4X ID02: set key_usage_qual=0x48

Related: SYS#7865
Change-Id: Idc5d33a4a003801f60c95fff6931706a9aeb6692
Jenkins: skip-card-test
Vadim Yanitskiy at

#28156 (Apr 24, 2026, 3:18:51 PM)

use secrets.SystemRandom as secure random nr source

secrets.SystemRandom is defined as the most secure random source
available on the given operating system.

Change-Id: I8049cd1292674b3ced82b0926569128535af6efe
Jenkins: skip-card-test
Vadim Yanitskiy at

#28155 (Apr 24, 2026, 3:18:46 PM)

add test_param_src.py

Change-Id: I03087b84030fddae98b965e0075d44e04ec6ba5c
Jenkins: skip-card-test
Vadim Yanitskiy at

#28154 (Apr 24, 2026, 3:18:41 PM)

personalization audit: optionally audit all (unknown) SD keys

By a flag, allow to audit also all Security Domain KVN that we have
*not* created ConfigurableParameter subclasses for.

For example, SCP80 has reserved kvn 0x01..0x0f, but we offer only
Scp80Kvn01, Scp80Kvn02, Scp80Kvn03. So we would not show kvn
0x03..0x0f in an audit.

This patch includes audits of all SD key kvn there may be in the UPP.
This will help to spot SD keys that may already be present in a UPP
template, with unexpected / unusual kvn.

Change-Id: Icaf6f7b589f117868633c0968a99f2f0252cf612
Jenkins: skip-card-test
Vadim Yanitskiy at

#28153 (Apr 24, 2026, 3:18:37 PM)

personalization: indicate default ParamSource per ConfigurableParameter

Add default_source class members pointing to ParamSource classes to all
ConfigurableParameter subclasses.

This is useful to automatically set up a default ParamSource for a given
ConfigurableParameter subclass, during user interaction to produce a
batch personalization.

For example, if the user selects a Pin1 parameter, a calling program can
implicitly set this to a RandomDigitSource, which will magically make it
work the way that most users need.

BTW, default_source and default_value can be combined to configure a
matching ParamSource instance:

  my_source = MyParam.default_source.from_str( MyParam.default_value )

Change-Id: Ie58d13bce3fa1aa2547cf3cee918c2f5b30a8b32
Jenkins: skip-card-test
Vadim Yanitskiy at

#28152 (Apr 24, 2026, 3:18:33 PM)

UppAudit: better indicate exception cause

Change-Id: I4d986b89a473a5b12ed56b4710263b034876a33e
Jenkins: skip-card-test
Vadim Yanitskiy at

#28151 (Apr 24, 2026, 3:18:29 PM)

comment in uicc.py on Security Domain Keys: add SCP81

Change-Id: Ib0205880f58e78c07688b4637abd5f67ea0570d1
Jenkins: skip-card-test
Vadim Yanitskiy at

#28150 (Apr 24, 2026, 3:18:25 PM)

ConfigurableParameter: do not magically overwrite the 'name' attribute

Change-Id: I6f631444c6addeb7ccc5f6c55b9be3dc83409169
Jenkins: skip-card-test
Vadim Yanitskiy at

#28149 (Apr 24, 2026, 3:18:21 PM)

personalization: implement UppAudit and BatchAudit

Change-Id: Iaab336ca91b483ecdddd5c6c8e08dc475dc6bd0a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28148 (Apr 24, 2026, 10:59:18 AM)

personalization: add param_source.py, add batch.py

Implement pySim.esim.saip.batch.BatchPersonalization,
generating N eSIM profiles from a preset configuration.

Batch parameters can be fed by a constant, incrementing, random or from
CSV rows: add pySim.esim.saip.param_source.* classes to feed such input
to each of the BatchPersonalization's ConfigurableParameter instances.

Related: SYS#6768
Change-Id: I01ae40a06605eb205bfb409189fcd2b3a128855a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28147 (Apr 24, 2026, 10:02:10 AM)

jobs/gerrit-verifications.yml: pysim: allow skipping card tests

I've already implemented this logic in 6a3b8a0, however by mistake
I added it to master-builds.yml instead of gerrit-verifications.yml.
This is wrong because we specifically need this feature for Jenkins
verification, not for the master builds.

For daily master builds, on the other hand, we specifically want to
execute all existing job types, so revert my recent changes from
master-builds.yml, but keep the new job type.

Change-Id: I986d88545f64e13cd571ba9ff56bc924822e39a0
Fixes: 6a3b8a0 ("jobs/master-builds.yml: pysim: allow skipping card tests")
Vadim Yanitskiy at

#28146 (Apr 23, 2026, 11:40:34 PM)

debian-trixie-build: add tshark

This is needed for running pysim unit tests on generic nodes.
As of now we're executing them on the 'simtester' node, which cannot
run more than one job at once, making build verification for large
pysim patchsets extremely slow.

Change-Id: Idbe934e5cc29b06fd1b13b85893de5856eca836e
Related: osmo-ci.git I986d88545f64e13cd571ba9ff56bc924822e39a0
Vadim Yanitskiy at

#28145 (Apr 23, 2026, 10:24:08 PM)

saip SmspTpScAddr: safeguard against decoding error

Reading the TS48 V6.0 eSIM_GTP_SAIP2.1A_NoBERTLV profile results in an
exception [1] in SmspTpScAddr. I have a caller that needs to skip
erratic values instead of raising.

The underlying issue, I presume, is that either the data needs
validation before decode_record_bin(), or decode_record_bin() needs
well-defined error handling.

So far I know only of this IndexError, so, as a workaround, catch that.

[1]
  File "/pysim/pySim/esim/saip/personalization.py", line 617, in get_values_from_pes
    ef_smsp_dec = ef_smsp.decode_record_bin(f_smsp.body, 1)
  File "/pysim/pySim/filesystem.py", line 1047, in decode_record_bin
    return parse_construct(self._construct, raw_bin_data)
  File "/application/venv/lib/python3.13/site-packages/osmocom/construct.py", line 550, in parse_construct
    parsed = c.parse(raw_bin_data, total_len=length, **context)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 404, in parse
    return self.parse_stream(io.BytesIO(data), **contextkw)
           ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 416, in parse_stream
    return self._parsereport(stream, context, "(parsing)")
           ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 428, in _parsereport
    obj = self._parse(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 2236, in _parse
    subobj = sc._parsereport(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 428, in _parsereport
    obj = self._parse(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 2770, in _parse
    return self.subcon._parsereport(stream, context, path)
           ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 428, in _parsereport
    obj = self._parse(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 2236, in _parse
    subobj = sc._parsereport(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 428, in _parsereport
    obj = self._parse(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 2770, in _parse
    return self.subcon._parsereport(stream, context, path)
           ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 428, in _parsereport
    obj = self._parse(stream, context, path)
  File "/application/venv/lib/python3.13/site-packages/construct/core.py", line 820, in _parse
    return self._decode(obj, context, path)
           ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/application/venv/lib/python3.13/site-packages/osmocom/construct.py", line 268, in _decode
    if r[-1] == 'f':
       ~^^^^
  File "/application/venv/lib/python3.13/site-packages/osmocom/utils.py", line 50, in __getitem__
    return hexstr(super().__getitem__(val))
                  ~~~~~~~~~~~~~~~~~~~^^^^^
IndexError: string index out of range

Change-Id: Ic436e206776b81f24de126e8ee0ae8bf5f3e8d7a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28144 (Apr 23, 2026, 10:24:06 PM)

personalization.ConfigurableParameter: fix BytesIO() input

Change-Id: I0ad160eef9015e76eef10baee7c6b606fe249123
Jenkins: skip-card-test
Vadim Yanitskiy at

#28143 (Apr 23, 2026, 10:24:03 PM)

personalization: add param_source.py, add batch.py

Implement pySim.esim.saip.batch.BatchPersonalization,
generating N eSIM profiles from a preset configuration.

Batch parameters can be fed by a constant, incrementing, random or from
CSV rows: add pySim.esim.saip.param_source.* classes to feed such input
to each of the BatchPersonalization's ConfigurableParameter instances.

Related: SYS#6768
Change-Id: I01ae40a06605eb205bfb409189fcd2b3a128855a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28142 (Apr 23, 2026, 10:24:00 PM)

saip: SdKey.__doc__: update SdKey listing

Change-Id: Ib5011b0c7d76b082231744cf09077628dc4e69b7
Jenkins: skip-card-test
Vadim Yanitskiy at

#28141 (Apr 23, 2026, 10:23:55 PM)

esim.saip.personalization: fix TLSPSK keys

Add AES variant of TLSPSK DEK (SCP81 KVN40 key_id=0x02).

Change-Id: I713a008fd26bbfcf437e0f29717b753f058ce76a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28140 (Apr 23, 2026, 10:23:52 PM)

MncLen

Change-Id: I6c600faeab00ffb072acbe94c9a8b2d1397c07d3
Jenkins: skip-card-test
Vadim Yanitskiy at

#28139 (Apr 23, 2026, 10:23:48 PM)

saip/param_source: try to not repeat random values

Change-Id: I4fa743ef5677580f94b9df16a5051d1d178edeb0
Jenkins: skip-card-test
Vadim Yanitskiy at

#28138 (Apr 23, 2026, 10:23:45 PM)

add comment about not updating existing key_usage_qualifier

Change-Id: Ie23ae5fde17be6b37746784bf1601b4d0874397a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28137 (Apr 23, 2026, 10:23:42 PM)

test_configurable_parameters.py: add tests for new parameters

For:
SmspTpScAddr
MilenageRotation
MilenageXoringConstants
TuakNrOfKeccak

Change-Id: Iecbea14fe31a9ee08d871dcde7f295d26d7bd001
Jenkins: skip-card-test
Vadim Yanitskiy at

#28136 (Apr 23, 2026, 10:23:39 PM)

saip SmspTpScAddr.get_values_from_pes: allow empty values

Change-Id: Ibbdd08f96160579238b50699091826883f2e9f5a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28135 (Apr 23, 2026, 10:23:36 PM)

use secrets.SystemRandom as secure random nr source

secrets.SystemRandom is defined as the most secure random source
available on the given operating system.

Change-Id: I8049cd1292674b3ced82b0926569128535af6efe
Jenkins: skip-card-test
Vadim Yanitskiy at

#28134 (Apr 23, 2026, 10:23:32 PM)

UppAudit: better indicate exception cause

Change-Id: I4d986b89a473a5b12ed56b4710263b034876a33e
Jenkins: skip-card-test
Vadim Yanitskiy at

#28133 (Apr 23, 2026, 10:23:28 PM)

personalization: add get_typical_input_len() to ConfigurableParameter

The aim is to tell a user interface how wide an input text field should
be chosen to be convenient -- ideally showing the entire value in all
cases, but not too huge for fields that have no sane size limit.

Change-Id: I2568a032167a10517d4d75d8076a747be6e21890
Jenkins: skip-card-test
Vadim Yanitskiy at

#28132 (Apr 23, 2026, 10:23:24 PM)

use random.SystemRandom as random nr source (/dev/urandom)

/dev/urandom is somewhat better than python's PRNG

Change-Id: I6de38c14ac6dd55bc84d53974192509c18d02bfa
Jenkins: skip-card-test
Vadim Yanitskiy at

#28131 (Apr 23, 2026, 10:23:20 PM)

personalization: fix SdKey.apply_val() implementation

'securityDomain' elements are decoded to ProfileElementSD instances,
which keep higher level representations of the key data apart from the
decoded[] lists.

So far, apply_val() was dropping binary values in decoded[], which does
not work, because ProfileElementSD._pre_encode() overwrites
self.decoded[] from the higher level representation.

Implement using
- ProfileElementSD.find_key() and SecurityDomainKeyComponent to modify
  an exsiting entry, or
- ProfileElementSD.add_key() to create a new entry.

Before this patch, SdKey parameters seemed to patch PES successfully,
but their modifications did not end up in the encoded DER.

(BTW, this does not fix any other errors that may still be present in
the various SdKey subclasses, patches coming up.)

Related: SYS#6768
Change-Id: I07dfc378705eba1318e9e8652796cbde106c6a52
Jenkins: skip-card-test
Vadim Yanitskiy at

#28130 (Apr 23, 2026, 10:23:16 PM)

personalization: indicate default ParamSource per ConfigurableParameter

Add default_source class members pointing to ParamSource classes to all
ConfigurableParameter subclasses.

This is useful to automatically set up a default ParamSource for a given
ConfigurableParameter subclass, during user interaction to produce a
batch personalization.

For example, if the user selects a Pin1 parameter, a calling program can
implicitly set this to a RandomDigitSource, which will magically make it
work the way that most users need.

BTW, default_source and default_value can be combined to configure a
matching ParamSource instance:

  my_source = MyParam.default_source.from_str( MyParam.default_value )

Change-Id: Ie58d13bce3fa1aa2547cf3cee918c2f5b30a8b32
Jenkins: skip-card-test
Vadim Yanitskiy at

#28129 (Apr 23, 2026, 10:23:12 PM)

sdkeys kv40 aes

Change-Id: If5b53c840ebd1f224f9bb4706a602b415194f47b
Jenkins: skip-card-test
Vadim Yanitskiy at

#28128 (Apr 23, 2026, 10:23:09 PM)

SdKey KVN4X ID02: set key_usage_qual=0x48

Related: SYS#7865
Change-Id: Idc5d33a4a003801f60c95fff6931706a9aeb6692
Jenkins: skip-card-test
Vadim Yanitskiy at

#28127 (Apr 23, 2026, 10:23:05 PM)

personalization: implement reading back values from a PES

Implement get_values_from_pes(), the reverse direction of apply_val():
read back and return values from a ProfileElementSequence. Implement for
all ConfigurableParameter subclasses.

Future: SdKey.get_values_from_pes() is reading pe.decoded[], which works
fine, but I07dfc378705eba1318e9e8652796cbde106c6a52 will change this
implementation to use the higher level ProfileElementSD members.

Implementation detail:

Implement get_values_from_pes() as classmethod that returns a generator.
Subclasses should yield all occurences of their parameter in a given
PES.

For example, the ICCID can appear in multiple places.
Iccid.get_values_from_pes() yields all of the individual values. A set()
of the results quickly tells whether the PES is consistent.

Rationales for reading back values:

This allows auditing an eSIM profile, particularly for producing an
output.csv from a batch personalization (that generated lots of random
key material which now needs to be fed to an HLR...).

Reading back from a binary result is more reliable than storing the
values that were fed into a personalization.
By auditing final DER results with this code, I discovered:
- "oh, there already was some key material in my UPP template."
- "all IMSIs ended up the same, forgot to set up the parameter."
- the SdKey.apply() implementations currently don't work, see
  I07dfc378705eba1318e9e8652796cbde106c6a52 for a fix.

Change-Id: I234fc4317f0bdc1a486f0cee4fa432c1dce9b463
Jenkins: skip-card-test
Vadim Yanitskiy at

#28126 (Apr 23, 2026, 10:23:02 PM)

personalization: implement UppAudit and BatchAudit

Change-Id: Iaab336ca91b483ecdddd5c6c8e08dc475dc6bd0a
Jenkins: skip-card-test
Vadim Yanitskiy at

#28125 (Apr 23, 2026, 10:22:59 PM)

transitional name mapping

To help existing applications transition to a common naming scheme for
the SdKey classes, offer this intermediate result, where the SdKey
classes' .name are still unchanged as before generating them.

Change-Id: I974cb6c393a2ed2248a6240c2722d157e9235c33
Jenkins: skip-card-test
Vadim Yanitskiy at

#28124 (Apr 23, 2026, 10:22:54 PM)

comment in uicc.py on Security Domain Keys: add SCP81

Change-Id: Ib0205880f58e78c07688b4637abd5f67ea0570d1
Jenkins: skip-card-test
Vadim Yanitskiy at

#28123 (Apr 23, 2026, 10:22:50 PM)

add test_configurable_parameters.py

Change-Id: Ia55f0d11f8197ca15a948a83a34b3488acf1a0b4
Jenkins: skip-card-test
Vadim Yanitskiy at

#28122 (Apr 23, 2026, 10:22:45 PM)

remove transitional name mapping

This reverts commit I974cb6c393a2ed2248a6240c2722d157e9235c33

Now, finally, all SdKey classes have a unified logical naming scheme.

Change-Id: Ic185af4a903c2211a5361d023af9e7c6fc57ae78
Jenkins: skip-card-test
Vadim Yanitskiy at

#28121 (Apr 23, 2026, 10:22:40 PM)

personalization: fix EF_SMSP length, alpha_id padding

The efFileSize needs to be updated and the alpha_id needs to be != None.

Change-Id: Ief6e02517f3e96158a2509d763b88aec4bd5a296
Jenkins: skip-card-test
Vadim Yanitskiy at

#28120 (Apr 23, 2026, 10:22:34 PM)

personalization: add int as input type for BinaryParameter

Change-Id: I31d8142cb0847a8b291f8dc614d57cb4734f0190
Jenkins: skip-card-test
Vadim Yanitskiy at

#28119 (Apr 23, 2026, 10:22:30 PM)

generate sdkey classes from a list

Change-Id: Ic92ddea6e1fad8167ea75baf78ffc3eb419838c4
Jenkins: skip-card-test
Vadim Yanitskiy at

#28118 (Apr 23, 2026, 10:22:24 PM)

saip: SmspTpScAddr: fix get_values_from_pes

Change-Id: I2010305340499c907bb7618c04c61e194db34814
Jenkins: skip-card-test
Vadim Yanitskiy at

#28117 (Apr 23, 2026, 10:22:20 PM)

personalization audit: optionally audit all (unknown) SD keys

By a flag, allow to audit also all Security Domain KVN that we have
*not* created ConfigurableParameter subclasses for.

For example, SCP80 has reserved kvn 0x01..0x0f, but we offer only
Scp80Kvn01, Scp80Kvn02, Scp80Kvn03. So we would not show kvn
0x03..0x0f in an audit.

This patch includes audits of all SD key kvn there may be in the UPP.
This will help to spot SD keys that may already be present in a UPP
template, with unexpected / unusual kvn.

Change-Id: Icaf6f7b589f117868633c0968a99f2f0252cf612
Jenkins: skip-card-test
Vadim Yanitskiy at

#28116 (Apr 23, 2026, 10:22:14 PM)

add test_param_src.py

Change-Id: I03087b84030fddae98b965e0075d44e04ec6ba5c
Jenkins: skip-card-test
Vadim Yanitskiy at

#28115 (Apr 23, 2026, 10:22:10 PM)

personalization: make AlgorithmID a new EnumParam

The AlgorithmID has a few preset values, and hardly anyone knows which
is which. So instead of entering '1', '2' or '3', make it work with
prededined values 'Milenage', 'TUAK' and 'usim-test'.

Implement the enum value part abstractly in new EnumParam.

Make AlgorithmID a subclass of EnumParam and define the values as from
pySim/esim/asn1/saip/PE_Definitions-3.3.1.asn

Related: SYS#6768
Change-Id: I71c2ec1b753c66cb577436944634f32792353240
Jenkins: skip-card-test
Vadim Yanitskiy at

#28114 (Apr 23, 2026, 10:22:05 PM)

personalization: allow reading back multiple values from PES

Change-Id: Iecb68af7c216c6b9dc3add469564416b6f37f7b2
Jenkins: skip-card-test
Vadim Yanitskiy at

#28113 (Apr 23, 2026, 10:22:01 PM)

ConfigurableParameter: do not magically overwrite the 'name' attribute

Change-Id: I6f631444c6addeb7ccc5f6c55b9be3dc83409169
Jenkins: skip-card-test
Vadim Yanitskiy at

#28112 (Apr 23, 2026, 10:21:57 PM)

ConfigurableParameter: safer val length check

Change-Id: Ibe91722ed1477b00d20ef5e4e7abd9068ff2f3e4
Jenkins: skip-card-test
Vadim Yanitskiy at

#28111 (Apr 23, 2026, 10:21:50 PM)

saip: add numeric_base indicator to ConfigurableParameter

By default, numeric_base = None, to indicate that there are no explicit
limitations on the number space.

For parameters that are definitely decimal, set numeric_base = 10.
For definitely hexadecimal, set numeric_base = 16.

Do the same for ConfigurableParameter as well as ParamSource, so callers
can match them up: if a parameter is numeric_base = 10, then omit
sources that are numeric_base = 16, and vice versa.

Change-Id: Ib0977bbdd9a85167be7eb46dd331fedd529dae01
Jenkins: skip-card-test
Vadim Yanitskiy at

#28110 (Apr 23, 2026, 10:21:43 PM)

param_source: allow plugging a random implementation (for testing)

Change-Id: Idce2b18af70c17844d6f09f7704efc869456ac39
Jenkins: skip-card-test
Vadim Yanitskiy at

#28109 (Apr 23, 2026, 7:18:18 PM)

jobs/gerrit-verifications.yml: pysim: allow skipping card tests

I've already implemented this logic in 6a3b8a0, however by mistake
I added it to master-builds.yml instead of gerrit-verifications.yml.
This is wrong because we specifically need this feature for Jenkins
verification, not for the master builds.

For daily master builds, on the other hand, we specifically want to
execute all existing job types, so revert my recent changes from
master-builds.yml, but keep the new job type.

Change-Id: I986d88545f64e13cd571ba9ff56bc924822e39a0
Fixes: 6a3b8a0 ("jobs/master-builds.yml: pysim: allow skipping card tests")
Vadim Yanitskiy at

#28108 (Apr 23, 2026, 7:18:11 PM)

jobs/master-builds.yml: add missing job type 'distcheck'

We do have this job type in gerrit-verifications.yml, so it's executed
for each patch submitted to Gerrit.  However, we are not executing
'distcheck' during the daily master builds - fix this.

Change-Id: I4898ba712a29a6afc34bc22adec6a3131ce8c794
Fixes: 31fd5cf0 ("gerrit-verifications: execute 'distcheck' job for pysim")
Vadim Yanitskiy at

#28107 (Apr 23, 2026, 7:18:03 PM)

jobs/master-builds.yml: fix typo: crad-test -> card-test

Change-Id: I0686af6c026e298c86d3a64cc161e5c84ec7dc57
Fixes: ee1ef65 ("jobs/master-builds.yml: pysim: separate JOB_TYPE for card tests")
Vadim Yanitskiy at

#28106 (Apr 23, 2026, 6:49:26 PM)

contrib/jenkins.sh: separate JOB_TYPE for card tests

A separate job gives us a possibility to skip tests requiring physical
cards for specific commits that do not touch the core logic.  See the
related commits in osmo-ci.git.

Change-Id: If76d812ee43b7eb3b57fdc660c60bf31fbff5b16
Related: osmo-ci.git Ia48d1b468f65d7c2e6b4128eeac36d0f3d03c45e
Related: osmo-ci.git I986d88545f64e13cd571ba9ff56bc924822e39a0
Vadim Yanitskiy at

#28105 (Apr 23, 2026, 6:17:11 PM)

contrib/jenkins.sh: add setup_venv()

Reduece code duplication by factoring out virtualenv setup and
activation into a shell function.

Change-Id: Ibb193d12d5502c78104ef53badc6037f08e92df1
Vadim Yanitskiy at

#28104 (Apr 23, 2026, 4:57:46 PM)

contrib/jenkins.sh: separate JOB_TYPE for card tests

A separate job gives us a possibility to skip tests requiring physical
cards for specific commits that do not touch the core logic.  See the
related commits in osmo-ci.git.

Change-Id: If76d812ee43b7eb3b57fdc660c60bf31fbff5b16
Related: osmo-ci.git Ia48d1b468f65d7c2e6b4128eeac36d0f3d03c45e
Related: osmo-ci.git I986d88545f64e13cd571ba9ff56bc924822e39a0
Vadim Yanitskiy at

#28103 (Apr 23, 2026, 4:57:41 PM)

contrib/jenkins.sh: add setup_venv()

Reduece code duplication by factoring out virtualenv setup and
activation into a shell function.

Change-Id: Ibb193d12d5502c78104ef53badc6037f08e92df1
Vadim Yanitskiy at

#28102 (Apr 23, 2026, 4:50:27 PM)

contrib/jenkins.sh: separate JOB_TYPE for card tests

A separate job gives us a possibility to skip tests requiring physical
cards for specific commits that do not touch the core logic.  See the
related commits in osmo-ci.git.

Change-Id: If76d812ee43b7eb3b57fdc660c60bf31fbff5b16
Related: osmo-ci.git Ia48d1b468f65d7c2e6b4128eeac36d0f3d03c45e
Related: osmo-ci.git I986d88545f64e13cd571ba9ff56bc924822e39a0
Vadim Yanitskiy at

#28101 (Apr 23, 2026, 4:40:40 PM)

contrib/jenkins.sh: add setup_venv()

Reduece code duplication by factoring out virtualenv setup and
activation into a shell function.

Change-Id: Ibb193d12d5502c78104ef53badc6037f08e92df1
Vadim Yanitskiy at

#28100 (Apr 23, 2026, 4:40:35 PM)

contrib/jenkins.sh: separate JOB_TYPE for card tests

A separate job gives us a possibility to skip tests requiring physical
cards for specific commits that do not touch the core logic.  See the
related commits in osmo-ci.git.

Change-Id: If76d812ee43b7eb3b57fdc660c60bf31fbff5b16
Related: osmo-ci.git Ia48d1b468f65d7c2e6b4128eeac36d0f3d03c45e
Related: osmo-ci.git I986d88545f64e13cd571ba9ff56bc924822e39a0
Vadim Yanitskiy at

#28099 (Apr 23, 2026, 2:09:11 PM)

testenv: Allow adding extra parameters to podman

Allows to add additional command line parameters to podman, if defined
int the testsuite section of testenv.cfg:

[testsuite]
...
podman_extra=--volume /dev/bus/usb:/dev/bus/usb

Change-Id: I6a2be0d60efcd70ea2081e0314927885085bb5e0
Andreas Eversberg at

#28098 (Apr 23, 2026, 1:34:45 PM)

OBS: build_srcpkg.Dockerfile: add dh-runit

Add dh-runit, so we can build source packages of newer versions of
pcsc-lite.

Related: https://salsa.debian.org/debian/pcsc-lite/-/commit/c7c40df72dc3c754341501e34aa096fd72a61cef
Change-Id: I8d852cebb9decb3c881fd3ff9b530213bade0216
Oliver Smith at

#28097 (Apr 23, 2026, 1:23:27 PM)

pySim-prog/cards: fix programming of EF.SMSP

The legacy code found in legacy/cards.py does not use the modern
construct based encoder (pySim-read uses it). The card classes either
use their own implementation of update_smsp or use the generic method
provided by the SimCard class. The latter one is true for FairwavesSIM
and WavemobileSim.

Unfortunately the implementation found in the SimCard is wrong. It
adds padding at the end of the file instead of the beginning. This
completely messes up the contents of EF.SMSP for the cards using this
method. To fix this, let's use the leftpad feature provided by
the update_record. This will ensure a correct alignment of the file
contents.

Related: SYS#7765
Change-Id: Ie112418f1f1461762d61365d3863181ca6be7245
pmaier@sysmocom.de at

#28096 (Apr 23, 2026, 1:23:25 PM)

ts_51_011/EF.SMSP: fix handling of 'alpha_id' field

The field 'alpha_id' is technically not an optional field, even though
the specification describes it as optional. Once the card manufacturer
decides that the field should be present, it must be always present and
vice versa.

(see code comment for a more detailed description)

Related: SYS#7765
Change-Id: I0ec99b2648b22c56f9145345e4cd8776f9217701
pmaier@sysmocom.de at

#28095 (Apr 23, 2026, 1:13:27 PM)

Fix: Prevent bankd from exiting upon SIGPIPE

IF a client disconnects from a worker thread while the worker is
responding to a to a request from that client, the socket is closed and
SIGPIPE is sent to the worker, causing the application to exit.

To prevent this, all workers have a dummy handler to prevent this. Now
the worker can handle the closing of the socket.

Change-Id: I13d6e9da48d12f93c00bd2d021789bde71aca7cf
Andreas Eversberg at

#28094 (Apr 23, 2026, 1:13:24 PM)

Fix: Prevent race conditions when accessing slotmap in bankd

All threads (main and workers) can use slotmap_by_bank() and
slotmap_by_client() to get a mapping entry from the slot map. While
working with this entry (reading values), it could be deleted by a
different thread.

For example, if a client connects to a worker, the worker will check if
there is an existing mapping between a reader and this client. If it
exists, slotmap_by_client() will return a pointer. If the mapping is
deleted at this time by the server, the worker uses a pointer to a
mapping entry that has just been freed.

Change-Id: I3464726f37beb7c47b4e1f00c018ffa4f3948906
Andreas Eversberg at

#28093 (Apr 23, 2026, 1:10:57 PM)

pySim-prog/cards: fix programming of EF.SMSP

The legacy code found in legacy/cards.py does not use the modern
construct based encoder (pySim-read uses it). The card classes either
use their own implementation of update_smsp or use the generic method
provided by the SimCard class. The latter one is true for FairwavesSIM
and WavemobileSim.

Unfortunately the implementation found in the SimCard is wrong. It
adds padding at the end of the file instead of the beginning. This
completely messes up the contents of EF.SMSP for the cards using this
method. To fix this, let's use the leftpad feature provided by
the update_record. This will ensure a correct alignment of the file
contents.

Related: SYS#7765
Change-Id: Ie112418f1f1461762d61365d3863181ca6be7245
pmaier@sysmocom.de at

#28092 (Apr 23, 2026, 1:10:54 PM)

ts_51_011/EF.SMSP: fix handling of 'alpha_id' field

The field 'alpha_id' is technically not an optional field, even though
the specification describes it as optional. Once the card manufacturer
decides that the field should be present, it must be always present and
vice versa.

(see code comment for a more detailed description)

Related: SYS#7765
Change-Id: I0ec99b2648b22c56f9145345e4cd8776f9217701
pmaier@sysmocom.de at

#28091 (Apr 23, 2026, 1:02:33 PM)

ts_51_011/EF.SMSP: fix handling of 'alpha_id' field

The field 'alpha_id' is technically not an optional field, even though
the specification describes it as optional. Once the card manufacturer
decides that the field should be present, it must be always present and
vice versa.

(see code comment for a more detailed description)

Related: SYS#7765
Change-Id: I0ec99b2648b22c56f9145345e4cd8776f9217701
pmaier@sysmocom.de at

#28090 (Apr 23, 2026, 1:02:21 PM)

pySim-prog/cards: fix programming of EF.SMSP

The legacy code found in legacy/cards.py does not use the modern
construct based encoder (pySim-read uses it). The card classes either
use their own implementation of update_smsp or use the generic method
provided by the SimCard class. The latter one is true for FairwavesSIM
and WavemobileSim.

Unfortunately the implementation found in the SimCard is wrong. It
adds padding at the end of the file instead of the beginning. This
completely messes up the contents of EF.SMSP for the cards using this
method. To fix this, let's use the leftpad feature provided by
the update_record. This will ensure a correct alignment of the file
contents.

Related: SYS#7765
Change-Id: Ie112418f1f1461762d61365d3863181ca6be7245
pmaier@sysmocom.de at

#28089 (Apr 23, 2026, 12:37:13 PM)

testenv: Allow adding extra parameters to podman

Allows to add additional command line parameters to podman, if defined
int the testsuite section of testenv.cfg:

[testsuite]
...
podman_extra=--volume /dev/bus/usb:/dev/bus/usb

Change-Id: I6a2be0d60efcd70ea2081e0314927885085bb5e0
Andreas Eversberg at

#28088 (Apr 23, 2026, 12:28:53 PM)

testenv: Allow adding extra parameters to podman

Allows to add additional command line parameters to podman, if defined
int the testsuite section of testenv.cfg:

[testsuite]
...
podman_extra=--volume /dev/bus/usb:/dev/bus/usb

Change-Id: I6a2be0d60efcd70ea2081e0314927885085bb5e0
Andreas Eversberg at

#28087 (Apr 23, 2026, 11:53:03 AM)

Fix: Prevent bankd from exiting upon SIGPIPE

IF a client disconnects from a worker thread while the worker is
responding to a to a request from that client, the socket is closed and
SIGPIPE is sent to the worker, causing the application to exit.

To prevent this, all workers have a dummy handler to prevent this. Now
the worker can handle the closing of the socket.

Change-Id: I13d6e9da48d12f93c00bd2d021789bde71aca7cf
Andreas Eversberg at

#28086 (Apr 23, 2026, 11:52:59 AM)

Fix: Prevent race conditions when accessing slotmap in bankd

All threads (main and workers) can use slotmap_by_bank() and
slotmap_by_client() to get a mapping entry from the slot map. While
working with this entry (reading values), it could be deleted by a
different thread.

For example, if a client connects to a worker, the worker will check if
there is an existing mapping between a reader and this client. If it
exists, slotmap_by_client() will return a pointer. If the mapping is
deleted at this time by the server, the worker uses a pointer to a
mapping entry that has just been freed.

Change-Id: I3464726f37beb7c47b4e1f00c018ffa4f3948906
Andreas Eversberg at

#28085 (Apr 23, 2026, 11:13:49 AM)

jobs/master-builds.yml: pysim: allow skipping card tests

Skip tests requiring physical cards ("card-test") for commits
having a special marker in the COMMIT_MSG:

  Jenkins: skip-card-tests

This speeds up the build verification significantly, and may be
useful for patches that do not modify the core logic (such as
documentation improvements and misc fixes).

Change-Id: I591717a2e2659c02447087dec23aa279cfd55551
Vadim Yanitskiy at

#28084 (Apr 23, 2026, 11:09:02 AM)

tests/sysmo-octsim/run-tests: tempfile -> mktemp

Fix for:
  WARNING: tempfile is deprecated; consider using mktemp instead.

Change-Id: I785a81173aae7202e4c01ead0ced11142d2e1794
Oliver Smith at

#28083 (Apr 23, 2026, 11:07:49 AM)

tests/sysmo-octsim/run-tests: tempfile -> mktemp

Fix for:
  WARNING: tempfile is deprecated; consider using mktemp instead.

Change-Id: I785a81173aae7202e4c01ead0ced11142d2e1794
Oliver Smith at

#28082 (Apr 23, 2026, 10:22:47 AM)

ts_51_011/EF.SMSP: fix handling of 'alpha_id' field

The field 'alpha_id' is technically not an optional field, even though
the specification describes it as optional. Once the card manufacturer
decides that the field should be present, it must be always present and
vice versa.

(see code comment for a more detailed description)

Related: SYS#7765
Change-Id: I0ec99b2648b22c56f9145345e4cd8776f9217701
pmaier@sysmocom.de at

#28081 (Apr 23, 2026, 10:08:03 AM)

ts_51_011/EF.SMSP: fix handling of 'alpha_id' field

The field 'alpha_id' is technically not an optional field, even though
the specification describes it as optional. Once the card manufacturer
decides that the field should be present, it must be always present and
vice versa.

(see code comment for a more detailed description)

Related: SYS#7765
Change-Id: I0ec99b2648b22c56f9145345e4cd8776f9217701
pmaier@sysmocom.de at

#28080 (Apr 23, 2026, 9:30:05 AM)

ts_51_011/EF.SMSP: fix handling of 'alpha_id' field

The field 'alpha_id' is technically not an optional field, even though
the specification describes it as optional. Once the card manufacturer
decides that the field should be present, it must be always present and
vice versa.

(see code comment for a more detailed description)

Related: SYS#7765
Change-Id: I0ec99b2648b22c56f9145345e4cd8776f9217701
pmaier@sysmocom.de at

#28079 (Apr 22, 2026, 11:36:21 PM)

jobs/master-builds.yml: pysim: allow skipping card tests

Skip tests requiring physical cards ("card-test") for commits
having a special marker in the COMMIT_MSG:

  Jenkins: skip-card-tests

This speeds up the build verification significantly, and may be
useful for patches that do not modify the core logic (such as
documentation improvements and misc fixes).

Change-Id: I591717a2e2659c02447087dec23aa279cfd55551
Vadim Yanitskiy at

#28078 (Apr 22, 2026, 11:27:34 PM)

jobs/master-builds.yml: pysim: separate JOB_TYPE for card tests

Change-Id: Ia48d1b468f65d7c2e6b4128eeac36d0f3d03c45e
Depends: pysim.git If76d812ee43b7eb3b57fdc660c60bf31fbff5b16
Vadim Yanitskiy at

#28077 (Apr 22, 2026, 11:27:32 PM)

jobs/master-builds.yml: pysim: allow skipping card tests

Skip tests requiring physical cards ("card-test") for commits
having a special marker in the COMMIT_MSG:

  Jenkins: skip-card-tests

This speeds up the build verification significantly, and may be
useful for patches that do not modify the core logic (such as
documentation improvements and misc fixes).

Change-Id: I591717a2e2659c02447087dec23aa279cfd55551
Vadim Yanitskiy at

#28076 (Apr 22, 2026, 11:27:27 PM)

contrib/jenkins.sh: separate JOB_TYPE for card tests

A separate job gives us a possibility to skip tests requiring physical
cards for specific commits that do not touch the core logic.  See the
related commits in osmo-ci.git.

Change-Id: If76d812ee43b7eb3b57fdc660c60bf31fbff5b16
Related: osmo-ci.git Ia48d1b468f65d7c2e6b4128eeac36d0f3d03c45e
Related: osmo-ci.git I591717a2e2659c02447087dec23aa279cfd55551
Vadim Yanitskiy at

#28075 (Apr 22, 2026, 11:27:23 PM)

tests: pySim-smpp2sim_test.sh: fix copy-pasted comment

Change-Id: I8167c6a3251bb6755810c96075010e920ceee8ac
Jenkins: skip-card-tests
Vadim Yanitskiy at

#28074 (Apr 22, 2026, 10:45:20 PM)

tests: pySim-smpp2sim_test.sh: fix copy-pasted comment

Change-Id: I8167c6a3251bb6755810c96075010e920ceee8ac
Jenkins: skip-card-tests
Vadim Yanitskiy at

#28073 (Apr 22, 2026, 10:45:17 PM)

contrib/jenkins.sh: add support for "Jenkins: skip-card-tests" marker

Add a have_jenkins_marker() helper that checks the commit message
for a given value on the "Jenkins:" footer line, for instance:

  Jenkins: skip-card-tests

When this marker is present, the real-card integration tests
(pySim-prog_test and pySim-shell_test) are skipped, allowing commits
that don't affect card I/O to bypass long card-dependent test runs.

Change-Id: If76d812ee43b7eb3b57fdc660c60bf31fbff5b16
Jenkins: skip-card-tests
Vadim Yanitskiy at

#28072 (Apr 22, 2026, 10:37:24 PM)

tests: pySim-smpp2sim_test.sh: fix copy-pasted comment

Change-Id: I8167c6a3251bb6755810c96075010e920ceee8ac
Jenkins: skip-card-tests
Vadim Yanitskiy at

#28071 (Apr 22, 2026, 10:37:17 PM)

contrib/jenkins.sh: add setup_venv()

Change-Id: Ibb193d12d5502c78104ef53badc6037f08e92df1
Vadim Yanitskiy at

#28070 (Apr 22, 2026, 10:37:05 PM)

contrib/jenkins.sh: add support for "Jenkins: skip-card-tests" marker

Add a have_jenkins_marker() helper that checks the commit message
for a given value on the "Jenkins:" footer line, for instance:

  Jenkins: skip-card-tests

When this marker is present, the real-card integration tests
(pySim-prog_test and pySim-shell_test) are skipped, allowing commits
that don't affect card I/O to bypass long card-dependent test runs.

Change-Id: If76d812ee43b7eb3b57fdc660c60bf31fbff5b16
Jenkins: skip-card-tests
Vadim Yanitskiy at

#28069 (Apr 22, 2026, 10:27:54 PM)

build: detect pthread_setname_np and sched_* APIs, guard usage

Add configure checks for pthread_setname_np and sched_* functions.
Wrap their usage with HAVE_* guards to avoid build failures on
platforms where they are unavailable.

Return -ENOTSUP for unsupported scheduler operations.

Improves portability across non-Linux and restricted environments
(e.g. WebAssembly).

Change-Id: Ic3f1492544439d88c5e6683330c6696de1c2f85b
dtv.comp at

#28068 (Apr 22, 2026, 10:27:47 PM)

convolve: avoid function pointer casts by adding wrapper functions

Introduce _base_convolve_*_void() wrappers matching the expected
function pointer signatures and use them instead of casting
_base_convolve_* functions to (void *).

This removes unsafe function pointer casts and improves
type safety, which is required for stricter toolchains and
non-native targets (e.g. WebAssembly)

Change-Id: Idecb118be285eb3e4691d1761d0d8fa24fd80c75
dtv.comp at

#28067 (Apr 22, 2026, 10:22:19 PM)

device: add WebSDR radio backend

Introduce a new optional WebSDR device backend, enabled via
--with-websdr.

Add WebSDRDevice implementation and build integration, providing
a RadioDevice interface backed by callback hooks for control and
sample I/O.

Intended for Web-based deployments where osmo-trx interacts with
SDR hardware via a WebSDR/WebUSB frontend.

Change-Id: Ie459cbd70388dd8ff5b89221d30770bab0bd9014
dtv.comp at

#28066 (Apr 22, 2026, 10:22:14 PM)

transceiver: add optional WebSDR device support

- Add support for WebSDR devices enabled via the --with-websdr
configure flag.
- add libosmo-trx-websdr library and pkg-config file
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#28065 (Apr 22, 2026, 9:20:19 PM)

abis: add optional WebSDR E1 input driver

Add a new optional E1 input backend for WebSDR, enabled via
--with-websdr.

Introduce input/websdr.c and public callback API to replace
socket-based IPA transport with a callback-driven interface
for OML/RSL and OSMUX.

Intended for WebAssembly builds where Osmocom components run
in a browser and communicate with SDR via WebUSB.

Change-Id: Ib804dc8eb67a91678603f54ea0beccd5c61e4a80
dtv.comp at

#28064 (Apr 22, 2026, 9:14:14 PM)

abis: add optional WebSDR E1 input driver

Add a new optional E1 input backend for WebSDR, enabled via
--with-websdr.

Introduce input/websdr.c and public callback API to replace
socket-based IPA transport with a callback-driven interface
for OML/RSL and OSMUX.

Intended for WebAssembly builds where Osmocom components run
in a browser and communicate with SDR via WebUSB.

Change-Id: Ib804dc8eb67a91678603f54ea0beccd5c61e4a80
dtv.comp at

#28063 (Apr 22, 2026, 9:12:11 PM)

vty: make CPU scheduling optional based on platform support

Add configure checks for sched_* APIs and guard their usage
in cpu_sched_vty with HAVE_SCHED_* macros.

If scheduler functions are not available, return -ENOTSUP
instead of failing at build time.

Also change osmo_cpu_sched_vty_init() to return int.

This improves portability on platforms lacking full sched
support (e.g. non-Linux or restricted environments).

Change-Id: Ic5b7e39fac16531d370cb81f769ba87fef18cb81
dtv.comp at

#28062 (Apr 22, 2026, 8:48:40 PM)

abis: add optional WebSDR E1 input driver

Add a new optional E1 input backend for WebSDR, enabled via
--with-websdr.

Introduce input/websdr.c and public callback API to replace
socket-based IPA transport with a callback-driven interface
for OML/RSL and OSMUX.

Intended for WebAssembly builds where Osmocom components run
in a browser and communicate with SDR via WebUSB.

Change-Id: Ib804dc8eb67a91678603f54ea0beccd5c61e4a80
dtv.comp at

#28061 (Apr 22, 2026, 10:56:51 AM)

OBS: build_srcpkg.Dockerfile: add dh-cmake

Add dh-cmake, so we can build source packages of programs using cmake,
such as kamailio.

Change-Id: I8b5debce4f2fc0c41c69f861822394e139ac5dfc
Oliver Smith at

#28060 (Apr 22, 2026, 12:21:23 AM)

timers: fix ATR timeout

Default WWT to 1.5s.

Both atr and card uart timeouts were combined in
7ae9a65c7fadf3d9d89370761c7352cbcac83a00 but the timeout
was accidentally left as 0 which was the original ATR fsm
state change timeout. The current code uses 0 as
"no timeout", so that killed the timeouts during the ATR.

Related: SYS#7991
Change-Id: I94d6641a10bf6d1df8640727e753da8171267339
ewild at