Skip to content

Loading builds...

Changes

#27938 (Apr 2, 2026, 4:32:09 PM)

msc: ASCI: Fix race condition in TC_assign_fail

The f_sleep(0.5) to delay the registration of the PC for the 2nd SCCP
connection sometimes fired too late and we received the VGCS/VBS
Assignment Request before the channel ConnHdlr was registered in
RAN_Emulation.
Then in turn we need to delay call establishment until the channel is
ready.
Implement proper synchronization points to make sure the order of
registers is accomplished while making sure the 2 ConnHdlrs are
registered before they need it.

Change-Id: Id80982b6b968bbe462aeac2b9be646ab50eace83
Pau Espin Pedrol at

#27937 (Apr 2, 2026, 10:55:54 AM)

pysim/pcsc: do not use getProtocol for protocol selection

The documentation of the getProtocol provided by pyscard says:

"Return bit mask for the protocol of connection, or None if no
protocol set. The return value is a bit mask of
CardConnection.T0_protocol, CardConnection.T1_protocol,
CardConnection.RAW_protocol, CardConnection.T15_protocol"

This suggests that the purpose of getProtocol is not to determine
which protocols are supported. Its purpose is to determine which
protocol is currently selected (either through auto selection or
through the explicit selection made by the API user). This means
we are using getProtocol wrong.

So far this was no problem, since the auto-selected protocol
should be a supported protocol anyway. However, the automatic
protocol selection may not always return a correct result (see
bug report from THD-siegfried [1]).

Let's not trust the automatic protocol selection. Instead let's
parse the ATR and make the decision based on the TD1/TD2 bytes).

[1] https://osmocom.org/issues/6952

Related: OS#6952
Change-Id: Ib119948aa68c430e42ac84daec8b9bd542db7963
pmaier@sysmocom.de at

#27936 (Apr 2, 2026, 10:03:23 AM)

contrib/jenkins: add SKIP_FIRMWARE_CLEAN argument

If this is set, then don't clean the firmware at the end. This is needed
to store the built firmware as artifact in jenkins, for passing it along
to another job.

Related: SYS#7963
Change-Id: I9e2342b8111645ef5d3b7bf4ac364ca592aa600b
Oliver Smith at

#27935 (Apr 2, 2026, 9:22:02 AM)

jobs/octsim_osmo-ccid-firmware: add 30 min timeout

I just stopped a job run that was going for 2 days 16 h. When
successful, the job finishes in 10 min, so let it abort automatically
after 30 min.

Change-Id: Iaccc96b8b29880c9e115e52561fcd43f7b6a8f77
Oliver Smith at

#27934 (Apr 2, 2026, 9:02:29 AM)

msc: Fix race condition in TC_reset_two(_1iu)

The test failed sporadically with:
"RAN_Emulation.ttcnpp:600 Dynamic test case error: Sending data on the
connection of port BSSAP to 659:SCCP_SP_PORT failed. (Broken pipe)"

That's because it was simply waiting for a fixed amount of time while
letting the underlaying RAN_Emulation do the RESET procedure.
Sometimes it started tearing down the test before the procedure was
fully completed, and RAN_Emulation failed passing the Reset (ACK) up the
stack because the component was already unmapped.

Fix the issue by making sure the RAN_Emulation finished the RESET
procedure before stopping the testThe test.

Change-Id: I27afd7a47e6c6cf0f70e1ecc9e26dd2c220e72ab
Pau Espin Pedrol at

#27933 (Apr 2, 2026, 8:33:49 AM)

msc: Fix race condition in TC_reset_two(_1iu)

The test failed sporadically with:
"RAN_Emulation.ttcnpp:600 Dynamic test case error: Sending data on the
connection of port BSSAP to 659:SCCP_SP_PORT failed. (Broken pipe)"

That's because it was simply waiting for a fixed amount of time while
letting the underlaying RAN_Emulation do the RESET procedure.
Sometimes it started tearing down the test before the procedure was
fully completed, and RAN_Emulation failed passing the Reset (ACK) up the
stack because the component was already unmapped.

Fix the issue by making sure the RAN_Emulation finished the RESET
procedure before stopping the testThe test.

Change-Id: I27afd7a47e6c6cf0f70e1ecc9e26dd2c220e72ab
Pau Espin Pedrol at

#27932 (Apr 2, 2026, 7:49:14 AM)

msc: ASCI: Fix race condition in TC_assign_fail

The f_sleep(0.5) to delay the registration of the PC for the 2nd SCCP
connection sometimes fired too late and we received the VGCS/VBS
Assignment Request before the channel ConnHdlr was registered in
RAN_Emulation.
Implement proper synchronization points to make sure the order of
registers is accomplished while making sure the 2 ConnHdlrs are
registered before they need it.

Change-Id: Id80982b6b968bbe462aeac2b9be646ab50eace83
Pau Espin Pedrol at

#27931 (Apr 1, 2026, 2:32:06 PM)

Support administrative block in role ASP

* Avoid activating later on if inactive when becoming blocked.
* Move to inactive state (and notify peer with ASPIA) if active when becoming blocked.
* Attempt re-activation if needed when becoming non-blocked.

Related: OS#6752
Change-Id: If32902575e874d2acc9a5fc12509af42ed151739
Pau Espin Pedrol at

#27930 (Apr 1, 2026, 2:32:02 PM)

asp: Fix wrong variable logged in ss7_asp_xua_srv_conn_rx_cb()

Change-Id: I24206a19fe57772caf8036464a2e1b6b8630fd7a
Pau Espin Pedrol at

#27929 (Apr 1, 2026, 2:31:06 PM)

Create missing LayerManager fsm in dynamic srv xua asps

Dynamic xUA ASPs in transport_role=server where missing initialization
+start of its LayerManager, meaning they had no xua_default_lm_fsm
instance attached.
Previous the xua_default_lm_fsm didn't do anything internally, but since
recently ir properly transitions through states in SG role too, so
we want to handle blocking/unblocking, etc.

Change-Id: Id01e7a24e92aecc61aa2850632b3712bb338e9f2
Pau Espin Pedrol at

#27928 (Apr 1, 2026, 2:30:42 PM)

stp: m3ua: Expect unsolicited ASPIA ACK after unblocking ASP

Since libosmo-sigtran.git Change-Id
If32902575e874d2acc9a5fc12509af42ed151739, osmo-stp will send an
unsolicited ASPIA ACK to the peer whenever the ASP becomes unblock, in
order to somehow give a chance to the peer to notice something changed
and for instance possibly attempt re-activation of the ASP.

Related: OS#6752
Change-Id: I4b70e576beae3c386d68f17a60d6f23d1a54293a
Pau Espin Pedrol at

#27927 (Apr 1, 2026, 1:01:02 PM)

filesystem: edit_{binary,record}_decoded: add encode/decode examples

When invoking `edit_binary_decoded` or `edit_record_decoded`, the
temp file opened in the editor now contains the EF's encode/decode
test vectors as //-comment lines below the JSON content, similar to
how 'git commit' appends comments to the commit message template.
The comment block is stripped before JSON parsing on save,
so it has no effect on the written data.

The feature is implemented via a new module-level JsonEditor context
manager class that encapsulates the full edit cycle:

* write JSON + examples to a TemporaryDirectory
* invoke the editor
* read back, strip //-comments, parse and return the result

Change-Id: I5a046a9c7ba7e08a98cf643d5a26bc669539b38f
Related: OS#6900
Vadim Yanitskiy at

#27926 (Apr 1, 2026, 1:00:59 PM)

docs: auto-generate Card Filesystem Reference

Add a Sphinx extension (docs/pysim_fs_sphinx.py) that hooks into the
builder-inited event and generates docs/filesystem.rst before Sphinx
reads any source files.

The generated page contains a hierarchical listing of all implemented
EFs and DFs, organised by application/specification (UICC/TS 102 221,
ADF.USIM/TS 31.102, ADF.ISIM/TS 31.103, SIM/TS 51.011).  For each file,
the class docstring and any _test_de_encode / _test_decode vectors
are included as an encoding/decoding example table.

docs/filesystem.rst is fully generated at build time and is therefore
added to .gitignore.

Add tests/unittests/test_fs_coverage.py that walks all pySim.* modules
and verifies that every CardProfile, CardApplication, and standalone
CardDF subclass with EF/DF children is either listed in the SECTIONS
(and will appear in the docs) or explicitly EXCLUDED.

Change-Id: I06ddeefc6c11e04d7c24e116f3f39c8a6635856f
Related: OS#6316
Vadim Yanitskiy at

#27925 (Apr 1, 2026, 1:00:55 PM)

filesystem: JsonEditor: offer interactive retry on error

When json.loads() fails (e.g. the user made a syntax mistake), prompt
the user with "Re-open file for editing? [y]es/[n]o:" and loop back to
the editor if they answer 'y' or 'yes'.  If the user declines, return
the original unmodified value so no write is attempted; the temp file
is still cleaned up by __exit__() in that case.

Change-Id: I9161b7becea0d8dfd3f5f740fbb253da2f061a1d
Related: OS#6899
Vadim Yanitskiy at

#27924 (Apr 1, 2026, 1:00:51 PM)

filesystem: JsonEditor: use NamedTemporaryFile

A plain NamedTemporaryFile is sufficient here: we only need a single
file, not a directory to hold it.  Using NamedTemporaryFile is simpler
(no subdirectory to manage) and gives us a .json suffix for free,
which editors use for syntax highlighting.

Change-Id: If3b0bd0fcc90732407dbd03b9cc883f7abeb948e
Vadim Yanitskiy at

#27923 (Apr 1, 2026, 12:33:47 PM)

Create missing LayerManager fsm in dynamic srv xua asps

Dynamic xUA ASPs in transport_role=server where missing initialization
+start of its LayerManager, meaning they had no xua_default_lm_fsm
instance attached.
Previous the xua_default_lm_fsm didn't do anything internally, but since
recently ir properly transitions through states in SG role too, so
we want to handle blocking/unblocking, etc.

Change-Id: Id01e7a24e92aecc61aa2850632b3712bb338e9f2
Pau Espin Pedrol at

#27922 (Apr 1, 2026, 12:33:45 PM)

cosmetic: xua_asp_fsm: Fix wrong indentation

Change-Id: I21c13ff7bc67c060e739eae38088ac00700680de
Pau Espin Pedrol at

#27921 (Apr 1, 2026, 12:33:43 PM)

xua_lm: Add S_INACTIVE state and improve state transitions

The S_INACTIVE state will be needed once we support administrative state
block in role ASP/(active)IPSP.

It is also useful now since sometimes we just want to leave an asp in
that state without any timer running (eg. asps in override which are not
active until the active one goes inactive).

Adding the S_INACTIVE state also allows transitioning states in role
SG, since we now have somewhere to go instead of leaving it alwas as
S_IDLE.

The S_INACTIVE state also allows staying in that state until the ASP ACT
ACK is received, moment at which the ASP is considered ACTIVE according
to specs.

Change-Id: I7e6127c150e479d0c436875b41824b3061e4fa48
Pau Espin Pedrol at

#27920 (Apr 1, 2026, 12:33:40 PM)

asp: Fix wrong variable logged in ss7_asp_xua_srv_conn_rx_cb()

Change-Id: I24206a19fe57772caf8036464a2e1b6b8630fd7a
Pau Espin Pedrol at

#27919 (Apr 1, 2026, 12:32:38 PM)

Support administrative block in role ASP

* Avoid activating later on if inactive when becoming blocked.
* Move to inactive state (and notify peer with ASPIA) if active when becoming blocked.
* Attempt re-activation if needed when becoming non-blocked.

Related: OS#6752
Change-Id: If32902575e874d2acc9a5fc12509af42ed151739
Pau Espin Pedrol at

#27918 (Apr 1, 2026, 12:17:26 PM)

asp: Fix wrong variable logged in ss7_asp_xua_srv_conn_rx_cb()

Change-Id: I24206a19fe57772caf8036464a2e1b6b8630fd7a
Pau Espin Pedrol at

#27917 (Apr 1, 2026, 12:03:13 PM)

stp: m3ua: Introduce test TC_adm_block_after_act

Related: libosmo-sigtran.git Change-Id If8e34cfb05b8b63173b8bb01a520c058daf1fe39
Related: OS#6752
Change-Id: I18672d228c1d15ef99039bccbb972e0b2496b545
Pau Espin Pedrol at

#27916 (Apr 1, 2026, 12:02:46 PM)

Support administrative block in role ASP

* Avoid activating later on if inactive when becoming blocked.
* Move to inactive state (and notify peer with ASPIA) if active when becoming blocked.
* Attempt re-activation if needed when becoming non-blocked.

Related: OS#6752
Change-Id: If32902575e874d2acc9a5fc12509af42ed151739
Pau Espin Pedrol at

#27915 (Apr 1, 2026, 12:02:43 PM)

Create missing LayerManager fsm in dynamic srv xua asps

Dynamic xUA ASPs in transport_role=server where missing initialization
+start of its LayerManager, meaning they had no xua_default_lm_fsm
instance attached.
Previous the xua_default_lm_fsm didn't do anything internally, but since
recently ir properly transitions through states in SG role too, so
we want to handle blocking/unblocking, etc.

Change-Id: Id01e7a24e92aecc61aa2850632b3712bb338e9f2
Pau Espin Pedrol at

#27914 (Apr 1, 2026, 10:11:33 AM)

Support administrative block in role ASP

Change-Id: If32902575e874d2acc9a5fc12509af42ed151739
Pau Espin Pedrol at

#27913 (Apr 1, 2026, 10:10:24 AM)

cosmetic: xua_asp_fsm: Fix wrong indentation

Change-Id: I21c13ff7bc67c060e739eae38088ac00700680de
Pau Espin Pedrol at

#27912 (Apr 1, 2026, 9:47:19 AM)

xua_lm: Add S_INACTIVE state and improve state transitions

The S_INACTIVE state will be needed once we support administrative state
block in role ASP/(active)IPSP.

It is also useful now since sometimes we just want to leave an asp in
that state without any timer running (eg. asps in override which are not
active until the active one goes inactive).

Adding the S_INACTIVE state also allows transitioning states in role
SG, since we now have somewhere to go instead of leaving it alwas as
S_IDLE.

The S_INACTIVE state also allows staying in that state until the ASP ACT
ACK is received, moment at which the ASP is considered ACTIVE according
to specs.

Change-Id: I7e6127c150e479d0c436875b41824b3061e4fa48
Pau Espin Pedrol at

#27911 (Apr 1, 2026, 8:47:04 AM)

xua asp block: SG: turn asp inactive when administratively blocked

This commit intentionally leaves aside implementing active->inactive
transition for asps with role ASP/(active) IPSP.

Change-Id: If8e34cfb05b8b63173b8bb01a520c058daf1fe39
Pau Espin Pedrol at

#27910 (Apr 1, 2026, 8:47:00 AM)

xua_asp_fsm: Stop T(ack) when receiving an Error msg as response

There's no need to keep retrying retransmission if the peer already told
us something is wrong with the message.

Change-Id: Icaeb472fe67911eb15755442cf11010d3c593f1d
Pau Espin Pedrol at

#27909 (Apr 1, 2026, 8:46:55 AM)

xua_lm: Handle M-Error.ind

Change-Id: I5bdba1ab09084b3eafcb8b4aaa9c9762b15e8583
Pau Espin Pedrol at

#27908 (Apr 1, 2026, 8:46:52 AM)

xua_lm: Use XLM SAP to send M-SCTP_RELEASE.req

Change-Id: I582855acaced48fb838700a3013f94bee7db75ad
Pau Espin Pedrol at

#27907 (Apr 1, 2026, 8:46:49 AM)

xua_rkm: send_reg_req: Avoid adding Routing Context with value 0

We use routing context 0 internally as "no routing context". Since the
Routing Context in the Routing KEy IE in RKM REG REQ is optional, if
local rctx is 0 (because we expect to get one allocated by the STP and
receive it through RKM REG RESP), avoid sending it with the value 0.

Change-Id: Iaa584fea3020af06951aea16e638ac6e6a84ae21
Pau Espin Pedrol at

#27906 (Apr 1, 2026, 8:46:44 AM)

Move xUA<->LM SAP logic to its own file

Right now it's difficult to gasp what's implemented of the SAP since it
was scattered around several places.
Put all the SAP forwarding logic into its own file so it's easy to
follow and extend (eg. adding new helper functions, etc.)

Change-Id: I93d74dd7f6ea8f2e60a8bc41be15362e433e8962
Pau Espin Pedrol at

#27905 (Apr 1, 2026, 8:46:39 AM)

sigtran_sap.h: Fix comment stating RK(DE)_REG prims are not implemented

Change-Id: I81a4df1a826fed2f24a4c7ca410b514b1251b44d
Pau Espin Pedrol at

#27904 (Apr 1, 2026, 8:46:36 AM)

xua_lm: Fix ending up from active to idle forever

Previous transition to S_IDLE was wrong, since there's no way to recover
from that state unless the SCTP connection is closed.
Instead, try harder waiting for some new notifications to try
re-activating the ASP and see if the AS becomes active, or end up timing
out and reconnecting to re-attempt complete set of steps.

Change-Id: I5c97c0ede9c27c63f9259b43b7267a3d5d71681d
Pau Espin Pedrol at

#27903 (Apr 1, 2026, 8:46:32 AM)

xua_lm: Use XLM SAP to send M-ASP_{UP, ACTIVE}.req

Change-Id: I5850d9ec9092ff3d099627856697a4184b0d5853
Pau Espin Pedrol at

#27902 (Apr 1, 2026, 8:46:27 AM)

xua_lm: Handle rx of unsolicited ASPIA ACK

Related: OS#6752
Change-Id: Ica4fbaefd08cdb5c4ca2e2a608606ddbec85297c
Pau Espin Pedrol at

#27901 (Apr 1, 2026, 8:43:47 AM)

Use osmo_ss7_asp_active() in several places

Change-Id: I172e691cb61ac68e2410b44e124737f7a4dd2775
Pau Espin Pedrol at

#27900 (Apr 1, 2026, 7:32:09 AM)

Use osmo_ss7_asp_active() in several places

Change-Id: I172e691cb61ac68e2410b44e124737f7a4dd2775
Pau Espin Pedrol at

#27899 (Mar 31, 2026, 9:53:18 PM)

filesystem: JsonEditor: use NamedTemporaryFile

A plain NamedTemporaryFile is sufficient here: we only need a single
file, not a directory to hold it.  Using NamedTemporaryFile is simpler
(no subdirectory to manage) and gives us a .json suffix for free,
which editors use for syntax highlighting.

Change-Id: If3b0bd0fcc90732407dbd03b9cc883f7abeb948e
Vadim Yanitskiy at

#27898 (Mar 31, 2026, 9:53:15 PM)

docs: auto-generate Card Filesystem Reference

Add a Sphinx extension (docs/pysim_fs_sphinx.py) that hooks into the
builder-inited event and generates docs/filesystem.rst before Sphinx
reads any source files.

The generated page contains a hierarchical listing of all implemented
EFs and DFs, organised by application/specification (UICC/TS 102 221,
ADF.USIM/TS 31.102, ADF.ISIM/TS 31.103, SIM/TS 51.011).  For each file,
the class docstring and any _test_de_encode / _test_decode vectors
are included as an encoding/decoding example table.

docs/filesystem.rst is fully generated at build time and is therefore
added to .gitignore.

Add tests/unittests/test_fs_coverage.py that walks all pySim.* modules
and verifies that every CardProfile, CardApplication, and standalone
CardDF subclass with EF/DF children is either listed in the SECTIONS
(and will appear in the docs) or explicitly EXCLUDED.

Change-Id: I06ddeefc6c11e04d7c24e116f3f39c8a6635856f
Related: OS#6316
Vadim Yanitskiy at

#27897 (Mar 31, 2026, 9:53:13 PM)

filesystem: JsonEditor: offer interactive retry on error

When json.loads() fails (e.g. the user made a syntax mistake), prompt
the user with "Re-open file for editing? [y]es/[n]o:" and loop back to
the editor if they answer 'y' or 'yes'.  If the user declines, return
the original unmodified value so no write is attempted; the temp file
is still cleaned up by __exit__() in that case.

Change-Id: I9161b7becea0d8dfd3f5f740fbb253da2f061a1d
Related: OS#6899
Vadim Yanitskiy at

#27896 (Mar 31, 2026, 9:53:10 PM)

filesystem: edit_{binary,record}_decoded: add encode/decode examples

When invoking `edit_binary_decoded` or `edit_record_decoded`, the
temp file opened in the editor now contains the EF's encode/decode
test vectors as //-comment lines below the JSON content, similar to
how 'git commit' appends comments to the commit message template.
The comment block is stripped before JSON parsing on save,
so it has no effect on the written data.

The feature is implemented via a new module-level JsonEditor context
manager class that encapsulates the full edit cycle:

* write JSON + examples to a TemporaryDirectory
* invoke the editor
* read back, strip //-comments, parse and return the result

Change-Id: I5a046a9c7ba7e08a98cf643d5a26bc669539b38f
Related: OS#6900
Vadim Yanitskiy at

#27895 (Mar 31, 2026, 3:50:46 PM)

xua_rkm: send_reg_req: Avoid adding Routing Context with value 0

We use routing context 0 internally as "no routing context". Since the
Routing Context in the Routing KEy IE in RKM REG REQ is optional, if
local rctx is 0 (because we expect to get one allocated by the STP and
receive it through RKM REG RESP), avoid sending it with the value 0.

Change-Id: Iaa584fea3020af06951aea16e638ac6e6a84ae21
Pau Espin Pedrol at

#27894 (Mar 31, 2026, 3:50:43 PM)

xua_lm: Handle rx of unsolicited ASPIA ACK

Related: OS#6752
Change-Id: Ica4fbaefd08cdb5c4ca2e2a608606ddbec85297c
Pau Espin Pedrol at

#27893 (Mar 31, 2026, 3:49:43 PM)

xua_asp_fsm: Stop T(ack) when receiving an Error msg as response

There's no need to keep retrying retransmission if the peer already told
us something is wrong with the message.

Change-Id: Icaeb472fe67911eb15755442cf11010d3c593f1d
Pau Espin Pedrol at

#27892 (Mar 31, 2026, 2:38:12 PM)

xua_rkm: send_reg_req: Avoid adding Routing Context with value 0

We use routing context 0 internally as "no routing context". Since the
Routing Context in the Routing KEy IE in RKM REG REQ is optional, if
local rctx is 0 (because we expect to get one allocated by the STP and
receive it through RKM REG RESP), avoid sending it with the value 0.

Change-Id: Iaa584fea3020af06951aea16e638ac6e6a84ae21
Pau Espin Pedrol at

#27891 (Mar 31, 2026, 1:49:58 PM)

xua_lm: Fix ending up from active to idle forever

Previous transition to S_IDLE was wrong, since there's no way to recover
from that state unless the SCTP connection is closed.
Instead, try harder waiting for some new notifications to try
re-activating the ASP and see if the AS becomes active, or end up timing
out and reconnecting to re-attempt complete set of steps.

Change-Id: I5c97c0ede9c27c63f9259b43b7267a3d5d71681d
Pau Espin Pedrol at

#27890 (Mar 31, 2026, 1:49:53 PM)

m3ua: m3ua_gen_error_msg(): include Routing Context IE in cause Invalid Routing Context

As per RFC4666 3.8.1:
"""
The "Invalid Routing Context" error is sent if a message is received
from a peer with an invalid (unconfigured) Routing Context value.
For this error, the invalid Routing Context(s) MUST be included in
the Error message."
"""

Hence add the originating Routing Context IE so the error message can be
further identified.
For the same reason, also add the Diagnostic Information for the
specific cases in the switch statement, and make them more robust about
possible null pointer dereference.

Change-Id: If821109701e315d17f5334c680670ea6c7bce3bd
Pau Espin Pedrol at

#27889 (Mar 31, 2026, 1:49:49 PM)

Move xUA<->LM SAP logic to its own file

Right now it's difficult to gasp what's implemented of the SAP since it
was scattered around several places.
Put all the SAP forwarding logic into its own file so it's easy to
follow and extend (eg. adding new helper functions, etc.)

Change-Id: I93d74dd7f6ea8f2e60a8bc41be15362e433e8962
Pau Espin Pedrol at

#27888 (Mar 31, 2026, 1:49:44 PM)

xua_lm: Handle M-Error.ind

Change-Id: I5bdba1ab09084b3eafcb8b4aaa9c9762b15e8583
Pau Espin Pedrol at

#27887 (Mar 31, 2026, 1:49:40 PM)

xua_as_fsm: Remove FIXME regarding queueing of msgs during state PENDING

Queueing of messags during T(r) (state PENDING) is already implemented,
see xua_as_fsm_pending() further below in the same file.

Change-Id: Ie572367493066039f7022250d94b815a4da5bd16
Pau Espin Pedrol at

#27886 (Mar 31, 2026, 1:49:33 PM)

xua asp block: SGP/IPSP: Answer ASPAC with Err if blocked

Reject received ASPACs when the asp is administratively blocked.

Moving an already active ASP into inactive state upon user applies
adminsitrative block is not covered in this commit; it will be
implementer later.

This commit doesn't yet implement asp blocking in ASP role nor
(ASP-side) IPSP role.

Related: OS#6752
Change-Id: I23851fe05c06b6bf59b902632029a2382231427e
Pau Espin Pedrol at

#27885 (Mar 31, 2026, 1:49:26 PM)

xua_asp_fsm: Include Routing Context IE in Err msg cuase Invalid Routing Context

As per RFC4666 3.8.1:
"""
For this error, the invalid Routing Context(s) MUST be included in
the Error message.
"""

Change-Id: Ia8bff16248967209d73cd6d5b54ac30fda283247
Pau Espin Pedrol at

#27884 (Mar 31, 2026, 1:49:19 PM)

xua_lm: Use XLM SAP to send M-ASP_{UP, ACTIVE}.req

Change-Id: I5850d9ec9092ff3d099627856697a4184b0d5853
Pau Espin Pedrol at

#27883 (Mar 31, 2026, 1:49:05 PM)

xua_lm: Use XLM SAP to send M-SCTP_RELEASE.req

Change-Id: I582855acaced48fb838700a3013f94bee7db75ad
Pau Espin Pedrol at

#27882 (Mar 31, 2026, 1:48:41 PM)

sigtran_sap.h: Fix comment stating RK(DE)_REG prims are not implemented

Change-Id: I81a4df1a826fed2f24a4c7ca410b514b1251b44d
Pau Espin Pedrol at

#27881 (Mar 31, 2026, 1:44:34 PM)

xua asp block: SG: turn asp inactive when administratively blocked

This commit intentionally leaves aside implementing active->inactive
transition for asps with role ASP/(active) IPSP.

Change-Id: If8e34cfb05b8b63173b8bb01a520c058daf1fe39
Pau Espin Pedrol at

#27880 (Mar 31, 2026, 12:19:10 PM)

docs/conf.py: silence autosectionlabel duplicate-label warnings

sphinxarg.ext generates generic sub-headings ("Named arguments",
"Positional arguments", "Sub-commands", "General options", ...) for
every argparse command and tool.  These repeat across many files and
trigger large numbers of autosectionlabel duplicate-label warnings.

Two-pronged fix:

* `autosectionlabel_maxdepth = 3` eliminates the depth-4+ warnings
  (sub-headings inside each individual command block).
* `suppress_warnings` per file silences the residual depth-3 collisions
  ("serial reader", "decode_hex", "sub-commands", ...) that still
  appear across tool documentation files.

Cross-references into these generic argparse-generated sections are not
a supported use-case, so suppressing the warnings is appropriate.

Change-Id: I9cdf2a4f6cbd435b16b90ab668205600ffd7c3b0
Vadim Yanitskiy at

#27879 (Mar 31, 2026, 12:19:04 PM)

docs: auto-generate Card Filesystem Reference

Add a Sphinx extension (docs/pysim_fs_sphinx.py) that hooks into the
builder-inited event and generates docs/filesystem.rst before Sphinx
reads any source files.

The generated page contains a hierarchical listing of all implemented
EFs and DFs, organised by application/specification (UICC/TS 102 221,
ADF.USIM/TS 31.102, ADF.ISIM/TS 31.103, SIM/TS 51.011).  For each file,
the class docstring and any _test_de_encode / _test_decode vectors
are included as an encoding/decoding example table.

docs/filesystem.rst is fully generated at build time and is therefore
added to .gitignore.

Change-Id: I06ddeefc6c11e04d7c24e116f3f39c8a6635856f
Related: OS#6316
Vadim Yanitskiy at

#27878 (Mar 31, 2026, 12:18:58 PM)

filesystem: edit_{binary,record}_decoded: add encode/decode examples

When invoking `edit_binary_decoded` or `edit_record_decoded`, the
temp file opened in the editor now contains the EF's encode/decode
test vectors as //-comment lines below the JSON content, similar to
how 'git commit' appends comments to the commit message template.
The comment block is stripped before JSON parsing on save,
so it has no effect on the written data.

The feature is implemented via a new module-level JsonEditor context
manager class that encapsulates the full edit cycle:

* write JSON + examples to a TemporaryDirectory
* invoke the editor
* read back, strip //-comments, parse and return the result

Change-Id: I5a046a9c7ba7e08a98cf643d5a26bc669539b38f
Related: OS#6900
Vadim Yanitskiy at

#27877 (Mar 31, 2026, 12:18:52 PM)

filesystem: JsonEditor: offer interactive retry on error

When json.loads() fails (e.g. the user made a syntax mistake), prompt
the user with "Re-open file for editing? [y]es/[n]o:" and loop back to
the editor if they answer 'y' or 'yes'.  If the user declines, return
the original unmodified value so no write is attempted; the temp file
is still cleaned up by __exit__() in that case.

Change-Id: I9161b7becea0d8dfd3f5f740fbb253da2f061a1d
Related: OS#6899
Vadim Yanitskiy at

#27876 (Mar 31, 2026, 12:18:42 PM)

filesystem: JsonEditor: use NamedTemporaryFile

A plain NamedTemporaryFile is sufficient here: we only need a single
file, not a directory to hold it.  Using NamedTemporaryFile is simpler
(no subdirectory to manage) and gives us a .json suffix for free,
which editors use for syntax highlighting.

Change-Id: If3b0bd0fcc90732407dbd03b9cc883f7abeb948e
Vadim Yanitskiy at

#27875 (Mar 31, 2026, 12:18:29 PM)

docs/conf.py: add autodoc_mock_imports for klein and twisted

The eSIM SM-DP+ server modules (`pySim.esim.es2p`, `pySim.esim.es9p`,
`pySim.esim.http_json_api`) unconditionally import optional server-side
dependencies at module level:

  pySim.esim.es2p          -- from klein import Klein
  pySim.esim.http_json_api -- from twisted.web.server import Request

Both imports fail during a docs build if the packages are absent or
broken, causing three "autodoc: failed to import" warnings and three
missing chapters in the generated manual.

Even when klein and twisted are installed, twisted 23.10.0 (the
version pulled in transitively by smpp.twisted3's `Twisted~=23.10.0`
constraint) is incompatible with Python 3.13+ because twisted.web.http
unconditionally executes `import cgi`, a module that was removed from
the standard library in Python 3.13.

Fix: add `autodoc_mock_imports = ['klein', 'twisted']` to conf.py.
Sphinx inserts mock entries into sys.modules before each autodoc import
attempt, so the modules can be imported and documented without requiring
the real packages to be importable at build time.

Change-Id: I71650466f02a6a6d150650deed167c05d2cb6e64
Vadim Yanitskiy at

#27874 (Mar 31, 2026, 11:40:23 AM)

pysim/pcsc: do not use getProtocol for protocol selection

The documentation of the getProtocol provided by pyscard says:

"Return bit mask for the protocol of connection, or None if no
protocol set. The return value is a bit mask of
CardConnection.T0_protocol, CardConnection.T1_protocol,
CardConnection.RAW_protocol, CardConnection.T15_protocol"

This suggests that the purpose of getProtocol is not to determine
which protocols are supported. Its purpose is to determine which
protocol is currently selected (either through auto selection or
through the explicit selection made by the API user). This means
we are using getProtocol wrong.

So far this was no problem, since the auto-selected protocol
should be a supported protocol anyway. However, the automatic
protocol selection may not always return a correct result (see
bug report from THD-siegfried [1]).

Let's not trust the automatic protocol selection. Instead let's
parse the ATR and make the decision based on the TD1/TD2 bytes).

[1] https://osmocom.org/issues/6952

Related: OS#6952
Change-Id: Ib119948aa68c430e42ac84daec8b9bd542db7963
pmaier@sysmocom.de at

#27873 (Mar 31, 2026, 10:20:00 AM)

sigtran_sap.h: Document spec specifying xUA<->LM primitive

Change-Id: I14c3092a3feac5661d03b9b9114889b348b11bb1
Pau Espin Pedrol at

#27872 (Mar 31, 2026, 9:51:39 AM)

xua_as_fsm: Remove FIXME regarding queueing of msgs during state PENDING

Queueing of messags during T(r) (state PENDING) is already implemented,
see xua_as_fsm_pending() further below in the same file.

Change-Id: Ie572367493066039f7022250d94b815a4da5bd16
Pau Espin Pedrol at

#27871 (Mar 31, 2026, 9:51:35 AM)

xua asp block: SGP/IPSP: Answer ASPAC with Err if blocked

Reject received ASPACs when the asp is administratively blocked.

Moving an already active ASP into inactive state upon user applies
adminsitrative block is not covered in this commit; it will be
implementer later.

This commit doesn't yet implement asp blocking in ASP role nor
(ASP-side) IPSP role.

Related: OS#6752
Change-Id: I23851fe05c06b6bf59b902632029a2382231427e
Pau Espin Pedrol at

#27870 (Mar 31, 2026, 9:50:41 AM)

xua asp block: SG: turn asp inactive when administratively blocked

This commit intentionally leaves aside implementing active->inactive
transition for asps with role ASP/(active) IPSP.

Change-Id: If8e34cfb05b8b63173b8bb01a520c058daf1fe39
Pau Espin Pedrol at

#27869 (Mar 31, 2026, 9:46:57 AM)

pySim-read: remove import random

In pySim-read we do not have to compute any random numbers, so
we may remove random from the imports

Change-Id: Iae4ee6aafb339cc682345299b92b4ecd0bbca14e
pmaier@sysmocom.de at

#27868 (Mar 31, 2026, 7:48:19 AM)

tlv: Allow control over comprehension bit in COMPR_TLV_IE

This allows construction of a comprehension TLV with the bit set or
cleared. The default is comprehension=True to not break existing code.

```
>>> foo = Foo(decoded=b"2342", comprehension=True)
>>> bar = Foo(decoded=b"2342", comprehension=False)
```

Related: OS#6989
Change-Id: I9ca689b9b51152f3907ea470c7b42a0b12208459
dwillmann at

#27867 (Mar 31, 2026, 7:48:15 AM)

tlv: Remove unused branch

0xff is checked in the first if statement and already raises a ValueError

Change-Id: Ia6a0656721a1fcaf5f16526fefe62c30b0ddb664
dwillmann at

#27866 (Mar 30, 2026, 11:57:22 PM)

filesystem: JsonEditor: offer interactive retry on error

When json.loads() fails (e.g. the user made a syntax mistake), prompt
the user with "Re-open file for editing? [y]es/[n]o:" and loop back to
the editor if they answer 'y' or 'yes'.  If the user declines, return
the original unmodified value so no write is attempted; the temp file
is still cleaned up by __exit__() in that case.

Change-Id: I9161b7becea0d8dfd3f5f740fbb253da2f061a1d
Related: OS#6899
Vadim Yanitskiy at

#27865 (Mar 30, 2026, 10:51:43 PM)

filesystem: JsonEditor: use NamedTemporaryFile

A plain NamedTemporaryFile is sufficient here: we only need a single
file, not a directory to hold it.  Using NamedTemporaryFile is simpler
(no subdirectory to manage) and gives us a .json suffix for free,
which editors use for syntax highlighting.

Change-Id: If3b0bd0fcc90732407dbd03b9cc883f7abeb948e
Vadim Yanitskiy at

#27864 (Mar 30, 2026, 10:51:40 PM)

filesystem: edit_{binary,record}_decoded: add encode/decode examples

When invoking `edit_binary_decoded` or `edit_record_decoded`, the
temp file opened in the editor now contains the EF's encode/decode
test vectors as //-comment lines below the JSON content, similar to
how 'git commit' appends comments to the commit message template.
The comment block is stripped before JSON parsing on save,
so it has no effect on the written data.

The feature is implemented via a new module-level JsonEditor context
manager class that encapsulates the full edit cycle:

* write JSON + examples to a TemporaryDirectory
* invoke the editor
* read back, strip //-comments, parse and return the result

Change-Id: I5a046a9c7ba7e08a98cf643d5a26bc669539b38f
Related: OS#6900
Vadim Yanitskiy at

#27863 (Mar 30, 2026, 10:51:33 PM)

docs: auto-generate Card Filesystem Reference

Add a Sphinx extension (docs/pysim_fs_sphinx.py) that hooks into the
builder-inited event and generates docs/filesystem.rst before Sphinx
reads any source files.

The generated page contains a hierarchical listing of all implemented
EFs and DFs, organised by application/specification (UICC/TS 102 221,
ADF.USIM/TS 31.102, ADF.ISIM/TS 31.103, SIM/TS 51.011).  For each file,
the class docstring and any _test_de_encode / _test_decode vectors
are included as an encoding/decoding example table.

docs/filesystem.rst is fully generated at build time and is therefore
added to .gitignore.

Change-Id: I06ddeefc6c11e04d7c24e116f3f39c8a6635856f
Related: OS#6316
Vadim Yanitskiy at

#27862 (Mar 30, 2026, 3:31:08 PM)

stp: m3ua: Introduce test TC_adm_block_after_act

Related: OS#6752
Change-Id: I18672d228c1d15ef99039bccbb972e0b2496b545
Pau Espin Pedrol at

#27861 (Mar 30, 2026, 2:46:33 PM)

stp: m3ua: Introduce test TC_adm_block_act_err

Related: OS#6752
Related: libosmo-sigtran.git Change-Id I23851fe05c06b6bf59b902632029a2382231427e
Change-Id: I9869ec2b71a3f6814340e181d67bab4c9266a2f4
Pau Espin Pedrol at

#27860 (Mar 30, 2026, 2:42:43 PM)

xua asp block: SGP/IPSP: Answer ASPAC with Err if blocked

Reject received ASPACs when the asp is administratively blocked.

Moving an already active ASP into inactive state upon user applies
adminsitrative block is not covered in this commit; it will be
implementer later.

This commit doesn't yet implement asp blocking in ASP role nor
(ASP-side) IPSP role.

Related: OS#6752
Change-Id: I23851fe05c06b6bf59b902632029a2382231427e
Pau Espin Pedrol at

#27859 (Mar 30, 2026, 2:42:32 PM)

stp: m3ua: Introduce test TC_adm_block_act_err

Related: OS#6752
Related: libosmo-sigtran.git Change-Id I23851fe05c06b6bf59b902632029a2382231427e
Change-Id: I9869ec2b71a3f6814340e181d67bab4c9266a2f4
Pau Espin Pedrol at

#27858 (Mar 30, 2026, 2:31:23 PM)

stp: Move NTFY expect to up & act step helper functions

Change-Id: Ia835a5dd54cc37f529ca1c4ff9892d44fe239241
Pau Espin Pedrol at

#27857 (Mar 30, 2026, 2:25:15 PM)

docs/conf.py: add autodoc_mock_imports for klein and twisted

The eSIM SM-DP+ server modules (`pySim.esim.es2p`, `pySim.esim.es9p`,
`pySim.esim.http_json_api`) unconditionally import optional server-side
dependencies at module level:

  pySim.esim.es2p          -- from klein import Klein
  pySim.esim.http_json_api -- from twisted.web.server import Request

Both imports fail during a docs build if the packages are absent or
broken, causing three "autodoc: failed to import" warnings and three
missing chapters in the generated manual.

Even when klein and twisted are installed, twisted 23.10.0 (the
version pulled in transitively by smpp.twisted3's `Twisted~=23.10.0`
constraint) is incompatible with Python 3.13+ because twisted.web.http
unconditionally executes `import cgi`, a module that was removed from
the standard library in Python 3.13.

Fix: add `autodoc_mock_imports = ['klein', 'twisted']` to conf.py.
Sphinx inserts mock entries into sys.modules before each autodoc import
attempt, so the modules can be imported and documented without requiring
the real packages to be importable at build time.

Change-Id: I71650466f02a6a6d150650deed167c05d2cb6e64
Vadim Yanitskiy at

#27856 (Mar 30, 2026, 2:09:49 PM)

firmware: werror on missing return

Silently ignoring a missing return just broke all timers,
so prevent similar mistakes in the future.

Change-Id: I2e25884077af6334c9e9ddace3900b04061fae04
ewild at

#27855 (Mar 30, 2026, 2:02:44 PM)

firmware: fix timers, add missing return

Change-Id: I5b12284c88d8fe6e4fe55cc4cd2aad550d276af4
ewild at

#27854 (Mar 30, 2026, 1:50:16 PM)

docs/conf.py: silence autosectionlabel duplicate-label warnings

sphinxarg.ext generates generic sub-headings ("Named arguments",
"Positional arguments", "Sub-commands", "General options", ...) for
every argparse command and tool.  These repeat across many files and
trigger large numbers of autosectionlabel duplicate-label warnings.

Two-pronged fix:

* `autosectionlabel_maxdepth = 3` eliminates the depth-4+ warnings
  (sub-headings inside each individual command block).
* `suppress_warnings` per file silences the residual depth-3 collisions
  ("serial reader", "decode_hex", "sub-commands", ...) that still
  appear across tool documentation files.

Cross-references into these generic argparse-generated sections are not
a supported use-case, so suppressing the warnings is appropriate.

Change-Id: I9cdf2a4f6cbd435b16b90ab668205600ffd7c3b0
Vadim Yanitskiy at

#27853 (Mar 30, 2026, 1:32:46 PM)

docs/legacy: fix typo "EF,IMSI" -> "EF.IMSI"

Change-Id: I1f246ec008a57b2373ed3f5531ab4166101f4dd0
Vadim Yanitskiy at

#27852 (Mar 30, 2026, 1:32:43 PM)

docs/conf.py: silence autosectionlabel duplicate-label warnings

sphinxarg.ext generates generic sub-headings ("Named arguments",
"Positional arguments", "Sub-commands", "General options", ...) for
every argparse command and tool.  These repeat across many files and
trigger large numbers of autosectionlabel duplicate-label warnings.

Two-pronged fix:

* `autosectionlabel_maxdepth = 3` eliminates the depth-4+ warnings
  (sub-headings inside each individual command block).
* `suppress_warnings` per file silences the residual depth-3 collisions
  ("serial reader", "decode_hex", "sub-commands", ...) that still
  appear across tool documentation files.

Cross-references into these generic argparse-generated sections are not
a supported use-case, so suppressing the warnings is appropriate.

Change-Id: I9cdf2a4f6cbd435b16b90ab668205600ffd7c3b0
Vadim Yanitskiy at

#27851 (Mar 30, 2026, 1:32:40 PM)

docs/put_key-tutorial: fix three typos

  "verifiation"        -> "verification"
  "this is identifies" -> "this identifies" (extra word)
  "and and"            -> "and" (doubled word)

Change-Id: I1ae6b01638cc2c3dd8355ba801f85cc179ca8bd3
Vadim Yanitskiy at

#27850 (Mar 30, 2026, 1:32:38 PM)

docs/card-key-provider: fix heading levels and typo

The "ADM PIN" and "SCP02 / SCP03" sub-sections of "Field naming" used
the '~' heading character, which Sphinx resolved to level 4 - skipping
level 3 and throwing build ERRORs.  As a result, both sub-sections
had no heading at all.  Change both to '^' (level 3) to match the
other sub-sections in this file.

While at it, fix a typo: "consisting if" -> "consisting of".

Change-Id: Ia56efc7fadcc0fd62e87e63850b929d2f80851ba
Vadim Yanitskiy at

#27849 (Mar 30, 2026, 1:32:33 PM)

docs/shell: fix copy-paste typos in editor command descriptions

Two adjacent commands (`edit_record_decoded`, `edit_binary_decoded`)
had identical copy-pasted error messages with three typos each:

  "modificatiosn" -> "modifications"
  "us the"        -> "use the"
  "comamdn"       -> "command"

Change-Id: Ie23baba4634e2cc40f81439fb11b102778aed1f6
Vadim Yanitskiy at

#27848 (Mar 30, 2026, 1:32:30 PM)

docs/saip-tool: fix typo "insertaion" -> "insertion"

Change-Id: Ie9c9235ec964a15fab19d6ca5a83b2b1ddf07e7b
Vadim Yanitskiy at

#27847 (Mar 30, 2026, 12:22:40 PM)

m3ua: m3ua_gen_error_msg(): include Routing Context IE in cause Invalid Routing Context

As per RFC4666 3.8.1:
"""
The "Invalid Routing Context" error is sent if a message is received
from a peer with an invalid (unconfigured) Routing Context value.
For this error, the invalid Routing Context(s) MUST be included in
the Error message."
"""

Hence add the originating Routing Context IE so the error message can be
further originated.
For the same reason, also add the Diagnostic Information for the
specific cases in the switch statement, and make them more robust about
possible null pointer dereference.

Change-Id: If821109701e315d17f5334c680670ea6c7bce3bd
Pau Espin Pedrol at

#27846 (Mar 30, 2026, 12:22:37 PM)

xua_asp_fsm: Include Routing Context IE in Err msg cuase Invalid Routing Context

As per RFC4666 3.8.1:
"""
For this error, the invalid Routing Context(s) MUST be included in
the Error message.
"""

Change-Id: Ia8bff16248967209d73cd6d5b54ac30fda283247
Pau Espin Pedrol at

#27845 (Mar 30, 2026, 12:13:23 PM)

m3ua: m3ua_gen_error_msg(): include Routing Context IE in cause Invalid Routing Context

As per RFC4666 3.8.1:
"""
The "Invalid Routing Context" error is sent if a message is received
from a peer with an invalid (unconfigured) Routing Context value.
For this error, the invalid Routing Context(s) MUST be included in
the Error message."
"""

Hence add the originating Routing Context IE so the error message can be
further originated.
For the same reason, also add the Diagnostic Information for the
specific cases in the switch statement, and make them more robust about
possible null pointer dereference.

Change-Id: If821109701e315d17f5334c680670ea6c7bce3bd
Pau Espin Pedrol at

#27844 (Mar 30, 2026, 12:13:19 PM)

xua_asp_fsm: Include Routing Context IE in Err msg cuase Invalid Routing Context

As per RFC4666 3.8.1:
"""
For this error, the invalid Routing Context(s) MUST be included in
the Error message.
"""

Change-Id: Ia8bff16248967209d73cd6d5b54ac30fda283247
Pau Espin Pedrol at

#27843 (Mar 30, 2026, 12:00:57 PM)

OBS: nightly: add ".0" after versions on git tags

Fix that with the current logic of generating version numbers for
nightly, a version done on a tag can be higher than the following
version:

on tag:                    1.14.0.202603231800         # <tag>.<YY><MM><DD><HH><mm><SS>
on tag (with this patch):  1.14.0.0.202603231800       # <tag>.0.<YY><MM><DD><HH><mm><SS>
next commit after the tag: 1.14.0.1.2016.202603241800  # <tag>.<patch-count-since-last-tag>.<commit-hash>.<YY><MM><DD><HH><mm><SS>

Fixes: OS#6981
Change-Id: Id140d8ea76bf98357711587a9909d54097250fd6
Oliver Smith at

#27842 (Mar 30, 2026, 11:32:31 AM)

xua: Split traffic mode readonly validation from internal state update

First validate the whole message, then once evyerthing is fine, act on
the message updating internal state.

Change-Id: I05ba891e774ebe341229b968c92e0383b6899bd6
Pau Espin Pedrol at

#27841 (Mar 30, 2026, 11:32:27 AM)

asp_vty: Fix wrong vty write 'blocked' command

This is not criticial since "block"/"no block" commands are yet to be
fully implemented.

Change-Id: Ia42a064cfdbba025bc3ae5479e8e6edec4abe770
Pau Espin Pedrol at

#27840 (Mar 30, 2026, 11:32:23 AM)

xua_find_as_for_asp(): Optimize lookup

Instead of looking up on all AS configured in an instance, look up on
the subset associated to the ASP we are looking up for.
Since we are also not looking a 2nd pass to then validate if ASP and
returned AS is related, in worst case this would split lookup complexity
by half.

Change-Id: If85ad27ad5e55be0c22e2716fa7329409a7b85b5
Pau Espin Pedrol at

#27839 (Mar 30, 2026, 11:32:19 AM)

osmo_ss7_find_free_{rctx,l_rk_id}(): Make more robust to wrap-around

Previous versions of those functions would end up broken over time after
~2^32 were allocated, turning the program into an unusuable stte.

Change-Id: Ie10f4048d0af384dc84c79e6fc441c8537649d55
Pau Espin Pedrol at

#27838 (Mar 30, 2026, 11:32:15 AM)

asp: Configure block and shutdown adm state independently

The block/no block and shutdown/no shutdown commands tweak independent
states; adapt the code to what's presented to the user. This simplifies
handling of both states, since the user may want eg. have it blocked and
shutdown, and then "no shutdown" it but make sure it stays blocked so no
race condition happens.

Related: OS#6752
Change-Id: I3ab81a4f6f6b72015c5068d5a27128642622cf99
Pau Espin Pedrol at

#27837 (Mar 30, 2026, 11:32:10 AM)

xua_rkm: handle_rkey_reg(): Skip AS ilookup of known free RCTX

There's no need to attempt a look up for an AS with a RCTX we just
ensured is not yet allocated to any AS.

Change-Id: I40719527c527db58244972a797c4287107306532
Pau Espin Pedrol at

#27836 (Mar 30, 2026, 11:31:57 AM)

xua_asp_fsm: XUA_ASP_E_ASPTM_ASPAC: Validate RCTX AS is associated to ASP

Previously we only validated that a local AS was configured for the
provided routing context, but we didn't validate that the AS was actually
associated to the requesting ASP.

Change-Id: Idcd51b9bbe38064ed03d076a76279384a3927334
Pau Espin Pedrol at

#27835 (Mar 30, 2026, 11:29:47 AM)

handle_rkey_dereg(): Optimize lookup

Instead of looking up on all AS configured in an instance, look up on
the subset associated to the ASP we are looking up for.
Since we are also not looking a 2nd pass to then validate if ASP and
returned AS is related, in worst case this would split lookup complexity
by half.

Change-Id: I56ac5caef9bcded9dd08ca532a413af94070a1bd
Pau Espin Pedrol at

#27834 (Mar 30, 2026, 10:47:47 AM)

stp: m3ua: Fix incorrect RCTX being sent in TC_combinedlset_loadshare

An ASPAC was being sent containing an RCTX of an unrelated AS to the
sending ASP.
Newer libosmo-sigtran properly validates AS/RCTX is associated to the
ASP in the local config, and hence now returns an error properly making
the test fail.

Change-Id: Id8381a028a919a265ca330ef4f61c76637c168f6
Pau Espin Pedrol at

#27833 (Mar 30, 2026, 9:50:03 AM)

struct trx_power_params: fix inaccurate comment

Change-Id: I1bdb7fab24fee28dbeac0ed05e13f650e08c98e9
Fixes: 4c632421 ("bts_shutdown_fsm: fix spurious RAMP_COMPL events in WAIT_TRX_CLOSED")
Vadim Yanitskiy at

#27832 (Mar 30, 2026, 8:07:01 AM)

OBS: pyhss_download_deps: add python 3.14

Download binary package dependencies for python 3.14 too, so we can
build the package for Ubuntu 26.04.

Related: OS#6983
Related: https://gitea.osmocom.org/osmocom/pyhss/commit/2125f52c5eb1b3e66b1ebe2febadb7c886536681
Change-Id: Ic23d52c081f68fb8d6f7d9e370883236ca9bf35f
Oliver Smith at

#27831 (Mar 30, 2026, 8:00:58 AM)

stp: STP_Tests_M3UA_TCP: Introduce tests TC_m3ua_tcp_{cli,srv}_adm_shutdown

Related tests already existed for STP_Tests_M3UA, but we want to
explicitly test against M3UA_TCP since these tests involve the transport
layer directly.

Related: OS#6752
Change-Id: Ia37a0e244895fbb447ef8e71a0980538cc9fd7f8
Pau Espin Pedrol at

#27830 (Mar 30, 2026, 8:00:50 AM)

stp: STP_Tests_IPA: Introduce tests TC_ipa_tcp_{cli,srv}_adm_shutdown

Related tests already exist for M3UA and M3UA_TCP, but were missing for
IPA ASPs.

Change-Id: Ie30de6caa3e2b680aff9e50898e63f615b526500
Related: OS#6752
Pau Espin Pedrol at

#27829 (Mar 29, 2026, 1:51:38 PM)

osmo-bts-trx: rx_data_fn(): fix copy-paste in comment

Change-Id: Ibf35c468310a690fd873cf968bb2c44b493ca5ea
Vadim Yanitskiy at

#27828 (Mar 29, 2026, 1:48:11 PM)

bts_shutdown_fsm: fix spurious RAMP_COMPL events in WAIT_TRX_CLOSED

With multiple TRXes ramping down in lockstep, both their final
ramp-timer callbacks fire back-to-back in the same event loop pass,
setting p_total_cur_mdBm to the target value for both before any async
hardware acknowledgement arrives.  When the first SETPOWER ack returns
and fires ramp_down_compl_cb() for TRX0, the remaining-TRX check in
st_wait_ramp_down_compl() inspects p_total_cur_mdBm for TRX1 and finds
it already at the target - concluding that all TRXes are done.  The FSM
then transitions to WAIT_TRX_CLOSED, and the second ack (for TRX1)
fires ramp_down_compl_cb() into the wrong state, producing:

  BTS_SHUTDOWN(...){WAIT_TRX_CLOSED}: Event BTS_SHUTDOWN_EV_TRX_RAMP_COMPL not permitted

The root cause is that p_total_cur_mdBm is a *requested* value set in
the timer callback, not a confirmed one.  The hardware confirmation
arrives asynchronously via power_trx_change_compl() ->
power_ramp_do_step(), which is also where compl_cb() is invoked.

Fix by adding a 'complete' flag to trx_power_params.ramp that is:

* cleared when _power_ramp_start() begins a new ramp, and
* set just before compl_cb() is called in power_ramp_do_step()

The shutdown FSM remaining-TRX count then checks !ramp.complete instead of
comparing p_total_cur_mdBm against the target, correctly reflecting which
TRXes have actually received hardware confirmation of ramp completion.

Change-Id: Ia71393e871187d6b44b7f520eb421bab354aafd1
Vadim Yanitskiy at

#27827 (Mar 29, 2026, 1:48:02 PM)

osmo-bts-trx: rx_rach_fn(): remove redundant fall-back

Condition `synch_seq != RACH_SYNCH_SEQ_TS0` is unlikely to be true,
given that no other synch. sequences are defined by 3GPP TS 45.002.
Even if this happens for whatever reason (e.g. a bug), assigning
`synch_seq` to `RACH_SYNCH_SEQ_TS0` is not needed, as `synch_seq`
is never read after the switch statement.  The logging message is
not useful either, since we already print the synch. seq. above.

Change-Id: I4cdc03dc6631ca17d13a3067ad03020e3e97eab1
Vadim Yanitskiy at

#27826 (Mar 27, 2026, 7:55:07 PM)

firmware: replace libosmocore fsm timers

Concurrent access from main loop and the different uart irqs was not
going well and caused crashes. The libosmocore fsm does still allocate
one internal timer, but it is not used by the firmware, so libosmocore
will not touch the rbtree.

Additionally ignore checkpatch jiffies complaints because we're trying
to do firmware here.

Closes: SYS#7877
Change-Id: Id2bd67b3946bb451008965f0b68b4a919f4d10bd
ewild at

#27825 (Mar 27, 2026, 6:15:19 PM)

firmware: replace libosmocore fsm timers

Concurrent access from main loop and the different uart irqs was not
going well and caused crashes. The libosmocore fsm does still allocate
one internal timer, but it is not used by the firmware, so libosmocore
will not touch the rbtree.

Additionally ignore checkpatch jiffies complaints because we're trying
to do firmware here.

Closes: SYS#7877
Change-Id: Id2bd67b3946bb451008965f0b68b4a919f4d10bd
ewild at

#27824 (Mar 27, 2026, 5:24:45 PM)

nokia_site: add objects to query TRX power and power steps

This commit adds a method to query per TRX RF power and
power control step capabilities of radio HW.

Change-Id: Ib5a00c0b528407144cca88e5cbde940d7a5509f0
metro4 at

#27823 (Mar 27, 2026, 4:55:24 PM)

stp: STP_Tests_M3UA_TCP: Introduce tests TC_m3ua_tcp_{cli,srv}_adm_shutdown

Related tests already existed for STP_Tests_M3UA, but we want to
explicitly test against M3UA_TCP since these tests involve the transport
layer directly.

Related: OS#6752
Change-Id: Ia37a0e244895fbb447ef8e71a0980538cc9fd7f8
Pau Espin Pedrol at

#27822 (Mar 27, 2026, 4:55:20 PM)

stp: STP_Tests_IPA: Introduce tests TC_ipa_tcp_{cli,srv}_adm_shutdown

Related tests already exist for M3UA and M3UA_TCP, but were missing for
IPA ASPs.

Change-Id: Ie30de6caa3e2b680aff9e50898e63f615b526500
Related: OS#6752
Pau Espin Pedrol at

#27821 (Mar 27, 2026, 9:18:29 AM)

OBS: pyhss_download_deps: fix dependency loop

Fix that the Osmocom_OBS_nightly job is failing for the pyhss package
with a dependency loop in hatchling:

  LookupError: https://files.pythonhosted.org/…/hatchling-1.29.0.tar.gz (from https://pypi.org/simple/hatchling/) (requires-python:>=3.10) is already being built: hatchling>=1.21.0 from https://files.pythonhosted.org/…/hatchling-1.29.0.tar.gz

This happens as it recursively collects source packages and their
(build) dependencies:

  pymongo
  -> dnspython
  -> hatchling
  -> pluggy
  -> setuptools-scm
  -> vcs-versioning
  -> hatchling

When only ignoring the hatchling source package, we get a similar
dependency loop with pluggy, so ignore both source packages. Hatchling
gets added later as binary package and pluggy is only a build-time
dependency for hatchling. The resulting PyHSS package builds fine with
this change.

Change-Id: I0484627fd105627fabe9435379e704db54e72ae3
Oliver Smith at

#27820 (Mar 27, 2026, 9:18:24 AM)

OBS: pyhss_download_deps: add python 3.14

Download binary package dependencies for python 3.14 too, so we can
build the package for Ubuntu 26.04.

Related: OS#6983
Related: https://gitea.osmocom.org/osmocom/pyhss/commit/2125f52c5eb1b3e66b1ebe2febadb7c886536681
Change-Id: Ic23d52c081f68fb8d6f7d9e370883236ca9bf35f
Oliver Smith at

#27819 (Mar 27, 2026, 7:41:39 AM)

osmo-bts-trx: check sscanf() result in NOMTXPOWER/SETPOWER handlers

Both trx_ctrl_rx_rsp_nomtxpower() and trx_ctrl_rx_rsp_setpower() were
calling sscanf() without checking its return value.  On a parse failure
the local variable remained uninitialized and was passed directly to the
callback, resulting in a garbage power level.

Change-Id: I3dc399cfae70c450d53d66bb99f3832f160fca39
Vadim Yanitskiy at

#27818 (Mar 27, 2026, 7:40:14 AM)

lint/checkpatch: ignore SSCANF_TO_KSTRTO

This kernel-specific warning doesn't make sense when linting our code so
disable it.

Change-Id: If096c600331d7ad5786395c5c41a6742da44a3e8
Oliver Smith at

#27817 (Mar 26, 2026, 9:47:22 PM)

l1sap: check_for_ciph_cmd(): add missing msgb length check

The function accesses msg->data[0..4] without first verifying that the
message is at least 5 bytes long, which would cause a buffer over-read
on a malformed (too short) LAPDm frame.

Change-Id: I47690f1a6357e42913bfa8100e36c05cb4f0607a
Vadim Yanitskiy at

#27816 (Mar 26, 2026, 9:47:18 PM)

osmo-bts-trx: clean up log messages in response handlers

Drop the redundant "transceiver" prefix from LOGPPHI() calls -
the macro already prepends the PHY instance name.

Change-Id: Iec722198f161621dd00ce3baabb732e1a1d91a37
Vadim Yanitskiy at

#27815 (Mar 26, 2026, 9:47:13 PM)

scheduler: trx_sched_is_sacch_fn(): fix returning non-bool

The function is declared `bool` but returns `-EINVAL` on an error path.
`-EINVAL` is `-22`, which in C implicitly converts to `bool true`.
Returning `false` makes more sense when we don't know the MF layout.

Change-Id: Ib2394687815aed4990c3880446176e4c97440667
Vadim Yanitskiy at

#27814 (Mar 26, 2026, 9:46:59 PM)

osmo-bts-trx: check sscanf() result in NOMTXPOWER/SETPOWER handlers

Both trx_ctrl_rx_rsp_nomtxpower() and trx_ctrl_rx_rsp_setpower() were
calling sscanf() without checking its return value.  On a parse failure
the local variable remained uninitialized and was passed directly to the
callback, resulting in a garbage power level.

Change-Id: I3dc399cfae70c450d53d66bb99f3832f160fca39
Vadim Yanitskiy at

#27813 (Mar 26, 2026, 9:46:53 PM)

measurement: is_meas_complete(): fix fn_mod variable type

`fn_mod` was declared as 'unsigned int' but initialized to -1, which
yields `UINT_MAX` via implicit conversion.  Use 'int' instead to make
the sentinel value unambiguous and match the `%d` format used in
the debug log.

Change-Id: I6b0bce9bc9fca1d6effbb2da2319132cdff4e9c7
Vadim Yanitskiy at

#27812 (Mar 26, 2026, 9:46:45 PM)

tx_power: get_pa_drive_level_mdBm(): assert on out-of-range ARFCN

The function previously returned `INT_MIN` as an error sentinel when
the ARFCN exceeded the calibration table size (1024 entries, covering
all valid GSM ARFCNs 0..1023).  None of the callers checked for this
value, so it would silently propagate through power calculations and
eventually be passed to `bts_model_change_power()`.

An out-of-range ARFCN indicates a serious misconfiguration;
replace the range check and `return INT_MIN` with an `OSMO_ASSERT`.

Change-Id: I70c54652e0b07d399363276bc60946aa8b195725
Vadim Yanitskiy at

#27811 (Mar 26, 2026, 9:46:39 PM)

phy_link: phy_instance_link_to_trx(): add missing semicolon

Change-Id: Ica33798adfdc5aad6b6aa9e252e9cc9294bad659
Vadim Yanitskiy at

#27810 (Mar 26, 2026, 9:46:32 PM)

bts_ctrl_commands: remove debugging leftover

Change-Id: I571a10f94482e3097aa915f192db6215f085dbcd
Vadim Yanitskiy at

#27809 (Mar 26, 2026, 9:44:52 PM)

phy_link: phy_{link,instance}_name(): fix shared static buffer

Both functions were writing into the same static buffer, so any caller
holding a pointer returned by one and then invoking the other would
silently end up with a stale/overwritten string.  Move name_buf into
each function as a local static, so the two buffers are independent.

Change-Id: I79e9d7f5b1e5c275911cf88854211f1ce8a28669
Vadim Yanitskiy at

#27808 (Mar 26, 2026, 5:35:31 PM)

firmware: add tear-free 64bit load/store helpers for jiffies

On Cortex-M4 a 64bit load may compile to two separate LDR
instructions which can lead to torn reads due to interrupts.
LDRD/STRD are restartable, they either complete or restart from
scratch, so the result is always consistent. The only "downside" is the
required alignment, which is fine.

Change-Id: I729c0fdfb5b228b03c2df1cf098743100b1ea625
ewild at

#27807 (Mar 26, 2026, 5:35:28 PM)

firmware: replace libosmocore fsm timers

Concurrent access from main loop and the different uart irqs was not
going well and caused crashes. The libosmocore fsm does still allocate
one internal timer, but it is not used by the firmware, so libosmocore
will not touch the rbtree.

Additionally ignore checkpatch jiffies complaints because we're trying
to do firmware here.

Closes: SYS#7877
Change-Id: Id2bd67b3946bb451008965f0b68b4a919f4d10bd
ewild at

#27806 (Mar 26, 2026, 3:57:48 PM)

firmware: replace libosmocore fsm timers

Concurrent access from main loop and the different uart irqs was not
going well and caused crashes. The libosmocore fsm does still allocate
one internal timer, but it is not used by the firmware, so libosmocore
will not touch the rbtree.

Additionally ignore checkpatch jiffies complaints because we're trying
to do firmware here.

Closes: SYS#7877
Change-Id: Id2bd67b3946bb451008965f0b68b4a919f4d10bd
ewild at

#27805 (Mar 26, 2026, 3:57:44 PM)

firmware: add tear-free 64bit load/store helpers for jiffies

On Cortex-M4 a 64bit load may compile to two separate LDR
instructions which can lead to torn reads due to interrupts.
LDRD/STRD are restartable, they either complete or restart from
scratch, so the result is always consistent. The only "downside" is the
required alignment, which is fine.

Change-Id: I729c0fdfb5b228b03c2df1cf098743100b1ea625
ewild at

#27804 (Mar 26, 2026, 3:13:29 PM)

Implement ITU Q.704 T10 timer

Implement timer T10 used for periodic ASP Audit procedure as described
in:
* ITU Q.704 13.5.2
* rfc4666 4.5.3
* ETSI TS 102 142 V1.1.1

This procedure is used in order to recover the signalling route
availability information that may not have been received because of
some signalling network failure.

Related: OS#6883
Change-Id: Ic12b1aa8f2a02f32615dade34f0e1f01b2535f7b
Pau Espin Pedrol at

#27803 (Mar 26, 2026, 1:14:11 PM)

cosmetic: xua_snm: Add spec reference regarding no SSNM tx

Change-Id: I69912d5b7032c12e06648e5f5a700384182bb1f9
Pau Espin Pedrol at

#27802 (Mar 26, 2026, 1:13:21 PM)

cosmetic: xua_snm: Add spec reference regarding no SSNM tx

Change-Id: I69912d5b7032c12e06648e5f5a700384182bb1f9
Pau Espin Pedrol at

#27801 (Mar 26, 2026, 12:42:11 PM)

firmware: replace libosmocore fsm timers

Concurrent access from main loop and the different uart irqs was not
going well and caused crashes. The libosmocore fsm does still allocate
one internal timer, but it is not used by the firmware, so libosmocore
will not touch the rbtree.

Additionally ignore checkpatch jiffies complaints because we're trying
to do firmware here.

Closes: SYS#7877
Change-Id: Id2bd67b3946bb451008965f0b68b4a919f4d10bd
ewild at

#27800 (Mar 26, 2026, 12:37:21 PM)

firmware: add tear-free 64bit load/store helpers for jiffies

On Cortex-M4 a 64bit load may compile to two separate LDR
instructions which can lead to torn reads due to interrupts.
LDRD/STRD are restartable, they either complete or restart from
scratch, so the result is always consistent. The only "downside" is the
required alignment, which is fine.

Change-Id: I729c0fdfb5b228b03c2df1cf098743100b1ea625
ewild at

#27799 (Mar 26, 2026, 12:37:16 PM)

firmware: replace libosmocore fsm timers

Concurrent access from main loop and the different uart irqs was not
going well and caused crashes. The libosmocore fsm does still allocate
one internal timer, but it is not used by the firmware, so libosmocore
will not touch the rbtree.

Additionally ignore checkpatch jiffies complaints because we're trying
to do firmware here.

Closes: SYS#7877
Change-Id: Id2bd67b3946bb451008965f0b68b4a919f4d10bd
ewild at

#27798 (Mar 26, 2026, 11:57:45 AM)

OBS: add Ubuntu 26.04

Change-Id: Id22f4902b73ad9b4131b837a8036df68cf665f8f
Oliver Smith at

#27797 (Mar 26, 2026, 10:01:50 AM)

pgw: Test v6 and v4v6 PDU session userplane

Change-Id: Idf009b9118db8117c547a1bb0f27afdfa3f03924
Pau Espin Pedrol at

#27796 (Mar 25, 2026, 10:33:14 PM)

pfcp_peer: add configurable heartbeat fail threshold + association reset

Introduce heartbeat_fail_threshold (default: 3) that tracks consecutive
unanswered PFCP Heartbeat Requests via the heartbeat_fail_count field
and resets the association when the threshold is reached.  The counter
applies to both periodic heartbeats and those triggered via the REST
API, and resets to zero on any successful Heartbeat Response.

Change-Id: I8cb0fb23468aba4dead9865a90d893c78c6ae074
Vadim Yanitskiy at

#27795 (Mar 25, 2026, 10:33:11 PM)

pfcp_peer: detect UPF restart via RTS mismatch in Heartbeat Response

Check the Recovery Timestamp (RTS) in each Heartbeat Response against
the value stored during Association Setup (`rem_rts`).  A mismatch
means the UPF has restarted; log a warning, increment the new
`pfcp.peer_restart counter`, and reset the PFCP association so it is
re-established with the restarted peer.

The `is_integer(ExpRTS)` guard prevents a spurious reset when a stale
Heartbeat Response arrives in the connecting state (where `rem_rts`
is still undefined).

Change-Id: I00a8384db1ea9c38d0ad9ff90b3d45ad86c3a020
Vadim Yanitskiy at

#27794 (Mar 25, 2026, 10:33:05 PM)

pfcp_peer: tune Heartbeat Request/Response logging

Reduce verbosity of the Tx/Rx Heartbeat Req/Resp log messages from
LOG_INFO to LOG_DEBUG in preparation for periodic heartbeat support.
Without this change, periodic heartbeats would flood the logging.

Change-Id: I6435cdf64fd86fa5358d57ea4d56dcad8eb9e69e
Vadim Yanitskiy at

#27793 (Mar 25, 2026, 10:31:36 PM)

pfcp_peer: implement periodic PFCP heartbeat

Add a heartbeat_interval parameter to the pfcp_peer config section.
When non-zero, pfcp_peer sends a periodic Heartbeat Request to the UPF
at the configured interval using a named gen_statem timeout (hb_timer).
The timer is started on entry to the connected state and cancelled on
re-entry to the connecting state.  Default is 10000 ms (10 seconds).

Change-Id: I306324f8eca325202a3fa23125854db9d5eaab38
Vadim Yanitskiy at

#27792 (Mar 25, 2026, 9:38:23 PM)

rspro_server: use correct byte order in log message "Bankd IP/Port changed to <IP>:<Port>

The byte order is wrong and results in printing the IP as reverse.
"Bankd IP/Port changed to 1.0.0.127:9999".

Change-Id: I288ea70091d24fa95732f7035ab50100831be841
lynxis at

#27791 (Mar 25, 2026, 4:34:58 PM)

GTPv2_Templates: Add enum for PDN Type and use it in pgw testsuite

Change-Id: I9833e998522a09a15b93c8fed0e18a5e8159d760
Pau Espin Pedrol at

#27790 (Mar 25, 2026, 4:34:55 PM)

5gc: Introduce test TC_pdu_sess_est_pco_pcscf

Our deps/nas fork is modified to fix multiple incorrect definitions
around ProtocolContainer record.

Change-Id: Ic7b22ad647bcac944551ac1c29080f895ca72cf8
Pau Espin Pedrol at

#27789 (Mar 25, 2026, 4:34:52 PM)

pgw: Test v6 and v4v6 PDU session userplane

Change-Id: Idf009b9118db8117c547a1bb0f27afdfa3f03924
Pau Espin Pedrol at

#27788 (Mar 25, 2026, 4:34:36 PM)

GTPv1U_Emulation: Rename s/f_gtp1u_ping4/f_gtp1u_ping/

The function can also be (and is) used to ping IPv6 hosts.

Change-Id: I195cb048176aefddcb477083ddc949b86ec592fa
Pau Espin Pedrol at

#27787 (Mar 25, 2026, 2:36:17 PM)

pySim/EF.SMSP: fix encoding of TP-Destination Address

The TP-Destination Address in EF.SMSP uses the same encoding as the
TS-Service Centre Address field. However, even though the encoding
of both fields looks almost identical, it actually isn't.

The TS-Service Centre Address field encodes the length field as
octets required for the call_number + one octet for ton_npi.
(see also: 3GPP TS 24.011, section 8.2.5.2)

The TP-Destination Address uses the number of digits of the
call_number directly in the length field.
(see also: 3GPP TS 23.040, section 9.1.2.5)

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

#27786 (Mar 25, 2026, 1:18:33 PM)

gtp_tunnel: Log Tx of ICMPv6 Router Solicitation

Change-Id: I5883a0e399e47b6e169c5adf8446e9d2aeecbe68
Pau Espin Pedrol at

#27785 (Mar 25, 2026, 1:17:21 PM)

pysim/pcsc: do not use getProtocol for protocol selection

The documentation of the getProtocol provided by pyscard says:

"Return bit mask for the protocol of connection, or None if no
protocol set. The return value is a bit mask of
CardConnection.T0_protocol, CardConnection.T1_protocol,
CardConnection.RAW_protocol, CardConnection.T15_protocol"

This suggests that the purpose of getProtocol is not to determine
which protocols are supported. Its purpose is to determine which
protocol is currently selected (either through auto selection or
through the explicit selection made by the API user). This means
we are using getProtocol wrong.

So far this was no problem, since the auto-selected protocol
should be a supported protocol anyway. However, the automatic
protocol selection may not always return a correct result (see
bug report from THD-siegfried [1]).

Let's not trust the automatic protocol selection. Instead let's
parse the ATR and make the decision based on the TD1/TD2 bytes).

[1] https://osmocom.org/issues/6952

Related: OS#6952
Change-Id: Ib119948aa68c430e42ac84daec8b9bd542db7963
pmaier@sysmocom.de at

#27784 (Mar 25, 2026, 1:03:09 PM)

s1ap_proxy: fix build_erab_setup_response_failure() to report all E-RABs

The previous implementation only included the first E-RAB from the
registry in the failure response (a FIXME was left in place).

Fix it to extract all E-RAB IDs from the original E-RAB SETUP REQUEST
and include each of them in the failure list, as required by 3GPP.

Change-Id: I7933fceb0edcdfdc95ace35416297b11c83f0bc9
Related: osmo-ttcn3-hacks.git I8a5dc338d28013dc85e1ce4b3bdac92cb3b35304
Vadim Yanitskiy at

#27783 (Mar 25, 2026, 12:44:08 PM)

global_platform: install_cap_parser: argument groups cannot be nested

pySim-shell currently does not work on systems with Python 3.14+:

  File ".../pysim/pySim/global_platform/__init__.py", line 868, in AddlShellCommands
    install_cap_parser_inst_prm_g_grp = install_cap_parser_inst_prm_g.add_argument_group()
  File "/usr/lib/python3.14/argparse.py", line 1794, in add_argument_group
    raise ValueError('argument groups cannot be nested')
  ValueError('argument groups cannot be nested')

The problem is that install_cap_parser creates a nested group inside
of mutually exclusive group.  argparse never supported group nesting
properly, so it has been deprecated since Python 3.11, and eventually
got removed in Python 3.14.

Remove group nesting, adjust the usage string, and implement the
mutual exclusiveness enforcement manually in do_install_cap().

Change-Id: Idddf72d5a745345e134b23f2f01e0257d0667579
Vadim Yanitskiy at

#27782 (Mar 25, 2026, 12:43:51 PM)

global_platform: refactor gen_install_parameters()

gen_install_parameters() had contradictory logic: the outer guard
required all three arguments to be non-None/non-empty (making them
mutually inclusive), while the inner checks then treated each one
as optional.

Make each parameter independently optional (defaulting to None) and
remove the all-or-nothing check.  Simplify the function body to a
straightforward single-pass construction of system_specific_params.

Change-Id: I8756fb38016cdf0527fe2e21edb44381d1dc557f
Vadim Yanitskiy at

#27781 (Mar 25, 2026, 12:21:38 PM)

GTPv1U_Emulation: Rename s/f_gtp1u_ping4/f_gtp1u_ping/

The function can also be (and is) used to ping IPv6 hosts.

Change-Id: I195cb048176aefddcb477083ddc949b86ec592fa
Pau Espin Pedrol at

#27780 (Mar 25, 2026, 12:11:23 PM)

GTPv2_Templates: Add enum for PDN Type and use it in pgw testsuite

Change-Id: I9833e998522a09a15b93c8fed0e18a5e8159d760
Pau Espin Pedrol at

#27779 (Mar 25, 2026, 12:02:53 PM)

docs/put_key: add tutorial that explains how to manage global platform keys

With the increased interest in using GlobalPlatform features of
UICC and eUICCs (OTA-SMS, applets, etc.), also comes an increased
interest in how the related GlobalPlatform keys can be managed
(key rotation, adding/removing keysets from/to a Security Domain).

Unfortunately, many aspects of this topic are not immediately
obvious for the average user. Let's add a tutorial that contains
some practical examples to shine some light on the topic.

Related: SYS#7881
Change-Id: I163dfedca3df572cb8442e9a4a280e6c5b00327e
pmaier@sysmocom.de at

#27778 (Mar 24, 2026, 10:05:44 PM)

s1ap_proxy: fix build_erab_setup_response_failure() to report all E-RABs

The previous implementation only included the first E-RAB from the
registry in the failure response (a FIXME was left in place).

Fix it to extract all E-RAB IDs from the original E-RAB SETUP REQUEST
and include each of them in the failure list, as required by 3GPP.

Change-Id: I7933fceb0edcdfdc95ace35416297b11c83f0bc9
Related: osmo-ttcn3-hacks.git I8a5dc338d28013dc85e1ce4b3bdac92cb3b35304
Vadim Yanitskiy at

#27777 (Mar 24, 2026, 10:05:02 PM)

s1gw: generalize f_TC_e_rab_setup_failure() for N E-RABs

The existing TC only tested PFCP Session Establishment failure with a
single E-RAB.  Generalize f_TC_e_rab_setup_failure() to use g_pars.erabs
throughout, so it works for any num_erabs: E-RAB 0 still triggers the
only PFCP Session Establishment Request (S1GW processes sequentially),
while all E-RABs in the request are expected to appear in the failure
response.

Add TC_e_rab_setup3_failure() which re-uses the same body with
num_erabs := 3, verifying that the S1GW lists all three E-RABs as
failed rather than just the first one.  Also make f_tr_E_RABList()
non-private so it is accessible from S1GW_Tests.ttcn.

Change-Id: I8a5dc338d28013dc85e1ce4b3bdac92cb3b35304
Related: osmo-s1gw.git I7933fceb0edcdfdc95ace35416297b11c83f0bc9
Vadim Yanitskiy at

#27776 (Mar 24, 2026, 10:04:41 PM)

s1gw: generalize f_TC_e_rab_setup_failure() for N E-RABs

The existing TC only tested PFCP Session Establishment failure with a
single E-RAB.  Generalize f_TC_e_rab_setup_failure() to use g_pars.erabs
throughout, so it works for any num_erabs: E-RAB 0 still triggers the
only PFCP Session Establishment Request (S1GW processes sequentially),
while all E-RABs in the request are expected to appear in the failure
response.

Add TC_e_rab_setup3_failure() which re-uses the same body with
num_erabs := 3, verifying that the S1GW lists all three E-RABs as
failed rather than just the first one.  Also make f_tr_E_RABList()
non-private so it is accessible from S1GW_Tests.ttcn.

Change-Id: I8a5dc338d28013dc85e1ce4b3bdac92cb3b35304
Related: osmo-s1gw.git I7933fceb0edcdfdc95ace35416297b11c83f0bc9
Vadim Yanitskiy at

#27775 (Mar 24, 2026, 9:30:03 PM)

s1gw/rest: PfcpAssocInfo: field 'lrts' is mandatory

Change-Id: I332e95a32935e0c8da99e600e8d30af14bd36b16
Related: osmo-s1gw.git Ic766ebc56ce1810fc27cb49ddcac50bc94e539d9
Vadim Yanitskiy at

#27774 (Mar 24, 2026, 9:29:55 PM)

s1gw: add more PFCP Heartbeat test cases

TC_pfcp_heartbeat_periodic: verify that the IUT sends periodic PFCP
Heartbeat Requests and that the heartbeat timer re-arms correctly after
each successful response (at least 2 periodic HBs must be observed).

TC_pfcp_heartbeat_miss_threshold: verify that the IUT resets the PFCP
association after mp_pfcp_heartbeat_miss_count consecutive unanswered
Heartbeat Requests (a new Association Setup Request is expected).

TC_pfcp_heartbeat_miss_reset: verify that a successful Heartbeat
Response resets the miss counter; run 2 cycles of missing
(miss_count - 1) HBs then responding to one, expecting no association
reset throughout.

TC_pfcp_heartbeat_rts_mismatch: verify that the IUT detects a UPF
restart when a Heartbeat Response carries a different Recovery Timestamp
than the one observed during Association Setup, and that it promptly
resets and re-establishes the PFCP association.

Also add module parameters for the heartbeat configuration
(mp_pfcp_heartbeat_interval, mp_pfcp_heartbeat_req_timeout,
mp_pfcp_heartbeat_miss_count) and update osmo-s1gw.config accordingly.

Change-Id: Ie5ac25b1ca4bb11e61bff220449397c271b11464
Related: osmo-s1gw.git Iba954746fe20e6b9eeaec3196e1f83e3fc3e7fc2
Related: osmo-s1gw.git I306324f8eca325202a3fa23125854db9d5eaab38
Related: osmo-s1gw.git I00a8384db1ea9c38d0ad9ff90b3d45ad86c3a020
Vadim Yanitskiy at

#27773 (Mar 24, 2026, 9:29:49 PM)

s1gw: f_ConnHdlr_pfcp_assoc_handler(): handle already-connected case

Previously, f_pfcp_assoc() would skip spawning a connection handler
entirely if the IUT was already PFCP-associated.  This was fine for
tests that only need an association to be present, but upcoming PFCP
Heartbeat test cases need the emulation's Recovery Timestamp to be
synced with what the IUT has stored, even when re-using an existing
association.

Move the state check into f_ConnHdlr_pfcp_assoc_handler(): if the
IUT is already connected, sync PFCPEM's Recovery Timestamp to the
value the IUT remembers (rrts); otherwise perform the full Association
Setup as before.  Remove the now-redundant g_pfcp_assoc component
variable from test_CT - it's not accessible by ConnHdlr(s) anyway.

Change-Id: Id9d2ebb1ddb3d3896dd24e2a37e9d21335441d52
Vadim Yanitskiy at

#27772 (Mar 24, 2026, 9:29:44 PM)

library/PFCP_Emulation: add f_PFCPEM_set_recovery_timestamp()

Companion setter for the existing f_PFCPEM_get_recovery_timestamp().
A follow-up patch uses this to inject a specific Recovery Timestamp
value into the emulation, so the IUT does not detect a spurious PFCP
peer restart between test cases.

Change-Id: If47e06d26b42081a28aacb6e06b5aeabf945362c
Vadim Yanitskiy at

#27771 (Mar 24, 2026, 9:29:39 PM)

s1gw: TC_pfcp_heartbeat: validate RTS in Heartbeat Response

The test case had a TODO noting that the Recovery Timestamp in the
Heartbeat Response was not yet validated.  Let's get this resolved:
query the IUT's PFCP association state via REST to obtain its local
Recovery Timestamp (lrts), and verify that the IUT echoes back that
same value in the Heartbeat Response.

Change-Id: I000cc82e7582baded96a33cb0da2103906972ff9
Vadim Yanitskiy at

#27770 (Mar 24, 2026, 9:29:36 PM)

pfcp_peer: implement periodic PFCP heartbeat

Add a heartbeat_interval parameter to the pfcp_peer config section.
When non-zero, pfcp_peer sends a periodic Heartbeat Request to the UPF
at the configured interval using a named gen_statem timeout (hb_timer).
The timer is started on entry to the connected state and cancelled on
re-entry to the connecting state.  Default is 0 (disabled).

Change-Id: I306324f8eca325202a3fa23125854db9d5eaab38
Vadim Yanitskiy at

#27769 (Mar 24, 2026, 9:29:33 PM)

pfcp_peer: tune Heartbeat Request/Response logging

Change-Id: I6435cdf64fd86fa5358d57ea4d56dcad8eb9e69e
Vadim Yanitskiy at

#27768 (Mar 24, 2026, 9:29:29 PM)

gtpu_kpi: use ?ENV_DEFAULT_GTPU_KPI_{TABLE_NAME,INTERVAL}

Change-Id: Ia8194966b20da1adc26c02f416b8ec0508191d98
Vadim Yanitskiy at

#27767 (Mar 24, 2026, 9:29:26 PM)

pfcp_peer: add configurable heartbeat miss count + association reset

Introduce heartbeat_miss_count (default: 3) that tracks consecutive
unanswered PFCP Heartbeat Requests and resets the association when the
threshold is reached.  The counter applies to both periodic heartbeats
and those triggered via the REST API, and resets to zero on any
successful Heartbeat Response.

Change-Id: I8cb0fb23468aba4dead9865a90d893c78c6ae074
Vadim Yanitskiy at

#27766 (Mar 24, 2026, 9:29:19 PM)

config/sys.config: group pfcp_peer params into a map

Following the same pattern as sctp_{client,server}, group the flat
pfcp_loc_addr/pfcp_rem_addr environment variables into a pfcp_peer
map.  The old flat keys are still supported for backwards compat.

Changes:
* osmo_s1gw_sup: add pfcp_cfg(), merging legacy flat keys with the new
  pfcp_peer map (new takes priority); store the resolved config back via
  set_env(pfcp_peer, ...) so all consumers see a single canonical map
* pfcp_peer: change start_link/2 to start_link/1 taking a cfg() map;
  simplify init() using sctp_common:parse_addr/1; add cfg() type
* rest_server: read pfcp laddr/raddr from the pfcp_peer map

Change-Id: Iba954746fe20e6b9eeaec3196e1f83e3fc3e7fc2
Vadim Yanitskiy at

#27765 (Mar 24, 2026, 9:29:02 PM)

pfcp_peer: make assoc_setup and heartbeat_req timeouts configurable

Add assoc_setup_timeout and heartbeat_req_timeout as optional fields
in the pfcp_peer config map, with 2000 ms defaults.  Store the full
cfg() map in #peer_state{} and read values from it with maps:get/3
at the point of use.

Change-Id: I58a472a3bbbbad029a2f0246b084428ab3b1905c
Vadim Yanitskiy at

#27764 (Mar 24, 2026, 9:28:55 PM)

pfcp_peer: detect UPF restart via RTS mismatch in Heartbeat Response

Check the Recovery Timestamp (RTS) in each Heartbeat Response against
the value stored during Association Setup (`rem_rts`).  A mismatch
means the UPF has restarted; log a warning, increment the new
`pfcp.peer_restart counter`, and reset the PFCP association so it is
re-established with the restarted peer.

The `is_integer(ExpRTS)` guard prevents a spurious reset when a stale
Heartbeat Response arrives in the connecting state (where `rem_rts`
is still undefined).

Change-Id: I00a8384db1ea9c38d0ad9ff90b3d45ad86c3a020
Vadim Yanitskiy at

#27763 (Mar 24, 2026, 9:25:27 PM)

[REST] PfcpAssocState: field 'lrts' is required

The local RTS is always known and thus always gets included regardless
of the PFCP association state.  Only the remote RTS is optional.

Change-Id: Ic766ebc56ce1810fc27cb49ddcac50bc94e539d9
Related: osmo-ttcn3-hacks.git I332e95a32935e0c8da99e600e8d30af14bd36b16
Vadim Yanitskiy at

#27762 (Mar 24, 2026, 4:49:31 PM)

5gc: Introduce test TC_pdu_sess_est_pco_pcscf

Our deps/nas fork is modified to fix multiple incorrect definitions
around ProtocolContainer record.

Change-Id: Ic7b22ad647bcac944551ac1c29080f895ca72cf8
Pau Espin Pedrol at

#27761 (Mar 24, 2026, 4:49:28 PM)

5gc: Introduce test TC_pdu_sess_est_always_on

This feature is right now not implemented in open5gs and hence the test
is expected to fail, since it returns no AlwaysOn Indication in PDU
Session Establishment Accept.

Change-Id: I282e0c8072172fa633bf82ed6b9492b0bb4362cc
Pau Espin Pedrol at

#27760 (Mar 24, 2026, 4:49:23 PM)

5gc: Remove arleady tested TODO

PDU Sess Est Req with emeregency services is already tested in test
TC_normal_reg_emergency_services.

Change-Id: I5e2d202ffd019b22a006637534922e0ba1d09ca0
Pau Espin Pedrol at

#27759 (Mar 24, 2026, 4:42:53 PM)

firmware: replace libosmocore fsm timers

Concurrent access from main loop and the different uart irqs was not
going well and caused crashes. The libosmocore fsm does still allocate
one internal timer, but it is not used by the firmware, so libosmocore
will not touch the rbtree.

This clashes with the host build which does not have jiffies, and
is pretty much a burden because it requires special casing code due to
the completely different targets even though it was last used many years
ago and might not even work, so disable it.

Additionally ignore checkpatch jiffies complaints because we're trying
to do firmware here.

Closes: SYS#7877
Change-Id: Id2bd67b3946bb451008965f0b68b4a919f4d10bd
ewild at

#27758 (Mar 24, 2026, 3:52:24 PM)

firmware: replace libosmocore fsm timers

Concurrent access from main loop and the different uart irqs was not
going well and caused crashes. The libosmocore fsm does still allocate
one internal timer, but it is not used by the firmware, so libosmocore
will not touch the rbtree.

This clashes with the host build which does not have jiffies, and
is pretty much a burden because it requires special casing code due to
the completely different targets even though it was last used many years
ago and might not even work, so disable it.

Additionally ignore checkpatch jiffies complaints because we're trying
to do firmware here.

Closes: SYS#7877
Change-Id: Id2bd67b3946bb451008965f0b68b4a919f4d10bd
ewild at

#27757 (Mar 24, 2026, 3:43:50 PM)

firmware: replace libosmocore fsm timers

Concurrent access from main loop and the different uart irqs was not
going well and caused crashes. The libosmocore fsm does still allocate
one internal timer, but it is not used by the firmware, so libosmocore
will not touch the rbtree.

This clashes with the host build which does not have jiffies, and
is pretty much a burden because it requires special casing code due to
the completely different targets even though it was last used many years
ago and might not even work, so disable it.

Closes: SYS#7877
Change-Id: Id2bd67b3946bb451008965f0b68b4a919f4d10bd
ewild at

#27756 (Mar 24, 2026, 3:12:14 PM)

firmware: replace libosmocore fsm timers

Concurrent access from main loop and the different uart irqs was not
going well and caused crashes. The libosmocore fsm does still allocate
one internal timer, but it is not used by the firmware, so libosmocore
will not touch the rbtree.

Closes: SYS#7877
Change-Id: Id2bd67b3946bb451008965f0b68b4a919f4d10bd
ewild at

#27755 (Mar 24, 2026, 12:23:38 PM)

docs/put_key: add tutorial that explains how to manage global platform keys

With the increased interest in using GlobalPlatform features of
UICC and eUICCs (OTA-SMS, applets, etc.), also comes an increased
interest in how the related GlobalPlatform keys can be managed
(key rotation, adding/removing keysets from/to a Security Domain).

Unfortunately, many aspects of this topic are not immediately
obvious for the average user. Let's add a tutorial that contains
some practical examples to shine some light on the topic.

Related: SYS#7881
Change-Id: I163dfedca3df572cb8442e9a4a280e6c5b00327e
pmaier@sysmocom.de at

#27754 (Mar 24, 2026, 11:54:36 AM)

5gc: Remove arleady tested TODO

PDU Sess Est Req with emeregency services is already tested in test
TC_normal_reg_emergency_services.

Change-Id: I5e2d202ffd019b22a006637534922e0ba1d09ca0
Pau Espin Pedrol at

#27753 (Mar 24, 2026, 11:53:33 AM)

5gc: Introduce test TC_pdu_sess_est_always_on

This feature is right now not implemented in open5gs and hence the test
is expected to fail, since it returns no AlwaysOn Indication in PDU
Session Establishment Accept.

Change-Id: I282e0c8072172fa633bf82ed6b9492b0bb4362cc
Pau Espin Pedrol at

#27752 (Mar 24, 2026, 11:32:29 AM)

5gc: Introduce tests TC_ng_register_ping46(_256)

Depends: osmo-uecups.git Change-Id Ic2da7a761a8df7e006fc02ca6557a48f371e4151
Change-Id: I9cb250f07ac356b7345a570ed71590f041168ed2
Pau Espin Pedrol at

#27751 (Mar 24, 2026, 11:32:25 AM)

5gc: Introduce tests TC_ng_register_ping6(_256)

Change-Id: Iedf3697265b91bdda85e8d32402345ea8d58dc9f
Pau Espin Pedrol at

#27750 (Mar 24, 2026, 11:32:20 AM)

GTPv1U_Emulation: Clear entries from PidTable upon rx CUPS program_term_ind

Otherwise it will evnetually run out of entries if enough commands are
called sequentially.

Change-Id: I7be2639761726c09e4ea6f75c57d8414c5dbf128
Pau Espin Pedrol at

#27749 (Mar 24, 2026, 11:32:09 AM)

5gc: Introduce test TC_pdu_sess_est_always_on

Change-Id: I282e0c8072172fa633bf82ed6b9492b0bb4362cc
Pau Espin Pedrol at

#27748 (Mar 24, 2026, 10:20:38 AM)

5gc: Introduce tests TC_ng_register_ping46(_256)

Depends: osmo-uecups.git Change-Id Ic2da7a761a8df7e006fc02ca6557a48f371e4151
Change-Id: I9cb250f07ac356b7345a570ed71590f041168ed2
Pau Espin Pedrol at

#27747 (Mar 24, 2026, 10:04:15 AM)

Depend on libosmo-netif for icmpv6 APIs

Most of icmpv6.* and checksum.* was moved to libosmo-netif from this
same repository so it can be reused. Link to libosmo-netif and adapt
code to new public symbol naming.

Depends: libosmo-netif.git Change-Id I78ec7270c717af0a1b8ffd9398cd69ea7a0dbee2
Change-Id: I8d8fae362f302d48afaed28a9c664f76ca4a2739
Pau Espin Pedrol at

#27746 (Mar 24, 2026, 9:48:36 AM)

5gc: Introduce tests TC_ng_register_ping46(_256)

Depends: osmo-uecups.git Change-Id Ic2da7a761a8df7e006fc02ca6557a48f371e4151
Change-Id: I9cb250f07ac356b7345a570ed71590f041168ed2
Pau Espin Pedrol at

#27745 (Mar 24, 2026, 9:48:32 AM)

5gc: Introduce tests TC_ng_register_ping6(_256)

Change-Id: Iedf3697265b91bdda85e8d32402345ea8d58dc9f
Pau Espin Pedrol at

#27744 (Mar 24, 2026, 9:48:26 AM)

GTPv1U_Emulation: Clear entries from PidTable upon rx CUPS program_term_ind

Otherwise it will evnetually run out of entries if enough commands are
called sequentially.

Change-Id: I7be2639761726c09e4ea6f75c57d8414c5dbf128
Pau Espin Pedrol at

#27743 (Mar 24, 2026, 9:26:48 AM)

5gc: Introduce tests TC_ng_register_ping46(_256)

Depends: osmo-uecups.git Change-Id Ic2da7a761a8df7e006fc02ca6557a48f371e4151
Change-Id: I9cb250f07ac356b7345a570ed71590f041168ed2
Pau Espin Pedrol at

#27742 (Mar 24, 2026, 9:26:35 AM)

5gc: Introduce tests TC_ng_register_ping6(_256)

Change-Id: Iedf3697265b91bdda85e8d32402345ea8d58dc9f
Pau Espin Pedrol at

#27741 (Mar 24, 2026, 9:26:18 AM)

GTPv1U_Emulation: Clear entries from PidTable upon rx CUPS program_term_ind

Otherwise it will evnetually run out of entries if enough commands are
called sequentially.

Change-Id: I7be2639761726c09e4ea6f75c57d8414c5dbf128
Pau Espin Pedrol at

#27740 (Mar 24, 2026, 9:24:36 AM)

GTPv1U_Emulation: Support IPv6 SLAAC with osmo-uecups

Depends: osmo-uecups.git Change-Id I917b5c70f143d48b55b4e270e24594d1a36f71aa
Change-Id: Ic368383ea65161297e57a298a12c7b4adc927142
Pau Espin Pedrol at

#27739 (Mar 24, 2026, 9:22:13 AM)

Depend on libosmo-netif for icmpv6 APIs

Most of icmpv6.* and checksum.* was moved to libosmo-netif from this
same repository so it can be reused. Link to libosmo-netif and adapt
code to new public symbol naming.

Depends: libosmo-netif.git Change-Id I78ec7270c717af0a1b8ffd9398cd69ea7a0dbee2
Change-Id: I8d8fae362f302d48afaed28a9c664f76ca4a2739
Pau Espin Pedrol at

#27738 (Mar 24, 2026, 9:18:52 AM)

Support configuring IPv4v6 tunnels

Change-Id: Ic2da7a761a8df7e006fc02ca6557a48f371e4151
Pau Espin Pedrol at

#27737 (Mar 24, 2026, 9:18:48 AM)

cups_client: Add commands to perform IPv6 SLAAC and obtain GTP tunnel IPv6 global info

Change-Id: I917b5c70f143d48b55b4e270e24594d1a36f71aa
Pau Espin Pedrol at

#27736 (Mar 24, 2026, 9:15:20 AM)

Implement logic to perform IPv6 SLAAC in GTPU tunnel

The IPv6 SLAAC prcoedure is not yet triggered in this patch; it will be
triggered by cups_client's new command in follow-up patch.

Depends: libosmo-netif.git Change-Id I78ec7270c717af0a1b8ffd9398cd69ea7a0dbee2
Change-Id: I837a4d7ec7c134412ab4a2e09909670e81ecbeea
Pau Espin Pedrol at

#27735 (Mar 23, 2026, 7:17:41 PM)

ip_checksum: Add SPDX license identifier

Let's make sure the newly-created/imported file has a machine-readable
SPDX identifier.

Change-Id: Ic40d01771e8d01461ed81d1a60d9e91a48fdc8d0
laforge at

#27734 (Mar 23, 2026, 7:17:32 PM)

icmpv6: Re-license code under GPL-v2-or-later

The original statement in my code from osmo-ggsn commit
d46bcd236e93432c894a939f4e5810dc5e9b4974 in 2017 was worded GPLv2-only,
which was most likely an oversight.

All subsequent modifications to this code were done by either me or Pau
Espin, who was doing the work under contract with sysmocom, of which I'm
the managing director.  Therefore, I have legal authority to re-license
this file to v2-or-later.

Change-Id: I5a4fa18ef64c2f228e21fa2c067e55eaa4080508
laforge at

#27733 (Mar 23, 2026, 7:17:15 PM)

Depend on libosmo-netif for icmpv6 APIs

Most of icmpv6.* and checksum.* was moved to libosmo-netif from this
same repository so it can be reused. Link to libosmo-netif and adapt
code to new public symbol naming.

Depends: libosmo-netif.git Change-Id I78ec7270c717af0a1b8ffd9398cd69ea7a0dbee2
Change-Id: I8d8fae362f302d48afaed28a9c664f76ca4a2739
Pau Espin Pedrol at

#27732 (Mar 23, 2026, 7:17:01 PM)

Support configuring IPv4v6 tunnels

Change-Id: Ic2da7a761a8df7e006fc02ca6557a48f371e4151
Pau Espin Pedrol at

#27731 (Mar 23, 2026, 7:15:27 PM)

cups_client: Add commands to perform IPv6 SLAAC and obtain GTP tunnel IPv6 global info

Change-Id: I917b5c70f143d48b55b4e270e24594d1a36f71aa
Pau Espin Pedrol at

#27730 (Mar 23, 2026, 7:14:13 PM)

Implement logic to perform IPv6 SLAAC in GTPU tunnel

The IPv6 SLAAC prcoedure is not yet triggered in this patch; it will be
triggered by cups_client's new command in follow-up patch.

Depends: libosmo-netif.git Change-Id I78ec7270c717af0a1b8ffd9398cd69ea7a0dbee2
Change-Id: I837a4d7ec7c134412ab4a2e09909670e81ecbeea
Pau Espin Pedrol at

#27729 (Mar 23, 2026, 4:59:10 PM)

pysim/pcsc: do not use getProtocol for protocol selection

The documentation of the getProtocol provided by pyscard says:

"Return bit mask for the protocol of connection, or None if no
protocol set. The return value is a bit mask of
CardConnection.T0_protocol, CardConnection.T1_protocol,
CardConnection.RAW_protocol, CardConnection.T15_protocol"

This suggests that the purpose of getProtocol is not to determine
which protocols are supported. Its purpose is to determine which
protocol is currently selected (either through auto selection or
through the explicit selection made by the API user). This means
we are using getProtocol wrong.

So far this was no problem, since the auto-selected protocol
should be a supported protocol anyway. However, the automatic
protocol selection may not always return a correct result (see
bug report from THD-siegfried [1]).

Let's not trust the automatic protocol selection. Instead let's
parse the ATR and make the decision based on the TD1/TD2 bytes).

[1] https://osmocom.org/issues/6952

Related: OS#6952
Change-Id: Ib119948aa68c430e42ac84daec8b9bd542db7963
pmaier@sysmocom.de at

#27728 (Mar 23, 2026, 4:59:08 PM)

pySim/pcsc/cosmetic: reformat comment

Change-Id: Ic04bdfbc6727cc670679c377c1afd1de53504b8f
pmaier@sysmocom.de at

#27727 (Mar 23, 2026, 4:52:39 PM)

5gc: Introduce tests TC_ng_register_ping46(_256)

Depends: osmo-uecups.git Change-Id Ic2da7a761a8df7e006fc02ca6557a48f371e4151
Change-Id: I9cb250f07ac356b7345a570ed71590f041168ed2
Pau Espin Pedrol at

#27726 (Mar 23, 2026, 4:52:34 PM)

General_types.ttcn: Introduce type OCT4_20n

This is useful to store EUAs of type v4,v6 or v4v6.

Change-Id: I00a35c444e3fb498712fbb4b9c310375c527052f
Pau Espin Pedrol at

#27725 (Mar 23, 2026, 4:52:25 PM)

GTPv1U_Emulation: Clear entries from PidTable upon rx CUPS program_term_ind

Otherwise it will evnetually run out of entries if enough commands are
called sequentially.

Change-Id: I7be2639761726c09e4ea6f75c57d8414c5dbf128
Pau Espin Pedrol at

#27724 (Mar 23, 2026, 4:52:22 PM)

5gc: Introduce tests TC_ng_register_ping6(_256)

Change-Id: Iedf3697265b91bdda85e8d32402345ea8d58dc9f
Pau Espin Pedrol at

#27723 (Mar 23, 2026, 4:52:07 PM)

GTPv1U_Emulation: Support IPv6 SLAAC with osmo-uecups

Depends: osmo-uecups.git Change-Id I917b5c70f143d48b55b4e270e24594d1a36f71aa
Change-Id: Ic368383ea65161297e57a298a12c7b4adc927142
Pau Espin Pedrol at

#27722 (Mar 23, 2026, 4:50:55 PM)

Support configuring IPv4v6 tunnels

Change-Id: Ic2da7a761a8df7e006fc02ca6557a48f371e4151
Pau Espin Pedrol at

#27721 (Mar 23, 2026, 3:50:25 PM)

pySim/EF.SMSP: fix encoding of TP-Destination Address

The TP-Destination Address in EF.SMSP uses the same encoding as the
TS-Service Centre Address field. However, even though the encoding
of both fields looks almost identical, it actually isn't.

The TS-Service Centre Address field encodes the length field as
octets required for the call_number + one octet for ton_npi.
(see also: 3GPP TS 24.011, section 8.2.5.2)

The TP-Destination Address uses the number of digits of the
call_number directly in the length field.
(see also: 3GPP TS 23.040, section 9.1.2.5)

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

#27720 (Mar 23, 2026, 3:50:22 PM)

pySim/EF.SMSP: remove superflous line break

Change-Id: Ie02e02546e708e2c339810812188bd8e8af2a720
pmaier@sysmocom.de at

#27719 (Mar 23, 2026, 3:50:20 PM)

pySim/EF.SMSP: add an additional de_encode test for EF_SMSP

Let's add another testvector where we test what happens when we populate
none of the fields except for the tp_sc_addr.

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

#27718 (Mar 23, 2026, 12:54:05 PM)

transport: change APDU format paradigm

Unfortunately we have mixed up the concept of TPDUs and APDUs in
earlier versions of pySim-shell. This lead to problems with
detecteding the APDU case properly (see also ISO/IEC 7816-3) and
also prevented us from adding support for T=1.

This problem has been fixed long time ago and all APDUs sent from
the pySim-shell code should be well formed and valid according to
ISO/IEC 7816-3.

To ensure that we continue to format APDUs correctly as APDUs (and
not TPDUs) we have added a mechanism to the LinkBase class that
would either raise an exception or print a warning if someone
mistakenly tries to send an APDU that is really a TPDU. Whether a
warning is printed or an exception is raised is controlled via the
apdu_strict member in the LinkBase class, which is false (print
warning only) by default.

The reason why we have implemneted the mechanism this way was
because we wanted to ensure that existing APDU scripts (pySim-shell
apdu command) keep working, even though when those scripts uses
APDUs which are formally invalid.

Sending a TPDU instead of an APDU via a T=0 link will still work
in almost all cases. This is also the reason why this problem
slipped through unnoticed for long time. However, there may still
be subtile problems araising from this practice. The root of the
problem is that it is impossible to distinguish between APDU case
3 and 4 when a TPDU instead of an APDU is sent. However in order
to handle a case 4 APDU correctly we must be able to distinguish
the APDU case correctly to handle the case correctly.
ETSI TS 102 221, section 7.3.1.1.4, clause 4 is very clear about
the fact that not (only) the status word (e.g. 61xx) but the
APDU case is what matters.

To complete the logic in LinkBaseTpdu and to maintain compatibility
(older APDU scripts), we must still be able to switch between the
'apdu_strict' mode and the non-strict mode. However, since
pySim-shell, pySim-prog and pySim-read internally use proper APDUs,
we may enable the 'apdu_strict' mode by default.

At the same time we will limit the effect of pySim-shell's
apdu_strict setable to the apdu command only. By doing so, the
bahviour of the apdu command is not altered. Users will still
have to enable the 'strict' mode explicitly. At the same time
all the internal functionality of pySim-shell will always use
the 'strict' mode.

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

#27717 (Mar 23, 2026, 12:51:02 PM)

all.deps: osmo-ggsn now depends on libosmo-netif

Since osmo-ggsn.git Change-Id I8d8fae362f302d48afaed28a9c664f76ca4a2739,
osmo-ggsn depends on libosmo-netif.

Change-Id: I4d10fff6a6994c428c572fc10249ad95b0d7e8db
Pau Espin Pedrol at

#27716 (Mar 23, 2026, 12:24:40 PM)

Depend on libosmo-netif for icmpv6 APIs

Most of icmpv6.* and checksum.* was moved to libosmo-netif from this
same repository so it can be reused. Link to libosmo-netif and adapt
code to new public symbol naming.

Depends: libosmo-netif.git Change-Id I78ec7270c717af0a1b8ffd9398cd69ea7a0dbee2
Change-Id: I8d8fae362f302d48afaed28a9c664f76ca4a2739
Pau Espin Pedrol at

#27715 (Mar 23, 2026, 12:14:04 PM)

Introduce API osmo_icmpv6

icmpv6.* files are copied from osmo-ggsn.git 1.14.0
(ebd1bf8adbc8d5bec9e36d70e3a78e8838226e7a).

Change-Id: I78ec7270c717af0a1b8ffd9398cd69ea7a0dbee2
Pau Espin Pedrol at

#27714 (Mar 23, 2026, 11:52:07 AM)

cups_client: Add commands to perform IPv6 SLAAC and obtain GTP tunnel IPv6 global info

Change-Id: I917b5c70f143d48b55b4e270e24594d1a36f71aa
Pau Espin Pedrol at

#27713 (Mar 23, 2026, 11:52:05 AM)

Implement logic to perform IPv6 SLAAC in GTPU tunnel

The IPv6 SLAAC prcoedure is not yet triggered in this patch; it will be
triggered by cups_client's new command in follow-up patch.

Depends: libosmo-netif.git Change-Id I78ec7270c717af0a1b8ffd9398cd69ea7a0dbee2
Change-Id: I837a4d7ec7c134412ab4a2e09909670e81ecbeea
Pau Espin Pedrol at

#27712 (Mar 23, 2026, 11:35:22 AM)

Introduce ip_checksum API

ip_checksum.* files are copied from checksum.* in osmo-ggsn.git
1.14.0 (ebd1bf8adbc8d5bec9e36d70e3a78e8838226e7a).

Change-Id: Ia09645a4715ac133036d7c89297b0fa10cf9aa3b
Pau Espin Pedrol at

#27711 (Mar 23, 2026, 11:35:16 AM)

Introduce API osmo_icmpv6

icmpv6.* files are copied from osmo-ggsn.git 1.14.0
(ebd1bf8adbc8d5bec9e36d70e3a78e8838226e7a).

Change-Id: I78ec7270c717af0a1b8ffd9398cd69ea7a0dbee2
Pau Espin Pedrol at

#27710 (Mar 23, 2026, 10:05:00 AM)

manuals: ignore old osmo-s1gw tags

Logic for building the osmo-s1gw-usermanual.pdf has just been added to
master. The Osmocom-release-manuals job tries to build old manuals as
well because now the osmo-s1gw directory exists at
https://ftp.osmocom.org/docs. Ignore old tags, as we can't build
usermanuals for those.

Change-Id: I94f19db2861f16c45894573f52f30bfbf5a7725e
Oliver Smith at

#27709 (Mar 23, 2026, 10:04:51 AM)

manuals: osmo-s1gw: adjust build_publish_manuals

Use the proper command to build osmo-s1gw manuals, so it doesn't fail
with:
  + su build -c autoreconf -fi
  autoreconf: error: 'configure.ac' is required

Change-Id: I096fd34fc5819becbc3a08a2dc4065d4913bbc1b
Oliver Smith at

#27708 (Mar 20, 2026, 9:35:31 PM)

esim/saip: raise an exception properly

Change-Id: Ia3749c02120fdc16e556214d0461cbeca032447b
laforge at

#27707 (Mar 20, 2026, 9:35:28 PM)

cdma_ruim: fix inaccurate comment for EF_AD

Change-Id: I71ea27fd30e44685ff35f49843072ca392995973
laforge at

#27706 (Mar 20, 2026, 9:35:21 PM)

utils: dec_plmn(): remove redundant call

Change-Id: Ic95c3992ed57eb8fee952ec2dc7f092dd7689579
laforge at

#27705 (Mar 20, 2026, 9:35:16 PM)

sms: fix flags_construct in SMS_DELIVER

* field `tp_rp` appears at bit positions 7 and 5
** bit 7 should be `tp_rp` (Reply Path)
** bit 5 should be `tp_sri` (Status Report Indication)
* field `tp_lp` is completely missing
** should be at bit position 3

Change-Id: I0274849f0fa07281b5e050af429ffda7d249f9e8
laforge at

#27704 (Mar 20, 2026, 9:35:13 PM)

ts_31_102: fix description for EF_5GS3GPPLOCI

Change-Id: I9cf3adfce65090fedb3f0fd33c9b3d15a2c5fb8c
laforge at

#27703 (Mar 20, 2026, 9:35:07 PM)

ota: OtaAlgo{Crypt,Auth}: fix algo_auth vs algo_crypt

* OtaAlgoCrypt.from_keyset() searches by `otak.algo_crypt`
  but the error message prints `otak.algo_auth`.  Should be
  `otak.algo_crypt` instead.

* OtaAlgoAuth.__init__() checks `algo_auth` but the error message
  prints `algo_crypt`.  Should be `otak.algo_auth` instead.

Change-Id: Ia636fffaeadc68e3f6d5b65d477e753834c95895
laforge at

#27702 (Mar 20, 2026, 9:35:02 PM)

global_platform: fix typo in SupportedTlsCipherSuitesForScp81

The attribute name is misspelled.  The BER-TLV infrastructure looks
for `_construct`; this typo means `SupportedTlsCipherSuitesForScp81`
will never decode its content.

Change-Id: I0f637951b0eeb7eca2a8b543baa737f216a935ed
laforge at

#27701 (Mar 20, 2026, 9:34:50 PM)

global_platform: fix docstring for Scp03SessionKeys._get_icv()

Change-Id: I8983bc27f581295544360ba8b4ae1d28b3ea850f
laforge at

#27700 (Mar 20, 2026, 9:34:35 PM)

ara_m: fix undefined variable used in a format-string

Change-Id: I310a5d461bae2b5e4d8e07097000b079c23aa0f6
laforge at

#27699 (Mar 20, 2026, 9:34:28 PM)

ara_m: fix exceptions not being raised properly

Exceptions are meant to be thrown/raised, not returned.

Change-Id: Id799c264447e22887edcd2dc7eb991cf0af1bbfc
laforge at

#27698 (Mar 20, 2026, 9:34:23 PM)

utils: DataObjectCollection.encode(): fix TypeError

`members_by_name` is a plain dictionary.  Calling it with `()` raises:

  TypeError: 'dict' object is not callable

Change-Id: I7e0c09aa7303f1506fe3a025fdc3779919dd0e6c
laforge at

#27697 (Mar 20, 2026, 9:34:19 PM)

global_platform: fix s/GET/STORE/ DATA in docs

Both `do_store_data` and `store_data` have identical docstrings that
incorrectly describe the command as GET DATA.  Should be "STORE DATA".
Take a chance to fix missing space between `v2.3` and `Section`.

Change-Id: I33fc80ab8ca50fadc38217b0005eec6169c8e34e
laforge at

#27696 (Mar 20, 2026, 9:34:12 PM)

global_platform: fix store_data() returning last chunk only

The loop builds up `response` across multiple STORE DATA blocks,
but the function returns only `data` - the response from the
*last* block.  It should return the accumulated response instead.

Change-Id: I3e15c8004d1e366e8c3896e559656622f48bb1a2
laforge at

#27695 (Mar 20, 2026, 9:34:08 PM)

global_platform: fix typo in ApplicationTemplate

The keyword argument should be `nested=`.  As written `ApplicationAID`
is silently ignored - `ApplicationTemplate` will not descend into its
nested TLVs.

Change-Id: If45dbb0c9b09fe53560d109957ce339267a9f2b0
laforge at

#27694 (Mar 20, 2026, 9:34:02 PM)

ts_31_102: EF_5G_PROSE_UIR: fix copy-pasted inner class name

Change-Id: I460e5ad70f35026d0d794271a4aef17323c14dfb
laforge at

#27693 (Mar 20, 2026, 9:33:58 PM)

ts_51_011: EF.EXT[6-7]: fix typo in desc

Change-Id: I93df1c9fd8a4d588ed7ed19ec2dc1d304412fc3d
laforge at

#27692 (Mar 20, 2026, 3:43:32 PM)

5gc: Introduce tests TC_ng_register_ping6(_256)

Change-Id: Iedf3697265b91bdda85e8d32402345ea8d58dc9f
Pau Espin Pedrol at

#27691 (Mar 20, 2026, 3:43:02 PM)

5gc: Introduce tests TC_ng_register_ping6(_256)

Change-Id: Iedf3697265b91bdda85e8d32402345ea8d58dc9f
Pau Espin Pedrol at

#27690 (Mar 20, 2026, 3:42:52 PM)

GTPv1U_Emulation: Support IPv6 SLAAC with osmo-uecups

Depends: osmo-uecups.git Change-Id I917b5c70f143d48b55b4e270e24594d1a36f71aa
Change-Id: Ic368383ea65161297e57a298a12c7b4adc927142
Pau Espin Pedrol at

#27689 (Mar 20, 2026, 3:30:03 PM)

cups_client: Add commands to perform IPv6 SLAAC and obtain GTP tunnel IPv6 global info

Change-Id: I1570ccf5f98ac98c1af467c48f42b6b54ac3911d
Pau Espin Pedrol at

#27688 (Mar 20, 2026, 3:24:33 PM)

Implement logic to perform IPv6 SLAAC in GTPU tunnel

The IPv6 SLAAC prcoedure is not yet triggered in this patch; it will be
triggered by cups_client's new command in follow-up patch.

Change-Id: I837a4d7ec7c134412ab4a2e09909670e81ecbeea
Pau Espin Pedrol at

#27687 (Mar 20, 2026, 3:24:29 PM)

cups_client: Add commands to perform IPv6 SLAAC and obtain GTP tunnel IPv6 global info

Change-Id: I917b5c70f143d48b55b4e270e24594d1a36f71aa
Pau Espin Pedrol at

#27686 (Mar 20, 2026, 1:26:10 PM)

cups_client: Log error decoding EUA

Change-Id: I98c7841da0f2662291aab5180f6113cb5fca4867
Pau Espin Pedrol at

#27685 (Mar 20, 2026, 1:24:47 PM)

cups_client: SPlit Tx of json str into its own function

This helper can be used in the future to submit a str multiple times
(eg. to multiple cups clients) without having to re-allocate the
content.

Change-Id: I505bf2eeea998a749e55f8f3b05c5013b5761297
Pau Espin Pedrol at

#27684 (Mar 20, 2026, 1:13:26 PM)

tun: Fix typo in log line and comment

Change-Id: I2f7ec968035193e00652dc27217f46e0719e56e8
Pau Espin Pedrol at

#27683 (Mar 20, 2026, 1:11:44 PM)

Use libosmocore netdev API

Depends: libosmocore.git Change-Id I75153eb59e96a6a2505dc5b29432c76e5c21ea24
Change-Id: I8f18ef56a6e7186fed88f965fbb34aa390c3bac1
Pau Espin Pedrol at

#27682 (Mar 20, 2026, 11:47:34 AM)

Use libosmocore netdev API

Depends: libosmocore.git Change-Id I75153eb59e96a6a2505dc5b29432c76e5c21ea24
Change-Id: I8f18ef56a6e7186fed88f965fbb34aa390c3bac1
Pau Espin Pedrol at

#27681 (Mar 20, 2026, 11:42:03 AM)

Use libosmocore netdev API

Depends: libosmocore.git Change-Id I75153eb59e96a6a2505dc5b29432c76e5c21ea24
Change-Id: I8f18ef56a6e7186fed88f965fbb34aa390c3bac1
Pau Espin Pedrol at

#27680 (Mar 20, 2026, 11:39:01 AM)

contrib/jenkins_manuals: fix doc/manuals paths

Change-Id: Ibfccefec7e44a4803d4ff8ad061db395fc498b89
Oliver Smith at

#27679 (Mar 20, 2026, 11:25:41 AM)

enb_proxy: split conn_info() into mme_conn_info() and proxy_info()

The old conn_info() conflated two distinct concerns: the MME SCTP
connection info stored in enb_registry (aid, saddr, sport) and the
broader operational state used for introspection (handler pid, enb
connection info, etc.).  Mixing them forced enb_registry to hold a
handler pid it has no business knowing about, and required rest_server
to extract that pid just to reach s1ap_proxy for E-RAB listing.

Split into two distinct types:

* mme_conn_info() - pure MME SCTP connection info (aid, saddr, sport),
  stored in the enb_registry and signalled via notify_mme_comm_up/2.
  The `mme_` prefix is dropped from field names as the type name
  provides the context.

* proxy_info() - richer operational snapshot (handler, enb_handle,
  enb_conn_info, mme_conn_info, genb_id_str, mme_info), returned by
  fetch_info/1 for introspection/debugging purposes.

Additionally:

* Add fetch_erab_list/1 to enb_proxy, delegating internally to
  s1ap_proxy:fetch_erab_list/1 via the cached handler pid.  This
  allows the rest_server to obtain a list of E-RAB without having
  to obtain pid of the s1ap_proxy and interact with it.

* Remove separate enb_aid/mme_aid/mme_saddr/mme_sport state fields;
  enb_aid is now read directly from enb_conn_info, and the MME fields
  are grouped in mme_conn_info.

Change-Id: Ia428ceb4762f972211e9b790688dc89fb5b8a274
Related: SYS#7066
Vadim Yanitskiy at

#27678 (Mar 20, 2026, 11:25:36 AM)

s1ap_proxy: add public erab_list() type

Change-Id: I21a674537d1d9f16fdb319aaf2d758ba0906b407
Vadim Yanitskiy at

#27677 (Mar 20, 2026, 11:25:32 AM)

[REST] Add PLMN/eNB IDs to EnbItem

Change-Id: I79690223a34afea5e6661125ac04f98462dadb03
Related: SYS#7066
Vadim Yanitskiy at

#27676 (Mar 20, 2026, 11:25:27 AM)

enb_proxy: add missing mme_info() to proxy_info()

As a bonus, `tried_mmes` now only serves its actual purpose - tracking
which MMEs have already been tried for selection filtering - rather
than being abused as a way to retrieve the current MME name.

Change-Id: Ibbb293d9e68b7c3a8c3ca7ee73132dbda3f2bf97
Related: SYS#7066
Vadim Yanitskiy at

#27675 (Mar 20, 2026, 11:25:23 AM)

enb_{proxy,registry}: signal MME conn info on SCTP comm_up

Previously, mme_aid/mme_saddr/mme_sport were only signalled to the
enb_registry once the S1 Setup procedure completed.  This meant the
REST API could not show MME connection details for eNBs stuck in
wait_s1setup_rsp state (e.g. due to a slow or retrying MME).

Add notify_mme_comm_up/2, called at SCTP comm_up, which stores the full
conn_info (including mme_aid, mme_saddr, mme_sport) in the registry as
soon as the SCTP connection is established.

notify_mme_connected/2 is simplified to notify_mme_connected/1: it now
only flips the state to 'connected', since conn_info is already stored.

Change-Id: Iea9ba4fdf961e6cd262edc154884a2eee3d95355
Related: SYS#7066
Vadim Yanitskiy at

#27674 (Mar 20, 2026, 11:25:18 AM)

doc/manuals: cli: shorten enb_list example table

The full enb_list table with all address columns is too wide to fit
on a page and does not render well in PDF.  Collapse the address
columns with '...'; add a note that they are omitted for readability.

Change-Id: I4e25233a3e77358060f1098e97907c93deab334b
Related: OS#6671
Vadim Yanitskiy at

#27673 (Mar 20, 2026, 11:25:12 AM)

rest_server: log received requests (as debug)

Change-Id: I25da9662fb98a0eafcedfde21b12a937225f5fb9
Related: SYS#7066
Vadim Yanitskiy at

#27672 (Mar 20, 2026, 11:25:01 AM)

rest_server: fix TOC/TOU race when listing/fetching E-RABs

The list of E-RAB FSM pids is a snapshot taken at one point in time.
By the time we interrogate each erab_fsm process individually, any of
them may have already terminated (e.g. bearer released mid-request).
The current code fails to generate a response if this happens.

* fetch_erab_info/1: add a pid() clause that wraps erab_list_item/1
  in a try/catch, returning 'error' if the process is gone.

* fetch_erab_info/1: catch both exit forms
** `{noproc, _}` raised by gen_statem:call/2 on a monitored pid, and
** the bare noproc atom for other code paths.

* fetch_erab_list/1: switch from lists:map to lists:filtermap and
  call fetch_erab_info/1 per E-RAB, silently dropping any that died
  between the snapshot and the per-process interrogation.

Change-Id: I160b413aa535f2379ad4e40a3ae8f37c5bce2067
Related: SYS#7066
Vadim Yanitskiy at

#27671 (Mar 20, 2026, 9:44:11 AM)

docs/put_key: add tutorial that explains how to manage global platform keys

With the increased interest in using GlobalPlatform features of
UICC and eUICCs (OTA-SMS, applets, etc.), also comes an increased
interest in how the related GlobalPlatform keys can be managed
(key rotation, adding/removing keysets from/to a Security Domain).

Unfortunately, many aspects of this topic are not immediately
obvious for the average user. Let's add a tutorial that contains
some practical examples to shine some light on the topic.

Related: SYS#7881
Change-Id: I163dfedca3df572cb8442e9a4a280e6c5b00327e
pmaier@sysmocom.de at

#27670 (Mar 19, 2026, 10:41:14 PM)

enb_proxy: split conn_info() into mme_conn_info() and proxy_info()

The old conn_info() conflated two distinct concerns: the MME SCTP
connection info stored in enb_registry (aid, saddr, sport) and the
broader operational state used for introspection (handler pid, enb
connection info, etc.).  Mixing them forced enb_registry to hold a
handler pid it has no business knowing about, and required rest_server
to extract that pid just to reach s1ap_proxy for E-RAB listing.

Split into two distinct types:

* mme_conn_info() - pure MME SCTP connection info (aid, saddr, sport),
  stored in the enb_registry and signalled via notify_mme_comm_up/2.
  The `mme_` prefix is dropped from field names as the type name
  provides the context.

* proxy_info() - richer operational snapshot (handler, enb_handle,
  enb_conn_info, mme_conn_info, genb_id_str, mme_info), returned by
  fetch_info/1 for introspection/debugging purposes.

Additionally:

* Add fetch_erab_list/1 to enb_proxy, delegating internally to
  s1ap_proxy:fetch_erab_list/1 via the cached handler pid.  This
  allows the rest_server to obtain a list of E-RAB without having
  to obtain pid of the s1ap_proxy and interact with it.

* Remove separate enb_aid/mme_aid/mme_saddr/mme_sport state fields;
  enb_aid is now read directly from enb_conn_info, and the MME fields
  are grouped in mme_conn_info.

Change-Id: Ia428ceb4762f972211e9b790688dc89fb5b8a274
Related: SYS#7066
Vadim Yanitskiy at

#27669 (Mar 19, 2026, 10:41:12 PM)

enb_proxy: add missing mme_info() to proxy_info()

As a bonus, `tried_mmes` now only serves its actual purpose - tracking
which MMEs have already been tried for selection filtering - rather
than being abused as a way to retrieve the current MME name.

Change-Id: Ibbb293d9e68b7c3a8c3ca7ee73132dbda3f2bf97
Related: SYS#7066
Vadim Yanitskiy at

#27668 (Mar 19, 2026, 10:41:09 PM)

rest_server: fix TOC/TOU race when listing/fetching E-RABs

The list of E-RAB FSM pids is a snapshot taken at one point in time.
By the time we interrogate each erab_fsm process individually, any of
them may have already terminated (e.g. bearer released mid-request).
The current code fails to generate a response if this happens.

* fetch_erab_info/1: add a pid() clause that wraps erab_list_item/1
  in a try/catch, returning 'error' if the process is gone.

* fetch_erab_info/1: catch both exit forms
** `{noproc, _}` raised by gen_statem:call/2 on a monitored pid, and
** the bare noproc atom for other code paths.

* fetch_erab_list/1: switch from lists:map to lists:filtermap and
  call fetch_erab_info/1 per E-RAB, silently dropping any that died
  between the snapshot and the per-process interrogation.

Change-Id: I160b413aa535f2379ad4e40a3ae8f37c5bce2067
Related: SYS#7066
Vadim Yanitskiy at

#27667 (Mar 19, 2026, 10:41:06 PM)

doc/manuals: cli: shorten enb_list example table

The full enb_list table with all address columns is too wide to fit
on a page and does not render well in PDF.  Collapse the address
columns with '...'; add a note that they are omitted for readability.

Change-Id: I4e25233a3e77358060f1098e97907c93deab334b
Related: OS#6671
Vadim Yanitskiy at

#27666 (Mar 19, 2026, 10:41:02 PM)

enb_{proxy,registry}: signal MME conn info on SCTP comm_up

Previously, mme_aid/mme_saddr/mme_sport were only signalled to the
enb_registry once the S1 Setup procedure completed.  This meant the
REST API could not show MME connection details for eNBs stuck in
wait_s1setup_rsp state (e.g. due to a slow or retrying MME).

Add notify_mme_comm_up/2, called at SCTP comm_up, which stores the full
conn_info (including mme_aid, mme_saddr, mme_sport) in the registry as
soon as the SCTP connection is established.

notify_mme_connected/2 is simplified to notify_mme_connected/1: it now
only flips the state to 'connected', since conn_info is already stored.

Change-Id: Iea9ba4fdf961e6cd262edc154884a2eee3d95355
Related: SYS#7066
Vadim Yanitskiy at

#27665 (Mar 19, 2026, 10:40:57 PM)

[REST] Add PLMN/eNB IDs to EnbItem

Change-Id: I79690223a34afea5e6661125ac04f98462dadb03
Related: SYS#7066
Vadim Yanitskiy at

#27664 (Mar 19, 2026, 10:39:11 PM)

s1ap_proxy: add public erab_list() type

Change-Id: I21a674537d1d9f16fdb319aaf2d758ba0906b407
Vadim Yanitskiy at

#27663 (Mar 19, 2026, 9:33:51 PM)

enb_proxy: add missing mme_info() to proxy_info()

As a bonus, `tried_mmes` now only serves its actual purpose - tracking
which MMEs have already been tried for selection filtering - rather
than being abused as a way to retrieve the current MME name.

Change-Id: Ibbb293d9e68b7c3a8c3ca7ee73132dbda3f2bf97
Related: SYS#7066
Vadim Yanitskiy at

#27662 (Mar 19, 2026, 9:33:42 PM)

s1ap_proxy: add public erab_list() type

Change-Id: I21a674537d1d9f16fdb319aaf2d758ba0906b407
Vadim Yanitskiy at

#27661 (Mar 19, 2026, 9:33:38 PM)

enb_{proxy,registry}: signal MME conn info on SCTP comm_up

Previously, mme_aid/mme_saddr/mme_sport were only signalled to the
enb_registry once the S1 Setup procedure completed.  This meant the
REST API could not show MME connection details for eNBs stuck in
wait_s1setup_rsp state (e.g. due to a slow or retrying MME).

Add notify_mme_comm_up/2, called at SCTP comm_up, which stores the full
conn_info (including mme_aid, mme_saddr, mme_sport) in the registry as
soon as the SCTP connection is established.

notify_mme_connected/2 is simplified to notify_mme_connected/1: it now
only flips the state to 'connected', since conn_info is already stored.

Change-Id: Iea9ba4fdf961e6cd262edc154884a2eee3d95355
Related: SYS#7066
Vadim Yanitskiy at

#27660 (Mar 19, 2026, 9:30:54 PM)

enb_proxy: split conn_info() into mme_conn_info() and proxy_info()

The old conn_info() conflated two distinct concerns: the MME SCTP
connection info stored in enb_registry (aid, saddr, sport) and the
broader operational state used for introspection (handler pid, enb
connection info, etc.).  Mixing them forced enb_registry to hold a
handler pid it has no business knowing about, and required rest_server
to extract that pid just to reach s1ap_proxy for E-RAB listing.

Split into two distinct types:

* mme_conn_info() - pure MME SCTP connection info (aid, saddr, sport),
  stored in the enb_registry and signalled via notify_mme_comm_up/2.
  The `mme_` prefix is dropped from field names as the type name
  provides the context.

* proxy_info() - richer operational snapshot (handler, enb_handle,
  enb_conn_info, mme_conn_info, genb_id_str, mme_info), returned by
  fetch_info/1 for introspection/debugging purposes.

Additionally:

* Add fetch_erab_list/1 to enb_proxy, delegating internally to
  s1ap_proxy:fetch_erab_list/1 via the cached handler pid.  This
  allows the rest_server to obtain a list of E-RAB without having
  to obtain pid of the s1ap_proxy and interact with it.

* Remove separate enb_aid/mme_aid/mme_saddr/mme_sport state fields;
  enb_aid is now read directly from enb_conn_info, and the MME fields
  are grouped in mme_conn_info.

Change-Id: Ia428ceb4762f972211e9b790688dc89fb5b8a274
Related: SYS#7066
Vadim Yanitskiy at

#27659 (Mar 19, 2026, 4:51:04 PM)

docs/put_key: add tutorial that explains how to manage global platform keys

With the increased interest in using GlobalPlatform features of
UICC and eUICCs (OTA-SMS, applets, etc.), also comes an increased
interest in how the related GlobalPlatform keys can be managed
(key rotation, adding/removing keysets from/to a Security Domain).

Unfortunately, many aspects of this topic are not immediately
obvious for the average user. Let's add a tutorial that contains
some practical examples to shine some light on the topic.

Related: SYS#7881
Change-Id: I163dfedca3df572cb8442e9a4a280e6c5b00327e
pmaier@sysmocom.de at

#27658 (Mar 19, 2026, 4:33:39 PM)

docs/put_key: add tutorial that explains how to manage global platform keys

With the increased interest in using GlobalPlatform features of
UICC and eUICCs (OTA-SMS, applets, etc.), also comes an increased
interest in how the related GlobalPlatform keys can be managed
(key rotation, adding/removing keysets from/to a Security Domain).

Unfortunately, many aspects of this topic are not immediately
obvious for the average user. Let's add a tutorial that contains
some practical examples to shine some light on the topic.

Related: SYS#7881
Change-Id: I163dfedca3df572cb8442e9a4a280e6c5b00327e
pmaier@sysmocom.de at

#27657 (Mar 19, 2026, 4:24:46 PM)

Use libosmocore netdev

Depends: libosmocore.git Change-Id I75153eb59e96a6a2505dc5b29432c76e5c21ea24
Change-Id: I8f18ef56a6e7186fed88f965fbb34aa390c3bac1
Pau Espin Pedrol at

#27656 (Mar 19, 2026, 3:11:36 PM)

netdev: Add API osmo_netdev_del_addr()

Change-Id: I75153eb59e96a6a2505dc5b29432c76e5c21ea24
Pau Espin Pedrol at

#27655 (Mar 19, 2026, 2:05:20 PM)

Use libosmocore netns API

Change-Id: Ia8617765d4c14483e2ad0ea09a8f2276fd7aaebf
Pau Espin Pedrol at

#27654 (Mar 19, 2026, 12:10:53 PM)

transport: change APDU format paradigm

Unfortunately we have mixed up the concept of TPDUs and APDUs in
earlier versions of pySim-shell. This lead to problems with
detecteding the APDU case properly (see also ISO/IEC 7816-3) and
also prevented us from adding support for T=1.

This problem has been fixed long time ago and all APDUs sent from
the pySim-shell code should be well formed and valid according to
ISO/IEC 7816-3.

To ensure that we continue to format APDUs correctly as APDUs (and
not TPDUs) we have added a mechanism to the LinkBase class that
would either raise an exception or print a warning if someone
mistakenly tries to send an APDU that is really a TPDU. Whether a
warning is printed or an exception is raised is controlled via the
apdu_strict member in the LinkBase class, which is false (print
warning only) by default.

The reason why we have implemneted the mechanism this way was
because we wanted to ensure that existing APDU scripts (pySim-shell
apdu command) keep working, even though when those scripts uses
APDUs which are formally invalid.

Sending a TPDU instead of an APDU via a T=0 link will still work
in almost all cases. This is also the reason why this problem
slipped through unnoticed for long time. However, there may still
be subtile problems araising from this practice. The root of the
problem is that it is impossible to distinguish between APDU case
3 and 4 when a TPDU instead of an APDU is sent. However in order
to handle a case 4 APDU correctly we must be able to distinguish
the APDU case correctly to handle the case correctly.
ETSI TS 102 221, section 7.3.1.1.4, clause 4 is very clear about
the fact that not (only) the status word (e.g. 61xx) but the
APDU case is what matters.

To complete the logic in LinkBaseTpdu and to maintain compatibility
(older APDU scripts), we must still be able to switch between the
'apdu_strict' mode and the non-strict mode. However, it makes sense
to do this on a per-api-call basis instead globally via a class
property.

At the same time we will limit the effect of pySim-shell's
apdu_strict setable to the apdu command only. By doing so, the
bahviour of the apdu command is not altered. Users will still
have to enable the 'strict' mode explicitly. At the same time
all the internal functionality of pySim-shell will always use
the 'strict' mode.

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

#27653 (Mar 19, 2026, 11:25:08 AM)

Use osmo_sockaddr everywhere

This allows getting rid of lots of explicit castings, as well as makeing
it easier do improve IPv6 support in the future.

Change-Id: Id87d9cf2ec138091681ab0fe7c7f86d648c0e98e
Pau Espin Pedrol at

#27652 (Mar 19, 2026, 12:53:03 AM)

doc/manuals: cli: shorten enb_list example table

The full enb_list table with all address columns is too wide to fit
on a page and does not render well in PDF.  Collapse the address
columns with '...'; add a note that they are omitted for readability.

Change-Id: I4e25233a3e77358060f1098e97907c93deab334b
Related: OS#6671
Vadim Yanitskiy at

#27651 (Mar 19, 2026, 12:53:00 AM)

[REST] Add MME source address/port to EnbItem

The enb_proxy now captures the local address and port of the S1GW-MME
SCTP connection (mme_saddr/mme_sport) at comm_up and includes them in
conn_info().  Expose this info through the REST API (EnbItem schema),
show it as a new column/row in the CLI (enb_list/enb_info).

Change-Id: I15bbddf96ac7d5b6f9962a8d745db58fdec334e7
Related: SYS#7066
Vadim Yanitskiy at

#27650 (Mar 19, 2026, 12:04:49 AM)

[REST] Add MME source address/port to EnbItem

The enb_proxy now captures the local address and port of the S1GW-MME
SCTP connection (mme_saddr/mme_sport) at comm_up and includes them in
conn_info().  Expose this info through the REST API (EnbItem schema),
show it as a new column/row in the CLI (enb_list/enb_info).

Change-Id: I15bbddf96ac7d5b6f9962a8d745db58fdec334e7
Related: SYS#7066
Vadim Yanitskiy at

#27649 (Mar 19, 2026, 12:04:46 AM)

doc/manuals: cli: shorten enb_list example table

The full enb_list table with all address columns is too wide to fit
on a page and does not render well in PDF.  Collapse the address
columns with '...'; add a note that they are omitted for readability.

Change-Id: I4e25233a3e77358060f1098e97907c93deab334b
Related: OS#6671
Vadim Yanitskiy at

#27648 (Mar 18, 2026, 11:24:51 PM)

library/HTTP_Adapter: clarify response template restriction

Change-Id: I1a5ee842c30de9ec22d9e375f6b1b24b3eaee1e0
Vadim Yanitskiy at

#27647 (Mar 18, 2026, 11:24:36 PM)

library/HTTP_Adapter: bail out early on failure

Replace `self.stop` with `Misc_Helpers.f_shutdown()`, and add it after
existing `setverdict(fail, ...)` calls that previously fell through.

In all these cases there is no meaningful way to continue: the caller
of these functions usually expects a valid value to be returned, and
continuing (not stopping) oftentimes results in confusing DTEs.

Change-Id: I229028d551d5cf9651e6e65314cd40f414bfe235
Vadim Yanitskiy at

#27646 (Mar 18, 2026, 11:24:21 PM)

s1gw: f_REST_*(): use tr_HTTP_RespBody(decmatch T:?)

Pass `exp := tr_HTTP_RespBody(decmatch T:?)` to f_http_transact() in
every REST helper that decodes the response body.  This ensures both
a 2xx status code and a decodable body are required before any decode
attempt is made, producing an informative "Unexpected HTTP response"
verdict (rather than a confusing DTE) when e.g. an older osmo-s1gw
returns HTTP 404 with an empty body for an unsupported endpoint.

Change-Id: I6997dae5314d4a4588386183832426ab5b8d0843
Vadim Yanitskiy at

#27645 (Mar 18, 2026, 6:41:36 PM)

dfu: set poll timeout to 128 ms to reduce EPIPE errors

The previous 10 ms poll timeout creates ERROR_PIPE errors when the
octsim is connected to a more busy bus.
E.g. when a network device is connected to the same bus or when flashing
multiple OCTSIMs at the same time.

From usb captures 70 ms should be already enough, but adding an additional
safety margin.
It is unclear why the EPIPE errors happens.

Related: SYS#7910
Change-Id: I4abe812e17194f37ce5d97fd1d866aeebd1d4239
lynxis at

#27644 (Mar 18, 2026, 3:53:55 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

#27643 (Mar 18, 2026, 3:53:51 PM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#27642 (Mar 18, 2026, 3:51:14 PM)

proto_trxd: add helpers to prepare burst indication packets

- introduce trxd_prepare_burst_ind_v0() and trxd_prepare_burst_ind_v1()
- reuse prepared packet size in send helpers
- handle idle frames during packet preparation
- use ssize_t consistently for prepared/write sizes

Change-Id: Ie94a1df4879cbf6056cd05c9621c46db1ed972fd
dtv.comp at

#27641 (Mar 18, 2026, 3:14:19 PM)

eIM_Tests: align RSP version number in HTTP header

The RSP version number in the x-admin-protocol header string should
be set to v.2.1.0 (gsma/rsp/v2.1.0), even though the ASN.1 spec we
currently use is at version 2.5.

This is to maintain compatibility with older IPAd versions and also
stated explicitly in GSMA SGP.32 V2.1, section 6.1.

Change-Id: I125c3b13697c71d35788e54b7d88a9f943bb7a71
Related: SYS#7945
pmaier@sysmocom.de at

#27640 (Mar 18, 2026, 2:03:31 PM)

[REST] EnbItem: expose name of the selected MME

For each eNB connection, include the name of the MME that was selected
from the pool.  Update the OpenAPI spec, CLI (enb_list/enb_info tables),
and user manual accordingly.

Change-Id: I4839275efa5d3545e84d684ad1b8b989214ef76a
Related: SYS#7066, SYS#7052
Vadim Yanitskiy at

#27639 (Mar 18, 2026, 2:03:29 PM)

[REST] Implement eNB/MME selection by addr-port

Add support for selecting an MME or eNB by remote address and port
in the REST API and CLI.  The selector format is `addr:IP:PORT` for
MMEs and `enb-conn:IP:PORT` for eNBs, where IP can be an IPv4 or
IPv6 address.  The colon is used as the address/port separator.

Change-Id: If02c8de1e1b7214bba868eee35233a79d0704dc5
Related: SYS#7066
Vadim Yanitskiy at

#27638 (Mar 18, 2026, 2:03:26 PM)

[REST] Implement PfcpAssoc{Setup,Release}

Change-Id: I2e24544563e4c4d23bb3d8a4a7b5434191b482d8
Related: SYS#7066
Vadim Yanitskiy at

#27637 (Mar 18, 2026, 2:00:38 PM)

[REST] Add MME source address/port

Change-Id: I15bbddf96ac7d5b6f9962a8d745db58fdec334e7
Vadim Yanitskiy at

#27636 (Mar 18, 2026, 1:31:43 PM)

[REST] EnbItem: expose name of the selected MME

For each eNB connection, include the name of the MME that was selected
from the pool.  Update the OpenAPI spec, CLI (enb_list/enb_info tables),
and user manual accordingly.

Change-Id: I4839275efa5d3545e84d684ad1b8b989214ef76a
Related: SYS#7066, SYS#7052
Vadim Yanitskiy at

#27635 (Mar 18, 2026, 1:31:40 PM)

enb_proxy: obtain sctp_client sockopts from the env directly

Instead of passing the MmeConnCfg (sctp_client:cfg()) all the way
from osmo_s1gw_sup through sctp_server (as priv) into enb_proxy
(as state), read the sctp_client configuration in-place via
osmo_s1gw:get_env/2 when it is actually needed (connecting/enter).

This works because osmo_s1gw_sup already normalizes and writes back
the complete sctp_client config to the application env (set_env/2)
before starting the supervision tree.

As a result, mme_conn_cfg is removed from enb_proxy's state record,
start_link/2 no longer uses its Priv argument, and server_cfg/1 is
simplified to server_cfg/0.

Change-Id: Ic77d3eb3351c8981c87fa4b6febcdeb814b9187b
Vadim Yanitskiy at

#27634 (Mar 18, 2026, 1:31:37 PM)

[REST] Implement eNB/MME selection by addr-port

Change-Id: If02c8de1e1b7214bba868eee35233a79d0704dc5
Related: SYS#7066
Vadim Yanitskiy at

#27633 (Mar 18, 2026, 1:31:33 PM)

[REST] Add MME source address/port

Change-Id: I15bbddf96ac7d5b6f9962a8d745db58fdec334e7
Vadim Yanitskiy at

#27632 (Mar 18, 2026, 1:31:30 PM)

[REST] Implement PfcpAssoc{Setup,Release}

Change-Id: I2e24544563e4c4d23bb3d8a4a7b5434191b482d8
Related: SYS#7066
Vadim Yanitskiy at

#27631 (Mar 18, 2026, 1:31:27 PM)

config/sys.config: increase StatsD reporter interval to 10s

When running ttcn3-s1gw-test locally, I noticed OsmoS1GW consuming
30-40% of a CPU core while idle (not serving any eNBs).  Profiling
with etop pointed to `exometer_report_statsd` as the culprit: with
~1720 metrics registered, it was sending ~1720 datagrams per second.

A 1-second reporting interval causes noticeable CPU overhead as the
number of active metrics grows.  With per-eNB and per-MME counters,
the metric set scales with the number of connected eNBs/MMEs.

Increase the default StatsD reporting interval from 1s to 10s to
reduce that overhead.  Update the documentation accordingly.

Change-Id: Icd5e1a43d1df4a4909fe742aec67cc51a01bb857
Vadim Yanitskiy at

#27630 (Mar 18, 2026, 1:31:24 PM)

enb_proxy: signal mme_info() to the enb_registry

When an MME is selected from the pool, pass the mme_registry:mme_info()
to the enb_registry via notify_mme_connecting/2 (replacing /1).  This
makes all MME configuration details (name, address, port, TAC list)
available to consumers such as the REST server, without having to
look them up separately from the mme_registry.

Change-Id: I22e705b8196c9dcf436ed3c4d91c5c5a912e7282
Related: SYS#7052
Vadim Yanitskiy at

#27629 (Mar 18, 2026, 1:31:19 PM)

rebar.lock: bump exometer_report_statsd version

The new version is using ETS instead of dict for counter lookups.
This significantly reduces performance impact when multiple eNBs
are registered, since the ETS provides O(1) average-case hash
lookups and in-place mutation.

Change-Id: I931321a831215012aa8186d851d9a8d38908a4bf
Vadim Yanitskiy at

#27628 (Mar 18, 2026, 1:31:16 PM)

[REST] Add GET /config endpoint (ConfigRead)

This endpoint returns the effective runtime configuration that
OsmoS1GW is currently using, with all defaults applied.  This
reflects the values read via `osmo_s1gw:get_env/2` at startup.

Change-Id: Ic6c9562a541e4a0728257538887537aac6b99b97
Related: SYS#7066
Vadim Yanitskiy at

#27627 (Mar 18, 2026, 1:31:11 PM)

doc/manuals: update MmeItem related info

The osmo-s1gw-cli documentation was not properly updated in 63ce2c9:

* default local/bind address for an MME is "any", not "::"
* allowed TACs (--tac) was missing in help and examples

Change-Id: I0b8115fe6342a80bf1eb99bd6ad210492a013947
Fixes: 63ce2c9 ("[REST] Add MmeList, MmeAdd, MmeInfo, MmeDelete")
Related: OS#6671, SYS#7066, SYS#7052
Vadim Yanitskiy at

#27626 (Mar 18, 2026, 1:31:07 PM)

doc/manuals: merge doc/osmo-s1gw-cli.md

Change-Id: Ic2556f6add9c6a24f6da03f4388d7f86dde0c5dc
Related: OS#6671, SYS#7066
Vadim Yanitskiy at

#27625 (Mar 18, 2026, 1:31:02 PM)

contrib: add jenkins_manuals.sh

Change-Id: I54f0774575534519a2c40e0588f136c8a5e706f8
Related: osmo-ci.git Id62d806a648c8f3480cb4f162adf65f77c552848
Related: OS#6671
Vadim Yanitskiy at

#27624 (Mar 18, 2026, 1:25:32 PM)

pfcp_peer: define ?PFCP_ASSOC_SETUP_TIMEOUT

Change-Id: I0b7299d9f3eaa8c0a3c7e4a4d6331d1ec5a1c779
Vadim Yanitskiy at

#27623 (Mar 18, 2026, 1:11:34 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

#27622 (Mar 18, 2026, 12:52:07 PM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#27621 (Mar 18, 2026, 12:51:58 PM)

proto_trxd: add helpers to prepare burst indication packets

- introduce trxd_prepare_burst_ind_v0() and trxd_prepare_burst_ind_v1()
- reuse prepared packet size in send helpers
- handle idle frames during packet preparation
- use ssize_t consistently for prepared/write sizes

Change-Id: Ie94a1df4879cbf6056cd05c9621c46db1ed972fd
dtv.comp at

#27620 (Mar 18, 2026, 12:49:25 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

#27619 (Mar 18, 2026, 12:17:59 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

#27618 (Mar 18, 2026, 9:59:05 AM)

SCCP_Adapter: Fix typo in setverdict string

Change-Id: I8924bf646b5c45e71746d3e76cf6aa3aa3fb674c
Pau Espin Pedrol at

#27617 (Mar 18, 2026, 9:58:53 AM)

5gc: f_pdu_sess_establish(): Pass pdu sess type as param

Change-Id: I86680b0a2f5ddb27ecbebd5639199d2f77d397f6
Pau Espin Pedrol at

#27616 (Mar 18, 2026, 9:58:48 AM)

5gc: Update mobility procedure status

There's no procedure to do direct mobility between GERAN/UTRAN and 5GS
according to spec, and IP preservation is not supported either through
indirect mobility GERAN/UTRAN<->EUTRAN<->5GS.

Regarding 3GPP TS 23.502 Annex G, open5gs-smfd supports Gn interface but
only when working against a 4G MME, not through 5GS (PCF and AMF).

Related specs:
*3GPP TS 23.501:
** 5.17.2.4 Mobility between 5GS and GERAN/UTRAN
** Annex L (normative): Support of GERAN/UTRAN access
* 3GPP TS 23.502 4.11.5 Impacts to 5GC Procedures
* 3GPP TS 23.632 5.3 5GC-EPC Mobility Scenarios

Change-Id: I6bb8672fbd553a1a2a51b97a8360658afa0fddff
Pau Espin Pedrol at

#27615 (Mar 18, 2026, 9:53:34 AM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#27614 (Mar 17, 2026, 9:32:53 PM)

[REST] Implement eNB/MME selection by addr-port

Change-Id: If02c8de1e1b7214bba868eee35233a79d0704dc5
Related: SYS#7066
Vadim Yanitskiy at

#27613 (Mar 17, 2026, 9:32:46 PM)

enb_proxy: obtain sctp_client sockopts from the env directly

Instead of passing the MmeConnCfg (sctp_client:cfg()) all the way
from osmo_s1gw_sup through sctp_server (as priv) into enb_proxy
(as state), read the sctp_client configuration in-place via
osmo_s1gw:get_env/2 when it is actually needed (connecting/enter).

This works because osmo_s1gw_sup already normalizes and writes back
the complete sctp_client config to the application env (set_env/2)
before starting the supervision tree.

As a result, mme_conn_cfg is removed from enb_proxy's state record,
start_link/2 no longer uses its Priv argument, and server_cfg/1 is
simplified to server_cfg/0.

Change-Id: Ic77d3eb3351c8981c87fa4b6febcdeb814b9187b
Vadim Yanitskiy at

#27612 (Mar 17, 2026, 9:32:37 PM)

pfcp_peer: define ?PFCP_ASSOC_SETUP_TIMEOUT

Change-Id: I0b7299d9f3eaa8c0a3c7e4a4d6331d1ec5a1c779
Vadim Yanitskiy at

#27611 (Mar 17, 2026, 9:32:27 PM)

[REST] Add GET /config endpoint (ConfigRead)

This endpoint returns the effective runtime configuration that
OsmoS1GW is currently using, with all defaults applied.  This
reflects the values read via `osmo_s1gw:get_env/2` at startup.

Change-Id: Ic6c9562a541e4a0728257538887537aac6b99b97
Related: SYS#7066
Vadim Yanitskiy at

#27610 (Mar 17, 2026, 9:32:19 PM)

enb_proxy: signal mme_info() to the enb_registry

When an MME is selected from the pool, pass the mme_registry:mme_info()
to the enb_registry via notify_mme_connecting/2 (replacing /1).  This
makes all MME configuration details (name, address, port, TAC list)
available to consumers such as the REST server, without having to
look them up separately from the mme_registry.

Change-Id: I22e705b8196c9dcf436ed3c4d91c5c5a912e7282
Related: SYS#7052
Vadim Yanitskiy at

#27609 (Mar 17, 2026, 9:32:14 PM)

[REST] EnbItem: expose name of the selected MME

For each eNB connection, include the name of the MME that was selected
from the pool.  Update the OpenAPI spec, CLI (enb_list/enb_info tables),
and user manual accordingly.

Change-Id: I4839275efa5d3545e84d684ad1b8b989214ef76a
Related: SYS#7066, SYS#7052
Vadim Yanitskiy at

#27608 (Mar 17, 2026, 9:29:18 PM)

[REST] Implement PfcpAssoc{Setup,Release}

Change-Id: I2e24544563e4c4d23bb3d8a4a7b5434191b482d8
Related: SYS#7066
Vadim Yanitskiy at

#27607 (Mar 17, 2026, 7:53:01 PM)

rebar.lock: bump exometer_report_statsd version

The new version is using ETS instead of dict for counter lookups.
This significantly reduces performance impact when multiple eNBs
are registered, since the ETS provides O(1) average-case hash
lookups and in-place mutation.

Change-Id: I931321a831215012aa8186d851d9a8d38908a4bf
Vadim Yanitskiy at

#27606 (Mar 17, 2026, 7:52:57 PM)

config/sys.config: increase StatsD reporter interval to 10s

When running ttcn3-s1gw-test locally, I noticed OsmoS1GW consuming
30-40% of a CPU core while idle (not serving any eNBs).  Profiling
with etop pointed to `exometer_report_statsd` as the culprit: with
~1720 metrics registered, it was sending ~1720 datagrams per second.

A 1-second reporting interval causes noticeable CPU overhead as the
number of active metrics grows.  With per-eNB and per-MME counters,
the metric set scales with the number of connected eNBs/MMEs.

Increase the default StatsD reporting interval from 1s to 10s to
reduce that overhead.  Update the documentation accordingly.

Change-Id: Icd5e1a43d1df4a4909fe742aec67cc51a01bb857
Vadim Yanitskiy at

#27605 (Mar 17, 2026, 6:32:49 PM)

ara_m: fix undefined variable used in a format-string

Change-Id: I310a5d461bae2b5e4d8e07097000b079c23aa0f6
Vadim Yanitskiy at

#27604 (Mar 17, 2026, 6:32:43 PM)

utils: DataObjectCollection.encode(): fix TypeError

`members_by_name` is a plain dictionary.  Calling it with `()` raises:

  TypeError: 'dict' object is not callable

Change-Id: I7e0c09aa7303f1506fe3a025fdc3779919dd0e6c
Vadim Yanitskiy at

#27603 (Mar 17, 2026, 6:32:38 PM)

global_platform: fix typo in ApplicationTemplate

The keyword argument should be `nested=`.  As written `ApplicationAID`
is silently ignored - `ApplicationTemplate` will not descend into its
nested TLVs.

Change-Id: If45dbb0c9b09fe53560d109957ce339267a9f2b0
Vadim Yanitskiy at

#27602 (Mar 17, 2026, 6:32:32 PM)

esim/saip: raise an exception properly

Change-Id: Ia3749c02120fdc16e556214d0461cbeca032447b
Vadim Yanitskiy at

#27601 (Mar 17, 2026, 6:32:23 PM)

ts_31_102: fix description for EF_5GS3GPPLOCI

Change-Id: I9cf3adfce65090fedb3f0fd33c9b3d15a2c5fb8c
Vadim Yanitskiy at

#27600 (Mar 17, 2026, 6:32:09 PM)

global_platform: fix store_data() returning last chunk only

The loop builds up `response` across multiple STORE DATA blocks,
but the function returns only `data` - the response from the
*last* block.  It should return the accumulated response instead.

Change-Id: I3e15c8004d1e366e8c3896e559656622f48bb1a2
Vadim Yanitskiy at

#27599 (Mar 17, 2026, 6:32:03 PM)

global_platform: fix typo in SupportedTlsCipherSuitesForScp81

The attribute name is misspelled.  The BER-TLV infrastructure looks
for `_construct`; this typo means `SupportedTlsCipherSuitesForScp81`
will never decode its content.

Change-Id: I0f637951b0eeb7eca2a8b543baa737f216a935ed
Vadim Yanitskiy at

#27598 (Mar 17, 2026, 6:31:56 PM)

global_platform: install_cap_parser: argument groups cannot be nested

pySim-shell currently does not work on systems with Python 3.14+:

  File ".../pysim/pySim/global_platform/__init__.py", line 868, in AddlShellCommands
    install_cap_parser_inst_prm_g_grp = install_cap_parser_inst_prm_g.add_argument_group()
  File "/usr/lib/python3.14/argparse.py", line 1794, in add_argument_group
    raise ValueError('argument groups cannot be nested')
  ValueError('argument groups cannot be nested')

The problem is that install_cap_parser creates a nested group inside
of mutually exclusive group.  argparse never supported group nesting
properly, so it has been deprecated since Python 3.11, and eventually
got removed in Python 3.14.

Remove group nesting, adjust the usage string, and implement the
mutual exclusiveness/inclusiveness manually in do_install_cap().

Change-Id: Idddf72d5a745345e134b23f2f01e0257d0667579
Vadim Yanitskiy at

#27597 (Mar 17, 2026, 6:31:49 PM)

ota: OtaAlgo{Crypt,Auth}: fix algo_auth vs algo_crypt

* OtaAlgoCrypt.from_keyset() searches by `otak.algo_crypt`
  but the error message prints `otak.algo_auth`.  Should be
  `otak.algo_crypt` instead.

* OtaAlgoAuth.__init__() checks `algo_auth` but the error message
  prints `algo_crypt`.  Should be `otak.algo_auth` instead.

Change-Id: Ia636fffaeadc68e3f6d5b65d477e753834c95895
Vadim Yanitskiy at

#27596 (Mar 17, 2026, 6:31:43 PM)

global_platform: refactor gen_install_parameters()

gen_install_parameters() had contradictory logic: the outer guard
required all three arguments to be non-None/non-empty (making them
mutually inclusive), while the inner checks then treated each one
as optional.

Make each parameter independently optional (defaulting to None) and
remove the all-or-nothing check.  Simplify the function body to a
straightforward single-pass construction of system_specific_params.

Change-Id: I8756fb38016cdf0527fe2e21edb44381d1dc557f
Vadim Yanitskiy at

#27595 (Mar 17, 2026, 6:31:37 PM)

ts_51_011: EF.EXT[6-7]: fix typo in desc

Change-Id: I93df1c9fd8a4d588ed7ed19ec2dc1d304412fc3d
Vadim Yanitskiy at

#27594 (Mar 17, 2026, 6:31:32 PM)

global_platform: fix docstring for Scp03SessionKeys._get_icv()

Change-Id: I8983bc27f581295544360ba8b4ae1d28b3ea850f
Vadim Yanitskiy at

#27593 (Mar 17, 2026, 6:31:25 PM)

utils: dec_plmn(): remove redundant call

Change-Id: Ic95c3992ed57eb8fee952ec2dc7f092dd7689579
Vadim Yanitskiy at

#27592 (Mar 17, 2026, 6:31:17 PM)

ara_m: fix exceptions not being raised properly

Exceptions are meant to be thrown/raised, not returned.

Change-Id: Id799c264447e22887edcd2dc7eb991cf0af1bbfc
Vadim Yanitskiy at

#27591 (Mar 17, 2026, 6:31:11 PM)

global_platform: fix s/GET/STORE/ DATA in docs

Both `do_store_data` and `store_data` have identical docstrings that
incorrectly describe the command as GET DATA.  Should be "STORE DATA".
Take a chance to fix missing space between `v2.3` and `Section`.

Change-Id: I33fc80ab8ca50fadc38217b0005eec6169c8e34e
Vadim Yanitskiy at

#27590 (Mar 17, 2026, 6:31:00 PM)

sms: fix flags_construct in SMS_DELIVER

* field `tp_rp` appears at bit positions 7 and 5
** bit 7 should be `tp_rp` (Reply Path)
** bit 5 should be `tp_sri` (Status Report Indication)
* field `tp_lp` is completely missing
** should be at bit position 3

Change-Id: I0274849f0fa07281b5e050af429ffda7d249f9e8
Vadim Yanitskiy at

#27589 (Mar 17, 2026, 6:30:53 PM)

ts_31_102: EF_5G_PROSE_UIR: fix copy-pasted inner class name

Change-Id: I460e5ad70f35026d0d794271a4aef17323c14dfb
Vadim Yanitskiy at

#27588 (Mar 17, 2026, 6:30:45 PM)

cdma_ruim: fix inaccurate comment for EF_AD

Change-Id: I71ea27fd30e44685ff35f49843072ca392995973
Vadim Yanitskiy at

#27587 (Mar 17, 2026, 4:21:02 PM)

5gc: f_pdu_sess_establish(): Pass pdu sess type as param

Change-Id: I86680b0a2f5ddb27ecbebd5639199d2f77d397f6
Pau Espin Pedrol at

#27586 (Mar 17, 2026, 3:56:59 PM)

doc/manuals: add overview, document running and configuration

Change-Id: I4ceca069866d7191ef2b153af95a20cb522bffeb
Related: OS#6671
Vadim Yanitskiy at

#27585 (Mar 17, 2026, 3:56:57 PM)

doc/manuals: update MmeItem related info

The osmo-s1gw-cli documentation was not properly updated in 63ce2c9:

* default local/bind address for an MME is "any", not "::"
* allowed TACs (--tac) was missing in help and examples

Change-Id: I0b8115fe6342a80bf1eb99bd6ad210492a013947
Fixes: 63ce2c9 ("[REST] Add MmeList, MmeAdd, MmeInfo, MmeDelete")
Related: OS#6671, SYS#7066, SYS#7052
Vadim Yanitskiy at

#27584 (Mar 17, 2026, 3:56:55 PM)

doc/manuals: document the REST interface

Change-Id: I8bc9183fff8f65db71554ee26369db9bdb61b78a
Related: OS#6671, SYS#7066
Vadim Yanitskiy at

#27583 (Mar 17, 2026, 3:56:50 PM)

doc/manuals: document GTP-U KPI monitoring

Change-Id: I2709cd545bfd6c8f6e34358caf9d372c02dd5c3e
Related: OS#6671, SYS#7307
Vadim Yanitskiy at

#27582 (Mar 17, 2026, 3:56:46 PM)

doc/manuals: document the metrics

Change-Id: Iacfefd387d0cd26eebbbeba0cd37efa78f90bb46
Related: OS#6671, SYS#7065
Vadim Yanitskiy at

#27581 (Mar 17, 2026, 3:56:42 PM)

config/sys.config: increase StatsD reporter interval to 10s

A 1-second reporting interval causes noticeable CPU overhead as the
number of active metrics grows.  With per-eNB and per-MME counters,
the metric set scales with the number of connected eNBs/MMEs.

Increase the default StatsD reporting interval from 1s to 10s to
reduce that overhead.  Update the documentation.

Change-Id: Icd5e1a43d1df4a4909fe742aec67cc51a01bb857
Vadim Yanitskiy at

#27580 (Mar 17, 2026, 3:56:29 PM)

contrib: add jenkins_manuals.sh

Change-Id: I54f0774575534519a2c40e0588f136c8a5e706f8
Related: osmo-ci.git Id62d806a648c8f3480cb4f162adf65f77c552848
Related: OS#6671
Vadim Yanitskiy at

#27579 (Mar 17, 2026, 3:54:09 PM)

doc/manuals: merge doc/osmo-s1gw-cli.md

Change-Id: Ic2556f6add9c6a24f6da03f4388d7f86dde0c5dc
Related: OS#6671, SYS#7066
Vadim Yanitskiy at

#27578 (Mar 17, 2026, 12:31:38 PM)

5gc: Update mobility procedure status

There's no procedure to do direct mobility between GERAN/UTRAN and 5GS
according to spec, and IP preservation is not supported either through
indirect mobility GERAN/UTRAN<->EUTRAN<->5GS.

Regarding 3GPP TS 23.502 Annex G, open5gs-smfd supports Gn interface but
only when working against a 4G MME, not through 5GS (PCF and AMF).

Related specs:
*3GPP TS 23.501:
** 5.17.2.4 Mobility between 5GS and GERAN/UTRAN
** Annex L (normative): Support of GERAN/UTRAN access
* 3GPP TS 23.502 4.11.5 Impacts to 5GC Procedures
* 3GPP TS 23.632 5.3 5GC-EPC Mobility Scenarios

Change-Id: I6bb8672fbd553a1a2a51b97a8360658afa0fddff
Pau Espin Pedrol at

#27577 (Mar 17, 2026, 11:10:24 AM)

transceiver: make control command parsing arguments const

Change-Id: I2f3aa5363c337791451a388f394d7351d3183908
dtv.comp at

#27576 (Mar 17, 2026, 11:10:20 AM)

transceiver: replace sprintf() with snprintf() in ctrl_sock_handle_rx

Change-Id: I7b725534c83a759e7b8f72f605dbcc38d778b1f2
dtv.comp at

#27575 (Mar 17, 2026, 11:10:16 AM)

proto_trxd: add helpers to prepare burst indication packets

- introduce trxd_prepare_burst_ind_v0() and trxd_prepare_burst_ind_v1()
- reuse prepared packet size in send helpers
- handle idle frames during packet preparation
- use ssize_t consistently for prepared/write sizes

Change-Id: Ie94a1df4879cbf6056cd05c9621c46db1ed972fd
dtv.comp at

#27574 (Mar 17, 2026, 11:10:12 AM)

transceiver: return -EINVAL for invalid SETSLOT

Change-Id: I90bda68268abdeee9c766a3bf4189fba8f13da53
dtv.comp at

#27573 (Mar 17, 2026, 11:10:06 AM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#27572 (Mar 17, 2026, 11:06:57 AM)

device/websdr: add WebSDR transceiver backend and build target

- add libosmo-trx-websdr library and pkg-config file
- integrate WebSDR device into the autotools build system
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#27571 (Mar 17, 2026, 10:18:17 AM)

esim/http_json_api: allow URL rewriting

The URL used when HTTP requests are performed is defined statically
with the url_prefix passed to the constructor of JsonHttpApiClient
together with the path property in JsonHttpApiFunction.

For applications that require dynamic URLs there is no way to rewrite
the URL. Let's add a mechanism that allows API users to apply custom
URL reqriting rules by adding a rewrite_url method to
JsonHttpApiFunction. API users may then overload this method with a
custom implementation as needed.

Related: SYS#7918
Change-Id: Id2713a867079cc140517fe312189e5e2162608a5
pmaier@sysmocom.de at

#27570 (Mar 16, 2026, 6:17:39 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
- Keep original modulateBurstLaurent() as fallback
- 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

#27569 (Mar 16, 2026, 5:08:19 PM)

5gc: Introduce test TC_ran_initiated_qos_flow_mobility

Change-Id: I1a1df29fa254496990d3d9099b3072433468ecb1
Pau Espin Pedrol at

#27568 (Mar 16, 2026, 5:08:14 PM)

transceiver: make control command parsing arguments const

Change-Id: I2f3aa5363c337791451a388f394d7351d3183908
dtv.comp at

#27567 (Mar 16, 2026, 5:08:06 PM)

transceiver: return -EINVAL for invalid SETSLOT and preserve original behavior

Change-Id: I90bda68268abdeee9c766a3bf4189fba8f13da53
dtv.comp at

#27566 (Mar 16, 2026, 5:07:57 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
- Keep original modulateBurstLaurent() as fallback
- 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

#27565 (Mar 16, 2026, 5:07:51 PM)

device/websdr: add WebSDR transceiver backend and build target

- add libosmo-trx-websdr library and pkg-config file
- integrate WebSDR device into the autotools build system
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#27564 (Mar 16, 2026, 5:04:06 PM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#27563 (Mar 16, 2026, 4:56:06 PM)

5gc: Introduce test TC_ran_initiated_qos_flow_mobility

Change-Id: I1a1df29fa254496990d3d9099b3072433468ecb1
Pau Espin Pedrol at

#27562 (Mar 16, 2026, 4:56:03 PM)

NGAP_Templates: Fix wrong IE id in n2_PDUSessionResourceModifyConfirm

Change-Id: Iddcf4e3081d47f91e3b6ec52186116bf93e28c90
Pau Espin Pedrol at

#27561 (Mar 16, 2026, 4:14:49 PM)

5gc: Introduce test TC_secondary_rat_data_usage_report

Change-Id: I8a82b1a8bcea948356d819af5c4919ae3829e549
Pau Espin Pedrol at

#27560 (Mar 16, 2026, 3:01:23 PM)

5gc: Document unable to find out specified message

N2 "QoS Flow mobility Indication" message mentioned in
3GPP TS 23.502 section 4.14.1 "RAN Initiated QoS Flow Mobility"
doesn't seem to show up in NGAP 3GPP TS 38.413.
I couldn't find any reference to it outside of that spec anywhere else.

Change-Id: I1a1df29fa254496990d3d9099b3072433468ecb1
Pau Espin Pedrol at

#27559 (Mar 16, 2026, 2:56:17 PM)

doc/manuals: document the REST interface

Change-Id: I8bc9183fff8f65db71554ee26369db9bdb61b78a
Related: OS#6671
Vadim Yanitskiy at

#27558 (Mar 16, 2026, 2:56:15 PM)

[REST] Add GET /config endpoint for reading the current configuration

Change-Id: Ic6c9562a541e4a0728257538887537aac6b99b97
Related: SYS#7066
Vadim Yanitskiy at

#27557 (Mar 16, 2026, 2:56:13 PM)

doc/manuals: document the metrics

Change-Id: Iacfefd387d0cd26eebbbeba0cd37efa78f90bb46
Related: OS#6671
Vadim Yanitskiy at

#27556 (Mar 16, 2026, 2:56:10 PM)

doc/manuals: add overview, document running and configuration

Change-Id: I4ceca069866d7191ef2b153af95a20cb522bffeb
Related: OS#6671
Vadim Yanitskiy at

#27555 (Mar 16, 2026, 2:56:08 PM)

doc/manuals: document GTP-U KPI monitoring

Change-Id: I2709cd545bfd6c8f6e34358caf9d372c02dd5c3e
Related: OS#6671
Vadim Yanitskiy at

#27554 (Mar 16, 2026, 2:52:19 PM)

doc/manuals: merge doc/osmo-s1gw-cli.md

Change-Id: Ic2556f6add9c6a24f6da03f4388d7f86dde0c5dc
Related: OS#6671
Vadim Yanitskiy at

#27553 (Mar 16, 2026, 2:36:35 PM)

doc/manuals: document the metrics

Change-Id: Iacfefd387d0cd26eebbbeba0cd37efa78f90bb46
Related: OS#6671
Vadim Yanitskiy at

#27552 (Mar 16, 2026, 2:36:33 PM)

doc/manuals: merge doc/osmo-s1gw-cli.md

Change-Id: Ic2556f6add9c6a24f6da03f4388d7f86dde0c5dc
Related: OS#6671
Vadim Yanitskiy at

#27551 (Mar 16, 2026, 2:36:30 PM)

doc/manuals: add overview, document running and configuration

Change-Id: I4ceca069866d7191ef2b153af95a20cb522bffeb
Related: OS#6671
Vadim Yanitskiy at

#27550 (Mar 16, 2026, 2:36:28 PM)

doc/manuals: document the REST interface

Change-Id: I8bc9183fff8f65db71554ee26369db9bdb61b78a
Related: OS#6671
Vadim Yanitskiy at

#27549 (Mar 16, 2026, 2:36:25 PM)

[REST] Add GET /config endpoint for reading the current configuration

Change-Id: Ic6c9562a541e4a0728257538887537aac6b99b97
Related: SYS#7066
Vadim Yanitskiy at

#27548 (Mar 16, 2026, 2:34:28 PM)

doc/manuals: document GTP-U KPI monitoring

Change-Id: I2709cd545bfd6c8f6e34358caf9d372c02dd5c3e
Related: OS#6671
Vadim Yanitskiy at

#27547 (Mar 16, 2026, 2:16:50 PM)

5gc: Document multiple inter RAT procedures not implemented

Change-Id: I71cee40c79d7266ca46fa9757df18605646b320f
Pau Espin Pedrol at

#27546 (Mar 16, 2026, 2:13:33 PM)

esim/http_json_api: allow URL rewriting

The URL used when HTTP requests are performed is defined statically
with the url_prefix passed to the constructor of JsonHttpApiClient
together with the path property in JsonHttpApiFunction.

For applications that require dynamic URLs there is no way to rewrite
the URL. Let's add a mechanism that allows API users to apply custom
URL reqriting rules by adding a rewrite_url method to
JsonHttpApiFunction. API users may then overload this method with a
custom implementation as needed.

Related: SYS#7918
Change-Id: Id2713a867079cc140517fe312189e5e2162608a5
pmaier@sysmocom.de at

#27545 (Mar 16, 2026, 2:05:43 PM)

esim/http_json_api: allow URL rewriting

The URL used when HTTP requests are performed is defined statically
with the url_prefix passed to the constructor of JsonHttpApiClient
together with the path property in JsonHttpApiFunction.

For applications that require dynamic URLs there is no way to rewrite
the URL. Let's add a mechanism that allows API users to apply custom
URL reqriting rules by adding a reqrite_url method to
JsonHttpApiFunction. API users may then overload this method with a
custom implementation as needed.

Related: SYS#7918
Change-Id: Id2713a867079cc140517fe312189e5e2162608a5
pmaier@sysmocom.de at

#27544 (Mar 16, 2026, 1:05:10 PM)

5gc: Document multiple inter RAT procedures not implemented

Change-Id: I71cee40c79d7266ca46fa9757df18605646b320f
Pau Espin Pedrol at

#27543 (Mar 16, 2026, 12:09:35 PM)

5gc: Remove conditional check for nightly repo in TC_pdu_sess_modification

open5gs 2.7.7 was recently released, so there's no need to guard for
nightly repo, since latest repo should contain now 2.7.7 with the needed
fix.

Change-Id: Ie37fb0e895710fdc7a4d497812cc2585b00996f8
Pau Espin Pedrol at

#27542 (Mar 16, 2026, 12:09:31 PM)

5gc: Document 'SMS over NAS' procedures as not implemented by open5gs

Change-Id: I7e69fc8076b3177b8d5513170aecdc1f3f92cd8d
Pau Espin Pedrol at

#27541 (Mar 16, 2026, 12:09:27 PM)

5gc: Document Location Services as not implemented by open5gs

Change-Id: I784ecc13018456278d228120cb22b786be6532ac
Pau Espin Pedrol at

#27540 (Mar 16, 2026, 12:09:17 PM)

5gc: Introduce test TC_normal_reg_emergency_services_fallback

Change-Id: I17f15d901a10791ae0ad208b7d6ea9a333b93dad
Pau Espin Pedrol at

#27539 (Mar 16, 2026, 11:46:36 AM)

rebar.lock: bump exometer_report_statsd version

The new version is using ETS instead of dict for counter lookups.
This significantly reduces performance impact when multiple eNBs
are registered, since the ETS provides O(1) average-case hash
lookups and in-place mutation.

Change-Id: I931321a831215012aa8186d851d9a8d38908a4bf
Vadim Yanitskiy at

#27538 (Mar 16, 2026, 10:20:49 AM)

doc/manuals: merge doc/osmo-s1gw-cli.md

Change-Id: Ic2556f6add9c6a24f6da03f4388d7f86dde0c5dc
Related: OS#6671
Vadim Yanitskiy at

#27537 (Mar 16, 2026, 10:20:46 AM)

doc/manuals: document the REST interface

Change-Id: I8bc9183fff8f65db71554ee26369db9bdb61b78a
Related: OS#6671
Vadim Yanitskiy at

#27536 (Mar 16, 2026, 10:20:41 AM)

doc/manuals: add overview, document running and configuration

Change-Id: I4ceca069866d7191ef2b153af95a20cb522bffeb
Related: OS#6671
Vadim Yanitskiy at

#27535 (Mar 16, 2026, 10:20:34 AM)

doc/manuals: update MmeItem related info

The osmo-s1gw-cli documentation was not properly updated in 63ce2c9:

* default local/bind address for an MME is "any", not "::"
* allowed TACs (--tac) was missing in help and examples

Change-Id: I0b8115fe6342a80bf1eb99bd6ad210492a013947
Fixes: 63ce2c9 ("[REST] Add MmeList, MmeAdd, MmeInfo, MmeDelete")
Related: OS#6671
Vadim Yanitskiy at

#27534 (Mar 16, 2026, 10:20:16 AM)

contrib: add jenkins_manuals.sh

Change-Id: I54f0774575534519a2c40e0588f136c8a5e706f8
Related: osmo-ci.git Id62d806a648c8f3480cb4f162adf65f77c552848
Related: OS#6671
Vadim Yanitskiy at

#27533 (Mar 16, 2026, 10:19:16 AM)

doc/manuals: document GTP-U KPI monitoring

Change-Id: I2709cd545bfd6c8f6e34358caf9d372c02dd5c3e
Related: OS#6671
Vadim Yanitskiy at

#27532 (Mar 16, 2026, 10:15:05 AM)

doc/manuals: document the metrics

Change-Id: Iacfefd387d0cd26eebbbeba0cd37efa78f90bb46
Related: OS#6671
Vadim Yanitskiy at

#27531 (Mar 16, 2026, 9:56:57 AM)

ara_m: fix undefined variable used in a format-string

Change-Id: I310a5d461bae2b5e4d8e07097000b079c23aa0f6
Vadim Yanitskiy at

#27530 (Mar 16, 2026, 9:56:54 AM)

ota: OtaAlgo{Crypt,Auth}: fix algo_auth vs algo_crypt

* OtaAlgoCrypt.from_keyset() searches by `otak.algo_crypt`
  but the error message prints `otak.algo_auth`.  Should be
  `otak.algo_crypt` instead.

* OtaAlgoAuth.__init__() checks `algo_auth` but the error message
  prints `algo_crypt`.  Should be `otak.algo_auth` instead.

Change-Id: Ia636fffaeadc68e3f6d5b65d477e753834c95895
Vadim Yanitskiy at

#27529 (Mar 16, 2026, 9:56:52 AM)

utils: dec_plmn(): remove redundant call

Change-Id: Ic95c3992ed57eb8fee952ec2dc7f092dd7689579
Vadim Yanitskiy at

#27528 (Mar 16, 2026, 9:56:49 AM)

utils: DataObjectCollection.encode(): fix TypeError

`members_by_name` is a plain dictionary.  Calling it with `()` raises:

  TypeError: 'dict' object is not callable

Change-Id: I7e0c09aa7303f1506fe3a025fdc3779919dd0e6c
Vadim Yanitskiy at

#27527 (Mar 16, 2026, 9:56:47 AM)

esim/saip: raise an exception properly

Change-Id: Ia3749c02120fdc16e556214d0461cbeca032447b
Vadim Yanitskiy at

#27526 (Mar 16, 2026, 9:56:45 AM)

global_platform: fix typo in SupportedTlsCipherSuitesForScp81

The attribute name is misspelled.  The BER-TLV infrastructure looks
for `_construct`; this typo means `SupportedTlsCipherSuitesForScp81`
will never decode its content.

Change-Id: I0f637951b0eeb7eca2a8b543baa737f216a935ed
Vadim Yanitskiy at

#27525 (Mar 16, 2026, 9:56:42 AM)

ts_31_102: EF_5G_PROSE_UIR: fix copy-pasted inner class name

Change-Id: I460e5ad70f35026d0d794271a4aef17323c14dfb
Vadim Yanitskiy at

#27524 (Mar 16, 2026, 9:56:40 AM)

ts_31_102: fix description for EF_5GS3GPPLOCI

Change-Id: I9cf3adfce65090fedb3f0fd33c9b3d15a2c5fb8c
Vadim Yanitskiy at

#27523 (Mar 16, 2026, 9:56:37 AM)

global_platform: fix docstring for Scp03SessionKeys._get_icv()

Change-Id: I8983bc27f581295544360ba8b4ae1d28b3ea850f
Vadim Yanitskiy at

#27522 (Mar 16, 2026, 9:56:34 AM)

ts_51_011: EF.EXT[6-7]: fix typo in desc

Change-Id: I93df1c9fd8a4d588ed7ed19ec2dc1d304412fc3d
Vadim Yanitskiy at

#27521 (Mar 16, 2026, 9:56:32 AM)

cdma_ruim: fix inaccurate comment for EF_AD

Change-Id: I71ea27fd30e44685ff35f49843072ca392995973
Vadim Yanitskiy at

#27520 (Mar 16, 2026, 9:56:29 AM)

ara_m: fix exceptions not being raised properly

Exceptions are meant to be thrown/raised, not returned.

Change-Id: Id799c264447e22887edcd2dc7eb991cf0af1bbfc
Vadim Yanitskiy at

#27519 (Mar 16, 2026, 9:56:26 AM)

global_platform: fix store_data() returning last chunk only

The loop builds up `response` across multiple STORE DATA blocks,
but the function returns only `data` - the response from the
*last* block.  It should return the accumulated response instead.

Change-Id: I3e15c8004d1e366e8c3896e559656622f48bb1a2
Vadim Yanitskiy at

#27518 (Mar 16, 2026, 9:56:23 AM)

sms: fix flags_construct in SMS_DELIVER

* field `tp_rp` appears at bit positions 7 and 5
** bit 7 should be `tp_rp` (Reply Path)
** bit 5 should be `tp_sri` (Status Report Indication)
* field `tp_lp` is completely missing
** should be at bit position 3

Change-Id: I0274849f0fa07281b5e050af429ffda7d249f9e8
Vadim Yanitskiy at

#27517 (Mar 16, 2026, 9:56:20 AM)

global_platform: fix typo in ApplicationTemplate

The keyword argument should be `nested=`.  As written `ApplicationAID`
is silently ignored - `ApplicationTemplate` will not descend into its
nested TLVs.

Change-Id: If45dbb0c9b09fe53560d109957ce339267a9f2b0
Vadim Yanitskiy at

#27516 (Mar 16, 2026, 9:56:17 AM)

global_platform: fix s/GET/STORE/ DATA in docs

Both `do_store_data` and `store_data` have identical docstrings that
incorrectly describe the command as GET DATA.  Should be "STORE DATA".
Take a chance to fix missing space between `v2.3` and `Section`.

Change-Id: I33fc80ab8ca50fadc38217b0005eec6169c8e34e
Vadim Yanitskiy at

#27515 (Mar 16, 2026, 9:56:13 AM)

global_platform: make --install-parameters-* independently optional

gen_install_parameters() had contradictory logic: the outer guard
required all three arguments to be non-None/non-empty (making them
mutually inclusive), while the inner checks then treated each one
as optional.

Make each parameter independently optional (defaulting to None) and
remove the all-or-nothing guard from both the function and its caller.
Simplify the function body to a straightforward single-pass
construction of system_specific_params.

Change-Id: I8756fb38016cdf0527fe2e21edb44381d1dc557f
Vadim Yanitskiy at

#27514 (Mar 16, 2026, 9:54:54 AM)

osmo_io: Fix msgb memleak if iofd is unregistered during write_cb with >1 io buffers

The msgbs are not allocated under the msghdr, hence if user unregistered
the iofd we need to manually free all remaining msgbs when freeing the
msghdr.

Change-Id: I579bc2142bba02947021c47d94bf2fe4f2040b01
Pau Espin Pedrol at

#27513 (Mar 16, 2026, 9:49:02 AM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- make command input read-only where applicable
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#27512 (Mar 16, 2026, 9:48:53 AM)

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
- Keep original modulateBurstLaurent() as fallback
- 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

#27511 (Mar 16, 2026, 9:46:08 AM)

device/websdr: add WebSDR transceiver backend and build target

- add libosmo-trx-websdr library and pkg-config file
- integrate WebSDR device into the autotools build system
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#27510 (Mar 16, 2026, 9:38:53 AM)

device/websdr: add WebSDR transceiver backend and build target

- add libosmo-trx-websdr library and pkg-config file
- integrate WebSDR device into the autotools build system
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#27509 (Mar 16, 2026, 9:38:48 AM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- make command input read-only where applicable
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#27508 (Mar 16, 2026, 9:35:19 AM)

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
- Keep original modulateBurstLaurent() as fallback
- 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

#27507 (Mar 16, 2026, 9:23:37 AM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- make command input read-only where applicable
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#27506 (Mar 16, 2026, 9:23:05 AM)

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
- Keep original modulateBurstLaurent() as fallback
- 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

#27505 (Mar 16, 2026, 9:18:59 AM)

device/websdr: add WebSDR transceiver backend and build target

- add libosmo-trx-websdr library and pkg-config file
- integrate WebSDR device into the autotools build system
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#27504 (Mar 16, 2026, 9:10:26 AM)

gsm48: fix missing/misspelled value-strings

Change-Id: I8d2333290c7715fd75ce7e7c759cb564a26b7461
Vadim Yanitskiy at

#27503 (Mar 16, 2026, 9:10:21 AM)

gsm48: remove duplicate GSM48_MT_RR_HANDO_INFO

Change-Id: Ic1cbba2b2a746667b9920ed2ed19b3848185977d
Vadim Yanitskiy at

#27502 (Mar 16, 2026, 9:09:34 AM)

gsmtap_util: gsmtap_gsm_channel_names[]: fix PTCCH string

Change-Id: Ic65668ae0363b991966bcf8ba4fb913940639964
Vadim Yanitskiy at

#27501 (Mar 16, 2026, 9:07:51 AM)

netdev: netdev_mnl_set_mtu(): drop unneeded variables

Change-Id: I8f9d39733a80a0ec4e8c462f4ae32b4ac52b5849
Vadim Yanitskiy at

#27500 (Mar 15, 2026, 11:17:03 PM)

gsmtap_util: gsmtap_gsm_channel_names[]: fix PTCCH string

Change-Id: Ic65668ae0363b991966bcf8ba4fb913940639964
Vadim Yanitskiy at

#27499 (Mar 15, 2026, 11:16:56 PM)

gsm48: remove duplicate GSM48_MT_RR_HANDO_INFO

Change-Id: Ic1cbba2b2a746667b9920ed2ed19b3848185977d
Vadim Yanitskiy at

#27498 (Mar 15, 2026, 11:15:58 PM)

gsm48: fix missing/misspelled value-strings

Change-Id: I8d2333290c7715fd75ce7e7c759cb564a26b7461
Vadim Yanitskiy at

#27497 (Mar 15, 2026, 10:53:31 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
Neels Hofmeyr at

#27496 (Mar 15, 2026, 10:53:29 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
Neels Hofmeyr at

#27495 (Mar 15, 2026, 10:53:25 PM)

personalization: allow reading back multiple values from PES

Change-Id: Iecb68af7c216c6b9dc3add469564416b6f37f7b2
Neels Hofmeyr at

#27494 (Mar 15, 2026, 10:53:23 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
Neels Hofmeyr at

#27493 (Mar 15, 2026, 10:46:19 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
Neels Hofmeyr at

#27492 (Mar 15, 2026, 10:44:44 PM)

personalization: allow reading back multiple values from PES

Change-Id: Iecb68af7c216c6b9dc3add469564416b6f37f7b2
Neels Hofmeyr at

#27491 (Mar 15, 2026, 10:44:41 PM)

stats: osmo_stats_reporter_udp_open(): fix unconditional jump

Change-Id: Ifb4842ea11e4df0cae8733438b3812a086396b99
Fixes: cc3694b65 ("Fix build for OSX")
Vadim Yanitskiy at

#27490 (Mar 15, 2026, 10:44:34 PM)

netdev: netdev_mnl_set_mtu(): drop unneeded variables

Setting an MTU via `RTM_NEWLINK` does not require `ifi_flags`/
`ifi_change`, so we don't really need to set these fields.

Change-Id: I8f9d39733a80a0ec4e8c462f4ae32b4ac52b5849
Vadim Yanitskiy at

#27489 (Mar 15, 2026, 10:44:31 PM)

gsup: encode_pdp_info(): fix wrong pdp_address index

The `PDP_TYPE_N_IETF_IPv4v6` case encodes two addresses: IPv4 from
`pdp_address[0]` and IPv6 from `pdp_address[1]`.  The IPv4 part is
encoded correctly, but the IPv6 part checks the wrong index.

The decoder decode_pdp_address() correctly puts the IPv4 address in
`pdp_address[0]` and the IPv6 address in `pdp_address[1]`.  Because
`pdp_address[0].sa_family` is `AF_INET` (not `AF_INET6`), the second
condition is always false in a proper dual-stack context, so the IPv6
part is silently dropped from every outgoing dual-stack GSUP message.

Change-Id: Ibc4a438ee7b06346839e78dc14d9d5b11b1c5bbd
Vadim Yanitskiy at

#27488 (Mar 15, 2026, 10:43:36 PM)

socket: osmo_sockaddr_from_str_and_uint(): fix memleak

`addrinfo_helper()` internally calls `getaddrinfo()`, whose result
must be freed with `freeaddrinfo()`.  On the size-check error path
the function returns early without freeing.  Fix this.

Change-Id: Ib05e1b8f2465e0db79e7b45de151dc9945e27924
Vadim Yanitskiy at

#27487 (Mar 15, 2026, 10:40:51 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
Neels Hofmeyr at

#27486 (Mar 15, 2026, 10:13:49 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
Neels Hofmeyr at

#27485 (Mar 15, 2026, 9:51:13 PM)

firmware/layer1: toa_input(): minor formatting fix

Change-Id: Iba061badfde8a3875cbf7e7cd19ef89064922f57
Vadim Yanitskiy at

#27484 (Mar 15, 2026, 9:51:05 PM)

layer23: gsm48_sysinfo_dump(): remove unused print argument

Change-Id: I0a26d5ac3183dc7ccb2e7d3d77ab41b58ad5b871
Vadim Yanitskiy at

#27483 (Mar 15, 2026, 9:50:56 PM)

mobile: gsm48_cc_tx_release_compl(): actually send the message

The message buffer is allocated, filled in, and then leaked when
`trans_free(trans)` is called.  The RELEASE COMPLETE message is
never transmitted to the network.

Change-Id: Ic754fe1ddd7e2908627374590f01e6fc81a73c77
Vadim Yanitskiy at

#27482 (Mar 15, 2026, 9:50:50 PM)

mobile: gsm48_mmxx_msg_names[]: fix some strings

Change-Id: Iab3e249acc18057416a5c1fc00322b597df403d4
Vadim Yanitskiy at

#27481 (Mar 15, 2026, 9:50:43 PM)

firmware/layer1: l1s_tch_{cmd,resp}(): fix misspelled FACCH

Change-Id: I85646a8a0b37478ca517407fcca92d0b89d6aaca
Vadim Yanitskiy at

#27480 (Mar 15, 2026, 9:50:37 PM)

firmware/layer1: l1a_rach_compl(): fix copy-pasted comment

Change-Id: I8000218836bcb58946db48184360f821617dc93f
Vadim Yanitskiy at

#27479 (Mar 15, 2026, 9:48:47 PM)

layer23: gsm_mncc_names[]: fix whitespace in a string

Change-Id: I93b5445db267985f3d8c53cde08ff28f166ae79c
Vadim Yanitskiy at

#27478 (Mar 15, 2026, 9:06:48 PM)

bts: pre-compute RACH RA using oct2int() early

Change-Id: I03e8748cf56fa1aa9b598d237d325989d91ca372
Vadim Yanitskiy at

#27477 (Mar 15, 2026, 9:06:31 PM)

bsc: f_TC_fh_params_gen_tr_ma(): simplify ma_mask calculation

Commented out code did not work back in 2020, but recent TITAN
versions (we use 11.1.0) have no problems compiling/running it.

Change-Id: I1892366af13b80844bcda3f84d18578284c35e08
Vadim Yanitskiy at

#27476 (Mar 15, 2026, 9:06:20 PM)

bts: fix ts_RslChanNr_CBCH4 used in SDCCH/8 TCs

Change-Id: I505346a5b29b1fa31b7207947f908eafb49c2724
Vadim Yanitskiy at

#27475 (Mar 15, 2026, 9:06:10 PM)

bts: f_vgcs_talker_detect(): check received req. reference

Change-Id: Ie988408a4c13af72d93e2d29137c9e1ae9a0d408
Vadim Yanitskiy at

#27474 (Mar 15, 2026, 9:06:04 PM)

library/GSM_RR_Types: add send/receive variants for t_RrL3Header

Change-Id: I35e5897470154f0a868fead4800a46849585a201
Vadim Yanitskiy at

#27473 (Mar 15, 2026, 9:05:46 PM)

bsc: fix copy-paste in TC_lcls_gcr_bway_codec_mismatch

The comment says that:

* first call leg uses FR,
* second call leg uses HR,

however the code actually modifies the first call leg to use HR.

The test still exercises a codec mismatch, so LCLS non-activation
is still triggered, but the leg roles are swapped relative to the
stated intent.  Fix this to avoid confusion.

Change-Id: Ie795516a447976ffe7b94ff8efcc649af0e37790
Vadim Yanitskiy at

#27472 (Mar 15, 2026, 10:36:28 AM)

esim/saip: raise an exception properly

Change-Id: Ia3749c02120fdc16e556214d0461cbeca032447b
Vadim Yanitskiy at

#27471 (Mar 15, 2026, 10:36:25 AM)

sms: fix flags_construct in SMS_DELIVER

* field `tp_rp` appears at bit positions 7 and 5
** bit 7 should be `tp_rp` (Reply Path)
** bit 5 should be `tp_sri` (Status Report Indication)
* field `tp_lp` is completely missing
** should be at bit position 3

Change-Id: I0274849f0fa07281b5e050af429ffda7d249f9e8
Vadim Yanitskiy at

#27470 (Mar 15, 2026, 10:36:22 AM)

ota: OtaAlgo{Crypt,Auth}: fix algo_auth vs algo_crypt

* OtaAlgoCrypt.from_keyset() searches by `otak.algo_crypt`
  but the error message prints `otak.algo_auth`.  Should be
  `otak.algo_crypt` instead.

* OtaAlgoAuth.__init__() checks `algo_auth` but the error message
  prints `algo_crypt`.  Should be `otak.algo_auth` instead.

Change-Id: Ia636fffaeadc68e3f6d5b65d477e753834c95895
Vadim Yanitskiy at

#27469 (Mar 15, 2026, 10:36:20 AM)

global_platform: refactor gen_install_parameters()

Change-Id: I8756fb38016cdf0527fe2e21edb44381d1dc557f
Vadim Yanitskiy at

#27468 (Mar 15, 2026, 10:36:17 AM)

cdma_ruim: fix inaccurate comment for EF_AD

Change-Id: I71ea27fd30e44685ff35f49843072ca392995973
Vadim Yanitskiy at

#27467 (Mar 15, 2026, 10:36:13 AM)

utils: dec_plmn(): remove redundant call

Change-Id: Ic95c3992ed57eb8fee952ec2dc7f092dd7689579
Vadim Yanitskiy at

#27466 (Mar 15, 2026, 10:36:09 AM)

ara_m: fix undefined variable used in a format-string

Change-Id: I310a5d461bae2b5e4d8e07097000b079c23aa0f6
Vadim Yanitskiy at

#27465 (Mar 15, 2026, 10:36:06 AM)

ts_51_011: EF.EXT[6-7]: fix typo in desc

Change-Id: I93df1c9fd8a4d588ed7ed19ec2dc1d304412fc3d
Vadim Yanitskiy at

#27464 (Mar 15, 2026, 10:36:03 AM)

ts_31_102: EF_5G_PROSE_UIR: fix copy-pasted inner class name

Change-Id: I460e5ad70f35026d0d794271a4aef17323c14dfb
Vadim Yanitskiy at

#27463 (Mar 15, 2026, 10:35:58 AM)

utils: DataObjectCollection.encode(): fix TypeError

`members_by_name` is a plain dictionary.  Calling it with `()` raises:

  TypeError: 'dict' object is not callable

Change-Id: I7e0c09aa7303f1506fe3a025fdc3779919dd0e6c
Vadim Yanitskiy at

#27462 (Mar 15, 2026, 10:35:55 AM)

ts_31_102: fix description for EF_5GS3GPPLOCI

Change-Id: I9cf3adfce65090fedb3f0fd33c9b3d15a2c5fb8c
Vadim Yanitskiy at

#27461 (Mar 15, 2026, 10:35:52 AM)

ara_m: fix exceptions not being raised properly

Exceptions are meant to be thrown/raised, not returned.

Change-Id: Id799c264447e22887edcd2dc7eb991cf0af1bbfc
Vadim Yanitskiy at

#27460 (Mar 15, 2026, 9:58:03 AM)

ara_m: fix exceptions not being raised properly

Exceptions are meant to be thrown/raised, not returned.

Change-Id: Id799c264447e22887edcd2dc7eb991cf0af1bbfc
Vadim Yanitskiy at

#27459 (Mar 15, 2026, 9:58:00 AM)

global_platform: fix s/GET/STORE/ DATA in docs

Both `do_store_data` and `store_data` have identical docstrings that
incorrectly describe the command as GET DATA.  Should be "STORE DATA".
Take a chance to fix missing space between `v2.3` and `Section`.

Change-Id: I33fc80ab8ca50fadc38217b0005eec6169c8e34e
Vadim Yanitskiy at

#27458 (Mar 15, 2026, 9:57:57 AM)

ts_51_011: EF.EXT[6-7]: fix typo in desc

Change-Id: I93df1c9fd8a4d588ed7ed19ec2dc1d304412fc3d
Vadim Yanitskiy at

#27457 (Mar 15, 2026, 9:57:55 AM)

cdma_ruim: fix inaccurate comment for EF_AD

Change-Id: I71ea27fd30e44685ff35f49843072ca392995973
Vadim Yanitskiy at

#27456 (Mar 15, 2026, 9:57:52 AM)

utils: dec_plmn(): remove redundant call

Change-Id: Ic95c3992ed57eb8fee952ec2dc7f092dd7689579
Vadim Yanitskiy at

#27455 (Mar 15, 2026, 9:57:49 AM)

ota: OtaAlgo{Crypt,Auth}: fix algo_auth vs algo_crypt

* OtaAlgoCrypt.from_keyset() searches by `otak.algo_crypt`
  but the error message prints `otak.algo_auth`.  Should be
  `otak.algo_crypt` instead.

* OtaAlgoAuth.__init__() checks `algo_auth` but the error message
  prints `algo_crypt`.  Should be `otak.algo_auth` instead.

Change-Id: Ia636fffaeadc68e3f6d5b65d477e753834c95895
Vadim Yanitskiy at

#27454 (Mar 15, 2026, 9:57:11 AM)

ts_31_102: fix description for EF_5GS3GPPLOCI

Change-Id: I9cf3adfce65090fedb3f0fd33c9b3d15a2c5fb8c
Vadim Yanitskiy at

#27453 (Mar 15, 2026, 9:57:07 AM)

global_platform: fix docstring for Scp03SessionKeys._get_icv()

Change-Id: I8983bc27f581295544360ba8b4ae1d28b3ea850f
Vadim Yanitskiy at

#27452 (Mar 15, 2026, 9:57:02 AM)

global_platform: fix typo in SupportedTlsCipherSuitesForScp81

The attribute name is misspelled.  The BER-TLV infrastructure looks
for `_construct`; this typo means `SupportedTlsCipherSuitesForScp81`
will never decode its content.

Change-Id: I0f637951b0eeb7eca2a8b543baa737f216a935ed
Vadim Yanitskiy at

#27451 (Mar 15, 2026, 9:56:58 AM)

global_platform: install_cap_parser: argument groups cannot be nested

pySim-shell currently does not work on systems with Python 3.14+:

  File ".../pysim/pySim/global_platform/__init__.py", line 868, in AddlShellCommands
    install_cap_parser_inst_prm_g_grp = install_cap_parser_inst_prm_g.add_argument_group()
  File "/usr/lib/python3.14/argparse.py", line 1794, in add_argument_group
    raise ValueError('argument groups cannot be nested')
  ValueError('argument groups cannot be nested')

The problem is that install_cap_parser creates a nested group inside
of mutually exclusive group.  argparse never supported group nesting
properly, so it has been deprecated since Python 3.11, and eventually
got removed in Python 3.14.

Remove group nesting, adjust the usage string, and implement the
mutual exclusiveness/inclusiveness manually in do_install_cap().

Change-Id: Idddf72d5a745345e134b23f2f01e0257d0667579
Vadim Yanitskiy at

#27450 (Mar 15, 2026, 9:56:32 AM)

esim/saip: raise an exception properly

Change-Id: Ia3749c02120fdc16e556214d0461cbeca032447b
Vadim Yanitskiy at

#27449 (Mar 15, 2026, 9:56:29 AM)

utils: DataObjectCollection.encode(): fix TypeError

`members_by_name` is a plain dictionary.  Calling it with `()` raises:

  TypeError: 'dict' object is not callable

Change-Id: I7e0c09aa7303f1506fe3a025fdc3779919dd0e6c
Vadim Yanitskiy at

#27448 (Mar 15, 2026, 9:56:25 AM)

sms: fix flags_construct in SMS_DELIVER

* field `tp_rp` appears at bit positions 7 and 5
** bit 7 should be `tp_rp` (Reply Path)
** bit 5 should be `tp_sri` (Status Report Indication)
* field `tp_lp` is completely missing
** should be at bit position 3

Change-Id: I0274849f0fa07281b5e050af429ffda7d249f9e8
Vadim Yanitskiy at

#27447 (Mar 15, 2026, 9:56:22 AM)

global_platform: fix store_data() returning last chunk only

The loop builds up `response` across multiple STORE DATA blocks,
but the function returns only `data` - the response from the
*last* block.  It should return the accumulated response instead.

Change-Id: I3e15c8004d1e366e8c3896e559656622f48bb1a2
Vadim Yanitskiy at

#27446 (Mar 15, 2026, 9:56:18 AM)

ts_31_102: EF_5G_PROSE_UIR: fix copy-pasted inner class name

Change-Id: I460e5ad70f35026d0d794271a4aef17323c14dfb
Vadim Yanitskiy at

#27445 (Mar 15, 2026, 9:56:15 AM)

global_platform: fix typo in ApplicationTemplate

The keyword argument should be `nested=`.  As written `ApplicationAID`
is silently ignored - `ApplicationTemplate` will not descend into its
nested TLVs.

Change-Id: If45dbb0c9b09fe53560d109957ce339267a9f2b0
Vadim Yanitskiy at

#27444 (Mar 15, 2026, 9:56:09 AM)

ara_m: fix undefined variable used in a format-string

Change-Id: I310a5d461bae2b5e4d8e07097000b079c23aa0f6
Vadim Yanitskiy at

#27443 (Mar 15, 2026, 9:56:04 AM)

global_platform: refactor gen_install_parameters()

Change-Id: I8756fb38016cdf0527fe2e21edb44381d1dc557f
Vadim Yanitskiy at

#27442 (Mar 14, 2026, 8:20:02 PM)

s1gw: add README.md

Change-Id: Ib5c1326c4260bf552b561a42f7ff9d3f28f89579
Vadim Yanitskiy at

#27441 (Mar 14, 2026, 7:43:41 PM)

contrib: add jenkins_manuals.sh

Change-Id: I54f0774575534519a2c40e0588f136c8a5e706f8
Related: osmo-ci.git Id62d806a648c8f3480cb4f162adf65f77c552848
Related: OS#6671
Vadim Yanitskiy at

#27440 (Mar 14, 2026, 7:43:36 PM)

jobs: add build/manuals JOB_TYPEs for osmo-s1gw

Change-Id: Id62d806a648c8f3480cb4f162adf65f77c552848
Depends: osmo-s1gw.git I54f0774575534519a2c40e0588f136c8a5e706f8
Related: OS#6671
Vadim Yanitskiy at

#27439 (Mar 14, 2026, 7:25:05 PM)

doc/manuals: document the REST interface

Change-Id: I8bc9183fff8f65db71554ee26369db9bdb61b78a
Related: OS#6671
Vadim Yanitskiy at

#27438 (Mar 14, 2026, 7:24:55 PM)

doc/manuals: merge doc/osmo-s1gw-cli.md

Change-Id: Ic2556f6add9c6a24f6da03f4388d7f86dde0c5dc
Related: OS#6671
Vadim Yanitskiy at

#27437 (Mar 14, 2026, 7:24:42 PM)

doc/manuals: document GTP-U KPI monitoring

Change-Id: I2709cd545bfd6c8f6e34358caf9d372c02dd5c3e
Related: OS#6671
Vadim Yanitskiy at

#27436 (Mar 14, 2026, 7:24:33 PM)

doc/manuals: document the metrics

Change-Id: Iacfefd387d0cd26eebbbeba0cd37efa78f90bb46
Related: OS#6671
Vadim Yanitskiy at

#27435 (Mar 14, 2026, 7:24:24 PM)

doc/manuals: update MmeItem related info

The osmo-s1gw-cli documentation was not properly updated in 63ce2c9:

* default local/bind address for an MME is "any", not "::"
* allowed TACs (--tac) was missing in help and examples

Change-Id: I0b8115fe6342a80bf1eb99bd6ad210492a013947
Fixes: 63ce2c9 ("[REST] Add MmeList, MmeAdd, MmeInfo, MmeDelete")
Related: OS#6671
Vadim Yanitskiy at

#27434 (Mar 14, 2026, 7:19:44 PM)

doc/manuals: add overview, document running and configuration

Change-Id: I4ceca069866d7191ef2b153af95a20cb522bffeb
Related: OS#6671
Vadim Yanitskiy at

#27433 (Mar 14, 2026, 2:05:12 PM)

gsup: align ordering of IEs

Align with the IE order produced by libosmocore's GSUP encoder.

Change-Id: I5caa3101da310cddfa311d068ad889bca697b438
Related: 54343caa ("common/gsup.adoc: document Supplementary Services extension")
Related: ce32ec2a ("gsup: Document ePDG Tunnel Req/Res/Err")
Related: 92cf519c ("GSUP: document inter-MSC handover additions")
Vadim Yanitskiy at

#27432 (Mar 14, 2026, 1:45:38 PM)

enb_proxy/mme_registry: add per-MME counters for connection events

Register a set of per-MME counters when an MME is added to the pool,
and increment them from enb_proxy at the relevant state transitions:

  - selected          (MME chosen for a connection attempt)
  - conn_est_timeout  (SCTP connection establishment timed out)
  - conn_est_failure  (SCTP connection establishment failed)
  - s1setup_rsp       (S1 SETUP RESPONSE received successfully)
  - s1setup_failure   (S1 SETUP FAILURE received from MME)
  - s1setup_rsp_timeout (timed out waiting for S1 SETUP RESPONSE)

A new global aggregate counter ?S1GW_CTR_ENB_PROXY_MME_SELECTED is
also added alongside the existing ?S1GW_CTR_ENB_PROXY_MME_SELECT_ERROR.

Change-Id: Ie0149c1ad0754af6d8f5f95d4e8919993eac3760
Related: SYS#7052
Vadim Yanitskiy at

#27431 (Mar 14, 2026, 1:07:41 PM)

s1gw: add tests for MME registry REST procedures

Add three test cases exercising the S1GW REST interface for MME pool
management.  The REST TCs are gated on the mp_rest_enable module
parameter in the control block.

TC_rest_mme_list: query the MME pool list via REST and verify it
matches the three static entries from the 'mme_pool' section in
osmo-s1gw.config (mme0/mme1/mme2 with their respective addresses).

TC_rest_mme_add_del: add a new MME entry at runtime via REST, verify
it appears in both the list and individual GET responses, then delete
it and confirm it is gone.

TC_rest_mme_del_fallback: delete mme0 from the pool at runtime and
verify that a connecting eNB is routed directly to mme1, skipping the
deleted entry.  The pool is restored to its original state afterwards
via f_REST_mme_pool_restore().

Also add:
* {ts,tr}_MmeItem templates to S1GW_REST_Types.ttcn
* f_REST_mme_find(): returns the integer index of a named entry in a
  MmeList, or -1 if not found; used for both presence and absence checks
* f_REST_mme_pool_restore(): deletes all current entries and re-adds
  mme0/mme1/mme2 in original order to keep pool state predictable
  across test cases

Change-Id: I260bc987ab8ae0ecb547d0b69b261fd97c5c9c23
Related: SYS#7052
Vadim Yanitskiy at

#27430 (Mar 14, 2026, 1:07:35 PM)

s1gw: use REST interface to check PFCP assoc state

It's quicker to query the IUT using the REST interface rather than
waiting for StatsD metric "gauge.pfcp.associated.value" to be received.
As a bonus, we "learn" the local/remote RTS from the S1GW, which can
be used in new PFCP related testcases.

Change-Id: Iec7594e79f533b08ee93b443a39cb9c8ff03da43
Vadim Yanitskiy at

#27429 (Mar 14, 2026, 1:07:28 PM)

s1gw: enable the REST interface, fix wrong REST port

REST had been disabled because only nightly builds supported it.
The latest stable release (v0.4.0) also supports the REST interface,
so let's enable it unconditionally by removing the mp_rest_enable.

Also fix the REST port: mp_rest_port was incorrectly set
to 8125 (the StatsD port) instead of the actual REST port 8080.

Change-Id: I012749076c652ab541e569026eb01c696ad5adc8
Related: SYS#7052, SYS#7066
Vadim Yanitskiy at

#27428 (Mar 14, 2026, 12:28:09 PM)

s1gw: enable the REST interface, fix wrong REST port

REST had been disabled because only nightly builds supported it.
The latest stable release (v0.4.0) also supports the REST interface,
so let's enable it unconditionally by removing the mp_rest_enable.

Also fix the REST port: mp_rest_port was incorrectly set
to 8125 (the StatsD port) instead of the actual REST port 8080.

Change-Id: I012749076c652ab541e569026eb01c696ad5adc8
Related: SYS#7052, SYS#7066
Vadim Yanitskiy at

#27427 (Mar 14, 2026, 11:48:37 AM)

s1gw: initial testcases for MME pooling

Three test cases covering the MME pool selection logic in OsmoS1GW:

* TC_mme_pool_reject_fallback: S1GW falls back to the next pool entry
  when the first MME rejects S1SetupReq with S1SetupFailure.
* TC_mme_pool_timeout_fallback: S1GW falls back when the first MME
  does not respond to S1SetupReq within the timeout.
* TC_mme_pool_all_reject: all pool entries reject S1SetupReq; S1GW
  must send S1SetupFailure to the eNB and tear down the connection.

Infrastructure added to support these tests:

* S1AP_Server.ttcn: S1AP_ServerList type; directed register/unregister
  helpers (f_ConnHdlr_s1ap_register_to / _unregister_from) for use
  when multiple S1AP_Server_CT instances are active simultaneously.
* S1GW_ConnHdlr.ttcn: f_ConnHdlr_s1ap_setup_pool() drives the pool
  setup sequence: pre-registers with all servers, sends S1SetupReq once
  (S1GW re-transmits it per-MME), then iterates through the expected
  behaviors (ACCEPT / REJECT / TIMEOUT) waiting for each server in turn.
* S1GW_Tests.ttcn: f_init_s1ap_srv(N) starts N MME emulators on
  consecutive IP addresses; f_TC_exec_pool() orchestrates pool tests.
* osmo-s1gw.config: a 'mme_pool' section with three entries is added
  alongside the existing sctp_client section.  Older OsmoS1GW (without
  pooling support) will use sctp_client to connect to a single MME and
  the pool test cases will simply fail, as expected.  Newer OsmoS1GW
  will use mme_pool and all three test cases will pass.

Change-Id: Ib8fd62e4352e3055971a669b8b363078bcd95d8d
Related: SYS#7052
Vadim Yanitskiy at

#27426 (Mar 14, 2026, 11:48:33 AM)

s1gw: enable the REST interface, fix wrong REST port

REST had been disabled because only nightly builds supported it.
The latest stable release (v0.4.0) also supports the REST interface,
so let's enable it by default.

Also fix the REST port: mp_rest_port was incorrectly set
to 8125 (the StatsD port) instead of the actual REST port 8080.

Change-Id: I012749076c652ab541e569026eb01c696ad5adc8
Related: SYS#7052, SYS#7066
Vadim Yanitskiy at

#27425 (Mar 14, 2026, 11:48:29 AM)

s1gw: add tests for MME registry REST procedures

Add three test cases exercising the S1GW REST interface for MME pool
management.  The REST TCs are gated on the mp_rest_enable module
parameter in the control block.

TC_rest_mme_list: query the MME pool list via REST and verify it
matches the three static entries from the 'mme_pool' section in
osmo-s1gw.config (mme0/mme1/mme2 with their respective addresses).

TC_rest_mme_add_del: add a new MME entry at runtime via REST, verify
it appears in both the list and individual GET responses, then delete
it and confirm it is gone.

TC_rest_mme_del_fallback: delete mme0 from the pool at runtime and
verify that a connecting eNB is routed directly to mme1, skipping the
deleted entry.  The pool is restored to its original state afterwards
via f_REST_mme_pool_restore().

Also add:
* {ts,tr}_MmeItem templates to S1GW_REST_Types.ttcn
* f_REST_mme_find(): returns the integer index of a named entry in a
  MmeList, or -1 if not found; used for both presence and absence checks
* f_REST_mme_pool_restore(): deletes all current entries and re-adds
  mme0/mme1/mme2 in original order to keep pool state predictable
  across test cases

Change-Id: I260bc987ab8ae0ecb547d0b69b261fd97c5c9c23
Related: SYS#7052
Vadim Yanitskiy at

#27424 (Mar 14, 2026, 11:48:22 AM)

s1gw: add testcases for impatient eNB during MME pool selection

Two new test cases covering scenarios where the eNB disconnects before
S1 setup completes, targeting specific states of the enb_proxy FSM:

* TC_mme_pool_enb_disc_wait_s1setup_req: eNB connects but disconnects
  before sending S1SetupReq (enb_proxy in wait_s1setup_req).  No MME
  connection is ever attempted; S1GW must handle the disconnect cleanly.

* TC_mme_pool_enb_disc_wait_s1setup_rsp: eNB sends S1SetupReq, S1GW
  forwards it to the first pool MME (enb_proxy in wait_s1setup_rsp),
  then eNB disconnects before the response arrives.  S1GW must detect
  the eNB disconnect and close the open MME connection in response.

A new helper S1GW_ConnHdlr.f_ConnHdlr_s1ap_close() is added for these
tests: unlike f_ConnHdlr_s1ap_disconnect(), it closes the eNB-side
socket without waiting for an S1APSRV_EVENT_CONN_DOWN from a pool
server (since in these scenarios either no MME connection exists
yet, or the CONN_DOWN is captured by the test body directly).

Change-Id: I5d27cdafcb9f595a2d3db59beff17cd55de2539e
Related: SYS#7052
Vadim Yanitskiy at

#27423 (Mar 13, 2026, 8:29:10 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
- Keep original modulateBurstLaurent() as fallback
- 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

#27422 (Mar 13, 2026, 8:29:01 PM)

proto_trxd: add helpers to prepare burst indication packets

- introduce trxd_prepare_burst_ind_v0() and trxd_prepare_burst_ind_v1()
- reuse prepared packet size in send helpers
- handle idle frames during packet preparation
- use ssize_t consistently for prepared/write sizes

Change-Id: Ie94a1df4879cbf6056cd05c9621c46db1ed972fd
dtv.comp at

#27421 (Mar 13, 2026, 8:01:29 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
- Keep original modulateBurstLaurent() as fallback
- 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

#27420 (Mar 13, 2026, 8:01:20 PM)

proto_trxd: add helpers to prepare burst indication packets

- introduce trxd_prepare_burst_ind_v0() and trxd_prepare_burst_ind_v1()
- reuse prepared packet size in send helpers
- handle idle frames during packet preparation
- use ssize_t consistently for prepared/write sizes

Change-Id: Ie94a1df4879cbf6056cd05c9621c46db1ed972fd
dtv.comp at

#27419 (Mar 13, 2026, 8:01:11 PM)

enb_proxy: fix stale SCTP events misprocessed during MME pool selection

When closing a connection to one MME and opening a new one to the next,
a SHUTDOWN_COMP event from the old (now-closed) socket can still be
pending in the process mailbox.  The sctp_assoc_change handlers in the
'connecting' and 'wait_s1setup_rsp' states were matching '_Socket',
ignoring the socket identity.  A stale SHUTDOWN_COMP would therefore
fall into the '_ -> repeat_state_and_data' branch, triggering a spurious
re-entry of 'connecting', which immediately closed the newly established
connection to the next MME and skipped to yet another pool entry.

Fix this by matching the Socket against the current S#state.sock in both
handlers.  Events arriving on a previously closed socket no longer match
these clauses and are silently dropped by the catch-all handle_event/4.

This was found thanks to the MME pooling TCs in ttcn3-s1gw-test.

Change-Id: I4211dd343607f045cf4dd33fa568ed580c79dd9f
Related: SYS#7052
Vadim Yanitskiy at

#27418 (Mar 13, 2026, 7:25:19 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

#27417 (Mar 13, 2026, 7:25:12 PM)

fw: add git blame ignore file

Reformatting should not pollute blame, so ignore those revs.

Change-Id: I35b86f52d491c9e28ab0af9e3e3d4fd5f6dbd119
ewild at

#27416 (Mar 13, 2026, 7:24:57 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

#27415 (Mar 13, 2026, 5:44:12 PM)

osmo_io: Rewrite iofd_handle_send_completion() to fix multiple issues

Previous implementation had multiple issues, which this patch addresses:
* Didn't call user cb updating completed bytes for a given msg which had
  a partial write.
* rc checks against "Incomplete write" were wrong, because rc was not
  being decremented with previous msgs idxs being processed.
* Didn't take into account the write(0, fd, buf) = 0 valid user case for
  regular files.

The rewrite also simplifies the logic by splitting the "rc < 0" (error) paths
from the "rc >= 0" (successful) paths.

Related: SYS#7842
Change-Id: Ia016e4df7be5e534a8212f7271caff9779e08eb1
Pau Espin Pedrol at

#27414 (Mar 13, 2026, 5:15:40 PM)

docs/put_key: add tutorial that explains how to manage global platform keys

With the increased interest in using GlobalPlatform features of
UICC and eUICCs (OTA-SMS, applets, etc.), also comes an increased
interest in how the related GlobalPlatform keys can be managed
(key rotation, adding/removing keysets from/to a Security Domain).

Unfortunately, many aspects of this topic are not immediately
obvious for the average user. Let's add a tutorial that contains
some practical examples to shine some light on the topic.

Related: SYS#7881
Change-Id: I163dfedca3df572cb8442e9a4a280e6c5b00327e
pmaier@sysmocom.de at

#27413 (Mar 13, 2026, 5:13:55 PM)

docs/put_key: add tutorial that explains how to manage global platform keys

With the increased interest in using GlobalPlatform features of
UICC and eUICCs (OTA-SMS, applets, etc.), also comes an increased
interest in how the related GlobalPlatform keys can be managed
(key rotation, adding/removing keysets from/to a Security Domain).

Unfortunately, many aspects of this topic are not immediately
obvious for the average user. Let's add a tutorial that contains
some practical examples to shine some light on the topic.

Related: SYS#7881
Change-Id: I163dfedca3df572cb8442e9a4a280e6c5b00327e
pmaier@sysmocom.de at

#27412 (Mar 13, 2026, 2:15:18 PM)

enb_proxy: add initial MME pooling support

Rework the CONNECTING state to dynamically select an MME from the pool
via mme_registry:mme_select/1, passing the eNB's Tracking Area Codes
(from the ?'id-SupportedTAs' IE of the S1 SETUP REQUEST) and a list of
already-tried MMEs, so successive attempts pick a different candidate.

On connection failure (SCTP establishment timeout or error), or when the
selected MME rejects the S1 SETUP REQUEST or fails to respond in time,
the FSM re-enters the CONNECTING state rather than terminating.  This
triggers another mme_select/1 call with the failed MME added to the
tried_mmes list.  S1 SETUP FAILURE PDUs from the MME are intentionally
not forwarded to the eNB, so the retry is fully transparent.

Once mme_select/1 exhausts all candidates it returns 'error'; at that
point the FSM builds and sends an S1 SETUP FAILURE PDU to the eNB and
terminates.

Other changes:
* add close_sock/1, close_conn/1 helpers; simplify terminate/3
* add ?S1GW_CTR_ENB_PROXY_MME_SELECT_ERROR counter

Change-Id: I83dc4a78c78a7b87e87f5ca9a941a168d6c1dc36
Related: SYS#7052
Vadim Yanitskiy at

#27411 (Mar 13, 2026, 2:15:16 PM)

mme_registry: add backwards compat for old sctp_client config

When 'mme_pool' is absent from the config, automatically populate the
MME pool with a single 'default' entry derived from the 'sctp_client'
section (including legacy mme_loc_addr/mme_rem_addr params), and emit
a deprecation warning.  osmo_s1gw_sup:init/1 normalises 'sctp_client'
in the app env (with all defaults applied) before children start, so
mme_registry can safely read it without duplicating the parsing logic.

Change-Id: Ia97fb61bbb5ace6f43d1a6768fb5fb6883158532
Related: SYS#7052
Vadim Yanitskiy at

#27410 (Mar 13, 2026, 1:52:43 PM)

s1gw: fix f_ConnHdlr_erab_release_cmd_(): do not discard cause

Change-Id: I8c75e08dd041ce805aa232984445ba1e2bde40fa
Fixes: 64db5053 ("s1gw: ConnHdlr: allow passing {MME,ENB}-UE-S1AP-ID")
Vadim Yanitskiy at

#27409 (Mar 13, 2026, 1:52:38 PM)

s1gw: f_ConnHdlr_conn_track_disable(): set conn_track := null

After deactivate, conn_track still holds the now-dead reference.
A second call (which can happen if any test explicitly calls this
before f_ConnHdlr_s1ap_disconnect()) will attempt to deactivate an
already-inactive default, which is a TTCN-3 runtime error.

Change-Id: I0b71b543fc7c4e87a86381cc3be23728e75cb59b
Fixes: adc942a94 ("s1gw: track eNB connection, fail immediately on loss")
Vadim Yanitskiy at

#27408 (Mar 13, 2026, 1:52:35 PM)

s1gw: fix TC_e_rab_setup_failure: expect a specific S1AP PDU

setup_rsp is carefully constructed, but is not actually used.
The f_ConnHdlr_rx_s1ap_from_enb() call falls through to the ? default,
so the test accepts any S1AP PDU and never validates that the S1GW
actually populated the failed-items list correctly.

Change-Id: I6dbe272af4302c83ac26db9b7da5a7f7bc96daa7
Fixes: 47544443 ("s1gw: add TC_e_rab_setup_failure")
Vadim Yanitskiy at

#27407 (Mar 13, 2026, 1:52:31 PM)

s1gw: remove unused mp_s1gw_mme_ip

We don't really care what address the S1GW is using when connecting
to our virtual MME.  This is why this parameter is not used anywhere.

Change-Id: I4fff3954c005ac3df34d00c3b0312300ba4f49a1
Vadim Yanitskiy at

#27406 (Mar 13, 2026, 1:52:27 PM)

s1gw: fix TC_uemux_e_rab_release_ind: pass release_ind := true

TC_uemux_e_rab_release_ind never actually tests the release indication
because release_ind is false instead of true.  The test body becomes
identical to TC_uemux_e_rab_setup - no release indication is ever sent.

Change-Id: Ieed5d8a2bf4f696efc1071569090facc7b731f96
Fixes: cdc149a6 ("s1gw: add UEMux TCs for E-RAB SETUP and RELEASE")
Vadim Yanitskiy at

#27405 (Mar 13, 2026, 1:52:23 PM)

s1gw: f_ConnHdlr_s1ap_setup(): make SupportedTAs configurable

Change-Id: Iade1889a702ef75859c5f847961ee4ca2398d4e1
Related: SYS#7052
Vadim Yanitskiy at

#27404 (Mar 13, 2026, 1:52:19 PM)

s1gw: improve conn established/closed logging

Change-Id: Iacda25ac9b34fc55217e2681e434c68eef2d3445
Vadim Yanitskiy at

#27403 (Mar 13, 2026, 1:52:12 PM)

s1gw: f_ConnHdlr_handover_rqd(): drop unused ERabList

Change-Id: If471e9f8daba918d1de90725db34e1930fd2e4d5
Fixes: 8eba9aada ("S1GW tests: Add test cases for S1 handover procedure")
Vadim Yanitskiy at

#27402 (Mar 13, 2026, 1:52:03 PM)

s1gw: make S1AP_Server.f_conn_add() return nothing

The index of a new entry is not used anywhere, so do not return it.

Change-Id: I8df3985a665ae919849559ea8cf0fd33b5b22df8
Vadim Yanitskiy at

#27401 (Mar 13, 2026, 1:51:54 PM)

s1gw: S1GW_UEMux.f_trx_s1ap_pdu(): fix setverdict() message param

On timeout pdu was never assigned (it's an out parameter), so TITAN
logs <unbound>.  The useful diagnostic is the expected template,
not the received value.

Change-Id: Idceefa82ec1b5fc71228b3847c7a22f419c9675e
Fixes: 325d07697 ("s1gw: add TC_uemux_uldl_nas_release")
Vadim Yanitskiy at

#27400 (Mar 13, 2026, 1:49:57 PM)

s1gw: f_ConnHdlr_rx_handover_cmd(): fix missing semicolon

Change-Id: I5db5fc01308f6834545b4be57631d77f1d2a3746
Vadim Yanitskiy at

#27399 (Mar 13, 2026, 1:31:12 PM)

5gc: Document Location Services as not implemented by open5gs

Change-Id: I784ecc13018456278d228120cb22b786be6532ac
Pau Espin Pedrol at

#27398 (Mar 13, 2026, 12:38:20 PM)

5gc: Document 'SMS over NAS' procedures as not implemented by open5gs

Change-Id: I7e69fc8076b3177b8d5513170aecdc1f3f92cd8d
Pau Espin Pedrol at

#27397 (Mar 13, 2026, 11:23:37 AM)

5gc: Introduce test TC_normal_reg_emergency_services_fallback

Change-Id: I17f15d901a10791ae0ad208b7d6ea9a333b93dad
Pau Espin Pedrol at

#27396 (Mar 13, 2026, 9:24:37 AM)

5gc: Introduce TC_handover_inter_ngran_n2

Change-Id: I90c7cc6c92864732a36556163aed692b2a1531b0
Pau Espin Pedrol at

#27395 (Mar 13, 2026, 9:24:27 AM)

5gc: Introduce tests for emergency services

These tests are expected to fail since open5gs has no specific logic for
emergency services in open5gs-amfd, and announces no Emergency Support
in Registration Accept.

Change-Id: Ie853b184da7ac8026bb0c360baabba762a7942e0
Pau Espin Pedrol at

#27394 (Mar 13, 2026, 9:24:22 AM)

5gc: Introduce TC_handover_inter_ngran_n2_cancel

Change-Id: I1137c9a82478cca0372678d3c3299e9eebc79bd5
Pau Espin Pedrol at

#27393 (Mar 13, 2026, 9:24:12 AM)

5gc: parametrize RequestType in f_pdu_sess_establish()

Change-Id: I69d6be5e581565720a21c719b0f982eb31ec2adf
Pau Espin Pedrol at

#27392 (Mar 13, 2026, 8:58:27 AM)

Fix lint errors: don't use star imports

tests/test_tlv.py:21:1: F403 `from osmocom.tlv import *` used; unable to detect undefined names
   |
19 | import unittest
20 | from construct import Int8ub, GreedyBytes
21 | from osmocom.tlv import *
   | ^^^^^^^^^^^^^^^^^^^^^^^^^ F403
22 | from osmocom.utils import h2b

Change-Id: I0ca76a40d47f72635682de9303ff73e9b2197266
Oliver Smith at

#27391 (Mar 13, 2026, 8:02:26 AM)

jobs/gerrit-lint: use debian 13

Use debian 13, so we have a newer clang-format version (14 -> 19).

Change-Id: I747dce009bb2e91f16a15e79dbe274c162f64813
Oliver Smith at

#27390 (Mar 13, 2026, 8:02:24 AM)

lint/lint_diff: print clang-format version

Change-Id: I076a518dccdb241a57628c385a60bffe30298a10
Oliver Smith at

#27389 (Mar 13, 2026, 8:00:08 AM)

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

#27388 (Mar 12, 2026, 11:32:19 PM)

Revert "clang-format: set ColumnLimit: 0"

This reverts commit 97caf6244398760ed8b0c5c045867b4bea36f0a0.

Reason for revert: we don't want clang-format to actively generate arbitrarily long line lengths.

Change-Id: I49111af334e6967a9c3a63ccb9d179df444d63bb
gerrit at

#27387 (Mar 12, 2026, 5:53:44 PM)

ensure libosmocore logging is properly disabled for builds

Change-Id: I169a059d8daff0a3993318a4ea3ab7adcb05fee3
ewild at

#27386 (Mar 12, 2026, 5:23:03 PM)

library/ngap: do not link against libfftranscode

TITAN has built-in ASN.1 PER codec since version 10.0.0.
We're already using it for NGAP, so libfftranscode is no longer needed.

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

#27385 (Mar 12, 2026, 5:22:58 PM)

testenv: do not install/check-for libfftranscode

All testsuites have been migrated to TITAN's own ASN.1 PER codec,
so installing libfftranscode is no longer required.

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

#27384 (Mar 12, 2026, 5:12:58 PM)

5gc: Introduce tests for emergency services

These tests are expected to fail since open5gs has no specific logic for
emergency services in open5gs-amfd, and announces no Emergency Support
in Registration Accept.

Change-Id: Ie853b184da7ac8026bb0c360baabba762a7942e0
Pau Espin Pedrol at

#27383 (Mar 12, 2026, 4:21:42 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

#27382 (Mar 12, 2026, 4:21:39 PM)

fw: add git blame ignore file

Reformatting should not pollute blame, so ignore those revs.

Change-Id: I35b86f52d491c9e28ab0af9e3e3d4fd5f6dbd119
ewild at

#27381 (Mar 12, 2026, 3:48:28 PM)

5gc: parametrize RequestType in f_pdu_sess_establish()

Change-Id: I69d6be5e581565720a21c719b0f982eb31ec2adf
Pau Espin Pedrol at

#27380 (Mar 12, 2026, 3:40:33 PM)

5gc: parametrize RequestType in f_pdu_sess_establish()

Change-Id: I69d6be5e581565720a21c719b0f982eb31ec2adf
Pau Espin Pedrol at

#27379 (Mar 12, 2026, 1:09:30 PM)

5gc: Introduce TC_handover_inter_ngran_n2_cancel

Change-Id: I1137c9a82478cca0372678d3c3299e9eebc79bd5
Pau Espin Pedrol at

#27378 (Mar 11, 2026, 6:40:50 PM)

5gc: Introduce TC_handover_inter_ngran_n2_cancel

Change-Id: I1137c9a82478cca0372678d3c3299e9eebc79bd5
Pau Espin Pedrol at

#27377 (Mar 11, 2026, 2:59:25 PM)

dfu: download: align download data buffer

The download data buffer is given to the usb stack.
Ensure the data buffer is dma capable to prevent an
additional memcpy() by the usb hal.

Change-Id: I01191a125aa62c2198e38d5e5fcd27d4e421c62e
lynxis at

#27376 (Mar 11, 2026, 2:35:09 PM)

5gc: Introduce TC_handover_inter_ngran_n2

Change-Id: I90c7cc6c92864732a36556163aed692b2a1531b0
Pau Espin Pedrol at

#27375 (Mar 11, 2026, 2:18:05 PM)

Errata 2.6.10: enable watchdog on boot

Previous the code was enabling the watchdog window on boot,
but not the watchdog as the errata specified.
It seems WDT EN and WDT WEN got accidental swapped.

Ensure the watchdog window mode is disabled, because
it might prevent us from disabling it again.
Use the hal defines which also describes the function
of the bits.

Change-Id: I581037724d19fb5abd0c5067f16a5769f9e264a7
lynxis at

#27374 (Mar 11, 2026, 2:09:55 PM)

build: add --disable-multi-arfcn configure option

- add configure flag to disable Multi ARFCN support
- compile Channelizer, Synthesis, RadioInterfaceMulti and fft.c only when enabled
- guard Multi ARFCN-specific code with ENABLE_MULTI_ARFCN
- avoid requiring fftw3f when Multi ARFCN support is disabled

Change-Id: I2495c5b5c79f2fe74bef83902058e1d2207c1f3c
dtv.comp at

#27373 (Mar 11, 2026, 2:09:53 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
- Keep original modulateBurstLaurent() as fallback
- 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

#27372 (Mar 11, 2026, 1:31:54 PM)

ansible/hosts: update lx2-1-obs-aarch64-1 ip

This machine is not available under the listed IPv6 anymore, but can be
reached through the VPN. Adjust the IP.

Change-Id: I77f72d7ad72d9b3ac745756cc5a082bd39dabdc5
Oliver Smith at

#27371 (Mar 11, 2026, 1:17:55 PM)

ansible: osmocom-obs-worker: remove lxc<5

I have applied a patch in our OBS server, which adjusts the version
check so we can build packages with newer LXC versions and sent it
upstream: https://github.com/openSUSE/obs-build/pull/1127

Remove the lxc version constraint (which finally allowed upgrading to a
newer opensuse version).

Related: OS#6975
Change-Id: I1e690bf91c4bebd1d46b51ec490daa339ea1107f
Oliver Smith at

#27370 (Mar 11, 2026, 1:17:52 PM)

ansible: osmocom-obs-worker: add mount-securityfs.service

Fix errors in lxc-start related to not having securityfs available:

[   14s] booting lxc...
[   14s] lxc-start: obsbuild:root_6: lsm/apparmor.c: apparmor_prepare: 1132 If you really want to start this container, set
[   14s] lxc-start: obsbuild:root_6: lsm/apparmor.c: apparmor_prepare: 1133 lxc.apparmor.allow_incomplete = 1
[   14s] lxc-start: obsbuild:root_6: lsm/apparmor.c: apparmor_prepare: 1134 in your container configuration file
[   14s] lxc-start: obsbuild:root_6: start.c: lxc_init: 879 Failed to initialize LSM
[   14s] lxc-start: obsbuild:root_6: start.c: __lxc_start: 2008 Failed to initialize container "obsbuild:root_6"
[   14s] lxc-start: obsbuild:root_6: tools/lxc_start.c: main: 306 The container failed to start
[   14s] lxc-start: obsbuild:root_6: tools/lxc_start.c: main: 312 Additional information can be obtained by setting the --logfile and --logpriority options
[   14s] '/var/cache/obs/worker/root_6/.build/_exitcode' not found or symlink

Usually systemd would mount the securityfs automatically as I understand
it, but it doesn't work anymore without this service in our use case
where osmocom-obs-worker runs inside an LXC itself. This is probably
related to upgrading the opensuse version for the osmocom-obs-worker
containers.

Change-Id: I0c708815440c67340531548361deb326c864aefe
Oliver Smith at

#27369 (Mar 11, 2026, 12:10:43 PM)

Replace snprintf() to free 4 kb

Change-Id: Ide644648bda86d4ae77a6713d1e140a4b78ba835
lynxis at

#27368 (Mar 11, 2026, 12:10:40 PM)

dfu: MANIFEST_SYNC: stay in MANIFEST_SYNC when manifestationIntolerant & completed

In theory a device which is manifestintolerant and completed the manifestation should
not reach MANIFEST_SYNC again.

Remove the state transistion to WAIT-RESET and stay in the current state and
wait for the main loop to change the state is safer.

Change-Id: I8c34a18e2336731126a8c01070d86e2547578e3d
lynxis at

#27367 (Mar 11, 2026, 12:10:37 PM)

dfu: download: make variables between IRQ and main loop volatile

Both are access by IRQ and mainloop and are written by the IRQ handler.

Change-Id: Ic3dccd77eff7feb164f9f07047680eef3f7c2516
lynxis at

#27366 (Mar 11, 2026, 12:10:34 PM)

dfu: flash: protect parsing of rc of flashing

Otherwise it is not guaranteed that both dfu_status and dfu_state
are in sync when the IRQ handler is running.

Change-Id: Ifc0d56d779ec31382855d6c367478104bc04e1e7
lynxis at

#27365 (Mar 11, 2026, 12:10:31 PM)

dfu: protect USB_DFU_STATE_DFU_MANIFEST by a critical section

In the MANIFEST state, the IRQ won't move the state, but
to prevent incosistency between dfu_manifestation_complete &
dfu_state, use a critical section.

Change-Id: Idf5fb7d55b4051ba7e235dfa409a4de18a8f208c
lynxis at

#27364 (Mar 11, 2026, 12:10:14 PM)

dfu: download: flash the first block in manifest phase

To prevent half flashed applications, erase the first page
when dfu downloading starts and save the first block for later.
In manifest stage, flash the first block.
If the first 4 byte are 0xffffffff, the board won't boot
into application and go into the dfu bootloader.

Change-Id: I894f3ee71587ccb287e92d7025039954991c631f
lynxis at

#27363 (Mar 11, 2026, 11:53:09 AM)

NGAP_Templates: Add missing IE TargetToSource_TransparentContainer to HandoverCommand

That IE is mandatory in HandoverCommand.

Change-Id: I59be738e8143ca1b9fee91c1bb377970e741efc5
Pau Espin Pedrol at

#27362 (Mar 11, 2026, 11:27:34 AM)

build: add --disable-multi-arfcn configure option

- add configure flag to disable Multi ARFCN support
- compile Channelizer, Synthesis, RadioInterfaceMulti and fft.c only when enabled
- guard Multi ARFCN-specific code with ENABLE_MULTI_ARFCN
- avoid requiring fftw3f when Multi ARFCN support is disabled

Change-Id: I2495c5b5c79f2fe74bef83902058e1d2207c1f3c
dtv.comp at

#27361 (Mar 11, 2026, 11:27:28 AM)

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
- Keep original modulateBurstLaurent() as fallback
- 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

#27360 (Mar 11, 2026, 11:00:44 AM)

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
- Keep original modulateBurstLaurent() as fallback
- 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

#27359 (Mar 11, 2026, 11:00:40 AM)

build: add --disable-multi-arfcn configure option

- add configure flag to disable Multi ARFCN support
- compile Channelizer, Synthesis, RadioInterfaceMulti and fft.c only when enabled
- guard Multi ARFCN-specific code with ENABLE_MULTI_ARFCN
- avoid requiring fftw3f when Multi ARFCN support is disabled

Change-Id: I2495c5b5c79f2fe74bef83902058e1d2207c1f3c
dtv.comp at

#27358 (Mar 11, 2026, 12:35:33 AM)

build: add --disable-multi-arfcn configure option

- add configure flag to disable Multi ARFCN support
- compile Channelizer, Synthesis, RadioInterfaceMulti and fft.c only when enabled
- guard Multi ARFCN-specific code with ENABLE_MULTI_ARFCN
- avoid requiring fftw3f when Multi ARFCN support is disabled

Change-Id: I2495c5b5c79f2fe74bef83902058e1d2207c1f3c
dtv.comp at

#27357 (Mar 11, 2026, 12:35:30 AM)

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
- Keep original modulateBurstLaurent() as fallback
- 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

#27356 (Mar 11, 2026, 12:22:43 AM)

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
- Keep original modulateBurstLaurent() as fallback
- 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

#27355 (Mar 11, 2026, 12:22:38 AM)

build: add --disable-multi-arfcn configure option

- add configure flag to disable Multi ARFCN support
- compile Channelizer, Synthesis, RadioInterfaceMulti and fft.c only when enabled
- guard Multi ARFCN-specific code with ENABLE_MULTI_ARFCN
- avoid requiring fftw3f when Multi ARFCN support is disabled

Change-Id: I2495c5b5c79f2fe74bef83902058e1d2207c1f3c
dtv.comp at

#27354 (Mar 11, 2026, 12:18:46 AM)

ccid: properly emit wait time ext messages

The CCID message that tells the host that the card
asked for a wait time extension was missing.

This is a bit weird, because it breaks the 1:1
relationship between messages and responses that
usually exists, nor does it consume a bSeq,
so we just emit WT msgs as appropriate.

It is bounded to prevent msgb exhaustion issues.

Closes: OS#6458
Change-Id: Ib69483d453a0e5ebb1bc1885a8f78790a0f10d70
ewild at

#27353 (Mar 10, 2026, 11:41:40 PM)

firmware: fix msgb/list mixed irq access handling

This fixes the mishandling of in_progress and the queues in the submit
functions that are in part irq driven, too, and ensures nothing breaks
by preventing concurrent access from irqs to the queues. Applying the
same pattern to all functions/cases is fine either way.

On top of all of tha the out ep was irq driven, so if submit_next_out
fails it was stuck, now fixed by attempted submit from main loop, and of
course the queue manipulation should be irq safe here as well.

Change-Id: I9212bfa7688cb4d3161ba963b854225744128632
ewild at

#27352 (Mar 10, 2026, 11:41:33 PM)

ccid: generate proper error for short messages

Change-Id: I3bf0bebd361666a2f3d0341444415a6f25d2b4bf
ewild at

#27351 (Mar 10, 2026, 7:28:15 PM)

ccid: Handle the TPDU-length = 4 case according to CCID spec

While ISO7816-3 forbids any TPDU shorter from 5 bytes, the CCID spec
begs to differ and actually permits a host to send us 4-byte TPDUs of
Form 1, giving the responsibility of adding the P3=00h octet to the CCID
implementation.

Let's implement this accordingly.  While at it, also reject TPDUs of
lengths 1, 2 and 3 bytes - just like zero-length TPDUs.

Change-Id: Ia27962bda526af3373b36d637e2b548aa01a3346
Closes: OS#6973
laforge at

#27350 (Mar 10, 2026, 5:17:11 PM)

dfu-download: flash the first block in manifest phase

To prevent half flashed applications, erase the first page
when dfu downloading starts and save the first block for later.
In manifest stage, flash the first block.
If the first 4 byte are 0xffffffff, the board won't boot
into application and go into the dfu bootloader.

Change-Id: I894f3ee71587ccb287e92d7025039954991c631f
lynxis at

#27349 (Mar 10, 2026, 5:17:07 PM)

dfu: rewrite firmware downloading

Improve handling of dfu_state by moving more state changing towards the
IRQ handler. Having both the main loop and IRQ changes dfu_state within
the same state could lead to races.

The main loop is now only a simple worker which reports back via dfu_flash_done &
dfu_flash_status.

Change-Id: I345d5948455b25cd8a2efb1abfd9d0986ebd8cef
lynxis at

#27348 (Mar 10, 2026, 5:17:04 PM)

Replace snprintf() to free 4 kb

Change-Id: Ide644648bda86d4ae77a6713d1e140a4b78ba835
lynxis at

#27347 (Mar 10, 2026, 5:16:59 PM)

dfu: MANIFEST_SYNC: stay in MANIFEST_SYNC when manifestationIntolerant & completed

In theory a device which is manifestintolerant and completed the manifestation should
not reach MANIFEST_SYNC again.

Remove the state transistion to WAIT-RESET and stay in the current state and
wait for the main loop to change the state is safer.

Change-Id: I8c34a18e2336731126a8c01070d86e2547578e3d
lynxis at

#27346 (Mar 10, 2026, 5:16:55 PM)

dfu: protect USB_DFU_STATE_DFU_MANIFEST by a critical section

In the MANIFEST state, the IRQ won't move the state, but
to prevent incosistency between dfu_manifestation_complete &
dfu_state, use a critical section.

Change-Id: Idf5fb7d55b4051ba7e235dfa409a4de18a8f208c
lynxis at

#27345 (Mar 10, 2026, 4:57:28 PM)

NGAP_Templates: Expect optional IEs in HandoverRequest templates

Change-Id: I227d67a589127ccfc5f44950daa3c0d95e425437
Pau Espin Pedrol at

#27344 (Mar 10, 2026, 4:57:24 PM)

NGAP_Templates: Add missing IE TargetToSource_TransparentContainer to HandoverRequestAcknowledge

Change-Id: I19b0b718021326a64fe3bf1b3508a769a453557d
Pau Espin Pedrol at

#27343 (Mar 10, 2026, 4:57:20 PM)

NGAP_Templates: Fix missing SourceToTarget_TransparentContainer IE not appended

Change-Id: I40cff63f3d662fa168b57abe4ef95f347ab74435
Pau Espin Pedrol at

#27342 (Mar 10, 2026, 4:57:13 PM)

NGAP_Templates: Fix wrong id in HandoverReq template IE

Change-Id: I160a319543c32187bc4f2f3f4cf0baa667758f79
Pau Espin Pedrol at

#27341 (Mar 10, 2026, 4:27:58 PM)

core: fix config.h

While exploring why logging is disabled but still shows up in the binaries
I kind of wondered how all the config.h HAVE_XX checks we have everwhere work.
Apparently they do not work at all, due to missing or misplaced include of config.h.

This affects tons of other checks as well.

The jenkins hook ensures the include order is checked to ensure config.h
does not get misplaced or lost in the future.

Change-Id: Ic2cf52a3b60f43a2f5d3fe01c41a41f6fd9a8000
ewild at

#27340 (Mar 10, 2026, 4:11:34 PM)

core: fix config.h

While exploring why logging is disabled but still shows up in the binaries
I kind of wondered how all the config.h HAVE_XX checks we have everwhere work.
Apparently they do not work at all, due to missing or misplaced include of config.h.

This affects tons of other checks as well.

The jenkins hook ensures the include order is checked to ensure config.h
does not get misplaced or lost in the future.

Change-Id: Ic2cf52a3b60f43a2f5d3fe01c41a41f6fd9a8000
ewild at

#27339 (Mar 10, 2026, 4:03:00 PM)

ccid: properly reject PC_to_RDR_{ResetParameters,SetParameters}

As per CCID 1.1 ch 6.2.3 a reader that does not support
these commands can reject them, which we now do, instead of
pretending to accept the params.

This requires https://gitlab.com/wireshark/wireshark/-/issues/20107 to
be properly decoded in wireshark >= 4.4.8 .

As a bonus this fixes the error response in gen_err_resp which so far had superfluous param data attached to it.

Closes: OS#5380
Change-Id: I4d0671c160e9028097397ec47982bafbfdc24f24
ewild at

#27338 (Mar 10, 2026, 3:59:47 PM)

ccid: properly reject PC_to_RDR_{ResetParameters,SetParameters}

As per CCID 1.1 ch 6.2.3 a reader that does not support
these commands can reject them, which we now do, instead of
pretending to accept the params.

This requires https://gitlab.com/wireshark/wireshark/-/issues/20107 to
be properly decoded in wireshark >= 4.4.8 .

Closes: OS#5380
Change-Id: I4d0671c160e9028097397ec47982bafbfdc24f24
ewild at

#27337 (Mar 10, 2026, 3:42:10 PM)

pySim-prog/pySim-read: add pySimLogger and verbose cmdline argument

pySim-prog and pySim-read do not integrate the pySimLogger yet. As we
may add more debug output that should not be visible on normal use, we
should ensure that the pySimLogger is correctly set up.

Change-Id: Ia2fa535fd9ce4ffa301c3f5d6f98c1f7a4716c74
pmaier@sysmocom.de at

#27336 (Mar 10, 2026, 2:29:53 PM)

PySimLogger: add parameter to set initial log-level/verbosity

When we initialize a new PySimLogger, we always call the setup method
first and then use the set_verbose and set_level method to configure
the initial log level and the initial log verbosity. However, we
initialize the PySimLogger in all our programs the same way and we
end up with the same boilerplate code every time. Let's add a keyword
parameter to the setup method where we can pass our opts.verbose (bool)
parameter so that the setup method can do the work for the main program.

In case the caller wants a different default configuration he still can
call set_verbose and set_level methods as needed.

Change-Id: I4b8ef1e203186878910c9614a1d900d5759236a8
pmaier@sysmocom.de at

#27335 (Mar 10, 2026, 2:29:51 PM)

pySim-prog/pySim-read: add pySimLogger and verbose cmdline argument

pySim-prog and pySim-read do not integrate the pySimLogger yet. As we
may add more debug output that should not be visible on normal use, we
should ensure that the pySimLogger is correctly set up.

Change-Id: Ia2fa535fd9ce4ffa301c3f5d6f98c1f7a4716c74
pmaier@sysmocom.de at

#27334 (Mar 10, 2026, 2:29:48 PM)

pySim-shell/cosmetic: remove semicolon

Change-Id: I629bacd432491211b939fcd2bed554b44ef441bc
pmaier@sysmocom.de at

#27333 (Mar 10, 2026, 2:20:15 PM)

cdma_ruim: fix copy-pasted desc for EF.AD

Change-Id: I2338f35c21978dd6b8916c0abd57b94f5e087655
Vadim Yanitskiy at

#27332 (Mar 10, 2026, 2:20:12 PM)

global_platform: install_cap_parser: argument groups cannot be nested

pySim-shell currently does not work on systems with Python 3.14+:

  File ".../pysim/pySim/global_platform/__init__.py", line 868, in AddlShellCommands
    install_cap_parser_inst_prm_g_grp = install_cap_parser_inst_prm_g.add_argument_group()
  File "/usr/lib/python3.14/argparse.py", line 1794, in add_argument_group
    raise ValueError('argument groups cannot be nested')
  ValueError('argument groups cannot be nested')

The problem is that install_cap_parser creates a nested group inside
of mutually exclusive group.  argparse never supported group nesting
properly, so it has been deprecated since Python 3.11, and eventually
got removed in Python 3.14.

Remove group nesting, adjust the usage string, and implement the
mutual exclusiveness/inclusiveness manually in do_install_cap().

Change-Id: Idddf72d5a745345e134b23f2f01e0257d0667579
Vadim Yanitskiy at

#27331 (Mar 10, 2026, 1:36:14 PM)

sane embedded builds without host talloc

So far host talloc was always required.
This fixes this up to only build a subset of stuff
that actually works for embedded targets while
using the pseudotalloc header file, and the actual
firmware can supply its own talloc, without
involving some random build system supplied talloc
headers.

Unfortunately static symbols can't really be weak,
so just going for always-on weak pseudotalloc does
not work.

Change-Id: Ibb309a01ac6cad827b33ac18be408be1ac2cf7e0
ewild at

#27330 (Mar 10, 2026, 1:34:17 PM)

ccid: properly emit wait time ext messages

The CCID message that tells the host that the card
asked for a wait time extension was missing.

This is a bit weird, because it breaks the 1:1
relationship between messages and responses that
usually exists, nor does it consume a bSeq,
so we just count and emit WT msgs as appropriate.

Closes: OS#6458
Change-Id: Ib69483d453a0e5ebb1bc1885a8f78790a0f10d70
ewild at

#27329 (Mar 10, 2026, 1:22:13 PM)

firmware: enable watchdog timer

2s is plenty, and while not perfect it should at
least ensure that hangs that require manual
intervention happen rarely if at all.

At least from a custimer POV having resets in case
something breaks is better than ending up with non
working devices that are stuck.

Change-Id: I1ef1fc70d33492efe0171a7879c1a23f16957195
ewild at

#27328 (Mar 10, 2026, 1:22:04 PM)

ccid: properly emit wait time ext messages

The CCID message that tells the host that the card
asked for a wait time extension was missing.

This is a bit weird, because it breaks the 1:1
relationship between messages and responses that
usually exists, nor does it consume a bSeq,
so we just count and emit WT msgs as appropriate.

Closes: OS#6458
Change-Id: Ib69483d453a0e5ebb1bc1885a8f78790a0f10d70
ewild at

#27327 (Mar 10, 2026, 11:40:14 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

#27326 (Mar 10, 2026, 11:40:09 AM)

contrib/csv-to_pgsl: explicitly set log level to INFO in non verbose mode

The current log level for PySimLogger currently is DEBUG. (The default
for verbose is False). Since those defaults may change over time, we
should conciously set what we want in verbose and non verbose mode, like
we already do in pySim-shell.

Change-Id: I4b8ef1e203186878910c9614a1d900d5759236a8
pmaier@sysmocom.de at

#27325 (Mar 10, 2026, 11:40:06 AM)

pySim-prog/pySim-read: add pySimLogger and verbose cmdline argument

pySim-prog and pySim-read do not integrate the pySimLogger yet. As we
may add more debug output that should not be visible on normal use, we
should ensure that the pySimLogger is correctly set up.

Change-Id: Ia2fa535fd9ce4ffa301c3f5d6f98c1f7a4716c74
pmaier@sysmocom.de at

#27324 (Mar 10, 2026, 11:04:11 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

#27323 (Mar 10, 2026, 10:49:43 AM)

Errata 2.6.10: enable watchdog on boot

Previous the code was enabling the watchdog window on boot,
but not the watchdog as the errata specified.
It seems WDT EN and WDT WEN got accidental swapped.

Use the hal defines which also describes the function
of the bits.

Change-Id: I581037724d19fb5abd0c5067f16a5769f9e264a7
lynxis at

#27322 (Mar 10, 2026, 10:45:09 AM)

Errata 2.6.10: enable watchdog on boot

Previous the code was enabling the watchdog window on boot,
but not the watchdog as the errata specified.
It seems WDT EN and WDT WEN got accidental swapped.

Use the hal defines which also describes the function
of the bits.

Change-Id: I581037724d19fb5abd0c5067f16a5769f9e264a7
lynxis at

#27321 (Mar 10, 2026, 10:45:06 AM)

Improve comments on errata 2.6.10

Errata 2.6.10 affects Rev A, D, F: The cache lines
of AHB0 and AHB1 might not reset properly on Power up
resulting in courrupted data in rare cases.

The errata recommends fixing this by:
- for AHB0: start WDT by NVMEM and disable by ARM core.
- for AHB1: disable and re-enable cache line

Change-Id: I3c35f590a4e43d778e70f2f377e0d470c3a652b2
lynxis at

#27320 (Mar 10, 2026, 10:34:13 AM)

ccid: Fix CCID RDR_to_PC_Parameters (missing bProtocolNum)

Our RDR_to_PC_Parameters message was broken, as it was missing
the bProtocolNum value after the header.  Let's fix that.

Change-Id: I67d5cb876d20b29f4759d5b194606f34b8b966c4
laforge at

#27319 (Mar 10, 2026, 10:34:09 AM)

ccid: Fix [unused] RDR_to_PC_Hardware_Error struct definition

Our definition of the message was wrong; it is an interrupt endpoint
message without the full header of the bulk-in endpoint. Luckily the
definition was not used in the code base, so this is not fixing any
problem visible on the protocol level.

Change-Id: Ieb756c37402c4ebea32cc3cd23ba3842f4c0df3e
laforge at

#27318 (Mar 10, 2026, 12:17:23 AM)

Improve comments on errata 2.6.10

Errata 2.6.10 affects Rev A, D, F: The cache lines
of AHB0 and AHB1 might not reset properly on Power up
resulting in courrupted data in rare cases.

The errata recommends fixing this by:
- for AHB0: start WDT by NVMEM and disable by ARM core.
- for AHB1: disable and re-enable cache line

Change-Id: I3c35f590a4e43d778e70f2f377e0d470c3a652b2
lynxis at

#27317 (Mar 10, 2026, 12:17:20 AM)

Errata 2.6.10: enable watchdog on boot

Previous the code was enabling the watchdog window on boot,
but not the watchdog as the errata specified.
It seems WDT EN and WDT WEN got accidental swapped.

Use the hal defines which also describes the function
of the bits.

Change-Id: I581037724d19fb5abd0c5067f16a5769f9e264a7
lynxis at

#27316 (Mar 9, 2026, 7:32:41 PM)

feat(usdr): add USDR backend support (osmo-trx-usdr)

- Implement USDRDevice backend for Transceiver52M
- Add --with-usdr configure option and build integration
- Add systemd service unit (osmo-trx-usdr.service)
- Add Debian packaging files for osmo-trx-usdr
- Provide example configuration file
- Extend manuals and device documentation with USDR backend section

Change-Id: I5d1d25921514954c4929ae6e7352168b3ceb05df
dtv.comp at

#27315 (Mar 9, 2026, 7:21:43 PM)

feat(usdr): add USDR backend support (osmo-trx-usdr)

- Implement USDRDevice backend for Transceiver52M
- Add --with-usdr configure option and build integration
- Add systemd service unit (osmo-trx-usdr.service)
- Add Debian packaging files for osmo-trx-usdr
- Provide example configuration file
- Extend manuals and device documentation with USDR backend section

Change-Id: I5d1d25921514954c4929ae6e7352168b3ceb05df
dtv.comp at

#27314 (Mar 9, 2026, 7:21:30 PM)

radio: improve API documentation in RadioDevice

Change-Id: I7b41c549d743ad180a1ddcd8c0313e1003860070
dtv.comp at

#27313 (Mar 9, 2026, 5:46:28 PM)

build: install common/GSM/transceiver libraries for emscripten and add pkg-config files

Expose previously internal libs (libcommon, libGSM, libtransceiver_common)
when building with emscripten, install headers and generate .pc files.
Keep them noinst for native builds.

Change-Id: I2495c5b5c79f2fe74bef83902058e1d2207c1f3c
dtv.comp at

#27312 (Mar 9, 2026, 5:46: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
- Keep original modulateBurstLaurent() as fallback
- 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

#27311 (Mar 9, 2026, 5:39:00 PM)

radio: improve API documentation in RadioDevice

Change-Id: I7b41c549d743ad180a1ddcd8c0313e1003860070
dtv.comp at

#27310 (Mar 9, 2026, 5:38:55 PM)

feat(usdr): add USDR backend support (osmo-trx-usdr)

- Implement USDRDevice backend for Transceiver52M
- Add --with-usdr configure option and build integration
- Add systemd service unit (osmo-trx-usdr.service)
- Add Debian packaging files for osmo-trx-usdr
- Provide example configuration file
- Extend manuals and device documentation with USDR backend section

Change-Id: I5d1d25921514954c4929ae6e7352168b3ceb05df
dtv.comp at

#27309 (Mar 9, 2026, 3:59:23 PM)

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

#27308 (Mar 9, 2026, 3:23:13 PM)

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

#27307 (Mar 9, 2026, 11:44:30 AM)

bankd: Avoid osmocom logging mutex deadlock in signal handling

The main thread communicates slotmap add + delete via POSIX signals
to the worker threads.  As those signals interrupt the normal
processing of the worker thread, they might get delivered while the
thread is already logging something, causing a deadlock.  This has
been observed in the real world in the following stack trace (where it's
actually two nested signals):

As a hot-fix, let's avoid logging from the handle_sig_map{del,add}()
functions at all, making them safe against a deadlock around this mutex.

We should decide how to proceed in general with potentially some
architectural changes later on; any such changes are not suitable as a
hot fix due to their potential of introducing other regressions.

Change-Id: I5ea32886dfaf624b4dc5ad7924941c7b904c1d36
Related: SYS#7930
laforge at

#27306 (Mar 6, 2026, 9:57:41 PM)

s1ap_utils_test: fix: expected value goes first

Change-Id: Ib7c6478b95a78c9797e86180a89c098e75b615e0
Vadim Yanitskiy at

#27305 (Mar 6, 2026, 9:57:38 PM)

s1ap_utils: add API for building S1 SETUP FAILURE PDU

This API will be used in a follow-up patch adding the MME pooling.
Take a chance to add a parsing test for the new PDU blob.

Change-Id: I5a4e060e0a2ebdfbcfafac42f9de2e49ac3583b8
Related: SYS#7052
Vadim Yanitskiy at

#27304 (Mar 6, 2026, 9:57:35 PM)

[REST] Add MmeList, MmeAdd, MmeInfo, MmeDelete

Change-Id: Iad249aed99face9e35fd19e0596cf2364ade4c77
Related: SYS#7052
Vadim Yanitskiy at

#27303 (Mar 6, 2026, 9:57:32 PM)

enb_proxy: add initial MME pooling support

Rework the CONNECTING state to dynamically select an MME from the pool
via mme_registry:mme_select/1, passing the eNB's Tracking Area Codes
(from the ?'id-SupportedTAs' IE of the S1 SETUP REQUEST) and a list of
already-tried MMEs, so successive attempts pick a different candidate.

On connection failure (SCTP establishment timeout or error), or when the
selected MME rejects the S1 SETUP REQUEST or fails to respond in time,
the FSM re-enters the CONNECTING state rather than terminating.  This
triggers another mme_select/1 call with the failed MME added to the
tried_mmes list.  S1 SETUP FAILURE PDUs from the MME are intentionally
not forwarded to the eNB, so the retry is fully transparent.

Once mme_select/1 exhausts all candidates it returns 'error'; at that
point the FSM builds and sends an S1 SETUP FAILURE PDU to the eNB and
terminates.

Other changes:
* add close_sock/1, close_conn/1 helpers; simplify terminate/3
* add ?S1GW_CTR_ENB_PROXY_MME_SELECT_ERROR counter

Change-Id: I83dc4a78c78a7b87e87f5ca9a941a168d6c1dc36
Related: SYS#7052
Vadim Yanitskiy at

#27302 (Mar 6, 2026, 9:54:34 PM)

mme_registry: the MME registry (pool) implementation

Change-Id: Id5480222439bf93eca2e994b291c619dff823b01
Related: SYS#7052
Vadim Yanitskiy at

#27301 (Mar 6, 2026, 9:35:37 PM)

enb_registry: rework handling of eNB property updates

The idea of an enb_event/0 containing the current MME connection
state and the associated information (Global-eNB-ID, eNB/MME conn
info) looked promising initially, however turned out to be
impractical in light of ongoing MME pooling related changes.

* remove type enb_state/0
* rename type enb_event/0 -> enb_prop/0
* rename function enb_event/2 -> enb_update/2 (now private)
* enb_prop/0: separate the state from other properties
* enb_update/2: accept a list of enb_prop/0 - enb_proplist/0
* add typed notify_*() helpers that group related property updates,
  ensuring consistency and serving as the sole public call sites
* notify_mme_connecting(): explicitly clears mme_conn_info
* openapi: EnbItem.state reflects the actual enb_proxy FSM state

Change-Id: Ib5c5dedce729151cd7350390987fdd008b254ef4
Related: SYS#7052
Vadim Yanitskiy at

#27300 (Mar 6, 2026, 9:35:33 PM)

enb_registry: rework handling of eNB property updates

The idea of an enb_event/0 containing the current MME connection
state and the associated information (Global-eNB-ID, eNB/MME conn
info) looked promising initially, however turned out to be
impractical in light of ongoing MME pooling related changes.

* remove type enb_state/0
* rename type enb_event/0 -> enb_prop/0
* rename function enb_event/2 -> enb_update/2 (now private)
* enb_prop/0: separate the state from other properties
* enb_update/2: accept a list of enb_prop/0 - enb_proplist/0
* add typed notify_*() helpers that group related property updates,
  ensuring consistency and serving as the sole public call sites
* notify_mme_connecting(): explicitly clears mme_conn_info
* openapi: EnbItem.state reflects the actual enb_proxy FSM state

Change-Id: Ib5c5dedce729151cd7350390987fdd008b254ef4
Related: SYS#7052
Vadim Yanitskiy at

#27299 (Mar 6, 2026, 9:35:29 PM)

enb_registry: call enb_metrics_register/1 from a proper place

Change-Id: I38237463aa9c968f89bf4f195407a18cba7e73c9
Vadim Yanitskiy at

#27298 (Mar 6, 2026, 9:35:25 PM)

pfcp_peer: replace deprecated erlang:timestamp/0 with os:system_time/1

erlang:timestamp/0 is deprecated since OTP 18.  os:system_time(second)
is the modern replacement and yields the result directly in seconds,
removing the need to reassemble the {MegaSec, Sec, _} tuple.

Change-Id: I4ad886a2222f0cee8a668b42efe8bfac800a55ac
Vadim Yanitskiy at

#27297 (Mar 6, 2026, 9:35:19 PM)

s1ap_proxy: fix discarded result of handle_ies/3 in HO REQ ACK handler

The call processing the optional E-RABFailedToSetupListHOReqAck IE did
not pattern-match its return value, causing any errors returned by
handle_ies/3 to be silently swallowed.  Bind the result to {_, S2}
to make the intent explicit.

Change-Id: I1c8feeb63fe23876ae443784980e9dc22a450c54
Vadim Yanitskiy at

#27296 (Mar 6, 2026, 9:35:10 PM)

erab_fsm: fix comment inaccuracies and a typo

Two comments copy-pasted from session_establish were left saying
"ESTABLISH Req" in session_modify and session_delete handlers where
"MODIFY Req" and "DELETE Req" are correct respectively.
Also fix typo "unieue" -> "unique" in init/1.

Change-Id: If84638142988767363aa080012b44082dee39f90
Vadim Yanitskiy at

#27295 (Mar 6, 2026, 9:35:06 PM)

pfcp_peer: wrap seq_nr at 24-bit boundary

PFCP sequence numbers are 24-bit (3GPP TS 29.244 section 7.2.2.2), but
the counter was incremented without wrapping, eventually exceeding the
type spec after 16,777,215 requests.  Introduce PFCP_SEQ_NR_MAX and use
it in the type spec and in the increment expression.

Change-Id: Ie269894add9a82c36698320379df3aca3f7ffea8
Vadim Yanitskiy at

#27294 (Mar 6, 2026, 9:34:59 PM)

enb_registry: fix pattern match in handle_info 'DOWN' handler

PIDs maps pid() => enb_handle() (an integer), so maps:find/2 returns
{ok, SomeHandle}.  The old pattern {ok, Pid} tried to match an integer
against the already-bound pid() variable, which never succeeds.

This handler is only called on abnormal termination (process crash),
so the broken match caused the registry entry to never be cleaned up
in that case.  Fix by using a fresh {ok, Handle} binding and removing
the now-redundant follow-up maps:get/2 call.

Change-Id: I4cb044e8071c4ae2fc48c507f8733af6c617ec46
Vadim Yanitskiy at

#27293 (Mar 6, 2026, 9:34:24 PM)

enb_registry: fix duplicate registration check in enb_register/0

next_handle was bound in the function head and reused in the case
pattern {ok, Handle}, turning what looks like a binding into an
equality test against next_handle.  The duplicate check therefore
only fired if the previously assigned handle happened to equal the
current next_handle counter, which is essentially never true.

Fix by removing next_handle from the function head pattern and reading
it with S#state.next_handle inside the error branch, so that Handle in
{ok, Handle} is always a fresh binding that matches any existing handle.

Change-Id: Ia64f3e2e79bea055e5c37df9bce91a4bcbf7184c
Vadim Yanitskiy at

#27292 (Mar 6, 2026, 9:33:20 PM)

pfcp_peer: replace watchdog process with a timer

The watchdog process is spawned bare (no link/monitor), so if it
crashes its failure goes unnoticed, and if pfcp_peer restarts the
orphaned watchdog may fire a stale cast at the new process.

The watchdog process exists solely to send a delayed message to
pfcp_peer on timeout, and to be cancelled (by receiving
heartbeat_response) when the response arrives.  That's exactly what
erlang:start_timer/3 does natively - no separate process needed.

Change-Id: I8d71ad8300feefb0aecbf690a825a2b4e9f1102c
Vadim Yanitskiy at

#27291 (Mar 6, 2026, 9:28:26 PM)

enb_registry: fix addr/port filter logic (use andalso)

In Erlang a function body returns only its last expression.  The comma
between the two enb_filter_by_sub_field/2 calls caused the result of
the addr check to be silently discarded, so the filter only tested the
port.  Replace the comma with andalso to require both to match.

Change-Id: I8061636cd1077a4f3a9e9d37a31224f5e373becb
Vadim Yanitskiy at

#27290 (Mar 6, 2026, 7:40:29 PM)

nokia_site: Change the LAPD N200 counter for RSL

This commit raises the LAPD RSL N200 (retransmission) counter for
Nokia RSL links. The reason is that the readiness of the TRX is not
signalled (OML) nor can be queried from the BTS in any way, and on
larger macro setups the TRX reset takes ~15 seconds, thus the RSL
bootstrap times out before the TRX becomes ready.

This issue presents itself with UltraSite types, does not affect
InSite or MetroSite (the later two are "integrated TRX" units).
More modern macro setups like the Flexi or Multiradio are likely
affected.

Runtime tested with InSite and UltraSite (multi-TRX).

Change-Id: Ie4bb804ea636eba2182586db13a625c5933eff31
metro4 at

#27289 (Mar 6, 2026, 7:31:17 PM)

nokia_site: Change the LAPD N200 counter for RSL

This commit raises the LAPD RSL N200 (retransmission) counter for
Nokia RSL links. The reason is that the readiness of the TRX is not
signalled (OML) nor can be queried from the BTS in any way, and on
larger macro setups the TRX reset takes ~15 seconds, thus the RSL
bootstrap times out before the TRX becomes ready.

This issue presents itself with UltraSite types, does not affect
InSite or MetroSite (the later two are "integrated TRX" units).
More modern macro setups like the Flexi or Multiradio are likely
affected.

Runtime tested with InSite and UltraSite (multi-TRX).

Change-Id: Ie4bb804ea636eba2182586db13a625c5933eff31
metro4 at

#27288 (Mar 6, 2026, 3:40:31 PM)

nokia_site: Change the LAPD N200 counter for RSL

This commit raises the LAPD RSL N200 (retransmission) counter for
Nokia RSL links. The reason is that the readiness of the TRX is not
signalled (OML) nor can be queried from the BTS in any way, and on
larger macro setups the TRX reset takes ~15 seconds, thus the RSL
bootstrap times out before the TRX becomes ready.

This issue presents itself with UltraSite types, does not affect
InSite or MetroSite (the later two are "integrated TRX" units).

Runtime tested with InSite and UltraSite (multi-TRX).

Change-Id: Ie4bb804ea636eba2182586db13a625c5933eff31
metro4 at

#27287 (Mar 6, 2026, 3:40:26 PM)

nokia_site: Add new BTS types to the list

This commit adds Flexi EDGE, Flexi Multiradio and Flexi Multiradio 10
BTS types to the supported device list.

Keep in mind that this was not yet tested as we lack actual HW,
but the OML logic should be the same.

Change-Id: Ie3f1a3c3d7d72a49401d66625516f92cc7384949
metro4 at

#27286 (Mar 6, 2026, 2:52:22 PM)

global_platform/scp: fix dek_encrypt/dek_decrypt for SCP02

The methods dek_encrypt/dek_decrypt use the wrong algorithm and the
wrong key material. The algorithm should be 3DES rather then single
DES and the key must be the DEK session key instead of the static
DEK key from which the DEK session key is derived.

Related: SYS#7902
Change-Id: I3d0cc7378680b346fa39152c8b7074446d2c869d
pmaier@sysmocom.de at

#27285 (Mar 6, 2026, 1:20:10 PM)

Fix lint errors: test for membership should be `not in`

src/osmocom/tlv.py:477:16: E713 [*] Test for membership should be `not in`
    |
475 |         key-value pair, where the key is the snake-reformatted type name of 'self'"""
476 |         expected_key_name = camel_to_snake(type(self).__name__)
477 |         if not expected_key_name in decoded:
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E713
478 |             raise ValueError("Dict %s doesn't contain expected key %s" % (decoded, expected_key_name))
479 |         self.from_val_dict(decoded[expected_key_name])
    |
    = help: Convert to `not in`

Change-Id: I2ca3135f1ce38dcc06dc95c38f4b6258a60121cd
Oliver Smith at

#27284 (Mar 6, 2026, 1:19:22 PM)

Fix lint errors: avoid equality comparisons to `False`

src/osmocom/utils.py:150:8: E712 Avoid equality comparisons to `False`; use `if not signed:` for false checks
    |
148 |     """
149 |
150 |     if signed == False and number < 0:
    |        ^^^^^^^^^^^^^^^ E712
151 |         raise ValueError("expecting a positive number")
    |
    = help: Replace with `not signed`

Change-Id: I2ebb33c498b4a7e6229980462aa51b579fa4f782
Oliver Smith at

#27283 (Mar 6, 2026, 12:53:30 PM)

{hlr,hss}/pyhss/config: remove unused options

PyHSS had several unused config options. They have been removed
upstream, remove them from the osmo-ttcn3-hacks configs as well.

Related: https://github.com/nickvsnetworking/pyhss/pull/284
Change-Id: I87cf01e00fe0a3b32be9eaa4cf4c1ddf02cddc0b
Oliver Smith at

#27282 (Mar 6, 2026, 12:38:10 PM)

hlr: pyhss: run the pyhss_hss service

Database preparations used to be done in PyHSS by all services if they
noticed that this was needed. The time between checking and creating the
tables caused a race condition where two services attempting to create
tables at the same time will result at one of them failing, we have seen
this in our ttcn3-hlr-test-pyhss jobs sometimes:

  [Database] [DEBUG] Table apn already exists
  [Database] [DEBUG] Table auc already exists
  [Database] [DEBUG] Table subscriber already exists
  …
  [testenv][pyhss] pyhss_gsup: setup script failed

I have fixed this upstream by letting only the main service (pyhss_hss)
prepare the database:
https://github.com/nickvsnetworking/pyhss/commit/8b8a2202c345fbb7262c9d07d03003cd2fdb819f

This means that we now need to run the pyhss_hss service in the HLR
tests, so pyhss_gsup doesn't fail with:

  [Database] [INFO] Waiting for the main service to prepare the database
  ERROR: 127.0.0.1:4222 did not become available within 5s!
  [testenv][pyhss] pyhss_gsup: setup script failed

Change-Id: I4fe689c8d8617432175ba403b45021c0f646970b
Oliver Smith at

#27281 (Mar 6, 2026, 10:57:40 AM)

repo-install-test: ignore charon-systemd

This package from strongswan-epdg causes the SSH connection to QEMU to
break when installed in debian 13. Don't install it. Use the wildcard,
because there is also a debug symbols package that pulls in
charon-systemd.

Change-Id: Ic641d5361c51df147a8cef5d49eb1e0f07b72e87
Oliver Smith at

#27280 (Mar 6, 2026, 10:57:35 AM)

repo-install-test: run for debian 13 too

This passes for latest, and should pass for nightly once this patch is
merged: https://gerrit.osmocom.org/c/osmo-sgsn/+/42277

Change-Id: I1db9de8c740d5167e4813ece36f422b27aed5111
Oliver Smith at

#27279 (Mar 6, 2026, 10:57:30 AM)

repo-install-test: don't use deprecated apt-key

apt-key has been removed in debian 13, use "[signed-by=…]" instead.

Change-Id: I7b8b9336b16cceb7ece317c59de2f55ed404392e
Oliver Smith at

#27278 (Mar 6, 2026, 10:57:25 AM)

repo-install-test: fix test_conflict for debian 13

Two changes are necessary to make this test work with debian 13:

* Installing libosmocore from osmocom-latest, then switching to
  osmocom-nightly and attempting to install another package is not
  enough anymore to trigger a conflict. apt is now able to resolve this
  by uninstalling the osmocom-latest package and upgrading libosmocore
  to the nightly version. Force the conflict by explicitly marking
  osmocom-latest (osmocom-$FEED) as installed and for hold.

* The apt conflict message has been reworked, so the string to look for
  needs to be adjusted.

Change-Id: Ibdcd583e48b97ced11ad4939974dccea3e139480
Oliver Smith at

#27277 (Mar 6, 2026, 10:57:21 AM)

repo-install-test: ignore pyhss

PyHSS listens on the same port as OsmoHLR, which causes the test to fail
with debian 13 because OsmoHLR can't start up properly. PyHSS wasn't
built for earlier debian versions in the Osmocom binary repositories.

Change-Id: I796e85a212dff94fbf9b8ef563eba47418c221cc
Oliver Smith at

#27276 (Mar 6, 2026, 10:57:15 AM)

repo-install-test: ignore sdcc-dbgsym

Fix for this error with debian 13:

  The following packages have unmet dependencies:
   sdcc-dbgsym : Depends: sdcc (= 4.2.0~osmocom3.113.9edd) but 4.5.0+dfsg-1 is to be installed
  E: Unable to correct problems, you have held broken packages.
  E: The following information from --solver 3.0 may provide additional context:
     Unable to satisfy dependencies. Reached two conflicting decisions:
     1. sdcc:amd64=4.2.0~osmocom3.113.9edd is not selected for install
     2. sdcc:amd64=4.2.0~osmocom3.113.9edd is selected for install because:
        1. sdcc-dbgsym:amd64=4.2.0~osmocom3.113.9edd is selected for install
        2. sdcc-dbgsym:amd64 Depends sdcc (= 4.2.0~osmocom3.113.9edd)

Change-Id: Ibb12118853f354d177cb94df63b60dd3bd9dfcb7
Oliver Smith at

#27275 (Mar 6, 2026, 10:05:56 AM)

contrib/smpp-ota-tool: use '-' instead of '_' in command line args

Some commandline arguments have an underscore in their name. Let's
replace those with dashes.

Change-Id: Icbe9d753d59263997e9ca34d46ed0daca36ca16c
Related: SYS#6868
pmaier@sysmocom.de at

#27274 (Mar 6, 2026, 10:05:52 AM)

contrib/smpp-ota-tool: define commandline arguments in global scope

The commandline arguments are currently defined under __main__ in a
private scope. From there they are not reachable to the sphinx
argparse module. We have to define the arguments globally at the
top. (like in the other applications)

Related: SYS#7881
Change-Id: I2d9782e3f5b1cac78c22d206fdcac4118c7d5e7c
pmaier@sysmocom.de at

#27273 (Mar 6, 2026, 10:05:49 AM)

docs/smpp-ota-tool: Add documentation/tutorial

We already have documentation that explains how to run pySim-smpp2sim.
With smpp-ota-tool we now have a counterpart for pySim-smpp2sim, so
let's add documentation for this tool as well.

Related: SYS#7881
Change-Id: If0d18a263f5a6dc035b90f5c5c6a942d46bbba49
pmaier@sysmocom.de at

#27272 (Mar 6, 2026, 10:05:47 AM)

tests/pySim-smpp2sim_test/card_sanitizer: update card backup with new test keyset

In our test setup we run the card_sanitizer.py script regualary to ensure that
we have consistent start conditions when running our tests. In case a testcase
crashes for some reason and leaves messed up files on a test card. The
card_sanitizer.py script will ensure that any problem like that is cleaned up
over night.

For the testcases we are about to add in the patch following this one, we need
to provision a new test keyset to one of our test cards. This has been already
done manually. However since the card_sanitizer still has the old keys in its
backup we will have to update that as well.

Change-Id: I5aa8a413b19b3e43a79d03e904daab50b4b1e767
Related: OS#6868
pmaier@sysmocom.de at

#27271 (Mar 6, 2026, 10:05:42 AM)

contrib/smpp-ota-tool: fix description string (copy+paste error)

Change-Id: I559844bfa1ac372370ef9d148f2f8a6bf4ab4ef5
Related: SYS#6868
pmaier@sysmocom.de at

#27270 (Mar 6, 2026, 10:05:38 AM)

tests/pySim-smpp2sim_test: add testcases for AES128 and AES256

Extend the existing test script so that it can handle multiple
testcases. Also add support for switching eUICC profiles.
Finally, add a testcases to test OTA-SMS (RFM) with AES128 and
AES256 encryption.

Change-Id: I1f10504f3a29a8c74a17991632d932819fecfa5a
Related: OS#6868
pmaier@sysmocom.de at

#27269 (Mar 6, 2026, 9:31:17 AM)

dfu-download: flash the first block in manifest phase

To prevent half flashed applications, erase the first page
when dfu downloading starts and save the first block for later.
In manifest stage, flash the first block.
If the first 4 byte are 0xffffffff, the board won't boot
into application and go into the dfu bootloader.

Change-Id: I894f3ee71587ccb287e92d7025039954991c631f
lynxis at

#27268 (Mar 6, 2026, 9:20:00 AM)

debian/changelog: bump to 1.14.0

Fix that debian/changelog is still on 1.12.0 on current master while the
latest stable version is on 1.13.x. This is confusing, and it also
results in unexpected behavior on debian 13: After enabling the Osmocom
nightly repository and asking apt to install osmo-sgsn or osmo-gtphub,
it will pick the 1.13.x versions from the debian repository instead of
the versions from the Osmocom nightly repository.

Related: OS#6968
Change-Id: Id8763bf96141fcb38f550c7885a1c9fd02cec198
Oliver Smith at

#27267 (Mar 6, 2026, 9:18:12 AM)

dfu-download: flash the first block in manifest phase

To prevent half flashed applications, erase the first page
when dfu downloading starts and save the first block for later.
In manifest stage, flash the first block.
If the first 4 byte are 0xffffffff, the board won't boot
into application and go into the dfu bootloader.

Change-Id: I894f3ee71587ccb287e92d7025039954991c631f
lynxis at

#27266 (Mar 5, 2026, 10:18:50 PM)

Replace snprintf() to free 4 kb

Change-Id: Ide644648bda86d4ae77a6713d1e140a4b78ba835
lynxis at

#27265 (Mar 5, 2026, 10:18:46 PM)

dfu-download: flash the first block in manifest phase

To prevent half flashed applications, erase the first page
when dfu downloading starts and save the first block for later.
In manifest stage, flash the first block.
If the first 4 byte are 0xffffffff, the board won't boot
into application and go into the dfu bootloader.

Change-Id: I894f3ee71587ccb287e92d7025039954991c631f
lynxis at

#27264 (Mar 5, 2026, 10:15:21 PM)

Makefile: on clean: remove dfu & flash .o & .d files

Change-Id: I9705f15c41ea0df8b8486b6326264db36f797dd8
lynxis at

#27263 (Mar 5, 2026, 10:14:36 PM)

dfu-download: flash the first block in manifest phase

To prevent half flashed applications, erase the first page
when dfu downloading starts and save the first block for later.
In manifest stage, flash the first block.
If the first 4 byte are 0xffffffff, the board won't boot
into application and go into the dfu bootloader.

Change-Id: I894f3ee71587ccb287e92d7025039954991c631f
lynxis at

#27262 (Mar 5, 2026, 10:14:32 PM)

Replace snprintf() to free 4 kb

Change-Id: Ide644648bda86d4ae77a6713d1e140a4b78ba835
lynxis at

#27261 (Mar 5, 2026, 3:02:37 PM)

esim/http_json_api: allow URL rewriting

The URL used when HTTP requests are performed is defined statically
with the url_prefix passed to the constructor of JsonHttpApiClient
together with the path property in JsonHttpApiFunction.

For applications that require dynamic URLs there is no way to rewrite
the URL. Let's add a mechanism that allows API users to apply custom
URL reqriting rules by adding a reqrite_url method to
JsonHttpApiFunction. API users may then overload this method with a
custom implementation as needed.

Related: SYS#7918
Change-Id: Id2713a867079cc140517fe312189e5e2162608a5
pmaier@sysmocom.de at