Skip to content

Loading builds...

Changes

#20589 (Feb 24, 2026, 10:54:00 AM)

stream: Improve error handling and logging in write_cb

Nowhere in man 2 write/send/sendmsg it can be read that a return of 0
is actually an error, so avoid handling that case as error in
stream_cli.

While at ti, log the errno string.

Change-Id: I68468f0452cbc86b6210bbd1dbfa251579270adb
Pau Espin Pedrol at

#20588 (Feb 24, 2026, 10:53:53 AM)

stream: Improve error handling and logging in write_cb

Nowhere in man 2 write/send/sendmsg it can be read that a return of 0
is actually an error, so avoid handling that case as error in
stream_cli.

While at ti, log the errno string.

Change-Id: I68468f0452cbc86b6210bbd1dbfa251579270adb
Pau Espin Pedrol at

#20587 (Feb 24, 2026, 10:53:49 AM)

stream: Improve error handling and logging in write_cb

Nowhere in man 2 write/send/sendmsg it can be read that a return of 0
is actually an error, so avoid handling that case as error in
stream_cli.

While at ti, log the errno string.

Change-Id: I68468f0452cbc86b6210bbd1dbfa251579270adb
Pau Espin Pedrol at

#20586 (Feb 24, 2026, 10:36:20 AM)

stream_cli: Log errno string if write failed

Change-Id: I68468f0452cbc86b6210bbd1dbfa251579270adb
Pau Espin Pedrol at

#20585 (Feb 24, 2026, 10:36:19 AM)

stream_cli: Log errno string if write failed

Change-Id: I68468f0452cbc86b6210bbd1dbfa251579270adb
Pau Espin Pedrol at

#20584 (Feb 24, 2026, 10:36:17 AM)

stream_cli: Log errno string if write failed

Change-Id: I68468f0452cbc86b6210bbd1dbfa251579270adb
Pau Espin Pedrol at

#20583 (Feb 24, 2026, 6:53:02 AM)

sigtran-osmocom.adoc: Describe tcap-aware loadshare

Change-Id: I58979e8f6c5156706b1016069eaaf2801ec9311b
Related: OS#5423
dwillmann at

#20582 (Feb 24, 2026, 6:53:00 AM)

sigtran-osmocom.adoc: Describe tcap-aware loadshare

Change-Id: I58979e8f6c5156706b1016069eaaf2801ec9311b
Related: OS#5423
dwillmann at

#20581 (Feb 23, 2026, 8:14:50 PM)

RTP: add vty option for ortp vs twrtp selection

With this patch it finally becomes possible for the user to select
which RTP library should be used: ortp or twrtp.  ortp is still
the default for now, in order to not alter behavior for existing
installations until twrtp receives more real world testing by users
beyond the original author.  Future patches may change the default
or even remove ortp support altogether - but twrtp should receive
more testing as a user opt-in feature first.

Related: OS#6474
Change-Id: Iff4e3a399250c16ba8fe4cb12e4e22f4c6b346ec
falcon at

#20580 (Feb 23, 2026, 8:14:44 PM)

RTP: add vty option for ortp vs twrtp selection

With this patch it finally becomes possible for the user to select
which RTP library should be used: ortp or twrtp.  ortp is still
the default for now, in order to not alter behavior for existing
installations until twrtp receives more real world testing by users
beyond the original author.  Future patches may change the default
or even remove ortp support altogether - but twrtp should receive
more testing as a user opt-in feature first.

Related: OS#6474
Change-Id: Iff4e3a399250c16ba8fe4cb12e4e22f4c6b346ec
falcon at

#20579 (Feb 23, 2026, 7:53:33 PM)

RTP: use new abstraction layer instead of direct osmo_ortp

As of this patch in the series, the RTP library in active use
is still always ortp, but all BTS code now accesses it through
the new abstraction layer, paving the way for twrtp option.

Related: OS#6474
Change-Id: I5e3de4f84e8e8875437cb94a9b8feeb07f9cc1cf
falcon at

#20578 (Feb 23, 2026, 7:53:33 PM)

RTP: add vty option for ortp vs twrtp selection

With this patch it finally becomes possible for the user to select
which RTP library should be used: ortp or twrtp.  ortp is still
the default for now, in order to not alter behavior for existing
installations until twrtp receives more real world testing by users
beyond the original author.  Future patches may change the default
or even remove ortp support altogether - but twrtp should receive
more testing as a user opt-in feature first.

Related: OS#6474
Change-Id: Iff4e3a399250c16ba8fe4cb12e4e22f4c6b346ec
falcon at

#20577 (Feb 23, 2026, 7:53:32 PM)

RTP: implement RTP socket abstraction layer

This abstraction layer is another step toward supporting a choice
between legacy Belledonne ortp and Osmocom-integrated twrtp.

Related: OS#6474
Depends: Ibda74c0dbfb163f5d0e3fb13f593a6e2c6817673 (libosmo-netif.git)
Change-Id: Ic945f6d753ec7f5c0ac5cecc9f71049464de7e8f
falcon at

#20576 (Feb 23, 2026, 7:53:32 PM)

RTP: use new abstraction layer instead of direct osmo_ortp

As of this patch in the series, the RTP library in active use
is still always ortp, but all BTS code now accesses it through
the new abstraction layer, paving the way for twrtp option.

Related: OS#6474
Change-Id: I5e3de4f84e8e8875437cb94a9b8feeb07f9cc1cf
falcon at

#20575 (Feb 23, 2026, 7:53:31 PM)

RTP: add vty option for ortp vs twrtp selection

With this patch it finally becomes possible for the user to select
which RTP library should be used: ortp or twrtp.  ortp is still
the default for now, in order to not alter behavior for existing
installations until twrtp receives more real world testing by users
beyond the original author.  Future patches may change the default
or even remove ortp support altogether - but twrtp should receive
more testing as a user opt-in feature first.

Related: OS#6474
Change-Id: Iff4e3a399250c16ba8fe4cb12e4e22f4c6b346ec
falcon at

#20574 (Feb 23, 2026, 7:53:31 PM)

RTP: implement RTP socket abstraction layer

This abstraction layer is another step toward supporting a choice
between legacy Belledonne ortp and Osmocom-integrated twrtp.

Related: OS#6474
Depends: Ibda74c0dbfb163f5d0e3fb13f593a6e2c6817673 (libosmo-netif.git)
Change-Id: Ic945f6d753ec7f5c0ac5cecc9f71049464de7e8f
falcon at

#20573 (Feb 22, 2026, 4:55:19 AM)

RTP: add vty option for ortp vs twrtp selection

With this patch it finally becomes possible for the user to select
which RTP library should be used: ortp or twrtp.  ortp is still
the default for now, in order to not alter behavior for existing
installations until twrtp receives more real world testing by users
beyond the original author.  Future patches may change the default
or even remove ortp support altogether - but twrtp should receive
more testing as a user opt-in feature first.

Related: OS#6474
Change-Id: Iff4e3a399250c16ba8fe4cb12e4e22f4c6b346ec
falcon at

#20572 (Feb 22, 2026, 4:55:18 AM)

RTP: add vty option for ortp vs twrtp selection

With this patch it finally becomes possible for the user to select
which RTP library should be used: ortp or twrtp.  ortp is still
the default for now, in order to not alter behavior for existing
installations until twrtp receives more real world testing by users
beyond the original author.  Future patches may change the default
or even remove ortp support altogether - but twrtp should receive
more testing as a user opt-in feature first.

Related: OS#6474
Change-Id: Iff4e3a399250c16ba8fe4cb12e4e22f4c6b346ec
falcon at

#20571 (Feb 22, 2026, 4:44:33 AM)

RTP: add vty option for ortp vs twrtp selection

With this patch it finally becomes possible for the user to select
which RTP library should be used: ortp or twrtp.  ortp is still
the default for now, in order to not alter behavior for existing
installations until twrtp receives more real world testing by users
beyond the original author.  Future patches may change the default
or even remove ortp support altogether - but twrtp should receive
more testing as a user opt-in feature first.

Related: OS#6474
Change-Id: Iff4e3a399250c16ba8fe4cb12e4e22f4c6b346ec
falcon at

#20570 (Feb 22, 2026, 4:44:32 AM)

RTP: add vty option for ortp vs twrtp selection

With this patch it finally becomes possible for the user to select
which RTP library should be used: ortp or twrtp.  ortp is still
the default for now, in order to not alter behavior for existing
installations until twrtp receives more real world testing by users
beyond the original author.  Future patches may change the default
or even remove ortp support altogether - but twrtp should receive
more testing as a user opt-in feature first.

Related: OS#6474
Change-Id: Iff4e3a399250c16ba8fe4cb12e4e22f4c6b346ec
falcon at

#20569 (Feb 22, 2026, 4:38:03 AM)

RTP: use new abstraction layer instead of direct osmo_ortp

As of this patch in the series, the RTP library in active use
is still always ortp, but all BTS code now accesses it through
the new abstraction layer, paving the way for twrtp option.

Related: OS#6474
Change-Id: I5e3de4f84e8e8875437cb94a9b8feeb07f9cc1cf
falcon at

#20568 (Feb 22, 2026, 4:38:02 AM)

RTP: use new abstraction layer instead of direct osmo_ortp

As of this patch in the series, the RTP library in active use
is still always ortp, but all BTS code now accesses it through
the new abstraction layer, paving the way for twrtp option.

Related: OS#6474
Change-Id: I5e3de4f84e8e8875437cb94a9b8feeb07f9cc1cf
falcon at

#20567 (Feb 22, 2026, 4:24:45 AM)

RTP: implement RTP socket abstraction layer

This abstraction layer is another step toward supporting a choice
between legacy Belledonne ortp and Osmocom-integrated twrtp.

Related: OS#6474
Depends: Ibda74c0dbfb163f5d0e3fb13f593a6e2c6817673 (libosmo-netif.git)
Change-Id: Ic945f6d753ec7f5c0ac5cecc9f71049464de7e8f
falcon at

#20566 (Feb 22, 2026, 4:24:41 AM)

RTP: implement RTP socket abstraction layer

This abstraction layer is another step toward supporting a choice
between legacy Belledonne ortp and Osmocom-integrated twrtp.

Related: OS#6474
Depends: Ibda74c0dbfb163f5d0e3fb13f593a6e2c6817673 (libosmo-netif.git)
Change-Id: Ic945f6d753ec7f5c0ac5cecc9f71049464de7e8f
falcon at

#20565 (Feb 22, 2026, 4:17:26 AM)

RTP: implement RTP socket abstraction layer

This abstraction layer is another step toward supporting a choice
between legacy Belledonne ortp and Osmocom-integrated twrtp.

Related: OS#6474
Depends: Ibda74c0dbfb163f5d0e3fb13f593a6e2c6817673 (libosmo-netif.git)
Change-Id: Ic945f6d753ec7f5c0ac5cecc9f71049464de7e8f
falcon at

#20564 (Feb 22, 2026, 4:17:26 AM)

RTP: implement RTP socket abstraction layer

This abstraction layer is another step toward supporting a choice
between legacy Belledonne ortp and Osmocom-integrated twrtp.

Related: OS#6474
Depends: Ibda74c0dbfb163f5d0e3fb13f593a6e2c6817673 (libosmo-netif.git)
Change-Id: Ic945f6d753ec7f5c0ac5cecc9f71049464de7e8f
falcon at

#20563 (Feb 22, 2026, 4:08:10 AM)

RTP: add vty configuration for twjit

This patch is the first step in the series adding the ability to use
twrtp+twjit instead of Belledonne ortp.  twjit requires vty config
for tunable parameters - add this config.  Actual use of this added
config will happen in subsequent patches.

Related: OS#6474
Change-Id: I9ccd060fce8416e01356fccd9ae465a7298a9ce5
falcon at

#20562 (Feb 22, 2026, 4:08:08 AM)

RTP: add vty configuration for twjit

This patch is the first step in the series adding the ability to use
twrtp+twjit instead of Belledonne ortp.  twjit requires vty config
for tunable parameters - add this config.  Actual use of this added
config will happen in subsequent patches.

Related: OS#6474
Change-Id: I9ccd060fce8416e01356fccd9ae465a7298a9ce5
falcon at

#20561 (Feb 22, 2026, 3:38:26 AM)

RTP: use new abstraction layer instead of direct osmo_ortp

As of this patch in the series, the RTP library in active use
is still always ortp, but all BTS code now accesses it through
the new abstraction layer, paving the way for twrtp option.

Related: OS#6474
Change-Id: I5e3de4f84e8e8875437cb94a9b8feeb07f9cc1cf
falcon at

#20560 (Feb 22, 2026, 3:38:26 AM)

RTP: add vty configuration for twjit

This patch is the first step in the series adding the ability to use
twrtp+twjit instead of Belledonne ortp.  twjit requires vty config
for tunable parameters - add this config.  Actual use of this added
config will happen in subsequent patches.

Related: OS#6474
Change-Id: I9ccd060fce8416e01356fccd9ae465a7298a9ce5
falcon at

#20559 (Feb 22, 2026, 3:38:26 AM)

RTP: implement RTP socket abstraction layer

This abstraction layer is another step toward supporting a choice
between legacy Belledonne ortp and Osmocom-integrated twrtp.

Related: OS#6474
Depends: Ibda74c0dbfb163f5d0e3fb13f593a6e2c6817673 (libosmo-netif.git)
Change-Id: Ic945f6d753ec7f5c0ac5cecc9f71049464de7e8f
falcon at

#20558 (Feb 22, 2026, 3:38:23 AM)

RTP: add vty option for ortp vs twrtp selection

With this patch it finally becomes possible for the user to select
which RTP library should be used: ortp or twrtp.  ortp is still
the default for now, in order to not alter behavior for existing
installations until twrtp receives more real world testing by users
beyond the original author.  Future patches may change the default
or even remove ortp support altogether - but twrtp should receive
more testing as a user opt-in feature first.

Related: OS#6474
Change-Id: Iff4e3a399250c16ba8fe4cb12e4e22f4c6b346ec
falcon at

#20557 (Feb 22, 2026, 3:38:23 AM)

RTP: implement RTP socket abstraction layer

This abstraction layer is another step toward supporting a choice
between legacy Belledonne ortp and Osmocom-integrated twrtp.

Related: OS#6474
Depends: Ibda74c0dbfb163f5d0e3fb13f593a6e2c6817673 (libosmo-netif.git)
Change-Id: Ic945f6d753ec7f5c0ac5cecc9f71049464de7e8f
falcon at

#20556 (Feb 22, 2026, 3:38:22 AM)

RTP: use new abstraction layer instead of direct osmo_ortp

As of this patch in the series, the RTP library in active use
is still always ortp, but all BTS code now accesses it through
the new abstraction layer, paving the way for twrtp option.

Related: OS#6474
Change-Id: I5e3de4f84e8e8875437cb94a9b8feeb07f9cc1cf
falcon at

#20555 (Feb 22, 2026, 3:38:22 AM)

RTP: add vty configuration for twjit

This patch is the first step in the series adding the ability to use
twrtp+twjit instead of Belledonne ortp.  twjit requires vty config
for tunable parameters - add this config.  Actual use of this added
config will happen in subsequent patches.

Related: OS#6474
Change-Id: I9ccd060fce8416e01356fccd9ae465a7298a9ce5
falcon at

#20554 (Feb 22, 2026, 3:38:20 AM)

RTP: add vty option for ortp vs twrtp selection

With this patch it finally becomes possible for the user to select
which RTP library should be used: ortp or twrtp.  ortp is still
the default for now, in order to not alter behavior for existing
installations until twrtp receives more real world testing by users
beyond the original author.  Future patches may change the default
or even remove ortp support altogether - but twrtp should receive
more testing as a user opt-in feature first.

Related: OS#6474
Change-Id: Iff4e3a399250c16ba8fe4cb12e4e22f4c6b346ec
falcon at

#20553 (Feb 20, 2026, 12:32:54 PM)

Bump version: 1.1.2 → 1.1.3

Change-Id: I4ffcc7d6bba6fd86525dd93fc8c643d50d81b7f0
Oliver Smith at

#20552 (Feb 20, 2026, 12:32:54 PM)

Bump version: 1.1.2 → 1.1.3

Change-Id: I4ffcc7d6bba6fd86525dd93fc8c643d50d81b7f0
Oliver Smith at

#20551 (Feb 20, 2026, 10:58:21 AM)

Bump version: 1.1.2 → 1.1.3

Change-Id: Ibc9d5efa85def78cfc3f1f09f0cde46aa7cfbd3c
Oliver Smith at

#20550 (Feb 20, 2026, 10:58:19 AM)

Bump version: 1.1.2 → 1.1.3

Change-Id: Ibc9d5efa85def78cfc3f1f09f0cde46aa7cfbd3c
Oliver Smith at

#20549 (Feb 20, 2026, 9:58:48 AM)

tcap: vty: Fix writing tcap-routing command

Change-Id: I36d23c0e330c224b69094fb861520c4a4a32b3d8
Pau Espin Pedrol at

#20548 (Feb 20, 2026, 9:58:48 AM)

tcap: vty: Fix writing tcap-routing command

Change-Id: I36d23c0e330c224b69094fb861520c4a4a32b3d8
Pau Espin Pedrol at

#20547 (Feb 19, 2026, 5:35:49 PM)

rspro_server: fix releasing timed out clients

Fix crash on reconnects of clients if they timed out.

The duplicate check will use conn->peer of the old peer,
but conn->peer is NULL because rspro_client_conn_destroy() never destroys
the connection if conn->peer is valid when rspro_client_conn_destroy() is called.

void rspro_client_conn_destroy(conn)
{
if (conn->peer) {
peer = conn->peer;
conn->peer = NULL;
osmo_stream_srv_destroy(peer); /* calls sock_closed_cb()
}
[..]
}

int sock_closed_cb(peer)
{
[..]
if (conn->peer) {
osmo_fsm_inst_dispatch(conn->fi, CLNTC_E_TCP_DOWN, NULL); /* calls in the end rspro_client_conn_destroy() */
}
return 0;
}

Re-organize the clean up:
* rspro_client_conn_destroy() will be only called by the FSM clean up
* closed_cb will inform the fi to clean up

Fixes: 8cfe1d808a57 ("Use new osmo_ipa_ka_fsm_inst APIs from libosmo-netif")
Related: OS#6957
Change-Id: I1f7faf5ffdd909362c492ab434b63fa7e79ada95
lynxis at

#20546 (Feb 19, 2026, 5:35:47 PM)

rspro_server: fix releasing timed out clients

Fix crash on reconnects of clients if they timed out.

The duplicate check will use conn->peer of the old peer,
but conn->peer is NULL because rspro_client_conn_destroy() never destroys
the connection if conn->peer is valid when rspro_client_conn_destroy() is called.

void rspro_client_conn_destroy(conn)
{
if (conn->peer) {
peer = conn->peer;
conn->peer = NULL;
osmo_stream_srv_destroy(peer); /* calls sock_closed_cb()
}
[..]
}

int sock_closed_cb(peer)
{
[..]
if (conn->peer) {
osmo_fsm_inst_dispatch(conn->fi, CLNTC_E_TCP_DOWN, NULL); /* calls in the end rspro_client_conn_destroy() */
}
return 0;
}

Re-organize the clean up:
* rspro_client_conn_destroy() will be only called by the FSM clean up
* closed_cb will inform the fi to clean up

Fixes: 8cfe1d808a57 ("Use new osmo_ipa_ka_fsm_inst APIs from libosmo-netif")
Related: OS#6957
Change-Id: I1f7faf5ffdd909362c492ab434b63fa7e79ada95
lynxis at

#20545 (Feb 19, 2026, 1:13:21 PM)

Bump version: 1.10.0.36-b9839-dirty → 1.11.0

Change-Id: I595b31071a071bfa5666931d99e24e9b56877a6f
Pau Espin Pedrol at

#20544 (Feb 19, 2026, 1:13:21 PM)

Bump version: 1.10.0.36-b9839-dirty → 1.11.0

Change-Id: I595b31071a071bfa5666931d99e24e9b56877a6f
Pau Espin Pedrol at

#20543 (Feb 19, 2026, 12:56:43 PM)

Add [no ]force-cell-sel-ind-after-rel

Change-Id: Ie5fa3e036e0a0dd4049a4230d6cd4cb7c158088e
Related: SYS#7482
Vadim Yanitskiy at

#20542 (Feb 19, 2026, 12:56:43 PM)

Add [no ]force-cell-sel-ind-after-rel

Change-Id: Ie5fa3e036e0a0dd4049a4230d6cd4cb7c158088e
Related: SYS#7482
Vadim Yanitskiy at

#20541 (Feb 19, 2026, 12:27:07 PM)

Bump version: 1.10.0.36-b9839-dirty → 1.11.0

Change-Id: I595b31071a071bfa5666931d99e24e9b56877a6f
Pau Espin Pedrol at

#20540 (Feb 19, 2026, 12:27:07 PM)

Bump version: 1.10.0.36-b9839-dirty → 1.11.0

Change-Id: I595b31071a071bfa5666931d99e24e9b56877a6f
Pau Espin Pedrol at

#20539 (Feb 19, 2026, 12:17:13 PM)

Bump version: 1.8.0.3-9533 → 1.8.1

Change-Id: I44a6d0216f2a8ea4a536374c99cfedfbec75eabf
Pau Espin Pedrol at

#20538 (Feb 19, 2026, 12:17:12 PM)

Bump version: 1.8.0.3-9533 → 1.8.1

Change-Id: I44a6d0216f2a8ea4a536374c99cfedfbec75eabf
Pau Espin Pedrol at

#20537 (Feb 19, 2026, 12:12:23 PM)

Bump version: 0.5.2.4-2463 → 0.5.3

Change-Id: I36a3c6219bbd4f7dc13b5d5e40687d3f61aa02d5
Pau Espin Pedrol at

#20536 (Feb 19, 2026, 12:12:22 PM)

Bump version: 0.5.2.4-2463 → 0.5.3

Change-Id: I36a3c6219bbd4f7dc13b5d5e40687d3f61aa02d5
Pau Espin Pedrol at

#20535 (Feb 19, 2026, 12:04:05 PM)

Bump version: 1.14.0.10-44efd → 1.14.1

Change-Id: I2a3907eabebc7f282f0a00d50b11894847669c1f
Pau Espin Pedrol at

#20534 (Feb 19, 2026, 12:04:02 PM)

ipaccess-config-e1-driver: Make sure struct input_signal_data is zero initialized

Change-Id: If97c4a4202eaf96446d48e821d5e59c98bafe51c
(cherry picked from commit 37929c0886be2fa71aadadc571ee024c3d54a3a6)
Pau Espin Pedrol at

#20533 (Feb 19, 2026, 12:04:02 PM)

assignment_fsm: Fix use-after-free of lchan->conn

Scenario:
* A DYNAMIC/OSMOCOM TS in PDCH mode is selected to be used for TCH/F,
  hence the TS is being switched to TCH/F: RF Channel Release is being
  transmitted and waiting to receive RF Channel release ACK. Hence,
  lchan is in state LCHAN_ST_WAIT_TS_READY, and there's a conn with an
  assignment FSM pointing to it in conn->assignment.new_lchan.
  lchan->conn also points to the related conn.
* The BSSMAP SCCP link goes down (link lost), which will terminate the
  conn->fi of all conns related to the MSC peer going down.
  During that teardown, first gscon_pre_term()->gscon_release_lchans()->
  assignment_reset() is called, which sets
  conn->assignment.new_lchan=NULL and calls lchan_release(). This path
  leaves conn->assignment.new_lchan->conn untouched!
* Later in the call path, when finally the bsc_subscr is put() to 0
  references and associated lchan gets its lchan_forget_conn() called,
  it will access lchan->conn which was not freed in the previous step
  mentioned above during assignment_reset().

This patch fixes the issue by adding a lchan_forget_conn() after the
lchan_release() in assignment_reset(), to make sure the conn is no
longer user by the lchan afterwards.

Related: OS#6936
Change-Id: Ifbb9a61cd8a40d953ef5c2b52f9be9ef0dffefa4
(cherry picked from commit 44efd5b20b50ab894ed32ada3340fb5507b4852b)
Pau Espin Pedrol at

#20532 (Feb 19, 2026, 12:04:02 PM)

Bump version: 1.14.0.10-44efd → 1.14.1

Change-Id: I2a3907eabebc7f282f0a00d50b11894847669c1f
Pau Espin Pedrol at

#20531 (Feb 19, 2026, 12:04:01 PM)

ipaccess-config-e1-driver: Make sure struct input_signal_data is zero initialized

Change-Id: If97c4a4202eaf96446d48e821d5e59c98bafe51c
(cherry picked from commit 37929c0886be2fa71aadadc571ee024c3d54a3a6)
Pau Espin Pedrol at

#20530 (Feb 19, 2026, 12:04:01 PM)

assignment_fsm: Fix use-after-free of lchan->conn

Scenario:
* A DYNAMIC/OSMOCOM TS in PDCH mode is selected to be used for TCH/F,
  hence the TS is being switched to TCH/F: RF Channel Release is being
  transmitted and waiting to receive RF Channel release ACK. Hence,
  lchan is in state LCHAN_ST_WAIT_TS_READY, and there's a conn with an
  assignment FSM pointing to it in conn->assignment.new_lchan.
  lchan->conn also points to the related conn.
* The BSSMAP SCCP link goes down (link lost), which will terminate the
  conn->fi of all conns related to the MSC peer going down.
  During that teardown, first gscon_pre_term()->gscon_release_lchans()->
  assignment_reset() is called, which sets
  conn->assignment.new_lchan=NULL and calls lchan_release(). This path
  leaves conn->assignment.new_lchan->conn untouched!
* Later in the call path, when finally the bsc_subscr is put() to 0
  references and associated lchan gets its lchan_forget_conn() called,
  it will access lchan->conn which was not freed in the previous step
  mentioned above during assignment_reset().

This patch fixes the issue by adding a lchan_forget_conn() after the
lchan_release() in assignment_reset(), to make sure the conn is no
longer user by the lchan afterwards.

Related: OS#6936
Change-Id: Ifbb9a61cd8a40d953ef5c2b52f9be9ef0dffefa4
(cherry picked from commit 44efd5b20b50ab894ed32ada3340fb5507b4852b)
Pau Espin Pedrol at

#20529 (Feb 19, 2026, 11:41:47 AM)

Bump version: 1.12.0.73-10f3 → 1.13.0

Change-Id: I877d255890a525a34fbf89101b3ff0bbd0989c87
Pau Espin Pedrol at

#20528 (Feb 19, 2026, 11:41:43 AM)

Bump version: 1.12.0.73-10f3 → 1.13.0

Change-Id: I877d255890a525a34fbf89101b3ff0bbd0989c87
Pau Espin Pedrol at

#20527 (Feb 19, 2026, 11:41:43 AM)

Bump version: 1.12.0.73-10f3 → 1.13.0

Change-Id: I877d255890a525a34fbf89101b3ff0bbd0989c87
Pau Espin Pedrol at

#20526 (Feb 19, 2026, 9:34:56 AM)

Tear down context_maps when UPF assoc goes down

Related: SYS#7294
Change-Id: I7dcd9114861fa8f4bf855a02c286f85083ad75fe
Pau Espin Pedrol at

#20525 (Feb 19, 2026, 9:34:54 AM)

Tear down context_maps when UPF assoc goes down

Related: SYS#7294
Change-Id: I7dcd9114861fa8f4bf855a02c286f85083ad75fe
Pau Espin Pedrol at

#20524 (Feb 18, 2026, 4:30:32 PM)

twjit: add underrun extension feature

Themyscira Wireless RTP jitter buffer implementation (twjit) was
originally designed for continuous streaming, as opposed to RTP
streams with intentional gaps.  However, intentional gaps in the
case of DTX pauses or radio errors are called for by 3GPP AoIP
specs and are the default mode for UL RTP Tx in OsmoBTS - therefore,
this philosophical incompatibility between twjit and RTP intentional
gaps is likely to be an obstacle to the desired replacement of
Belledonne ortp with twrtp+twjit in OsmoBTS.  The greatest practical
effect of this philosophical mismatch occurs with RTP streams that
apply intentional gaps for DTX: with standard twjit algorithm,
isolated-island comfort noise update packets throughout each DTX
pause will be dropped.

Underrun extension is an optionally-enabled modification to twjit
algorithm that solves the problem of isolated-island CN update
packets during DTX pauses - i.e., delivers these packets to the
application on the output side of twjit.  As detailed in the
included document update, this solution is not perfect in that
these isolated CN update packets will be delivered only in steady
flow state but not in new flow acquisition states - but it is the
best solution this author can currently provide for the problem of
RTP intentional gaps.

Related: OS#6474
Change-Id: Ibda74c0dbfb163f5d0e3fb13f593a6e2c6817673
falcon at

#20523 (Feb 18, 2026, 4:30:29 PM)

twjit: add underrun extension feature

Themyscira Wireless RTP jitter buffer implementation (twjit) was
originally designed for continuous streaming, as opposed to RTP
streams with intentional gaps.  However, intentional gaps in the
case of DTX pauses or radio errors are called for by 3GPP AoIP
specs and are the default mode for UL RTP Tx in OsmoBTS - therefore,
this philosophical incompatibility between twjit and RTP intentional
gaps is likely to be an obstacle to the desired replacement of
Belledonne ortp with twrtp+twjit in OsmoBTS.  The greatest practical
effect of this philosophical mismatch occurs with RTP streams that
apply intentional gaps for DTX: with standard twjit algorithm,
isolated-island comfort noise update packets throughout each DTX
pause will be dropped.

Underrun extension is an optionally-enabled modification to twjit
algorithm that solves the problem of isolated-island CN update
packets during DTX pauses - i.e., delivers these packets to the
application on the output side of twjit.  As detailed in the
included document update, this solution is not perfect in that
these isolated CN update packets will be delivered only in steady
flow state but not in new flow acquisition states - but it is the
best solution this author can currently provide for the problem of
RTP intentional gaps.

Related: OS#6474
Change-Id: Ibda74c0dbfb163f5d0e3fb13f593a6e2c6817673
falcon at

#20522 (Feb 18, 2026, 4:30:26 PM)

twjit: add underrun extension feature

Themyscira Wireless RTP jitter buffer implementation (twjit) was
originally designed for continuous streaming, as opposed to RTP
streams with intentional gaps.  However, intentional gaps in the
case of DTX pauses or radio errors are called for by 3GPP AoIP
specs and are the default mode for UL RTP Tx in OsmoBTS - therefore,
this philosophical incompatibility between twjit and RTP intentional
gaps is likely to be an obstacle to the desired replacement of
Belledonne ortp with twrtp+twjit in OsmoBTS.  The greatest practical
effect of this philosophical mismatch occurs with RTP streams that
apply intentional gaps for DTX: with standard twjit algorithm,
isolated-island comfort noise update packets throughout each DTX
pause will be dropped.

Underrun extension is an optionally-enabled modification to twjit
algorithm that solves the problem of isolated-island CN update
packets during DTX pauses - i.e., delivers these packets to the
application on the output side of twjit.  As detailed in the
included document update, this solution is not perfect in that
these isolated CN update packets will be delivered only in steady
flow state but not in new flow acquisition states - but it is the
best solution this author can currently provide for the problem of
RTP intentional gaps.

Related: OS#6474
Change-Id: Ibda74c0dbfb163f5d0e3fb13f593a6e2c6817673
falcon at

#20521 (Feb 18, 2026, 12:57:21 PM)

Tear down context_maps when UPF assoc goes down

Related: SYS#7294
Change-Id: I7dcd9114861fa8f4bf855a02c286f85083ad75fe
Pau Espin Pedrol at

#20520 (Feb 18, 2026, 12:57:21 PM)

Integrate mgw/mgcp failures more tightly into context_map fsm

Similar to what we already do in RAN/CN link lost.
As a result, we now trigger RLSD instead of Iu RANAP Release Req, which
adequates better to the level where hnbgw is espected to operate.

Change-Id: Ief051e1384d2282708302dc1756454d8f88a6fae
Pau Espin Pedrol at

#20519 (Feb 18, 2026, 12:57:18 PM)

Tear down context_maps when UPF assoc goes down

Related: SYS#7294
Change-Id: I7dcd9114861fa8f4bf855a02c286f85083ad75fe
Pau Espin Pedrol at

#20518 (Feb 18, 2026, 12:57:18 PM)

Integrate mgw/mgcp failures more tightly into context_map fsm

Similar to what we already do in RAN/CN link lost.
As a result, we now trigger RLSD instead of Iu RANAP Release Req, which
adequates better to the level where hnbgw is espected to operate.

Change-Id: Ief051e1384d2282708302dc1756454d8f88a6fae
Pau Espin Pedrol at

#20517 (Feb 17, 2026, 6:20:30 PM)

twjit: add underrun extension feature

Themyscira Wireless RTP jitter buffer implementation (twjit) was
originally designed for continuous streaming, as opposed to RTP
streams with intentional gaps.  However, intentional gaps in the
case of DTX pauses or radio errors are called for by 3GPP AoIP
specs and are the default mode for UL RTP Tx in OsmoBTS - therefore,
this philosophical incompatibility between twjit and RTP intentional
gaps is likely to be an obstacle to the desired replacement of
Belledonne ortp with twrtp+twjit in OsmoBTS.  The greatest practical
effect of this philosophical mismatch occurs with RTP streams that
apply intentional gaps for DTX: with standard twjit algorithm,
isolated-island comfort noise update packets throughout each DTX
pause will be dropped.

Underrun extension is an optionally-enabled modification to twjit
algorithm that solves the problem of isolated-island CN update
packets during DTX pauses - i.e., delivers these packets to the
application on the output side of twjit.  As detailed in the
included document update, this solution is not perfect in that
these isolated CN update packets will be delivered only in steady
flow state but not in new flow acquisition states - but it is the
best solution this author can currently provide for the problem of
RTP intentional gaps.

Related: OS#6474
Change-Id: Ibda74c0dbfb163f5d0e3fb13f593a6e2c6817673
falcon at

#20516 (Feb 17, 2026, 6:20:30 PM)

twjit: add underrun extension feature

Themyscira Wireless RTP jitter buffer implementation (twjit) was
originally designed for continuous streaming, as opposed to RTP
streams with intentional gaps.  However, intentional gaps in the
case of DTX pauses or radio errors are called for by 3GPP AoIP
specs and are the default mode for UL RTP Tx in OsmoBTS - therefore,
this philosophical incompatibility between twjit and RTP intentional
gaps is likely to be an obstacle to the desired replacement of
Belledonne ortp with twrtp+twjit in OsmoBTS.  The greatest practical
effect of this philosophical mismatch occurs with RTP streams that
apply intentional gaps for DTX: with standard twjit algorithm,
isolated-island comfort noise update packets throughout each DTX
pause will be dropped.

Underrun extension is an optionally-enabled modification to twjit
algorithm that solves the problem of isolated-island CN update
packets during DTX pauses - i.e., delivers these packets to the
application on the output side of twjit.  As detailed in the
included document update, this solution is not perfect in that
these isolated CN update packets will be delivered only in steady
flow state but not in new flow acquisition states - but it is the
best solution this author can currently provide for the problem of
RTP intentional gaps.

Related: OS#6474
Change-Id: Ibda74c0dbfb163f5d0e3fb13f593a6e2c6817673
falcon at

#20515 (Feb 17, 2026, 6:20:29 PM)

twjit: add underrun extension feature

Themyscira Wireless RTP jitter buffer implementation (twjit) was
originally designed for continuous streaming, as opposed to RTP
streams with intentional gaps.  However, intentional gaps in the
case of DTX pauses or radio errors are called for by 3GPP AoIP
specs and are the default mode for UL RTP Tx in OsmoBTS - therefore,
this philosophical incompatibility between twjit and RTP intentional
gaps is likely to be an obstacle to the desired replacement of
Belledonne ortp with twrtp+twjit in OsmoBTS.  The greatest practical
effect of this philosophical mismatch occurs with RTP streams that
apply intentional gaps for DTX: with standard twjit algorithm,
isolated-island comfort noise update packets throughout each DTX
pause will be dropped.

Underrun extension is an optionally-enabled modification to twjit
algorithm that solves the problem of isolated-island CN update
packets during DTX pauses - i.e., delivers these packets to the
application on the output side of twjit.  As detailed in the
included document update, this solution is not perfect in that
these isolated CN update packets will be delivered only in steady
flow state but not in new flow acquisition states - but it is the
best solution this author can currently provide for the problem of
RTP intentional gaps.

Related: OS#6474
Change-Id: Ibda74c0dbfb163f5d0e3fb13f593a6e2c6817673
falcon at

#20514 (Feb 17, 2026, 8:08:49 AM)

libgsmhr/fetch_sources: fix download from 3gpp.org

Fix that the script gets a 403 forbidden error since 2026-01-26. Set a
user-agent string and switch the protocol to https while at it.

Change-Id: I5679bc519e7891e3342d8e78c11bf5eb6b44a217
Oliver Smith at

#20513 (Feb 17, 2026, 8:08:48 AM)

libgsmhr/fetch_sources: fix download from 3gpp.org

Fix that the script gets a 403 forbidden error since 2026-01-26. Set a
user-agent string and switch the protocol to https while at it.

Change-Id: I5679bc519e7891e3342d8e78c11bf5eb6b44a217
Oliver Smith at

#20512 (Feb 17, 2026, 7:57:30 AM)

libgsmhr/fetch_sources: set protocol to https

The http version gives a 403 forbidden error since 2026-01-26.

Change-Id: I5679bc519e7891e3342d8e78c11bf5eb6b44a217
Oliver Smith at

#20511 (Feb 17, 2026, 7:57:28 AM)

libgsmhr/fetch_sources: set protocol to https

The http version gives a 403 forbidden error since 2026-01-26.

Change-Id: I5679bc519e7891e3342d8e78c11bf5eb6b44a217
Oliver Smith at

#20510 (Feb 17, 2026, 12:49:01 AM)

rspro_server: fix releasing timed out clients

Fix crash on reconnects of clients if they timed out.

The duplicate check will use conn->peer of the old peer,
but conn->peer is NULL because rspro_client_conn_destroy() never destroys
the connection if conn->peer is valid when rspro_client_conn_destroy() is called.

void rspro_client_conn_destroy(conn)
{
if (conn->peer) {
peer = conn->peer;
conn->peer = NULL;
osmo_stream_srv_destroy(peer); /* calls sock_closed_cb()
}
[..]
}

int sock_closed_cb(peer)
{
[..]
if (conn->peer) {
osmo_fsm_inst_dispatch(conn->fi, CLNTC_E_TCP_DOWN, NULL); /* calls in the end rspro_client_conn_destroy() */
}
return 0;
}

Fixes: 8cfe1d808a57 ("Use new osmo_ipa_ka_fsm_inst APIs from libosmo-netif")
Related: OS#6957
Change-Id: I1f7faf5ffdd909362c492ab434b63fa7e79ada95
lynxis at

#20509 (Feb 17, 2026, 12:48:53 AM)

rspro_server: fix releasing timed out clients

Fix crash on reconnects of clients if they timed out.

The duplicate check will use conn->peer of the old peer,
but conn->peer is NULL because rspro_client_conn_destroy() never destroys
the connection if conn->peer is valid when rspro_client_conn_destroy() is called.

void rspro_client_conn_destroy(conn)
{
if (conn->peer) {
peer = conn->peer;
conn->peer = NULL;
osmo_stream_srv_destroy(peer); /* calls sock_closed_cb()
}
[..]
}

int sock_closed_cb(peer)
{
[..]
if (conn->peer) {
osmo_fsm_inst_dispatch(conn->fi, CLNTC_E_TCP_DOWN, NULL); /* calls in the end rspro_client_conn_destroy() */
}
return 0;
}

Fixes: 8cfe1d808a57 ("Use new osmo_ipa_ka_fsm_inst APIs from libosmo-netif")
Related: OS#6957
Change-Id: I1f7faf5ffdd909362c492ab434b63fa7e79ada95
lynxis at

#20508 (Feb 16, 2026, 4:20:47 PM)

pfcp: Trigger assoc_cb(false) upon Recovery Timestamp change

Signal cp_peer becomes disassociated to the user when the recovery
timestamp value changes.
The library will automatically try to re-associate after signalling the
association change.

Related: SYS#7294
Change-Id: I5400ae9c2f00b3c87a73aef5cebba67cf9434477
Pau Espin Pedrol at

#20507 (Feb 16, 2026, 4:20:45 PM)

pfcp: Trigger assoc_cb(false) upon Recovery Timestamp change

Signal cp_peer becomes disassociated to the user when the recovery
timestamp value changes.
The library will automatically try to re-associate after signalling the
association change.

Related: SYS#7294
Change-Id: I5400ae9c2f00b3c87a73aef5cebba67cf9434477
Pau Espin Pedrol at

#20506 (Feb 16, 2026, 3:15:30 PM)

Tear down context_maps when UPF assoc goes down

Related: SYS#7294
Change-Id: I7dcd9114861fa8f4bf855a02c286f85083ad75fe
Pau Espin Pedrol at

#20505 (Feb 16, 2026, 3:15:30 PM)

Integrate mgw/mgcp failures more tightly into context_map fsm

Similar to what we already do in RAN/CN link lost.
As a result, we now trigger RLSD instead of Iu RANAP Release Req, which
adequates better to the level where hnbgw is espected to operate.

Change-Id: Ief051e1384d2282708302dc1756454d8f88a6fae
Pau Espin Pedrol at

#20504 (Feb 16, 2026, 3:15:25 PM)

Tear down context_maps when UPF assoc goes down

Related: SYS#7294
Change-Id: I7dcd9114861fa8f4bf855a02c286f85083ad75fe
Pau Espin Pedrol at

#20503 (Feb 16, 2026, 3:15:25 PM)

Integrate mgw/mgcp failures more tightly into context_map fsm

Similar to what we already do in RAN/CN link lost.
As a result, we now trigger RLSD instead of Iu RANAP Release Req, which
adequates better to the level where hnbgw is espected to operate.

Change-Id: Ief051e1384d2282708302dc1756454d8f88a6fae
Pau Espin Pedrol at

#20502 (Feb 16, 2026, 11:18:57 AM)

cp_peer: Implement local originated heartbeat procedure

Submit PFCP Hearbeat Request with configured interval,
and timeout after no PFCP Hearbeat Response received based on
configuration.

Upon timeout, the cp_peer assoc_cb() is called to notify the user that
the peer is considered not associated anymore. It will then try to
keep associating again automatically.

Default value for OSMO_PFCP_TIMER_HEARTBEAT_RESP is increased to 35s to
allow for a single Heartbeat Request packet loss.

Related: SYS#7294
Change-Id: I7efc0961e1ea39dd7f4cc6ba96be4cf5ce9a2d6c
Pau Espin Pedrol at

#20501 (Feb 16, 2026, 11:18:57 AM)

Move struct osmo_pfcp_endpoint to pfcp_endpoint_private.h

Similar to what we have with pfcp_cp_peer_private.h.

Change-Id: Id3dcd1c2e086d40bbc7060d5e89aed5ee18249e1
Pau Espin Pedrol at

#20500 (Feb 16, 2026, 11:18:57 AM)

cp_peer: Implement local originated heartbeat procedure

Submit PFCP Hearbeat Request with configured interval,
and timeout after no PFCP Hearbeat Response received based on
configuration.

Upon timeout, the cp_peer assoc_cb() is called to notify the user that
the peer is considered not associated anymore. It will then try to
keep associating again automatically.

Default value for OSMO_PFCP_TIMER_HEARTBEAT_RESP is increased to 35s to
allow for a single Heartbeat Request packet loss.

Related: SYS#7294
Change-Id: I7efc0961e1ea39dd7f4cc6ba96be4cf5ce9a2d6c
Pau Espin Pedrol at

#20499 (Feb 16, 2026, 11:18:57 AM)

Move struct osmo_pfcp_endpoint to pfcp_endpoint_private.h

Similar to what we have with pfcp_cp_peer_private.h.

Change-Id: Id3dcd1c2e086d40bbc7060d5e89aed5ee18249e1
Pau Espin Pedrol at

#20498 (Feb 16, 2026, 10:53:57 AM)

xua_asp_fsm: Validate remote ASP Id matching config in SG role

The node in SG role really doesn't have an ASP Id of its own (it is
never sent over the wire). Hence, use the "asp-identifier <N>" VTY
config in SG role to require the ASP to identify itself with a given
ASP identifier.

Related: OS#6953
Change-Id: I3e22439aa7e22f7a6113b093c44ace6745c808b9
Pau Espin Pedrol at

#20497 (Feb 16, 2026, 10:53:56 AM)

xua_asp_fsm: Validate remote ASP Id matching config in SG role

The node in SG role really doesn't have an ASP Id of its own (it is
never sent over the wire). Hence, use the "asp-identifier <N>" VTY
config in SG role to require the ASP to identify itself with a given
ASP identifier.

Related: OS#6953
Change-Id: I3e22439aa7e22f7a6113b093c44ace6745c808b9
Pau Espin Pedrol at

#20496 (Feb 16, 2026, 10:38:39 AM)

xua_asp_fsm: Validate remote ASP Id matching config in SG role

The node in SG role really doesn't have an ASP Id of its own (it is
never sent over the wire). Hence, use the "asp-identifier <N>" VTY
config in SG role to require the ASP to identify itself with a given
ASP identifier.

Related: OS#6953
Change-Id: I3e22439aa7e22f7a6113b093c44ace6745c808b9
Pau Espin Pedrol at

#20495 (Feb 16, 2026, 10:38:38 AM)

Introduce struct osmo_ss7_as_asp_assoc

This new struct allows supporting unlimited number of ASPs per AS.
It can also potentially be used in the future to:
* Hold M3UA "ASP Identifier" per AS<->ASP association
* Speed up iterating over AS served by a given ASP.

NOTE: Having >16 ASPs per AS may not be desirable, for instance under
loadshare traffic mode ITU SLS is 4 bit, so despite having ext_sls
extending the table to 128 entries based on OPC, it may not provide
enough entropy to properly loadshare among all of them.

Related: OS#7519
Change-Id: I149ab467899633ac50cba3e482b2cae02124279d
Pau Espin Pedrol at

#20494 (Feb 16, 2026, 10:38:36 AM)

Allow configuring local ASP Identifier

If configured, it will be transmitted during ASP UP and ASP UP ACK.
This may be needed if facing an SG/IPSP peer who requires ASP Identifier
to be set.

Related: OS#6953
Change-Id: Ib94d542f940e13d5c007bc3319e7dde65cf81f12
Pau Espin Pedrol at

#20493 (Feb 16, 2026, 10:38:34 AM)

asp: Introduce asp->assoc_as_list

This way we can iterate easily/quickly the AS served by a given ASP.
This in turn allows simplifying some code since we cache the amount of
AS served by the ASP at any time, so we save some counting.

Related: SYS#6953
Change-Id: I1ca90748286374109dbb4277cbc7b2337ce2072a
Pau Espin Pedrol at

#20492 (Feb 16, 2026, 10:37:45 AM)

xua_asp_fsm: Error on ASP UP (ACK) with non-unique ASP Identifier

Following RFC4666:
"""
   The "Invalid ASP Identifier" error is sent by an SGP in response to
   an ASP Up message with an invalid (i.e., non-unique) ASP Identifier
"""

Change-Id: I2d422acaa2f04c7d1eebd92c3185c4f5476a1789
Pau Espin Pedrol at

#20491 (Feb 16, 2026, 10:37:45 AM)

cosmetic: xua_as_fsm: Fix mixed brace/no-brace blocks in if/else

Change-Id: Ibfd818d354c09409b04b392853f544a220de3a72
Pau Espin Pedrol at

#20490 (Feb 16, 2026, 10:37:44 AM)

ss7_as: Optimize ASP Tx selection in Override traffic mode

Cache the last selected ASP, and expect it to still be the active ASP
most of the time until it changes.

Change-Id: I3d480d23591f4bd216293be60b22389b182fd8f3
Pau Espin Pedrol at

#20489 (Feb 16, 2026, 10:37:40 AM)

tests/vty: Introduce testASPservesTonsOfAS

Change-Id: I39016a479fde7d61b7c0f39ca769cd8c958b55b6
Pau Espin Pedrol at

#20488 (Feb 16, 2026, 10:37:39 AM)

tests/vty: Introduce testTonsOfASP

Add test to validate tons of ASPs (1000) can be configured, all serving
one given AS.

Related: SYS#7519
Change-Id: I9bfcfcbea3c4cec0e6284ae59d30670fcf3ccac4
Pau Espin Pedrol at

#20487 (Feb 16, 2026, 10:37:39 AM)

xua_default_lm_fsm: Submit RKM REG REQ for all AS in ASP

So far only the first rctx (AS) was being registered.
This fixes RKM for ASPs serving multiple AS in ASP/IPSP role.

Relted: OS#6943
Change-Id: I932c1b05dfd37fd7b89adea0d1ea59a5dc6138b4
Pau Espin Pedrol at

#20486 (Feb 16, 2026, 10:37:39 AM)

xua_asp_fsm: Remove obvious comments

Those can already be interpretred directly by the ENSURE_* macros.
No need to clog the file with more lines describing stuff.

Change-Id: Idec06646c48fbce4cbe200e88f987dfb3e9d5a39
Pau Espin Pedrol at

#20485 (Feb 16, 2026, 10:37:38 AM)

ss7_as: Optimize ss7_as_asp_assoc_find()

Look for counterpart on the object with the shortest list, ie. convert
from O(N) to O(min(N,M)).
This way eg. if we have 100 ASPs on 1 AS, lookup time becomes O(1).
Same if we have eg. 1 ASP serving 100 AS.

Change-Id: I139aede15af6b6a77d19e6fcf6b6abe8ed6599a6
Pau Espin Pedrol at

#20484 (Feb 16, 2026, 10:37:37 AM)

xua_as_fsm: Remove TODO no longer valid

Routing Context is filled in in fill_notify_route_ctx().

Take the chance to move the logging a bit up in the function, to have
all npar filling together.

Change-Id: I57af18dacc0470d36ddd4705a9530bd44b31f9c0
Pau Espin Pedrol at

#20483 (Feb 16, 2026, 10:37:36 AM)

xua_asp_fsm: Validate remote ASP Id matching config in SG role

The node in SG role really doesn't have an ASP Id of its own (it is
never sent over the wire). Hence, use the "asp-identifier <N>" VTY
config in SG role to require the ASP to identify itself with a given
ASP identifier.

Related: OS#6953
Change-Id: I3e22439aa7e22f7a6113b093c44ace6745c808b9
Pau Espin Pedrol at

#20482 (Feb 16, 2026, 10:37:34 AM)

xua_default_lm_fsm: Submit RKM REG REQ for all AS in ASP

So far only the first rctx (AS) was being registered.
This fixes RKM for ASPs serving multiple AS in ASP/IPSP role.

Relted: OS#6943
Change-Id: I932c1b05dfd37fd7b89adea0d1ea59a5dc6138b4
Pau Espin Pedrol at

#20481 (Feb 16, 2026, 10:36:34 AM)

ss7_as: Optimize ASP Tx selection in Override traffic mode

Cache the last selected ASP, and expect it to still be the active ASP
most of the time until it changes.

Change-Id: I3d480d23591f4bd216293be60b22389b182fd8f3
Pau Espin Pedrol at

#20480 (Feb 16, 2026, 10:36:34 AM)

asp: Introduce asp->assoc_as_list

This way we can iterate easily/quickly the AS served by a given ASP.
This in turn allows simplifying some code since we cache the amount of
AS served by the ASP at any time, so we save some counting.

Related: SYS#6953
Change-Id: I1ca90748286374109dbb4277cbc7b2337ce2072a
Pau Espin Pedrol at

#20479 (Feb 16, 2026, 10:36:33 AM)

tests/vty: Introduce testTonsOfASP

Add test to validate tons of ASPs (1000) can be configured, all serving
one given AS.

Related: SYS#7519
Change-Id: I9bfcfcbea3c4cec0e6284ae59d30670fcf3ccac4
Pau Espin Pedrol at

#20478 (Feb 16, 2026, 10:36:33 AM)

cosmetic: xua_as_fsm: Fix mixed brace/no-brace blocks in if/else

Change-Id: Ibfd818d354c09409b04b392853f544a220de3a72
Pau Espin Pedrol at

#20477 (Feb 16, 2026, 10:36:32 AM)

xua_asp_fsm: Error on ASP UP (ACK) with non-unique ASP Identifier

Following RFC4666:
"""
   The "Invalid ASP Identifier" error is sent by an SGP in response to
   an ASP Up message with an invalid (i.e., non-unique) ASP Identifier
"""

Change-Id: I2d422acaa2f04c7d1eebd92c3185c4f5476a1789
Pau Espin Pedrol at

#20476 (Feb 16, 2026, 10:36:32 AM)

Introduce struct osmo_ss7_as_asp_assoc

This new struct allows supporting unlimited number of ASPs per AS.
It can also potentially be used in the future to:
* Hold M3UA "ASP Identifier" per AS<->ASP association
* Speed up iterating over AS served by a given ASP.

NOTE: Having >16 ASPs per AS may not be desirable, for instance under
loadshare traffic mode ITU SLS is 4 bit, so despite having ext_sls
extending the table to 128 entries based on OPC, it may not provide
enough entropy to properly loadshare among all of them.

Related: OS#7519
Change-Id: I149ab467899633ac50cba3e482b2cae02124279d
Pau Espin Pedrol at

#20475 (Feb 16, 2026, 10:36:32 AM)

Allow configuring local ASP Identifier

If configured, it will be transmitted during ASP UP and ASP UP ACK.
This may be needed if facing an SG/IPSP peer who requires ASP Identifier
to be set.

Related: OS#6953
Change-Id: Ib94d542f940e13d5c007bc3319e7dde65cf81f12
Pau Espin Pedrol at

#20474 (Feb 16, 2026, 10:36:31 AM)

tests/vty: Introduce testASPservesTonsOfAS

Change-Id: I39016a479fde7d61b7c0f39ca769cd8c958b55b6
Pau Espin Pedrol at

#20473 (Feb 16, 2026, 10:36:31 AM)

xua_as_fsm: Remove TODO no longer valid

Routing Context is filled in in fill_notify_route_ctx().

Take the chance to move the logging a bit up in the function, to have
all npar filling together.

Change-Id: I57af18dacc0470d36ddd4705a9530bd44b31f9c0
Pau Espin Pedrol at

#20472 (Feb 16, 2026, 10:36:31 AM)

ss7_as: Optimize ss7_as_asp_assoc_find()

Look for counterpart on the object with the shortest list, ie. convert
from O(N) to O(min(N,M)).
This way eg. if we have 100 ASPs on 1 AS, lookup time becomes O(1).
Same if we have eg. 1 ASP serving 100 AS.

Change-Id: I139aede15af6b6a77d19e6fcf6b6abe8ed6599a6
Pau Espin Pedrol at

#20471 (Feb 16, 2026, 10:36:31 AM)

xua_asp_fsm: Remove obvious comments

Those can already be interpretred directly by the ENSURE_* macros.
No need to clog the file with more lines describing stuff.

Change-Id: Idec06646c48fbce4cbe200e88f987dfb3e9d5a39
Pau Espin Pedrol at

#20470 (Feb 16, 2026, 10:35:15 AM)

m3ua: Fix missing break in m3a_rx_snm for IPSP

Fixes: e597f08dde51361434a027dc4362a5698220afb6
Change-Id: I387794b0a736ee8419e7d12dc0f586aa30b9ac26
Pau Espin Pedrol at

#20469 (Feb 16, 2026, 10:35:15 AM)

m3ua: Fix missing break in m3a_rx_snm for IPSP

Fixes: e597f08dde51361434a027dc4362a5698220afb6
Change-Id: I387794b0a736ee8419e7d12dc0f586aa30b9ac26
Pau Espin Pedrol at

#20468 (Feb 16, 2026, 5:09:57 AM)

Fixed PDP QoS return length and terminal reconnection issues.

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20467 (Feb 16, 2026, 5:09:53 AM)

Fixed PDP QoS return length and terminal reconnection issues.

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20466 (Feb 16, 2026, 5:09:28 AM)

Fixed PDP QoS return length and terminal reconnection issues.

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20465 (Feb 16, 2026, 5:09:27 AM)

Fixed PDP QoS return length and terminal reconnection issues.

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20464 (Feb 16, 2026, 5:07:09 AM)

Fixed PDP QoS return length and terminal reconnection issues.

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20463 (Feb 16, 2026, 5:07:07 AM)

Fixed PDP QoS return length and terminal reconnection issues.

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20462 (Feb 16, 2026, 5:06:44 AM)

Fixed PDP QoS return length and terminal reconnection issues.

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20461 (Feb 16, 2026, 5:06:42 AM)

Fixed PDP QoS return length and terminal reconnection issues.

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20460 (Feb 13, 2026, 12:59:52 PM)

cp_peer: Implement local originated heartbeat procedure

Submit PFCP Hearbeat Request with configured interval,
and timeout after no PFCP Hearbeat Response received based on
configuration.

Upon timeout, the cp_peer assoc_cb() is called to notify the user that
the peer is considered not associated anymore. It will then try to
keep associating again automatically.

Related: SYS#7294
Change-Id: I7efc0961e1ea39dd7f4cc6ba96be4cf5ce9a2d6c
Pau Espin Pedrol at

#20459 (Feb 13, 2026, 12:59:50 PM)

cp_peer: Implement local originated heartbeat procedure

Submit PFCP Hearbeat Request with configured interval,
and timeout after no PFCP Hearbeat Response received based on
configuration.

Upon timeout, the cp_peer assoc_cb() is called to notify the user that
the peer is considered not associated anymore. It will then try to
keep associating again automatically.

Related: SYS#7294
Change-Id: I7efc0961e1ea39dd7f4cc6ba96be4cf5ce9a2d6c
Pau Espin Pedrol at

#20458 (Feb 13, 2026, 8:52:46 AM)

xua_asp_fsm: Error on ASP UP (ACK) with non-unique ASP Identifier

Following RFC4666:
"""
   The "Invalid ASP Identifier" error is sent by an SGP in response to
   an ASP Up message with an invalid (i.e., non-unique) ASP Identifier
"""

Change-Id: I2d422acaa2f04c7d1eebd92c3185c4f5476a1789
Pau Espin Pedrol at

#20457 (Feb 13, 2026, 8:52:45 AM)

xua_asp_fsm: Remove obvious comments

Those can already be interpretred directly by the ENSURE_* macros.
No need to clog the file with more lines describing stuff.

Change-Id: Idec06646c48fbce4cbe200e88f987dfb3e9d5a39
Pau Espin Pedrol at

#20456 (Feb 13, 2026, 8:52:44 AM)

cosmetic: xua_as_fsm: Fix mixed brace/no-brace blocks in if/else

Change-Id: Ibfd818d354c09409b04b392853f544a220de3a72
Pau Espin Pedrol at

#20455 (Feb 13, 2026, 8:51:54 AM)

Allow configuring local ASP Identifier

If configured, it will be transmitted during ASP UP and ASP UP ACK.
This may be needed if facing an SG/IPSP peer who requires ASP Identifier
to be set.

Related: OS#6953
Change-Id: Ib94d542f940e13d5c007bc3319e7dde65cf81f12
Pau Espin Pedrol at

#20454 (Feb 13, 2026, 8:51:54 AM)

xua_asp_fsm: Validate remote ASP Id matching config in SG role

The node in SG role really doesn't have an ASP Id of its own (it is
never sent over the wire). Hence, use the "asp-identifier <N>" VTY
config in SG role to require the ASP to identify itself with a given
ASP identifier.

Related: OS#6953
Change-Id: I3e22439aa7e22f7a6113b093c44ace6745c808b9
Pau Espin Pedrol at

#20453 (Feb 13, 2026, 8:51:50 AM)

xua_asp_fsm: Remove obvious comments

Those can already be interpretred directly by the ENSURE_* macros.
No need to clog the file with more lines describing stuff.

Change-Id: Idec06646c48fbce4cbe200e88f987dfb3e9d5a39
Pau Espin Pedrol at

#20452 (Feb 13, 2026, 8:51:50 AM)

xua_asp_fsm: Error on ASP UP (ACK) with non-unique ASP Identifier

Following RFC4666:
"""
   The "Invalid ASP Identifier" error is sent by an SGP in response to
   an ASP Up message with an invalid (i.e., non-unique) ASP Identifier
"""

Change-Id: I2d422acaa2f04c7d1eebd92c3185c4f5476a1789
Pau Espin Pedrol at

#20451 (Feb 13, 2026, 8:51:49 AM)

cosmetic: xua_as_fsm: Fix mixed brace/no-brace blocks in if/else

Change-Id: Ibfd818d354c09409b04b392853f544a220de3a72
Pau Espin Pedrol at

#20450 (Feb 13, 2026, 8:51:49 AM)

Allow configuring local ASP Identifier

If configured, it will be transmitted during ASP UP and ASP UP ACK.
This may be needed if facing an SG/IPSP peer who requires ASP Identifier
to be set.

Related: OS#6953
Change-Id: Ib94d542f940e13d5c007bc3319e7dde65cf81f12
Pau Espin Pedrol at

#20449 (Feb 13, 2026, 8:51:48 AM)

xua_asp_fsm: Validate remote ASP Id matching config in SG role

The node in SG role really doesn't have an ASP Id of its own (it is
never sent over the wire). Hence, use the "asp-identifier <N>" VTY
config in SG role to require the ASP to identify itself with a given
ASP identifier.

Related: OS#6953
Change-Id: I3e22439aa7e22f7a6113b093c44ace6745c808b9
Pau Espin Pedrol at

#20448 (Feb 12, 2026, 4:05:45 PM)

xua_asp_fsm: Validate remote ASP Id matching config in SG role

The node in SG role really doesn't have an ASP Id of its own (it is
never sent over the wire). Hence, use the "asp-identifier <N>" VTY
config in SG role to require the ASP to identift itself with a given
ASP identifier.

Related: OS#6953
Change-Id: I3e22439aa7e22f7a6113b093c44ace6745c808b9
Pau Espin Pedrol at

#20447 (Feb 12, 2026, 4:05:45 PM)

xua_asp_fsm: Validate remote ASP Id matching config in SG role

The node in SG role really doesn't have an ASP Id of its own (it is
never sent over the wire). Hence, use the "asp-identifier <N>" VTY
config in SG role to require the ASP to identift itself with a given
ASP identifier.

Related: OS#6953
Change-Id: I3e22439aa7e22f7a6113b093c44ace6745c808b9
Pau Espin Pedrol at

#20446 (Feb 12, 2026, 3:23:57 PM)

cosmetic: xua_as_fsm: Fix mixed brace/no-brace blocks in if/else

Change-Id: Ibfd818d354c09409b04b392853f544a220de3a72
Pau Espin Pedrol at

#20445 (Feb 12, 2026, 3:23:57 PM)

cosmetic: xua_as_fsm: Fix mixed brace/no-brace blocks in if/else

Change-Id: Ibfd818d354c09409b04b392853f544a220de3a72
Pau Espin Pedrol at

#20444 (Feb 12, 2026, 3:22:40 PM)

xua_asp_fsm: Error on ASP UP (ACK) with non-unique ASP Identifier

Following RFC4666:
"""
   The "Invalid ASP Identifier" error is sent by an SGP in response to
   an ASP Up message with an invalid (i.e., non-unique) ASP Identifier
"""

Change-Id: I2d422acaa2f04c7d1eebd92c3185c4f5476a1789
Pau Espin Pedrol at

#20443 (Feb 12, 2026, 3:22:36 PM)

xua_asp_fsm: Error on ASP UP (ACK) with non-unique ASP Identifier

Following RFC4666:
"""
   The "Invalid ASP Identifier" error is sent by an SGP in response to
   an ASP Up message with an invalid (i.e., non-unique) ASP Identifier
"""

Change-Id: I2d422acaa2f04c7d1eebd92c3185c4f5476a1789
Pau Espin Pedrol at

#20442 (Feb 12, 2026, 2:49:20 PM)

xua_asp_fsm: Remove obvious comments

Those can already be interpretred directly by the ENSURE_* macros.
No need to clog the file with more lines describing stuff.

Change-Id: Idec06646c48fbce4cbe200e88f987dfb3e9d5a39
Pau Espin Pedrol at

#20441 (Feb 12, 2026, 2:49:16 PM)

xua_asp_fsm: Remove obvious comments

Those can already be interpretred directly by the ENSURE_* macros.
No need to clog the file with more lines describing stuff.

Change-Id: Idec06646c48fbce4cbe200e88f987dfb3e9d5a39
Pau Espin Pedrol at

#20440 (Feb 12, 2026, 1:26:11 PM)

Allow configuring local ASP Identifier

If configured, it will be transmitted during ASP UP and ASP UP ACK.
This may be needed if facing an SG/IPSP peer who requires ASP Identifier
to be set.

Related: OS#6953
Change-Id: Ib94d542f940e13d5c007bc3319e7dde65cf81f12
Pau Espin Pedrol at

#20439 (Feb 12, 2026, 1:25:55 PM)

Allow configuring local ASP Identifier

If configured, it will be transmitted during ASP UP and ASP UP ACK.
This may be needed if facing an SG/IPSP peer who requires ASP Identifier
to be set.

Related: OS#6953
Change-Id: Ib94d542f940e13d5c007bc3319e7dde65cf81f12
Pau Espin Pedrol at

#20438 (Feb 12, 2026, 12:49:04 PM)

xua_as_fsm: Remove TODO no longer valid

Routing Context is filled in in fill_notify_route_ctx().

Take the chance to move the logging a bit up in the function, to have
all npar filling together.

Change-Id: I57af18dacc0470d36ddd4705a9530bd44b31f9c0
Pau Espin Pedrol at

#20437 (Feb 12, 2026, 12:49:02 PM)

xua_as_fsm: Remove TODO no longer valid

Routing Context is filled in in fill_notify_route_ctx().

Take the chance to move the logging a bit up in the function, to have
all npar filling together.

Change-Id: I57af18dacc0470d36ddd4705a9530bd44b31f9c0
Pau Espin Pedrol at

#20436 (Feb 12, 2026, 11:37:49 AM)

xua_default_lm_fsm: Submit RKM REG REQ for all AS in ASP

So far only thre first rctx (AS) was being registered.
This fixes RKM for ASPs serving multiple AS in ASP/IPSP role.

Relted: OS#6943
Change-Id: I932c1b05dfd37fd7b89adea0d1ea59a5dc6138b4
Pau Espin Pedrol at

#20435 (Feb 12, 2026, 11:37:49 AM)

xua_default_lm_fsm: Submit RKM REG REQ for all AS in ASP

So far only thre first rctx (AS) was being registered.
This fixes RKM for ASPs serving multiple AS in ASP/IPSP role.

Relted: OS#6943
Change-Id: I932c1b05dfd37fd7b89adea0d1ea59a5dc6138b4
Pau Espin Pedrol at

#20434 (Feb 12, 2026, 11:25:19 AM)

ss7_as: Optimize ss7_as_asp_assoc_find()

Look for counterpart on the object with the shortest list, ie. convert
from O(N) to O(min(N,M)).
This way eg. if we have 100 ASPs on 1 AS, lookup time becomes O(1).
Same if we have eg. 1 ASP serving 100 AS.

Change-Id: I139aede15af6b6a77d19e6fcf6b6abe8ed6599a6
Pau Espin Pedrol at

#20433 (Feb 12, 2026, 11:25:19 AM)

asp: Introduce asp->assoc_as_list

This way we can iterate easily/quickly the AS served by a given ASP.
This in turn allows simplifying some code since we cache the amount of
AS served by the ASP at any time, so we save some counting.

Related: SYS#6953
Change-Id: I1ca90748286374109dbb4277cbc7b2337ce2072a
Pau Espin Pedrol at

#20432 (Feb 12, 2026, 11:25:16 AM)

ss7_as: Optimize ss7_as_asp_assoc_find()

Look for counterpart on the object with the shortest list, ie. convert
from O(N) to O(min(N,M)).
This way eg. if we have 100 ASPs on 1 AS, lookup time becomes O(1).
Same if we have eg. 1 ASP serving 100 AS.

Change-Id: I139aede15af6b6a77d19e6fcf6b6abe8ed6599a6
Pau Espin Pedrol at

#20431 (Feb 12, 2026, 11:25:16 AM)

asp: Introduce asp->assoc_as_list

This way we can iterate easily/quickly the AS served by a given ASP.
This in turn allows simplifying some code since we cache the amount of
AS served by the ASP at any time, so we save some counting.

Related: SYS#6953
Change-Id: I1ca90748286374109dbb4277cbc7b2337ce2072a
Pau Espin Pedrol at

#20430 (Feb 12, 2026, 11:06:10 AM)

WIP: asp: Introduce asp->assoc_as_list

Related: SYS#6953
Change-Id: I1ca90748286374109dbb4277cbc7b2337ce2072a
Pau Espin Pedrol at

#20429 (Feb 12, 2026, 11:06:10 AM)

ss7_as: Optimize ss7_as_asp_assoc_find()

Look for counterpart on the object with the shortest list, ie. convert
from O(N) to O(min(N,M)).
This way eg. if we have 100 ASPs on 1 AS, lookup time becomes O(1).
Same if we have eg. 1 ASP serving 100 AS.

Change-Id: I139aede15af6b6a77d19e6fcf6b6abe8ed6599a6
Pau Espin Pedrol at

#20428 (Feb 12, 2026, 11:06:09 AM)

WIP: asp: Introduce asp->assoc_as_list

Related: SYS#6953
Change-Id: I1ca90748286374109dbb4277cbc7b2337ce2072a
Pau Espin Pedrol at

#20427 (Feb 12, 2026, 11:06:09 AM)

ss7_as: Optimize ss7_as_asp_assoc_find()

Look for counterpart on the object with the shortest list, ie. convert
from O(N) to O(min(N,M)).
This way eg. if we have 100 ASPs on 1 AS, lookup time becomes O(1).
Same if we have eg. 1 ASP serving 100 AS.

Change-Id: I139aede15af6b6a77d19e6fcf6b6abe8ed6599a6
Pau Espin Pedrol at

#20426 (Feb 12, 2026, 10:32:42 AM)

Introduce struct osmo_ss7_as_asp_assoc

This new struct allows supporting unlimited number of ASPs per AS.
It can also potentially be used in the future to:
* Hold M3UA "ASP Identifier" per AS<->ASP association
* Speed up iterating over AS served by a given ASP.

NOTE: Having >16 ASPs per AS may not be desirable, for instance under
loadshare traffic mode ITU SLS is 4 bit, so despite having ext_sls
extending the table to 128 entries based on OPC, it may not provide
enough entropy to properly loadshare among all of them.

Related: OS#7519
Change-Id: I149ab467899633ac50cba3e482b2cae02124279d
Pau Espin Pedrol at

#20425 (Feb 12, 2026, 10:32:42 AM)

tests/vty: Introduce testTonsOfASP

Add test to validate tons of ASPs (1000) can be configured, all serving
one given AS.

Related: SYS#7519
Change-Id: I9bfcfcbea3c4cec0e6284ae59d30670fcf3ccac4
Pau Espin Pedrol at

#20424 (Feb 12, 2026, 10:32:41 AM)

ss7_as: Optimize ASP Tx selection in Override traffic mode

Cache the last selected ASP, and expect it to still be the active ASP
most of the time until it changes.

Change-Id: I3d480d23591f4bd216293be60b22389b182fd8f3
Pau Espin Pedrol at

#20423 (Feb 12, 2026, 10:32:39 AM)

tests/vty: Introduce testASPservesTonsOfAS

Change-Id: I39016a479fde7d61b7c0f39ca769cd8c958b55b6
Pau Espin Pedrol at

#20422 (Feb 12, 2026, 10:32:39 AM)

Introduce struct osmo_ss7_as_asp_assoc

This new struct allows supporting unlimited number of ASPs per AS.
It can also potentially be used in the future to:
* Hold M3UA "ASP Identifier" per AS<->ASP association
* Speed up iterating over AS served by a given ASP.

NOTE: Having >16 ASPs per AS may not be desirable, for instance under
loadshare traffic mode ITU SLS is 4 bit, so despite having ext_sls
extending the table to 128 entries based on OPC, it may not provide
enough entropy to properly loadshare among all of them.

Related: OS#7519
Change-Id: I149ab467899633ac50cba3e482b2cae02124279d
Pau Espin Pedrol at

#20421 (Feb 12, 2026, 10:32:38 AM)

ss7_as: Optimize ASP Tx selection in Override traffic mode

Cache the last selected ASP, and expect it to still be the active ASP
most of the time until it changes.

Change-Id: I3d480d23591f4bd216293be60b22389b182fd8f3
Pau Espin Pedrol at

#20420 (Feb 12, 2026, 10:32:38 AM)

tests/vty: Introduce testTonsOfASP

Add test to validate tons of ASPs (1000) can be configured, all serving
one given AS.

Related: SYS#7519
Change-Id: I9bfcfcbea3c4cec0e6284ae59d30670fcf3ccac4
Pau Espin Pedrol at

#20419 (Feb 12, 2026, 10:32:36 AM)

tests/vty: Introduce testASPservesTonsOfAS

Change-Id: I39016a479fde7d61b7c0f39ca769cd8c958b55b6
Pau Espin Pedrol at

#20418 (Feb 11, 2026, 4:36:35 PM)

tests/vty: Introduce testASPservesTonsOfAS

Change-Id: I39016a479fde7d61b7c0f39ca769cd8c958b55b6
Pau Espin Pedrol at

#20417 (Feb 11, 2026, 4:36:35 PM)

tests/vty: Introduce testASPservesTonsOfAS

Change-Id: I39016a479fde7d61b7c0f39ca769cd8c958b55b6
Pau Espin Pedrol at

#20416 (Feb 11, 2026, 4:10:02 PM)

tests/vty: Introduce testTonsOfASP

Add test to validate tons of ASPs (1000) can be configured, all serving
one given AS.

Related: SYS#7519
Change-Id: I9bfcfcbea3c4cec0e6284ae59d30670fcf3ccac4
Pau Espin Pedrol at

#20415 (Feb 11, 2026, 4:10:02 PM)

tests/vty: Introduce testTonsOfASP

Add test to validate tons of ASPs (1000) can be configured, all serving
one given AS.

Related: SYS#7519
Change-Id: I9bfcfcbea3c4cec0e6284ae59d30670fcf3ccac4
Pau Espin Pedrol at

#20414 (Feb 11, 2026, 3:30:42 PM)

ss7_as: Optimize ASP Tx selection in Override traffic mode

Cache the last selected ASP, and expect it to still be the active ASP
most of the time until it changes.

Change-Id: I3d480d23591f4bd216293be60b22389b182fd8f3
Pau Espin Pedrol at

#20413 (Feb 11, 2026, 3:30:42 PM)

ss7_as: Optimize ASP Tx selection in Override traffic mode

Cache the last selected ASP, and expect it to still be the active ASP
most of the time until it changes.

Change-Id: I3d480d23591f4bd216293be60b22389b182fd8f3
Pau Espin Pedrol at

#20412 (Feb 11, 2026, 12:49:02 PM)

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20411 (Feb 11, 2026, 12:48:50 PM)

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20410 (Feb 11, 2026, 12:47:57 PM)

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20409 (Feb 11, 2026, 12:47:51 PM)

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20408 (Feb 11, 2026, 12:46:55 PM)

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20407 (Feb 11, 2026, 12:46:54 PM)

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20406 (Feb 11, 2026, 12:45:44 PM)

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20405 (Feb 11, 2026, 12:45:39 PM)

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20404 (Feb 11, 2026, 5:20:05 AM)

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20403 (Feb 11, 2026, 5:20:04 AM)

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20402 (Feb 10, 2026, 5:09:03 PM)

Introduce struct osmo_ss7_as_asp_assoc

This new struct allows supporting unlimited number of ASPs per AS.
It can also potentially be used in the future to:
* Hold M3UA "ASP Identifier" per AS<->ASP association
* Speed up iterating over AS served by a given ASP.

NOTE: Having >16 ASPs per AS may not be desirable, for instance under
loadshare traffic mode ITU SLS is 4 bit, so despite having ext_sls
extending the table to 128 entries based on OPC, it may not provide
enough entropy to properly loadshare among all of them.

Related: OS#7519
Change-Id: I149ab467899633ac50cba3e482b2cae02124279d
Pau Espin Pedrol at

#20401 (Feb 10, 2026, 5:09:00 PM)

Introduce struct osmo_ss7_as_asp_assoc

This new struct allows supporting unlimited number of ASPs per AS.
It can also potentially be used in the future to:
* Hold M3UA "ASP Identifier" per AS<->ASP association
* Speed up iterating over AS served by a given ASP.

NOTE: Having >16 ASPs per AS may not be desirable, for instance under
loadshare traffic mode ITU SLS is 4 bit, so despite having ext_sls
extending the table to 128 entries based on OPC, it may not provide
enough entropy to properly loadshare among all of them.

Related: OS#7519
Change-Id: I149ab467899633ac50cba3e482b2cae02124279d
Pau Espin Pedrol at

#20400 (Feb 10, 2026, 3:41:35 PM)

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20399 (Feb 10, 2026, 3:41:32 PM)

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.
If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Related: OS#6922
Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20398 (Feb 10, 2026, 3:08:38 PM)

cosmetic: ss7_asp.h: Drop comment no longer valid

Since a while ago, remote asp ID is stored in asp->remote_asp_id.

Fixes: b8fe5e4a1adfb54f265efc81432eab6252e9b04f
Change-Id: I2253b1cb9e24270b9d6b3400d3fa20827c66ad23
Pau Espin Pedrol at

#20397 (Feb 10, 2026, 3:08:38 PM)

cosmetic: ss7_asp.h: Drop comment no longer valid

Since a while ago, remote asp ID is stored in asp->remote_asp_id.

Fixes: b8fe5e4a1adfb54f265efc81432eab6252e9b04f
Change-Id: I2253b1cb9e24270b9d6b3400d3fa20827c66ad23
Pau Espin Pedrol at

#20396 (Feb 10, 2026, 1:01:34 PM)

xua_snm: assert for unexpected condition

The rx DUNA/DAVA/DUPU paths are already guarded at m3ua.c and sua.c to
only call xua_snm_rx_{duna,dava,dupu}() in ASP role. Hence, calling
those functions is expected to always happen in ASP role.

Change-Id: I24bb335a2a856bf1a5ca255f7afbfe103ebcd86f
Pau Espin Pedrol at

#20395 (Feb 10, 2026, 1:01:33 PM)

xua_snm: assert for unexpected condition

The rx DUNA/DAVA/DUPU paths are already guarded at m3ua.c and sua.c to
only call xua_snm_rx_{duna,dava,dupu}() in ASP role. Hence, calling
those functions is expected to always happen in ASP role.

Change-Id: I24bb335a2a856bf1a5ca255f7afbfe103ebcd86f
Pau Espin Pedrol at

#20394 (Feb 10, 2026, 1:01:15 PM)

xua_snm: assert for unexpected condition

The rx DUNA/DAVA/DUPU paths are already guarded at m3ua.c and sua.c to
only call xua_snm_rx_{duna,dava,dupu}() in ASP role. Hence, calling
those functions is expected to always happen in ASP role.

Change-Id: I24bb335a2a856bf1a5ca255f7afbfe103ebcd86f
Pau Espin Pedrol at

#20393 (Feb 10, 2026, 1:01:13 PM)

xua_snm: assert for unexpected condition

The rx DUNA/DAVA/DUPU paths are already guarded at m3ua.c and sua.c to
only call xua_snm_rx_{duna,dava,dupu}() in ASP role. Hence, calling
those functions is expected to always happen in ASP role.

Change-Id: I24bb335a2a856bf1a5ca255f7afbfe103ebcd86f
Pau Espin Pedrol at

#20392 (Feb 10, 2026, 12:47:19 PM)

xua: Improve logging around unexpected snm messages

Log rx of unexpected message type according to configured role.
Decrease verbosity of DAUD logging to match the new logging.

For SUA we can use M3UA's m3ua_snm_msgt_names because the value/strings
are the same and they are actually used through m3ua_msg_class_snm in
xua_dialect_sua.

Change-Id: I697e52dfd733cb9ee260bba133204a7462c4e8ee
Pau Espin Pedrol at

#20391 (Feb 10, 2026, 12:47:19 PM)

xua: Improve logging around unexpected snm messages

Log rx of unexpected message type according to configured role.
Decrease verbosity of DAUD logging to match the new logging.

For SUA we can use M3UA's m3ua_snm_msgt_names because the value/strings
are the same and they are actually used through m3ua_msg_class_snm in
xua_dialect_sua.

Change-Id: I697e52dfd733cb9ee260bba133204a7462c4e8ee
Pau Espin Pedrol at

#20390 (Feb 10, 2026, 12:32:38 PM)

xua: Allow rx DAUD in IPSP with quirk daud_in_asp

That quirk was added back in time most probably when interacting with
some peer who claimed to be in SG mode but actually was in IPSP mode.
Hence, to be on the safe side, be relaxed and allow accepting DAUD also
if the quirk is added, otherwise it may be impossible to continue
communication with that faulty peer.
In theory according to spec DAUD should only be sent ASP->SG.

Change-Id: I8ad0889f4584446f8b01f1255498f57e0cd34012
Pau Espin Pedrol at

#20389 (Feb 10, 2026, 12:32:37 PM)

xua: Allow rx DAUD in IPSP with quirk daud_in_asp

That quirk was added back in time most probably when interacting with
some peer who claimed to be in SG mode but actually was in IPSP mode.
Hence, to be on the safe side, be relaxed and allow accepting DAUD also
if the quirk is added, otherwise it may be impossible to continue
communication with that faulty peer.
In theory according to spec DAUD should only be sent ASP->SG.

Change-Id: I8ad0889f4584446f8b01f1255498f57e0cd34012
Pau Espin Pedrol at

#20388 (Feb 9, 2026, 5:30:59 PM)

sua: Support rx SCON in role=ASP

Change-Id: I1e4146c2cb8fab460d5e810b602c20293272c2e4
Pau Espin Pedrol at

#20387 (Feb 9, 2026, 5:30:58 PM)

sua: Support rx SCON in role=SG

Change-Id: Ide2b4f876ddbdb1bb0bfed11fad6fc13aaf1afda
Pau Espin Pedrol at

#20386 (Feb 9, 2026, 5:30:58 PM)

sua: Support rx SCON in role=IPSP

Change-Id: I3f46b634084c1d71643812828d4f114ab45dffde
Pau Espin Pedrol at

#20385 (Feb 9, 2026, 5:30:53 PM)

sua: Support rx SCON in role=SG

Change-Id: Ide2b4f876ddbdb1bb0bfed11fad6fc13aaf1afda
Pau Espin Pedrol at

#20384 (Feb 9, 2026, 5:30:52 PM)

sua: Support rx SCON in role=ASP

Change-Id: I1e4146c2cb8fab460d5e810b602c20293272c2e4
Pau Espin Pedrol at

#20383 (Feb 9, 2026, 5:30:52 PM)

sua: Support rx SCON in role=IPSP

Change-Id: I3f46b634084c1d71643812828d4f114ab45dffde
Pau Espin Pedrol at

#20382 (Feb 9, 2026, 4:37:17 PM)

xua_aspm_fsm: Remove unneeded workaround submitting XUA_ASP_E_M_ASP_ACTIVE_REQ

Sending that kind of event is up to the layer manager.
Right now, all ASPs (except ipa_aspm_fsm, which don't need that event
because there's no ACTIVATE in IPA) have an associated layer manager
FSM, so that workaround is not needed.

Change-Id: If6c2c5b6ffc4080320aadc550d823abc5d613d6f
Pau Espin Pedrol at

#20381 (Feb 9, 2026, 4:37:15 PM)

xua_aspm_fsm: Remove unneeded workaround submitting XUA_ASP_E_M_ASP_ACTIVE_REQ

Sending that kind of event is up to the layer manager.
Right now, all ASPs (except ipa_aspm_fsm, which don't need that event
because there's no ACTIVATE in IPA) have an associated layer manager
FSM, so that workaround is not needed.

Change-Id: If6c2c5b6ffc4080320aadc550d823abc5d613d6f
Pau Espin Pedrol at

#20380 (Feb 9, 2026, 4:29:17 PM)

xua_as_fsm: Trigger PC (un)availability to upper layers in IPSP

Same as done in ASP. This is specially important in IPSP in order to
trigger availability/unavailability of PCs defined in the SCCP
addressbook.

Change-Id: I0e6015f04ad0647cc151d3c772355a18cb55547a
Pau Espin Pedrol at

#20379 (Feb 9, 2026, 4:29:15 PM)

xua_as_fsm: Trigger PC (un)availability to upper layers in IPSP

Same as done in ASP. This is specially important in IPSP in order to
trigger availability/unavailability of PCs defined in the SCCP
addressbook.

Change-Id: I0e6015f04ad0647cc151d3c772355a18cb55547a
Pau Espin Pedrol at

#20378 (Feb 9, 2026, 2:25:05 PM)

logging: Support nonblocking-io for log target stderr & file, make it default

The nonblocking-io used to be the mode used until recently, where wq
only was used if the write buffer was full.
This is more performant that always waiting for poll() to write, plus
the fact that we write to system synchronously, hence seeing output
immediatelly or not losing it if program crashes.
Furthermore, It turns out using wq in multithreaded programs may cause
problems, so better switch back to using nonblocking-io by default.

Related: OS#6947
Change-Id: I46420f4b174d3a9ed01e993e2e89aea3b46c0dd7
Pau Espin Pedrol at

#20377 (Feb 9, 2026, 2:25:04 PM)

logging: Support nonblocking-io for log target stderr & file, make it default

The nonblocking-io used to be the mode used until recently, where wq
only was used if the write buffer was full.
This is more performant that always waiting for poll() to write, plus
the fact that we write to system synchronously, hence seeing output
immediatelly or not losing it if program crashes.
Furthermore, It turns out using wq in multithreaded programs may cause
problems, so better switch back to using nonblocking-io by default.

Related: OS#6947
Change-Id: I46420f4b174d3a9ed01e993e2e89aea3b46c0dd7
Pau Espin Pedrol at

#20376 (Feb 9, 2026, 2:25:02 PM)

logging: Support nonblocking-io for log target stderr & file, make it default

The nonblocking-io used to be the mode used until recently, where wq
only was used if the write buffer was full.
This is more performant that always waiting for poll() to write, plus
the fact that we write to system synchronously, hence seeing output
immediatelly or not losing it if program crashes.
Furthermore, It turns out using wq in multithreaded programs may cause
problems, so better switch back to using nonblocking-io by default.

Related: OS#6947
Change-Id: I46420f4b174d3a9ed01e993e2e89aea3b46c0dd7
Pau Espin Pedrol at

#20375 (Feb 9, 2026, 1:34:04 PM)

logging: Support nonblocking-io for log target stderr & file, make it default

The nonblocking-io used to be the mode used until recently, where wq
only was used if the write buffer was full.
This is more performant that always waiting for poll() to write, plus
the fact that we write to system synchronously, hence seeing output
immediatelly or not losing it if program crashes.
Furthermore, It turns out using wq in multithreaded programs may cause
problems, so better switch back to using nonblocking-io by default.

Related: OS#6947
Change-Id: I46420f4b174d3a9ed01e993e2e89aea3b46c0dd7
Pau Espin Pedrol at

#20374 (Feb 9, 2026, 1:34:03 PM)

logging: Support nonblocking-io for log target stderr & file, make it default

The nonblocking-io used to be the mode used until recently, where wq
only was used if the write buffer was full.
This is more performant that always waiting for poll() to write, plus
the fact that we write to system synchronously, hence seeing output
immediatelly or not losing it if program crashes.
Furthermore, It turns out using wq in multithreaded programs may cause
problems, so better switch back to using nonblocking-io by default.

Related: OS#6947
Change-Id: I46420f4b174d3a9ed01e993e2e89aea3b46c0dd7
Pau Espin Pedrol at

#20373 (Feb 9, 2026, 1:34:02 PM)

logging: Support nonblocking-io for log target stderr & file, make it default

The nonblocking-io used to be the mode used until recently, where wq
only was used if the write buffer was full.
This is more performant that always waiting for poll() to write, plus
the fact that we write to system synchronously, hence seeing output
immediatelly or not losing it if program crashes.
Furthermore, It turns out using wq in multithreaded programs may cause
problems, so better switch back to using nonblocking-io by default.

Related: OS#6947
Change-Id: I46420f4b174d3a9ed01e993e2e89aea3b46c0dd7
Pau Espin Pedrol at

#20372 (Feb 9, 2026, 1:00:33 PM)

logging: Support nonblocking-io for log target stderr & file, make it default

The nonblocking-io used to be the mode used until recently, where wq
only was used if the write buffer was full.
This is more performant that always waiting for poll() to write, plus
the fact that we write to system synchronously, hence seeing output
immediatelly or not losing it if program crashes.
Furthermore, It turns out using wq in multithreaded programs may cause
problems, so better switch back to using nonblocking-io by default.

Related: OS#6947
Change-Id: I46420f4b174d3a9ed01e993e2e89aea3b46c0dd7
Pau Espin Pedrol at

#20371 (Feb 9, 2026, 1:00:33 PM)

logging: Support nonblocking-io for log target stderr & file, make it default

The nonblocking-io used to be the mode used until recently, where wq
only was used if the write buffer was full.
This is more performant that always waiting for poll() to write, plus
the fact that we write to system synchronously, hence seeing output
immediatelly or not losing it if program crashes.
Furthermore, It turns out using wq in multithreaded programs may cause
problems, so better switch back to using nonblocking-io by default.

Related: OS#6947
Change-Id: I46420f4b174d3a9ed01e993e2e89aea3b46c0dd7
Pau Espin Pedrol at

#20370 (Feb 9, 2026, 1:00:27 PM)

logging: Support nonblocking-io for log target stderr & file, make it default

The nonblocking-io used to be the mode used until recently, where wq
only was used if the write buffer was full.
This is more performant that always waiting for poll() to write, plus
the fact that we write to system synchronously, hence seeing output
immediatelly or not losing it if program crashes.
Furthermore, It turns out using wq in multithreaded programs may cause
problems, so better switch back to using nonblocking-io by default.

Related: OS#6947
Change-Id: I46420f4b174d3a9ed01e993e2e89aea3b46c0dd7
Pau Espin Pedrol at

#20369 (Feb 9, 2026, 12:36:34 PM)

Add CAS channel support

CAS is currently supported by e1d driver only.

Change-Id: I81cc89e01bb4207dc899ab28f24a131f24b61c9c
Andreas Eversberg at

#20368 (Feb 9, 2026, 12:36:31 PM)

Add CAS channel support

CAS is currently supported by e1d driver only.

Change-Id: I81cc89e01bb4207dc899ab28f24a131f24b61c9c
Andreas Eversberg at

#20367 (Feb 9, 2026, 11:58:35 AM)

logging: Fix print tid value in multithreadded programs

Change-Id: I363751ab1368d916aad8905b056ec4f9d62b7175
Pau Espin Pedrol at

#20366 (Feb 9, 2026, 11:58:34 AM)

logging: Fix print tid value in multithreadded programs

Change-Id: I363751ab1368d916aad8905b056ec4f9d62b7175
Pau Espin Pedrol at

#20365 (Feb 9, 2026, 11:58:34 AM)

logging: Fix print tid value in multithreadded programs

Change-Id: I363751ab1368d916aad8905b056ec4f9d62b7175
Pau Espin Pedrol at

#20364 (Feb 9, 2026, 11:36:10 AM)

osmo_io_uring: Split global init from per-thread init

osmo_iofd_init() is expected to be called per-thread, while some code in
osmo_iofd_uring_init() was only expected to be called once.

Change-Id: Ifa5c46d7532ea49869f3cfe7268fdd082906fd10
Pau Espin Pedrol at

#20363 (Feb 9, 2026, 11:36:10 AM)

osmo_io: Lazy-initialize during osmo_iofd_setup()

This way new threads (!=main) don't need to explicitly call
osmo_iofd_init() explicitly before using osmo_io. This is specially
useful for threads using osmo_io indirectly, eg, when logging.

The osmo_iofd_setup() API is really the only main API which requires
initialization. All other APIs requiring it come after osmo_iofd_setup()
since they use an osmo_iofd pointer.

Change-Id: Ia543c1b9d111c929cd9dbed266b6d21b74e47e4b
Pau Espin Pedrol at

#20362 (Feb 9, 2026, 11:36:10 AM)

osmo_io_uring: Split global init from per-thread init

osmo_iofd_init() is expected to be called per-thread, while some code in
osmo_iofd_uring_init() was only expected to be called once.

Change-Id: Ifa5c46d7532ea49869f3cfe7268fdd082906fd10
Pau Espin Pedrol at

#20361 (Feb 9, 2026, 11:36:10 AM)

osmo_io: Lazy-initialize during osmo_iofd_setup()

This way new threads (!=main) don't need to explicitly call
osmo_iofd_init() explicitly before using osmo_io. This is specially
useful for threads using osmo_io indirectly, eg, when logging.

The osmo_iofd_setup() API is really the only main API which requires
initialization. All other APIs requiring it come after osmo_iofd_setup()
since they use an osmo_iofd pointer.

Change-Id: Ia543c1b9d111c929cd9dbed266b6d21b74e47e4b
Pau Espin Pedrol at

#20360 (Feb 9, 2026, 11:36:08 AM)

osmo_io_uring: Split global init from per-thread init

osmo_iofd_init() is expected to be called per-thread, while some code in
osmo_iofd_uring_init() was only expected to be called once.

Change-Id: Ifa5c46d7532ea49869f3cfe7268fdd082906fd10
Pau Espin Pedrol at

#20359 (Feb 9, 2026, 11:36:08 AM)

osmo_io: Lazy-initialize during osmo_iofd_setup()

This way new threads (!=main) don't need to explicitly call
osmo_iofd_init() explicitly before using osmo_io. This is specially
useful for threads using osmo_io indirectly, eg, when logging.

The osmo_iofd_setup() API is really the only main API which requires
initialization. All other APIs requiring it come after osmo_iofd_setup()
since they use an osmo_iofd pointer.

Change-Id: Ia543c1b9d111c929cd9dbed266b6d21b74e47e4b
Pau Espin Pedrol at

#20358 (Feb 9, 2026, 11:04:00 AM)

osmo_io: Move function declaration to internal header

Change-Id: I25ffb94e00225bcdc565f56a3f0f7834df00e974
Pau Espin Pedrol at

#20357 (Feb 9, 2026, 11:03:58 AM)

osmo_io: Move function declaration to internal header

Change-Id: I25ffb94e00225bcdc565f56a3f0f7834df00e974
Pau Espin Pedrol at

#20356 (Feb 9, 2026, 11:03:58 AM)

osmo_io: Move function declaration to internal header

Change-Id: I25ffb94e00225bcdc565f56a3f0f7834df00e974
Pau Espin Pedrol at

#20355 (Feb 7, 2026, 1:55:10 PM)

Add Channel-Associated Signalling (CAS) support

CAS frames are sent and received repeatedly. They consist of 16 frames
(octets) on time slot 16. This is a CAS multiframe. This multiframe
carries 30 individual CAS signaling channels.

Whenever a CAS frames changes, an event (E1DP_EVT_CAS) is forwarded to
the e1d client. The event includes one octet with the CAS information.

The e1d client requests to transmit a new CAS frame by sending a command
(E1DP_CMD_CAS). The command includes one octet with the CAS information.

The e1d client requests to receive current CAS frame of a given time
slot by setting a query flag in the E1DP_CMD_CAS command. This is useful
if the CAS signals changed before the application was started.

The lower 4 bits of each octet in the message represent the signaling
sub-channels: A, B, C and D. They are packed like this: 'xxxxABCD'

To enable cas support on an interface, set line attribute "cas" via VTY.

Change-Id: Ib4f5e6ef02c9b0d1eec2a86d9c48376112805972
Andreas Eversberg at

#20354 (Feb 7, 2026, 1:55:10 PM)

Add Channel-Associated Signalling (CAS) support

CAS frames are sent and received repeatedly. They consist of 16 frames
(octets) on time slot 16. This is a CAS multiframe. This multiframe
carries 30 individual CAS signaling channels.

Whenever a CAS frames changes, an event (E1DP_EVT_CAS) is forwarded to
the e1d client. The event includes one octet with the CAS information.

The e1d client requests to transmit a new CAS frame by sending a command
(E1DP_CMD_CAS). The command includes one octet with the CAS information.

The e1d client requests to receive current CAS frame of a given time
slot by setting a query flag in the E1DP_CMD_CAS command. This is useful
if the CAS signals changed before the application was started.

The lower 4 bits of each octet in the message represent the signaling
sub-channels: A, B, C and D. They are packed like this: 'xxxxABCD'

To enable cas support on an interface, set line attribute "cas" via VTY.

Change-Id: Ib4f5e6ef02c9b0d1eec2a86d9c48376112805972
Andreas Eversberg at

#20353 (Feb 6, 2026, 5:20:35 PM)

xua_default_fsm: Support IPSP role

Change-Id: Id9ad8bbfce5cf15fedcba83034ae383e61d3b3a3
Pau Espin Pedrol at

#20352 (Feb 6, 2026, 5:20:34 PM)

xua_default_fsm: Support IPSP role

Change-Id: Id9ad8bbfce5cf15fedcba83034ae383e61d3b3a3
Pau Espin Pedrol at

#20351 (Feb 6, 2026, 5:15:31 PM)

ss7_asp: remove lm during ASP destroy

Otherwise the xua_default_lm_fsm instance is freed with talloc_free()
instead of osmo_fsm_inst_free().

Change-Id: Iee339b49d4b73a9afde60c4b8f6f5a03ad8a822d
Pau Espin Pedrol at

#20350 (Feb 6, 2026, 5:15:28 PM)

lm: Use layer manager also on transport-role=server

The upper layers (M3UA) should behave similarly eg. on role ASP
independently of transport role being client or server.

Change-Id: I5f0109463323f214e15610b2c4fe253b828fce3b
Pau Espin Pedrol at

#20349 (Feb 6, 2026, 5:14:59 PM)

vty: Prohibit confiruing an IPA ASP as IPSP

We could eventually define how the IPA CCM is expected to behave when in
IPSP role (eg. implementing/allowing both sides of IPA CCM, or assigning
an IPA CCM role based on TCP client/server), but that has not yet been
defined.

IPSP is actually a good candidate for IPA ASPs, since in IPA proto we
don't have SNM messaging either, and it's meant to be used
point-to-point (or through STP by assigning hardocded routes).

Change-Id: I18ad3e9ad4aac7a3d8e84483ba1bf09016520b54
Pau Espin Pedrol at

#20348 (Feb 6, 2026, 5:14:59 PM)

Document osmo_xua_layer_manager prim_cb

Change-Id: I1347c3538435985836ee5fe1d9dd42996e32ff94
Pau Espin Pedrol at

#20347 (Feb 6, 2026, 5:14:57 PM)

vty: Prohibit configuring an ASP as IPSP in an SG node

The spec explicitly prohibits it.

Change-Id: I38bbd9226bad478f8068d02f7a4d7b3711596208
Pau Espin Pedrol at

#20346 (Feb 6, 2026, 5:14:22 PM)

xua_rkm: Adapt RKM code to support IPSP

Related: OS#6474
Change-Id: I9c59d6fb43d4e7ceda552f156dd7761173545b11
Pau Espin Pedrol at

#20345 (Feb 6, 2026, 5:14:20 PM)

lm: Initialize layer manager also on role=SG

Right now the LM will stay in IDLE for role=SG, but it already provides
with an easier logic where all xUA ASPs (no matter their role) have an
associated FSM object, which can be extnded later on.
This way we already valdiate the FSM instance lifecycle wroks as
expected.
It also allows in the future more easily integrating the LM in role
IPSP, where it will need to be extended.

Change-Id: I1f25cf8371ba72d710796e01a9a967d3fafffb99
Pau Espin Pedrol at

#20344 (Feb 6, 2026, 5:14:16 PM)

vty: Allow configuring xua server in ASP mode

The xua server has nothing to do with a node being an ASP or an SG,
it used to allow transport server features (SCTP/TCP server).
One may want to configure an ASP role with a SCTCP server.

Change-Id: I9b07d2c96404b7b86c51fd9c7bab5e52a2343ade
Pau Espin Pedrol at

#20343 (Feb 6, 2026, 5:14:13 PM)

IPSP: don't route any incoming M3UA messages in IPSP case

An IPSP is a point-to-point association, and we must not route any
such messages.

Change-Id: Iad7280619ec5814cda7a179418079048a5955976
Pau Espin Pedrol at

#20342 (Feb 6, 2026, 5:14:12 PM)

xua_asp_fsm: Improvements to support IPSP

Change-Id: Ia268848ee9bb2f97a47ba9be60ecd16fbeb4fb40
Pau Espin Pedrol at

#20341 (Feb 6, 2026, 5:13:59 PM)

IPSP: Allow vty-configuration of IPSP role "ASPs"

We should now have everything in place to support IPSP-SE, let's
accept enabling IPSP role via the VTY.

Change-Id: I0f0fa881471b87a4bb82a0211c6fb6e4c50b48ec
Pau Espin Pedrol at

#20340 (Feb 6, 2026, 5:13:59 PM)

m3ua: Allow rx SCON in IPSP role

Change-Id: I49838219aab912243a761ab9b5167095e363c72b
Pau Espin Pedrol at

#20339 (Feb 6, 2026, 5:13:58 PM)

Move osmo_xlm_sap_down to ss7_asp.c

That's a generic function to interact with the ASP from the LM.
Only some of the primitives are related to RKM.

Change-Id: I9a8d0e0fc1fd193db8dd3901911848ed8564616f
Pau Espin Pedrol at

#20338 (Feb 6, 2026, 5:13:16 PM)

IPSP: Add a comment that it's intentional to drop all M3UA SNM for IPSP

An IPSP doesn't have MTP3 network management.

Change-Id: I7b87bf03964e7e9aac683ad860e511f83a685821
Pau Espin Pedrol at

#20337 (Feb 6, 2026, 5:13:14 PM)

vty: Allow configuring xua timers in ASP mode

non-STP users of the API may also want to configure per-ASP timers, like
the Heartbeat timer.

Change-Id: I3801d10175f42c13e6f7994e1e4da8e7c99e8e16
Pau Espin Pedrol at

#20336 (Feb 6, 2026, 5:13:11 PM)

Refactor xua_layer_manager object

Several changes to improve separation of the LM object and its
lifecycle:
* Store in ss7_asp a pointer to a xua_layer_manager, which contains all
  implementation dependent information inside its priv pointer.
* Add a new free_func field to the xua_layer_manager struct in order to
  be able to free it without knowing how it was allocated.
* Get rid og the loglevel param, LOGL_DEBUG was always passed and that
  was actually an implementation specific detail of the default xua
  layer manager.
* Pass pointer to function to be called by LM to submit primitives to
  M3UA.

Change-Id: Ia96ebf40444f46ad718d61befbecb523f267fd6c
Pau Espin Pedrol at

#20335 (Feb 6, 2026, 5:13:09 PM)

xua_default_fsm: Support IPSP role

Change-Id: Id9ad8bbfce5cf15fedcba83034ae383e61d3b3a3
Pau Espin Pedrol at

#20334 (Feb 6, 2026, 5:13:07 PM)

Move osmo_xua_layer_manager definition to ss7_asp.h

The struct osmo_xua_layer_manager has no relation to a xua_server, hence
move it to ss7_asp.h, where it is used.

Change-Id: If7efb8996de0c407f5a466ff959095c8872ddc76
Pau Espin Pedrol at

#20333 (Feb 6, 2026, 5:12:55 PM)

xua_default_lm_fsm: Move timer_cb further below

As usually done in osmo_fsm implemnetations.

Change-Id: Ibdc04d9ece0b3955da44849755a87ec28c17f140
Pau Espin Pedrol at

#20332 (Feb 6, 2026, 5:12:52 PM)

ss7_asp: remove lm during ASP destroy

Otherwise the xua_default_lm_fsm instance is freed with talloc_free()
instead of osmo_fsm_inst_free().

Change-Id: Iee339b49d4b73a9afde60c4b8f6f5a03ad8a822d
Pau Espin Pedrol at

#20331 (Feb 6, 2026, 5:12:52 PM)

Document osmo_xua_layer_manager prim_cb

Change-Id: I1347c3538435985836ee5fe1d9dd42996e32ff94
Pau Espin Pedrol at

#20330 (Feb 6, 2026, 5:12:11 PM)

Move osmo_xlm_sap_down to ss7_asp.c

That's a generic function to interact with the ASP from the LM.
Only some of the primitives are related to RKM.

Change-Id: I9a8d0e0fc1fd193db8dd3901911848ed8564616f
Pau Espin Pedrol at

#20329 (Feb 6, 2026, 5:11:59 PM)

vty: Prohibit configuring an ASP as IPSP in an SG node

The spec explicitly prohibits it.

Change-Id: I38bbd9226bad478f8068d02f7a4d7b3711596208
Pau Espin Pedrol at

#20328 (Feb 6, 2026, 5:11:57 PM)

lm: Initialize layer manager also on role=SG

Right now the LM will stay in IDLE for role=SG, but it already provides
with an easier logic where all xUA ASPs (no matter their role) have an
associated FSM object, which can be extnded later on.
This way we already valdiate the FSM instance lifecycle wroks as
expected.
It also allows in the future more easily integrating the LM in role
IPSP, where it will need to be extended.

Change-Id: I1f25cf8371ba72d710796e01a9a967d3fafffb99
Pau Espin Pedrol at

#20327 (Feb 6, 2026, 5:11:56 PM)

m3ua: Allow rx SCON in IPSP role

Change-Id: I49838219aab912243a761ab9b5167095e363c72b
Pau Espin Pedrol at

#20326 (Feb 6, 2026, 5:11:52 PM)

xua_rkm: Adapt RKM code to support IPSP

Related: OS#6474
Change-Id: I9c59d6fb43d4e7ceda552f156dd7761173545b11
Pau Espin Pedrol at

#20325 (Feb 6, 2026, 5:11:15 PM)

IPSP: Add a comment that it's intentional to drop all M3UA SNM for IPSP

An IPSP doesn't have MTP3 network management.

Change-Id: I7b87bf03964e7e9aac683ad860e511f83a685821
Pau Espin Pedrol at

#20324 (Feb 6, 2026, 5:10:50 PM)

vty: Prohibit confiruing an IPA ASP as IPSP

We could eventually define how the IPA CCM is expected to behave when in
IPSP role (eg. implementing/allowing both sides of IPA CCM, or assigning
an IPA CCM role based on TCP client/server), but that has not yet been
defined.

IPSP is actually a good candidate for IPA ASPs, since in IPA proto we
don't have SNM messaging either, and it's meant to be used
point-to-point (or through STP by assigning hardocded routes).

Change-Id: I18ad3e9ad4aac7a3d8e84483ba1bf09016520b54
Pau Espin Pedrol at

#20323 (Feb 6, 2026, 5:10:48 PM)

xua_asp_fsm: Improvements to support IPSP

Change-Id: Ia268848ee9bb2f97a47ba9be60ecd16fbeb4fb40
Pau Espin Pedrol at

#20322 (Feb 6, 2026, 5:10:46 PM)

IPSP: don't route any incoming M3UA messages in IPSP case

An IPSP is a point-to-point association, and we must not route any
such messages.

Change-Id: Iad7280619ec5814cda7a179418079048a5955976
Pau Espin Pedrol at

#20321 (Feb 6, 2026, 5:10:43 PM)

xua_default_fsm: Support IPSP role

Change-Id: Id9ad8bbfce5cf15fedcba83034ae383e61d3b3a3
Pau Espin Pedrol at

#20320 (Feb 6, 2026, 5:10:17 PM)

vty: Allow configuring xua timers in ASP mode

non-STP users of the API may also want to configure per-ASP timers, like
the Heartbeat timer.

Change-Id: I3801d10175f42c13e6f7994e1e4da8e7c99e8e16
Pau Espin Pedrol at

#20319 (Feb 6, 2026, 5:09:45 PM)

IPSP: Allow vty-configuration of IPSP role "ASPs"

We should now have everything in place to support IPSP-SE, let's
accept enabling IPSP role via the VTY.

Change-Id: I0f0fa881471b87a4bb82a0211c6fb6e4c50b48ec
Pau Espin Pedrol at

#20318 (Feb 6, 2026, 5:09:42 PM)

Refactor xua_layer_manager object

Several changes to improve separation of the LM object and its
lifecycle:
* Store in ss7_asp a pointer to a xua_layer_manager, which contains all
  implementation dependent information inside its priv pointer.
* Add a new free_func field to the xua_layer_manager struct in order to
  be able to free it without knowing how it was allocated.
* Get rid og the loglevel param, LOGL_DEBUG was always passed and that
  was actually an implementation specific detail of the default xua
  layer manager.
* Pass pointer to function to be called by LM to submit primitives to
  M3UA.

Change-Id: Ia96ebf40444f46ad718d61befbecb523f267fd6c
Pau Espin Pedrol at

#20317 (Feb 6, 2026, 5:09:42 PM)

lm: Use layer manager also on transport-role=server

The upper layers (M3UA) should behave similarly eg. on role ASP
independently of transport role being client or server.

Change-Id: I5f0109463323f214e15610b2c4fe253b828fce3b
Pau Espin Pedrol at

#20316 (Feb 6, 2026, 5:09:42 PM)

vty: Allow configuring xua server in ASP mode

The xua server has nothing to do with a node being an ASP or an SG,
it used to allow transport server features (SCTP/TCP server).
One may want to configure an ASP role with a SCTCP server.

Change-Id: I9b07d2c96404b7b86c51fd9c7bab5e52a2343ade
Pau Espin Pedrol at

#20315 (Feb 6, 2026, 5:09:41 PM)

Move osmo_xua_layer_manager definition to ss7_asp.h

The struct osmo_xua_layer_manager has no relation to a xua_server, hence
move it to ss7_asp.h, where it is used.

Change-Id: If7efb8996de0c407f5a466ff959095c8872ddc76
Pau Espin Pedrol at

#20314 (Feb 6, 2026, 5:09:40 PM)

xua_default_lm_fsm: Move timer_cb further below

As usually done in osmo_fsm implemnetations.

Change-Id: Ibdc04d9ece0b3955da44849755a87ec28c17f140
Pau Espin Pedrol at

#20313 (Feb 6, 2026, 2:35:01 PM)

tcap_as_loadshare: Fix asp selection if no tcap-range was found

Keep doing loadshare round-robin style, but select only active asps that
have tcap enabled in the config.

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

#20312 (Feb 6, 2026, 2:34:59 PM)

tcap_as_loadshare: Fix asp selection if no tcap-range was found

Keep doing loadshare round-robin style, but select only active asps that
have tcap enabled in the config.

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

#20311 (Feb 5, 2026, 4:17:00 PM)

tcap_as_loadshare: Fix asp selection if no tcap-range was found

Keep doing loadshare round-robin style, but select only active asps that
have tcap enabled in the config.

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

#20310 (Feb 5, 2026, 4:17:00 PM)

tcap_as_loadshare: Fix asp selection if no tcap-range was found

Keep doing loadshare round-robin style, but select only active asps that
have tcap enabled in the config.

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

#20309 (Feb 5, 2026, 2:52:49 PM)

power_control: lchan_ms_pwr_ctrl(): always log input values

Depending on the power control interval (P_Con_INTERVAL), the MS power
loop may delay the power control decision for a certain amount of SACCH
block periods.  In this case lchan_ms_pwr_ctrl() returns early and no
logging is printed at all.

Let's always log the input values (reported level, UL measurements)
early in lchan_ms_pwr_ctrl().  This is useful for debugging, and
this is exactly what lchan_bs_pwr_ctrl() does.

Change-Id: I3b8466f062624fc8a2ea6f8220c057d3812f2c35
Vadim Yanitskiy at

#20308 (Feb 5, 2026, 2:52:47 PM)

power_control: lchan_ms_pwr_ctrl(): always log input values

Depending on the power control interval (P_Con_INTERVAL), the MS power
loop may delay the power control decision for a certain amount of SACCH
block periods.  In this case lchan_ms_pwr_ctrl() returns early and no
logging is printed at all.

Let's always log the input values (reported level, UL measurements)
early in lchan_ms_pwr_ctrl().  This is useful for debugging, and
this is exactly what lchan_bs_pwr_ctrl() does.

Change-Id: I3b8466f062624fc8a2ea6f8220c057d3812f2c35
Vadim Yanitskiy at

#20307 (Feb 5, 2026, 2:47:06 PM)

lm: Initialize layer manager also on role=SG

Right now the LM will stay in IDLE for role=SG, but it already provides
with an easier logic where all xUA ASPs (no matter their role) have an
associated FSM object, which can be extnded later on.
This way we already valdiate the FSM instance lifecycle wroks as
expected.
It also allows in the future more easily integrating the LM in role
IPSP, where it will need to be extended.

Change-Id: I1f25cf8371ba72d710796e01a9a967d3fafffb99
Pau Espin Pedrol at

#20306 (Feb 5, 2026, 2:46:34 PM)

lm: Initialize layer manager also on role=SG

Right now the LM will stay in IDLE for role=SG, but it already provides
with an easier logic where all xUA ASPs (no matter their role) have an
associated FSM object, which can be extnded later on.
This way we already valdiate the FSM instance lifecycle wroks as
expected.
It also allows in the future more easily integrating the LM in role
IPSP, where it will need to be extended.

Change-Id: I1f25cf8371ba72d710796e01a9a967d3fafffb99
Pau Espin Pedrol at

#20305 (Feb 5, 2026, 2:45:09 PM)

power_control: lchan_ms_pwr_ctrl(): always log input values

Depending on the power control interval (P_Con_INTERVAL), the MS power
loop may delay the power control decision for a certain amount of SACCH
block periods.  In this case lchan_ms_pwr_ctrl() returns early and no
logging is printed at all.

Let's always log the input values (reported level, UL measurements)
early in lchan_ms_pwr_ctrl().  This is useful for debugging, and
this is exactly what lchan_bs_pwr_ctrl() does.

Change-Id: I3b8466f062624fc8a2ea6f8220c057d3812f2c35
Vadim Yanitskiy at

#20304 (Feb 5, 2026, 2:45:07 PM)

power_control: lchan_ms_pwr_ctrl(): always log input values

Depending on the power control interval (P_Con_INTERVAL), the MS power
loop may delay the power control decision for a certain amount of SACCH
block periods.  In this case lchan_ms_pwr_ctrl() returns early and no
logging is printed at all.

Let's always log the input values (reported level, UL measurements)
early in lchan_ms_pwr_ctrl().  This is useful for debugging, and
this is exactly what lchan_bs_pwr_ctrl() does.

Change-Id: I3b8466f062624fc8a2ea6f8220c057d3812f2c35
Vadim Yanitskiy at

#20303 (Feb 5, 2026, 2:15:02 PM)

xua_default_lm_fsm: Move timer_cb further below

As usually done in osmo_fsm implemnetations.

Change-Id: Ibdc04d9ece0b3955da44849755a87ec28c17f140
Pau Espin Pedrol at

#20302 (Feb 5, 2026, 2:15:02 PM)

lm: Use layer manager also on transport-role=server

The upper layers (M3UA) should behave similarly eg. on role ASP
independently of transport role being client or server.

Change-Id: I5f0109463323f214e15610b2c4fe253b828fce3b
Pau Espin Pedrol at

#20301 (Feb 5, 2026, 2:15:01 PM)

xua_default_lm_fsm: Move timer_cb further below

As usually done in osmo_fsm implemnetations.

Change-Id: Ibdc04d9ece0b3955da44849755a87ec28c17f140
Pau Espin Pedrol at

#20300 (Feb 5, 2026, 2:15:01 PM)

lm: Use layer manager also on transport-role=server

The upper layers (M3UA) should behave similarly eg. on role ASP
independently of transport role being client or server.

Change-Id: I5f0109463323f214e15610b2c4fe253b828fce3b
Pau Espin Pedrol at

#20299 (Feb 5, 2026, 1:04:10 PM)

Refactor xua_layer_manager object

Several changes to improve separation of the LM object and its
lifecycle:
* Store in ss7_asp a pointer to a xua_layer_manager, which contains all
  implementation dependent information inside its priv pointer.
* Add a new free_func field to the xua_layer_manager struct in order to
  be able to free it without knowing how it was allocated.
* Get rid og the loglevel param, LOGL_DEBUG was always passed and that
  was actually an implementation specific detail of the default xua
  layer manager.
* Pass pointer to function to be called by LM to submit primitives to
  M3UA.

Change-Id: Ia96ebf40444f46ad718d61befbecb523f267fd6c
Pau Espin Pedrol at

#20298 (Feb 5, 2026, 1:04:09 PM)

Refactor xua_layer_manager object

Several changes to improve separation of the LM object and its
lifecycle:
* Store in ss7_asp a pointer to a xua_layer_manager, which contains all
  implementation dependent information inside its priv pointer.
* Add a new free_func field to the xua_layer_manager struct in order to
  be able to free it without knowing how it was allocated.
* Get rid og the loglevel param, LOGL_DEBUG was always passed and that
  was actually an implementation specific detail of the default xua
  layer manager.
* Pass pointer to function to be called by LM to submit primitives to
  M3UA.

Change-Id: Ia96ebf40444f46ad718d61befbecb523f267fd6c
Pau Espin Pedrol at

#20297 (Feb 5, 2026, 1:03:04 PM)

Move osmo_xlm_sap_down to ss7_asp.c

That's a generic function to interact with the ASP from the LM.
Only some of the primitives are related to RKM.

Change-Id: I9a8d0e0fc1fd193db8dd3901911848ed8564616f
Pau Espin Pedrol at

#20296 (Feb 5, 2026, 1:03:04 PM)

Move osmo_xlm_sap_down to ss7_asp.c

That's a generic function to interact with the ASP from the LM.
Only some of the primitives are related to RKM.

Change-Id: I9a8d0e0fc1fd193db8dd3901911848ed8564616f
Pau Espin Pedrol at

#20295 (Feb 5, 2026, 12:58:33 PM)

Refactor xua_layer_manager object

Several changes to improve separation of the LM object and its
lifecycle:
* Store in ss7_asp a pointer to a xua_layer_manager, which contains all
  implementation dependent information inside its priv pointer.
* Add a new free_func field to the xua_layer_manager struct in order to
  be able to free it without knowing how it was allocated.
* Get rid og the loglevel param, LOGL_DEBUG was always passed and that
  was actually an implementation specific detail of the default xua
  layer manager.
* Pass pointer to function to be called by LM to submit primitives to
  M3UA.
Change-Id: Ia96ebf40444f46ad718d61befbecb523f267fd6c

Change-Id: I5b101d3afa41712d895815b467eae58f52922476
Pau Espin Pedrol at

#20294 (Feb 5, 2026, 12:58:29 PM)

Refactor xua_layer_manager object

Several changes to improve separation of the LM object and its
lifecycle:
* Store in ss7_asp a pointer to a xua_layer_manager, which contains all
  implementation dependent information inside its priv pointer.
* Add a new free_func field to the xua_layer_manager struct in order to
  be able to free it without knowing how it was allocated.
* Get rid og the loglevel param, LOGL_DEBUG was always passed and that
  was actually an implementation specific detail of the default xua
  layer manager.
* Pass pointer to function to be called by LM to submit primitives to
  M3UA.
Change-Id: Ia96ebf40444f46ad718d61befbecb523f267fd6c

Change-Id: I5b101d3afa41712d895815b467eae58f52922476
Pau Espin Pedrol at

#20293 (Feb 5, 2026, 12:04:30 PM)

vty: Allow configuring xua server in ASP mode

The xua server has nothing to do with a node being an ASP or an SG,
it used to allow transport server features (SCTP/TCP server).
One may want to configure an ASP role with a SCTCP server.

Change-Id: I9b07d2c96404b7b86c51fd9c7bab5e52a2343ade
Pau Espin Pedrol at

#20292 (Feb 5, 2026, 12:03:59 PM)

Refactor xua_layer_manager object

Several changes to improve separation of the LM object and its
lifecycle:
* Store in ss7_asp a pointer to a xua_layer_manager, which contains all
  implementation dependent information inside its priv pointer.
* Add a new free_func field to the xua_layer_manager struct in order to
  be able to free it without knowing how it was allocated.
* Get rid og the loglevel param, LOGL_DEBUG was always passed and that
  was actually an implementation specific detail of the default xua
  layer manager.
* get rid of struct lm_fsm_priv, it's not needed since it acutally only
  contain an asp pointer which can be passed directly as fi->priv.

Change-Id: Ia96ebf40444f46ad718d61befbecb523f267fd6c
Pau Espin Pedrol at

#20291 (Feb 5, 2026, 12:03:57 PM)

Document osmo_xua_layer_manager prim_cb

Change-Id: I1347c3538435985836ee5fe1d9dd42996e32ff94
Pau Espin Pedrol at

#20290 (Feb 5, 2026, 12:03:57 PM)

vty: Allow configuring xua timers in ASP mode

non-STP users of the API may also want to configure per-ASP timers, like
the Heartbeat timer.

Change-Id: I3801d10175f42c13e6f7994e1e4da8e7c99e8e16
Pau Espin Pedrol at

#20289 (Feb 5, 2026, 12:03:56 PM)

ss7_asp: remove lm during ASP destroy

Otherwise the xua_default_lm_fsm instance is freed with talloc_free()
instead of osmo_fsm_inst_free().

Change-Id: Iee339b49d4b73a9afde60c4b8f6f5a03ad8a822d
Pau Espin Pedrol at

#20288 (Feb 5, 2026, 12:03:55 PM)

Move osmo_xua_layer_manager definition to ss7_asp.h

The struct osmo_xua_layer_manager has no relation to a xua_server, hence
move it to ss7_asp.h, where it is used.

Change-Id: If7efb8996de0c407f5a466ff959095c8872ddc76
Pau Espin Pedrol at

#20287 (Feb 5, 2026, 12:03:55 PM)

Refactor xua_layer_manager object

Several changes to improve separation of the LM object and its
lifecycle:
* Store in ss7_asp a pointer to a xua_layer_manager, which contains all
  implementation dependent information inside its priv pointer.
* Add a new free_func field to the xua_layer_manager struct in order to
  be able to free it without knowing how it was allocated.
* Get rid og the loglevel param, LOGL_DEBUG was always passed and that
  was actually an implementation specific detail of the default xua
  layer manager.
* get rid of struct lm_fsm_priv, it's not needed since it acutally only
  contain an asp pointer which can be passed directly as fi->priv.

Change-Id: Ia96ebf40444f46ad718d61befbecb523f267fd6c
Pau Espin Pedrol at

#20286 (Feb 5, 2026, 12:03:54 PM)

ss7_asp: remove lm during ASP destroy

Otherwise the xua_default_lm_fsm instance is freed with talloc_free()
instead of osmo_fsm_inst_free().

Change-Id: Iee339b49d4b73a9afde60c4b8f6f5a03ad8a822d
Pau Espin Pedrol at

#20285 (Feb 5, 2026, 12:03:54 PM)

Document osmo_xua_layer_manager prim_cb

Change-Id: I1347c3538435985836ee5fe1d9dd42996e32ff94
Pau Espin Pedrol at

#20284 (Feb 5, 2026, 12:03:52 PM)

vty: Allow configuring xua server in ASP mode

The xua server has nothing to do with a node being an ASP or an SG,
it used to allow transport server features (SCTP/TCP server).
One may want to configure an ASP role with a SCTCP server.

Change-Id: I9b07d2c96404b7b86c51fd9c7bab5e52a2343ade
Pau Espin Pedrol at

#20283 (Feb 5, 2026, 12:03:52 PM)

vty: Allow configuring xua timers in ASP mode

non-STP users of the API may also want to configure per-ASP timers, like
the Heartbeat timer.

Change-Id: I3801d10175f42c13e6f7994e1e4da8e7c99e8e16
Pau Espin Pedrol at

#20282 (Feb 5, 2026, 12:03:50 PM)

Move osmo_xua_layer_manager definition to ss7_asp.h

The struct osmo_xua_layer_manager has no relation to a xua_server, hence
move it to ss7_asp.h, where it is used.

Change-Id: If7efb8996de0c407f5a466ff959095c8872ddc76
Pau Espin Pedrol at

#20281 (Feb 4, 2026, 3:20:40 PM)

Related: OS#6922

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.  If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20280 (Feb 4, 2026, 3:20:38 PM)

Related: OS#6922

Some older modules, such as the Air20X module, may crash during PDP attachment due to excessively long QoS response packets.  If the PDP is not released after successful attachment, the module will restart, and subsequent TCP connections will fail.

Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
canghaiwuhen at

#20279 (Feb 4, 2026, 1:26:11 PM)

vty: Allow configuring xua timers in ASP mode

non-STP users of the API may also want to configure per-ASP timers, like
the Heartbeat timer.

Change-Id: I3801d10175f42c13e6f7994e1e4da8e7c99e8e16
Pau Espin Pedrol at

#20278 (Feb 4, 2026, 1:26:09 PM)

vty: Allow configuring xua server in ASP mode

The xua server has nothing to do with a node being an ASP or an SG,
it used to allow transport server features (SCTP/TCP server).
One may want to configure an ASP role with a SCTCP server.

Change-Id: I9b07d2c96404b7b86c51fd9c7bab5e52a2343ade
Pau Espin Pedrol at

#20277 (Feb 4, 2026, 1:26:04 PM)

vty: Allow configuring xua timers in ASP mode

non-STP users of the API may also want to configure per-ASP timers, like
the Heartbeat timer.

Change-Id: I3801d10175f42c13e6f7994e1e4da8e7c99e8e16
Pau Espin Pedrol at

#20276 (Feb 4, 2026, 1:25:49 PM)

vty: Allow configuring xua server in ASP mode

The xua server has nothing to do with a node being an ASP or an SG,
it used to allow transport server features (SCTP/TCP server).
One may want to configure an ASP role with a SCTCP server.

Change-Id: I9b07d2c96404b7b86c51fd9c7bab5e52a2343ade
Pau Espin Pedrol at

#20275 (Feb 4, 2026, 12:50:28 PM)

osmo-bts-trx: apply 'max-initial' value before POWERON

Not applying this value before powering the transceiver on results
in transmission at full Tx power for a certain amount of time before
the power ramping begins.

Change-Id: Iff03d4dcb74f67629a59c8d6f8bb60929d9f6ddd
Related: OS#6939
Vadim Yanitskiy at

#20274 (Feb 4, 2026, 12:50:28 PM)

osmo-bts-trx: apply 'max-initial' value before POWERON

Not applying this value before powering the transceiver on results
in transmission at full Tx power for a certain amount of time before
the power ramping begins.

Change-Id: Iff03d4dcb74f67629a59c8d6f8bb60929d9f6ddd
Related: OS#6939
Vadim Yanitskiy at

#20273 (Feb 4, 2026, 12:31:28 PM)

osmo-bts-trx: trx_provision_fsm: mark internal functions as static

Change-Id: I0cf13e091938db2b991156189bf4ff7c523e24da
Vadim Yanitskiy at

#20272 (Feb 4, 2026, 12:31:24 PM)

osmo-bts-trx: apply 'max-initial' value before POWERON

Not applying this value before powering the transceiver on results
in transmission at full Tx power for a certain amount of time before
the power ramping begins.

Change-Id: Iff03d4dcb74f67629a59c8d6f8bb60929d9f6ddd
Related: OS#6939
Vadim Yanitskiy at

#20271 (Feb 4, 2026, 12:31:24 PM)

osmo-bts-trx: trx_provision_fsm: do not send *_CNF events on failure

The trx_provision_fsm currently does not check the event data (rc),
causing failed operations (rc != 0) to be treated as successful
confirmations.  Avoid emitting *_CNF events when a command fails,
ensuring that only successful operations generate confirmation events.

Change-Id: Id85fb19c6621f55a9c46882df24bec534864a9dc
Vadim Yanitskiy at

#20270 (Feb 4, 2026, 12:31:24 PM)

osmo-bts-trx: trx_provision_fsm: mark internal functions as static

Change-Id: I0cf13e091938db2b991156189bf4ff7c523e24da
Vadim Yanitskiy at

#20269 (Feb 4, 2026, 12:31:23 PM)

osmo-bts-trx: apply 'max-initial' value before POWERON

Not applying this value before powering the transceiver on results
in transmission at full Tx power for a certain amount of time before
the power ramping begins.

Change-Id: Iff03d4dcb74f67629a59c8d6f8bb60929d9f6ddd
Related: OS#6939
Vadim Yanitskiy at

#20268 (Feb 4, 2026, 12:31:22 PM)

osmo-bts-trx: trx_provision_fsm: do not send *_CNF events on failure

The trx_provision_fsm currently does not check the event data (rc),
causing failed operations (rc != 0) to be treated as successful
confirmations.  Avoid emitting *_CNF events when a command fails,
ensuring that only successful operations generate confirmation events.

Change-Id: Id85fb19c6621f55a9c46882df24bec534864a9dc
Vadim Yanitskiy at

#20267 (Feb 4, 2026, 12:04:29 PM)

cosmetic: xua_rkm: Improve description of adding ASP to AS

Change-Id: I57c6a810e081b0968cf2dc24357214a4cebe533b
Pau Espin Pedrol at

#20266 (Feb 4, 2026, 12:04:28 PM)

cosmetic: xua_rkm: Improve description of adding ASP to AS

Change-Id: I57c6a810e081b0968cf2dc24357214a4cebe533b
Pau Espin Pedrol at

#20265 (Feb 4, 2026, 12:03:08 PM)

cosmetic: xua_rkm: Improve description of adding ASP to AS

Change-Id: I57c6a810e081b0968cf2dc24357214a4cebe533b
Pau Espin Pedrol at

#20264 (Feb 4, 2026, 12:03:08 PM)

cosmetic: xua_rkm: Improve description of adding ASP to AS

Change-Id: I57c6a810e081b0968cf2dc24357214a4cebe533b
Pau Espin Pedrol at

#20263 (Feb 4, 2026, 11:37:28 AM)

tcap: Log vty msg in CS7_ROLE_SG

This code was placed in the wrong section, since tcap features can only
be enabled in SG mode (STP).

Change-Id: I77cf19bdc8fa29dd4a28773ac0f954850cd76e1b
Pau Espin Pedrol at

#20262 (Feb 4, 2026, 11:37:28 AM)

tcap: Log vty msg in CS7_ROLE_SG

This code was placed in the wrong section, since tcap features can only
be enabled in SG mode (STP).

Change-Id: I77cf19bdc8fa29dd4a28773ac0f954850cd76e1b
Pau Espin Pedrol at

#20261 (Feb 4, 2026, 11:31:38 AM)

cosmetic: Fix typo in comment

Change-Id: If5adb80baaae78cae7164e1f85c53195eafa6e3e
Pau Espin Pedrol at

#20260 (Feb 4, 2026, 11:31:34 AM)

cosmetic: Fix typo in comment

Change-Id: If5adb80baaae78cae7164e1f85c53195eafa6e3e
Pau Espin Pedrol at

#20259 (Feb 4, 2026, 11:15:05 AM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#20258 (Feb 4, 2026, 11:15:05 AM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#20257 (Feb 4, 2026, 11:15:03 AM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#20256 (Feb 4, 2026, 9:44:23 AM)

xua_rkm: Add checks for ASP role in rx msg path

Change-Id: I672060c24571586b37102c7f7f60e4b0e20e07a9
Pau Espin Pedrol at

#20255 (Feb 4, 2026, 9:44:22 AM)

xua_rkm: Add checks for ASP role in rx msg path

Change-Id: I672060c24571586b37102c7f7f60e4b0e20e07a9
Pau Espin Pedrol at

#20254 (Feb 4, 2026, 9:43:17 AM)

xua_rkm: Add checks for ASP role in rx msg path

Change-Id: I672060c24571586b37102c7f7f60e4b0e20e07a9
Pau Espin Pedrol at

#20253 (Feb 4, 2026, 9:43:12 AM)

xua_rkm: Add checks for ASP role in rx msg path

Change-Id: I672060c24571586b37102c7f7f60e4b0e20e07a9
Pau Espin Pedrol at

#20252 (Feb 4, 2026, 8:41:11 AM)

xua_asp_fsm: Remove duplicated role field

The role is actually taken from the asp object, and it's not expected to
change during its lifetime, so there's no really a need to keep a copy
of it. Simplify the code by using the asp role everywhere.

Change-Id: Ia6de131ce50f07261736645fe5b2ed1ad39eb01b
Pau Espin Pedrol at

#20251 (Feb 4, 2026, 8:41:10 AM)

xua_asp_fsm: Remove duplicated role field

The role is actually taken from the asp object, and it's not expected to
change during its lifetime, so there's no really a need to keep a copy
of it. Simplify the code by using the asp role everywhere.

Change-Id: Ia6de131ce50f07261736645fe5b2ed1ad39eb01b
Pau Espin Pedrol at

#20250 (Feb 4, 2026, 7:20:25 AM)

Fix typos

Change-Id: I107154f0cc7c240ea143397a5f7b655cc48ee9b8
matan1008 at

#20249 (Feb 4, 2026, 7:20:24 AM)

smscb_peer_fsm: Replace printf with debug log

Change-Id: I026da3797a025d79f500f742e97139fbc5bbbcad
matan1008 at

#20248 (Feb 4, 2026, 7:20:19 AM)

sbcap: Remove duplicated cli connection destroy

Change-Id: I8809738955fb90e546b2adb8bb0722b15f464d26
matan1008 at

#20247 (Feb 4, 2026, 7:20:18 AM)

Fix typos

Change-Id: I107154f0cc7c240ea143397a5f7b655cc48ee9b8
matan1008 at

#20246 (Feb 4, 2026, 7:20:18 AM)

sbcap: Remove duplicated cli connection destroy

Change-Id: I8809738955fb90e546b2adb8bb0722b15f464d26
matan1008 at

#20245 (Feb 4, 2026, 7:20:18 AM)

smscb_peer_fsm: Replace printf with debug log

Change-Id: I026da3797a025d79f500f742e97139fbc5bbbcad
matan1008 at

#20244 (Feb 3, 2026, 9:23:26 PM)

doc: fix default 'max-initial' value

The default value is set in gsm_bts_trx_alloc() and it's actually 0.

Change-Id: I178e0664f6818d0eda15701b57bb030916b06006
Vadim Yanitskiy at

#20243 (Feb 3, 2026, 9:23:26 PM)

osmo-bts-trx: add missing \n to a logging message

Change-Id: I5b3091b5ed96e28ae056272398c5eddbdef4b8b5
Vadim Yanitskiy at

#20242 (Feb 3, 2026, 9:23:24 PM)

osmo-bts-trx: apply 'max-initial' value before POWERON

Not applying this value before powering the transceiver on results
in transmission at full Tx power for a certain amount of time before
the power ramping begins.

Change-Id: Iff03d4dcb74f67629a59c8d6f8bb60929d9f6ddd
Related: OS#6939
Vadim Yanitskiy at

#20241 (Feb 3, 2026, 9:23:20 PM)

osmo-bts-trx: add missing \n to a logging message

Change-Id: I5b3091b5ed96e28ae056272398c5eddbdef4b8b5
Vadim Yanitskiy at

#20240 (Feb 3, 2026, 9:23:20 PM)

doc: fix default 'max-initial' value

The default value is set in gsm_bts_trx_alloc() and it's actually 0.

Change-Id: I178e0664f6818d0eda15701b57bb030916b06006
Vadim Yanitskiy at

#20239 (Feb 3, 2026, 9:23:19 PM)

osmo-bts-trx: apply 'max-initial' value before POWERON

Not applying this value before powering the transceiver on results
in transmission at full Tx power for a certain amount of time before
the power ramping begins.

Change-Id: Iff03d4dcb74f67629a59c8d6f8bb60929d9f6ddd
Related: OS#6939
Vadim Yanitskiy at

#20238 (Feb 3, 2026, 7:19:19 PM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#20237 (Feb 3, 2026, 7:19:19 PM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#20236 (Feb 3, 2026, 7:19:14 PM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#20235 (Feb 3, 2026, 4:44:54 PM)

cosmetic: xua_as_fsm.c: Improve spec documentation

The specific spec paragraph talks about "Alternate ASP_Active"
scenario in quotes, which I could find right away by grepping
in the code. Improve the documentation so it can be easily matched in
code.

Change-Id: I79f5123d87dab79620657c2a2ebfd9fe22f178c3
Pau Espin Pedrol at

#20234 (Feb 3, 2026, 4:44:52 PM)

cosmetic: xua_as_fsm.c: Improve spec documentation

The specific spec paragraph talks about "Alternate ASP_Active"
scenario in quotes, which I could find right away by grepping
in the code. Improve the documentation so it can be easily matched in
code.

Change-Id: I79f5123d87dab79620657c2a2ebfd9fe22f178c3
Pau Espin Pedrol at

#20233 (Feb 3, 2026, 4:43:26 PM)

vty: Prohibit configuring an ASP as IPSP in an SG node

The spec explicitly prohibits it.

Change-Id: I38bbd9226bad478f8068d02f7a4d7b3711596208
Pau Espin Pedrol at

#20232 (Feb 3, 2026, 4:43:25 PM)

cosmetic: xua_as_fsm.c: Improve spec documentation

The specific spec paragraph talks about "Alternate ASP_Active"
scenario in quotes, which I could find right away by grepping
in the code. Improve the documentation so it can be easily matched in
code.

Change-Id: I79f5123d87dab79620657c2a2ebfd9fe22f178c3
Pau Espin Pedrol at

#20231 (Feb 3, 2026, 4:43:24 PM)

IPSP: Allow vty-configuration of IPSP role "ASPs"

We should now have everything in place to support IPSP-SE, let's
accept enabling IPSP role via the VTY.

Change-Id: I0f0fa881471b87a4bb82a0211c6fb6e4c50b48ec
Pau Espin Pedrol at

#20230 (Feb 3, 2026, 4:42:33 PM)

m3ua: Allow rx SCON in IPSP role

Change-Id: I49838219aab912243a761ab9b5167095e363c72b
Pau Espin Pedrol at

#20229 (Feb 3, 2026, 4:42:23 PM)

IPSP: don't route any incoming M3UA messages in IPSP case

An IPSP is a point-to-point association, and we must not route any
such messages.

Change-Id: Iad7280619ec5814cda7a179418079048a5955976
Pau Espin Pedrol at

#20228 (Feb 3, 2026, 4:42:22 PM)

IPSP: Add a comment that it's intentional to drop all M3UA SNM for IPSP

An IPSP doesn't have MTP3 network management.

Change-Id: I7b87bf03964e7e9aac683ad860e511f83a685821
Pau Espin Pedrol at

#20227 (Feb 3, 2026, 4:42:20 PM)

vty: Prohibit configuring an ASP as IPSP in an SG node

The spec explicitly prohibits it.

Change-Id: I38bbd9226bad478f8068d02f7a4d7b3711596208
Pau Espin Pedrol at

#20226 (Feb 3, 2026, 4:42:20 PM)

IPSP: Allow vty-configuration of IPSP role "ASPs"

We should now have everything in place to support IPSP-SE, let's
accept enabling IPSP role via the VTY.

Change-Id: I0f0fa881471b87a4bb82a0211c6fb6e4c50b48ec
Pau Espin Pedrol at

#20225 (Feb 3, 2026, 4:42:20 PM)

cosmetic: xua_as_fsm.c: Improve spec documentation

The specific spec paragraph talks about "Alternate ASP_Active"
scenario in quotes, which I could find right away by grepping
in the code. Improve the documentation so it can be easily matched in
code.

Change-Id: I79f5123d87dab79620657c2a2ebfd9fe22f178c3
Pau Espin Pedrol at

#20224 (Feb 3, 2026, 4:42:20 PM)

m3ua: Allow rx SCON in IPSP role

Change-Id: I49838219aab912243a761ab9b5167095e363c72b
Pau Espin Pedrol at

#20223 (Feb 3, 2026, 4:42:19 PM)

IPSP: don't route any incoming M3UA messages in IPSP case

An IPSP is a point-to-point association, and we must not route any
such messages.

Change-Id: Iad7280619ec5814cda7a179418079048a5955976
Pau Espin Pedrol at

#20222 (Feb 3, 2026, 4:42:19 PM)

IPSP: Add a comment that it's intentional to drop all M3UA SNM for IPSP

An IPSP doesn't have MTP3 network management.

Change-Id: I7b87bf03964e7e9aac683ad860e511f83a685821
Pau Espin Pedrol at

#20221 (Feb 3, 2026, 10:33:53 AM)

osmo-hlr: Force log stderr blocking-io in --db-check mode

When --db-check is used, osmo-hlr actually becomes a synchronous
non-interactive program instead of a daemon.
In that case, we want to use blocking-io since it doesn't use the event
loop, so we want to flush all logging synchronously before exiting.

Usually the user will pass the same osmo-hlr.cfg when running with
--db-check, which means most probably won't be using blocking-io (as
expected when osmo-hlr runs in daemon mode).
Since --db-check converts osmo-hlr to a cmdline which exits after checks
are done, we actually want to force blocking-io in that case, so that
all content is written to stderr before finishing the process.

Change-Id: If5e505383086cc55d724c0d6891756c8d94fa267
Pau Espin Pedrol at

#20220 (Feb 3, 2026, 10:33:53 AM)

osmo-hlr: Force log stderr blocking-io in --db-check mode

When --db-check is used, osmo-hlr actually becomes a synchronous
non-interactive program instead of a daemon.
In that case, we want to use blocking-io since it doesn't use the event
loop, so we want to flush all logging synchronously before exiting.

Usually the user will pass the same osmo-hlr.cfg when running with
--db-check, which means most probably won't be using blocking-io (as
expected when osmo-hlr runs in daemon mode).
Since --db-check converts osmo-hlr to a cmdline which exits after checks
are done, we actually want to force blocking-io in that case, so that
all content is written to stderr before finishing the process.

Change-Id: If5e505383086cc55d724c0d6891756c8d94fa267
Pau Espin Pedrol at

#20219 (Feb 3, 2026, 10:30:48 AM)

osmo-hlr: Force log stderr blocking-io in --db-check mode

When --db-check is used, osmo-hlr actually becomes a synchronous
non-interactive program instead of a daemon.
In that case, we want to use blocking-io since it doesn't use the event
loop, so we want to flush all logging synchronously before exiting.

Usually the user will pass the same osmo-hlr.cfg when running with
--db-check, which means most probably won't be using blocking-io (as
expected when osmo-hlr runs in daemon mode).
Since --db-check converts osmo-hlr to a cmdline which exits after checks
are done, we actually want to force blocking-io in that case, so that
all content is written to stderr before finishing the process.

Change-Id: If5e505383086cc55d724c0d6891756c8d94fa267
Pau Espin Pedrol at

#20218 (Feb 3, 2026, 10:30:47 AM)

osmo-hlr: Force log stderr blocking-io in --db-check mode

When --db-check is used, osmo-hlr actually becomes a synchronous
non-interactive program instead of a daemon.
In that case, we want to use blocking-io since it doesn't use the event
loop, so we want to flush all logging synchronously before exiting.

Usually the user will pass the same osmo-hlr.cfg when running with
--db-check, which means most probably won't be using blocking-io (as
expected when osmo-hlr runs in daemon mode).
Since --db-check converts osmo-hlr to a cmdline which exits after checks
are done, we actually want to force blocking-io in that case, so that
all content is written to stderr before finishing the process.

Change-Id: If5e505383086cc55d724c0d6891756c8d94fa267
Pau Espin Pedrol at

#20217 (Feb 3, 2026, 10:19:55 AM)

tests/db_upgrade: Use log stderr blocking-io

When --db-check is used, osmo-hlr actually becomes a synchronous
non-interactive program instead of a daemon.
In that case, we want to use blocking-io since it doesn't use the event
loop, so we want to flush all logging synchrnously before exiting.

Change-Id: Ic81eacbcc0432b81debc52c49fddc668c7a062b3
Pau Espin Pedrol at

#20216 (Feb 3, 2026, 10:19:54 AM)

tests/db_upgrade: Use log stderr blocking-io

When --db-check is used, osmo-hlr actually becomes a synchronous
non-interactive program instead of a daemon.
In that case, we want to use blocking-io since it doesn't use the event
loop, so we want to flush all logging synchrnously before exiting.

Change-Id: Ic81eacbcc0432b81debc52c49fddc668c7a062b3
Pau Espin Pedrol at

#20215 (Feb 3, 2026, 10:12:43 AM)

tests/db_upgrade: Use log stderr blocking-io

When --db-check is used, osmo-hlr actually becomes a synchronous
non-interactive program instead of a daemon.
In that case, we want to use blocking-io since it doesn't use the event
loop, so we want to flush all logging synchrnously before exiting.

Change-Id: Ic81eacbcc0432b81debc52c49fddc668c7a062b3
Pau Espin Pedrol at

#20214 (Feb 3, 2026, 10:12:43 AM)

osmo-hlr: Force log stderr blocking-io in --db-check mode

When --db-check is used, osmo-hlr actually becomes a synchronous
non-interactive program instead of a daemon.
In that case, we want to use blocking-io since it doesn't use the event
loop, so we want to flush all logging synchronously before exiting.

Usually the user will pass the same osmo-hlr.cfg when running with
--db-check, which means most probably won't be using blocking-io (as
expected when osmo-hlr runs in daemon mode).
Since --db-check converts osmo-hlr to a cmdline which exits after checks
are done, we actually want to force blocking-io in that case, so that
all content is written to stderr before finishing the process.

Change-Id: If5e505383086cc55d724c0d6891756c8d94fa267
Pau Espin Pedrol at

#20213 (Feb 3, 2026, 10:12:39 AM)

tests/db_upgrade: Use log stderr blocking-io

When --db-check is used, osmo-hlr actually becomes a synchronous
non-interactive program instead of a daemon.
In that case, we want to use blocking-io since it doesn't use the event
loop, so we want to flush all logging synchrnously before exiting.

Change-Id: Ic81eacbcc0432b81debc52c49fddc668c7a062b3
Pau Espin Pedrol at

#20212 (Feb 3, 2026, 10:12:39 AM)

osmo-hlr: Force log stderr blocking-io in --db-check mode

When --db-check is used, osmo-hlr actually becomes a synchronous
non-interactive program instead of a daemon.
In that case, we want to use blocking-io since it doesn't use the event
loop, so we want to flush all logging synchronously before exiting.

Usually the user will pass the same osmo-hlr.cfg when running with
--db-check, which means most probably won't be using blocking-io (as
expected when osmo-hlr runs in daemon mode).
Since --db-check converts osmo-hlr to a cmdline which exits after checks
are done, we actually want to force blocking-io in that case, so that
all content is written to stderr before finishing the process.

Change-Id: If5e505383086cc55d724c0d6891756c8d94fa267
Pau Espin Pedrol at

#20211 (Feb 3, 2026, 6:28:47 AM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#20210 (Feb 3, 2026, 6:28:47 AM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#20209 (Feb 3, 2026, 6:28:45 AM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#20208 (Feb 2, 2026, 4:41:44 PM)

server: wr_file: Request up to 8 iofd write buffers if available

Writing to disk is usually slower than handling network traffic, so it's
a desirable to increase write buffers to try to submit our write queue
to the kernel/VFS as fast as possible, to avoid it growing too much.
This should also improve CPU use at the expense of some dozen KBs of
extra use, which in the server should be plenty available.

Depends: libosmocore.git 378cf564c8859311415aa70adeb220cedbe56eb3
Change-Id: I167e5f9b7f9d5693b3df05f713288c741031c532
Pau Espin Pedrol at

#20207 (Feb 2, 2026, 4:41:42 PM)

server: wr_file: Request up to 8 iofd write buffers if available

Writing to disk is usually slower than handling network traffic, so it's
a desirable to increase write buffers to try to submit our write queue
to the kernel/VFS as fast as possible, to avoid it growing too much.
This should also improve CPU use at the expense of some dozen KBs of
extra use, which in the server should be plenty available.

Depends: libosmocore.git 378cf564c8859311415aa70adeb220cedbe56eb3
Change-Id: I167e5f9b7f9d5693b3df05f713288c741031c532
Pau Espin Pedrol at

#20206 (Feb 2, 2026, 4:41:42 PM)

server: wr_file: Request up to 8 iofd write buffers if available

Writing to disk is usually slower than handling network traffic, so it's
a desirable to increase write buffers to try to submit our write queue
to the kernel/VFS as fast as possible, to avoid it growing too much.
This should also improve CPU use at the expense of some dozen KBs of
extra use, which in the server should be plenty available.

Depends: libosmocore.git 378cf564c8859311415aa70adeb220cedbe56eb3
Change-Id: I167e5f9b7f9d5693b3df05f713288c741031c532
Pau Espin Pedrol at

#20205 (Feb 2, 2026, 12:40:36 PM)

assignment_fsm: Fix use-after-free of lchan->conn

Scenario:
* A DYNAMIC/OSMOCOM TS in PDCH mode is selected to be used for TCH/F,
  hence the TS is being switched to TCH/F: RF Channel Release is being
  transmitted and waiting to receive RF Channel release ACK. Hence,
  lchan is in state LCHAN_ST_WAIT_TS_READY, and there's a conn with an
  assignment FSM pointing to it in conn->assignment.new_lchan.
  lchan->conn also points to the related conn.
* The BSSMAP SCCP link goes down (link lost), which will terminate the
  conn->fi of all conns related to the MSC peer going down.
  During that teardown, first gscon_pre_term()->gscon_release_lchans()->
  assignment_reset() is called, which sets
  conn->assignment.new_lchan=NULL and calls lchan_release(). This path
  leaves conn->assignment.new_lchan->conn untouched!
* Later in the call path, when finally the bsc_subscr is put() to 0
  references and associated lchan gets its lchan_forget_conn() called,
  it will access lchan->conn which was not freed in the previous step
  mentioned above during assignment_reset().

This patch fixes the issue by adding a lchan_forget_conn() after the
lchan_release() in assignment_reset(), to make sure the conn is no
longer user by the lchan afterwards.

Related: OS#6936
Change-Id: Ifbb9a61cd8a40d953ef5c2b52f9be9ef0dffefa4
Pau Espin Pedrol at

#20204 (Feb 2, 2026, 12:40:32 PM)

assignment_fsm: Fix use-after-free of lchan->conn

Scenario:
* A DYNAMIC/OSMOCOM TS in PDCH mode is selected to be used for TCH/F,
  hence the TS is being switched to TCH/F: RF Channel Release is being
  transmitted and waiting to receive RF Channel release ACK. Hence,
  lchan is in state LCHAN_ST_WAIT_TS_READY, and there's a conn with an
  assignment FSM pointing to it in conn->assignment.new_lchan.
  lchan->conn also points to the related conn.
* The BSSMAP SCCP link goes down (link lost), which will terminate the
  conn->fi of all conns related to the MSC peer going down.
  During that teardown, first gscon_pre_term()->gscon_release_lchans()->
  assignment_reset() is called, which sets
  conn->assignment.new_lchan=NULL and calls lchan_release(). This path
  leaves conn->assignment.new_lchan->conn untouched!
* Later in the call path, when finally the bsc_subscr is put() to 0
  references and associated lchan gets its lchan_forget_conn() called,
  it will access lchan->conn which was not freed in the previous step
  mentioned above during assignment_reset().

This patch fixes the issue by adding a lchan_forget_conn() after the
lchan_release() in assignment_reset(), to make sure the conn is no
longer user by the lchan afterwards.

Related: OS#6936
Change-Id: Ifbb9a61cd8a40d953ef5c2b52f9be9ef0dffefa4
Pau Espin Pedrol at

#20203 (Feb 2, 2026, 9:37:16 AM)

Lb: Handle N-PCSTATE.ind

Change-Id: I16900b9c2b840d4c7d8471c1f69b19601e892b2d
Pau Espin Pedrol at

#20202 (Feb 2, 2026, 9:37:14 AM)

Lb: Handle SCCP N-NOTICE.ind

Change-Id: I689bf2f2c4311fbc1da92f02c27078a1c00dda1a
Pau Espin Pedrol at

#20201 (Feb 2, 2026, 9:37:14 AM)

Lb: Handle N-PCSTATE.ind

Change-Id: I16900b9c2b840d4c7d8471c1f69b19601e892b2d
Pau Espin Pedrol at

#20200 (Feb 2, 2026, 9:37:10 AM)

Lb: Handle SCCP N-NOTICE.ind

Change-Id: I689bf2f2c4311fbc1da92f02c27078a1c00dda1a
Pau Espin Pedrol at

#20199 (Feb 2, 2026, 9:03:37 AM)

vty: Use osmo_fd_{write,read}_enable() API helper

Change-Id: Icba439fb33a29626ffce9ca1d61d30e88426f526
Pau Espin Pedrol at

#20198 (Feb 2, 2026, 9:03:36 AM)

vty: Use osmo_fd_{write,read}_enable() API helper

Change-Id: Icba439fb33a29626ffce9ca1d61d30e88426f526
Pau Espin Pedrol at

#20197 (Feb 2, 2026, 9:03:34 AM)

vty: Use osmo_fd_{write,read}_enable() API helper

Change-Id: Icba439fb33a29626ffce9ca1d61d30e88426f526
Pau Espin Pedrol at

#20195 (Feb 1, 2026, 12:43:33 PM)

Add CAS channel support

CAS is currently supported by e1d driver only.

Change-Id: I81cc89e01bb4207dc899ab28f24a131f24b61c9c
Andreas Eversberg at

#20193 (Feb 1, 2026, 12:42:32 PM)

Add Channel-Associated Signalling (CAS) support

CAS frames are sent and received repeatedly. They consist of 16 frames
(octets) on time slot 16. This is a CAS multiframe. This multiframe
carries 30 individual CAS signaling channels.

Whenever a CAS frames changes, an event (E1DP_EVT_CAS) is forwarded to
the e1d client. The event includes one octet with the CAS information.

The e1d client requests to transmit a new CAS frame by sending a command
(E1DP_CMD_CAS). The command includes one octet with the CAS information.

The e1d client requests to receive current CAS frame of a given time
slot by setting a query flag in the E1DP_CMD_CAS command. This is useful
if the CAS signals changed before the application was started.

The lower 4 bits of each octet in the message represent the signaling
sub-channels: A, B, C and D. They are packed like this: 'xxxxABCD'

To enable cas support on an interface, set line attribute "cas" via VTY.

Change-Id: Ib4f5e6ef02c9b0d1eec2a86d9c48376112805972
Andreas Eversberg at

#20191 (Feb 1, 2026, 12:41:46 PM)

Add CAS channel support

CAS is currently supported by e1d driver only.

Change-Id: I81cc89e01bb4207dc899ab28f24a131f24b61c9c
Andreas Eversberg at

#20190 (Feb 1, 2026, 12:41:35 PM)

Add Channel-Associated Signalling (CAS) support

CAS frames are sent and received repeatedly. They consist of 16 frames
(octets) on time slot 16. This is a CAS multiframe. This multiframe
carries 30 individual CAS signaling channels.

Whenever a CAS frames changes, an event (E1DP_EVT_CAS) is forwarded to
the e1d client. The event includes one octet with the CAS information.

The e1d client requests to transmit a new CAS frame by sending a command
(E1DP_CMD_CAS). The command includes one octet with the CAS information.

The e1d client requests to receive current CAS frame of a given time
slot by setting a query flag in the E1DP_CMD_CAS command. This is useful
if the CAS signals changed before the application was started.

The lower 4 bits of each octet in the message represent the signaling
sub-channels: A, B, C and D. They are packed like this: 'xxxxABCD'

To enable cas support on an interface, set line attribute "cas" via VTY.

Change-Id: Ib4f5e6ef02c9b0d1eec2a86d9c48376112805972
Andreas Eversberg at

#20189 (Feb 1, 2026, 12:41:33 PM)

Add Channel-Associated Signalling (CAS) support

CAS frames are sent and received repeatedly. They consist of 16 frames
(octets) on time slot 16. This is a CAS multiframe. This multiframe
carries 30 individual CAS signaling channels.

Whenever a CAS frames changes, an event (E1DP_EVT_CAS) is forwarded to
the e1d client. The event includes one octet with the CAS information.

The e1d client requests to transmit a new CAS frame by sending a command
(E1DP_CMD_CAS). The command includes one octet with the CAS information.

The e1d client requests to receive current CAS frame of a given time
slot by setting a query flag in the E1DP_CMD_CAS command. This is useful
if the CAS signals changed before the application was started.

The lower 4 bits of each octet in the message represent the signaling
sub-channels: A, B, C and D. They are packed like this: 'xxxxABCD'

To enable cas support on an interface, set line attribute "cas" via VTY.

Change-Id: Ib4f5e6ef02c9b0d1eec2a86d9c48376112805972
Andreas Eversberg at

#20188 (Jan 31, 2026, 10:54:06 AM)

rest_api: Fix encoded payload length check

Change-Id: I4224102dd924dfded59e3a489079d02ca0237983
matan1008 at

#20187 (Jan 31, 2026, 10:54:00 AM)

rest_api: Fix encoded payload length check

Change-Id: I4224102dd924dfded59e3a489079d02ca0237983
matan1008 at

#20186 (Jan 30, 2026, 6:02:43 PM)

Lb: Log stop of Lb link

Change-Id: If8537874cf6b70791aa0fee9f1c94b472113ccf6
Pau Espin Pedrol at

#20185 (Jan 30, 2026, 6:02:43 PM)

Lb: Log stop of Lb link

Change-Id: If8537874cf6b70791aa0fee9f1c94b472113ccf6
Pau Espin Pedrol at

#20184 (Jan 30, 2026, 5:55:07 PM)

sccp_scrc: Improve logging unable to find SCCP user

Change-Id: I9277624a260ee2f94f8cd059211aff53cfb50574
Pau Espin Pedrol at

#20183 (Jan 30, 2026, 5:55:03 PM)

sccp_scrc: Improve logging unable to find SCCP user

Change-Id: I9277624a260ee2f94f8cd059211aff53cfb50574
Pau Espin Pedrol at

#20182 (Jan 30, 2026, 5:29:52 PM)

Lb: Handle N-PCSTATE.ind

Change-Id: I16900b9c2b840d4c7d8471c1f69b19601e892b2d
Pau Espin Pedrol at

#20181 (Jan 30, 2026, 5:29:51 PM)

Lb: Handle SCCP N-NOTICE.ind

Change-Id: I689bf2f2c4311fbc1da92f02c27078a1c00dda1a
Pau Espin Pedrol at

#20180 (Jan 30, 2026, 5:29:48 PM)

Lb: Handle N-PCSTATE.ind

Change-Id: I16900b9c2b840d4c7d8471c1f69b19601e892b2d
Pau Espin Pedrol at

#20179 (Jan 30, 2026, 5:29:48 PM)

Lb: Handle SCCP N-NOTICE.ind

Change-Id: I689bf2f2c4311fbc1da92f02c27078a1c00dda1a
Pau Espin Pedrol at

#20178 (Jan 30, 2026, 4:10:30 PM)

sccp_scrc: Log Point code in integer format too

Change-Id: I9277624a260ee2f94f8cd059211aff53cfb50574
Pau Espin Pedrol at

#20177 (Jan 30, 2026, 4:10:28 PM)

sccp_scrc: Log Point code in integer format too

Change-Id: I9277624a260ee2f94f8cd059211aff53cfb50574
Pau Espin Pedrol at

#20176 (Jan 30, 2026, 2:32:10 PM)

osmo_io: Remove outdated comment in API doc of osmo_iofd_set_io_buffers()

Multiple iov buffers are supported in poll backend since
4272cd46b1e5b264e6f6b65d38bcb08e3a139a9e.

Related: OS#6705
Change-Id: I9b75f3597081c6cd7e24f75f0e289b93edb3aa86
Pau Espin Pedrol at

#20175 (Jan 30, 2026, 2:32:06 PM)

logging_file: Request up to 8 iofd write buffers if available

This should help in decreasing latency between submitting a logging line
and getting it written to file. It should, for the same reason, optimize
CPU use.

Change-Id: Ia88b27948922d278e0f72fc2aac4b4ae88465b4d
Pau Espin Pedrol at

#20174 (Jan 30, 2026, 2:32:06 PM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20173 (Jan 30, 2026, 2:32:05 PM)

osmo_io: Allow fetching maximum value allowed by osmo_iofd_set_io_buffers()

Before this patch, there's no way for a user of the API to know whether
a requested buffers value is actually going to be accepted or not.

Change-Id: Id3d8413c119eb3d9b60aa068295a59561236938c
Pau Espin Pedrol at

#20172 (Jan 30, 2026, 2:32:05 PM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20171 (Jan 30, 2026, 2:31:18 PM)

logging_file: Request up to 8 iofd write buffers if available

This should help in decreasing latency between submitting a logging line
and getting it written to file. It should, for the same reason, optimize
CPU use.

Change-Id: Ia88b27948922d278e0f72fc2aac4b4ae88465b4d
Pau Espin Pedrol at

#20170 (Jan 30, 2026, 2:31:09 PM)

osmo_io: Remove outdated comment in API doc of osmo_iofd_set_io_buffers()

Multiple iov buffers are supported in poll backend since
4272cd46b1e5b264e6f6b65d38bcb08e3a139a9e.

Related: OS#6705
Change-Id: I9b75f3597081c6cd7e24f75f0e289b93edb3aa86
Pau Espin Pedrol at

#20169 (Jan 30, 2026, 2:31:09 PM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20168 (Jan 30, 2026, 2:31:08 PM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20167 (Jan 30, 2026, 2:31:07 PM)

osmo_io: Allow fetching maximum value allowed by osmo_iofd_set_io_buffers()

Before this patch, there's no way for a user of the API to know whether
a requested buffers value is actually going to be accepted or not.

Change-Id: Id3d8413c119eb3d9b60aa068295a59561236938c
Pau Espin Pedrol at

#20166 (Jan 30, 2026, 2:31:04 PM)

osmo_io: Remove outdated comment in API doc of osmo_iofd_set_io_buffers()

Multiple iov buffers are supported in poll backend since
4272cd46b1e5b264e6f6b65d38bcb08e3a139a9e.

Related: OS#6705
Change-Id: I9b75f3597081c6cd7e24f75f0e289b93edb3aa86
Pau Espin Pedrol at

#20165 (Jan 30, 2026, 2:31:03 PM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20164 (Jan 30, 2026, 2:31:03 PM)

logging_file: Request up to 8 iofd write buffers if available

This should help in decreasing latency between submitting a logging line
and getting it written to file. It should, for the same reason, optimize
CPU use.

Change-Id: Ia88b27948922d278e0f72fc2aac4b4ae88465b4d
Pau Espin Pedrol at

#20163 (Jan 30, 2026, 2:31:02 PM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20162 (Jan 30, 2026, 2:31:01 PM)

osmo_io: Allow fetching maximum value allowed by osmo_iofd_set_io_buffers()

Before this patch, there's no way for a user of the API to know whether
a requested buffers value is actually going to be accepted or not.

Change-Id: Id3d8413c119eb3d9b60aa068295a59561236938c
Pau Espin Pedrol at

#20161 (Jan 30, 2026, 2:05:26 PM)

osmo_io: Introduce API osmo_iofd_get_txqueue_max_length()

Change-Id: I92526aa554fc87734fae3fac0ad650d17bf52bb5
Pau Espin Pedrol at

#20160 (Jan 30, 2026, 2:04:34 PM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20159 (Jan 30, 2026, 2:04:01 PM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20158 (Jan 30, 2026, 2:03:58 PM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20157 (Jan 30, 2026, 2:03:58 PM)

osmo_io: Introduce API osmo_iofd_get_txqueue_max_length()

Change-Id: I92526aa554fc87734fae3fac0ad650d17bf52bb5
Pau Espin Pedrol at

#20156 (Jan 30, 2026, 2:03:58 PM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20155 (Jan 30, 2026, 2:03:58 PM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20154 (Jan 30, 2026, 2:03:56 PM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20153 (Jan 30, 2026, 2:03:56 PM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20152 (Jan 30, 2026, 2:03:56 PM)

osmo_io: Introduce API osmo_iofd_get_txqueue_max_length()

Change-Id: I92526aa554fc87734fae3fac0ad650d17bf52bb5
Pau Espin Pedrol at

#20151 (Jan 30, 2026, 2:03:56 PM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20150 (Jan 30, 2026, 2:03:54 PM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20149 (Jan 30, 2026, 1:56:40 PM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20148 (Jan 30, 2026, 1:55:55 PM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20147 (Jan 30, 2026, 1:55:45 PM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20146 (Jan 30, 2026, 1:55:39 PM)

logging: Also Avoid infinite loop/deadlock in log_check_level()

A LOG() macro being called inside an already-logging path will first
call log_check_level() before calling osmo_vlogp(). Since calling
happens with the mutex hold, it has been seen to deadlock in eg.
osmo-hnbgw.

Change-Id: I0098629b335b3aa174b49fd79c33d22b04bc4785
Pau Espin Pedrol at

#20145 (Jan 30, 2026, 1:55:35 PM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20144 (Jan 30, 2026, 1:55:29 PM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20143 (Jan 30, 2026, 1:55:09 PM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20142 (Jan 30, 2026, 1:54:54 PM)

logging: Also Avoid infinite loop/deadlock in log_check_level()

A LOG() macro being called inside an already-logging path will first
call log_check_level() before calling osmo_vlogp(). Since calling
happens with the mutex hold, it has been seen to deadlock in eg.
osmo-hnbgw.

Change-Id: I0098629b335b3aa174b49fd79c33d22b04bc4785
Pau Espin Pedrol at

#20141 (Jan 30, 2026, 1:54:04 PM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20140 (Jan 30, 2026, 1:53:54 PM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20139 (Jan 30, 2026, 1:53:50 PM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20138 (Jan 30, 2026, 1:53:44 PM)

logging: Also Avoid infinite loop/deadlock in log_check_level()

A LOG() macro being called inside an already-logging path will first
call log_check_level() before calling osmo_vlogp(). Since calling
happens with the mutex hold, it has been seen to deadlock in eg.
osmo-hnbgw.

Change-Id: I0098629b335b3aa174b49fd79c33d22b04bc4785
Pau Espin Pedrol at

#20137 (Jan 30, 2026, 1:52:11 PM)

logging: Also Avoid infinite loop/deadlock in log_check_level()

A LOG() macro being called inside an already-logging path will first
call log_check_level() before calling osmo_vlogp(). Since calling
happens with the mutex hold, it has been seen to deadlock in eg.
osmo-hnbgw.

Change-Id: I0098629b335b3aa174b49fd79c33d22b04bc4785
Pau Espin Pedrol at

#20136 (Jan 30, 2026, 1:52:03 PM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20135 (Jan 30, 2026, 1:50:42 PM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20134 (Jan 30, 2026, 1:50:32 PM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20133 (Jan 30, 2026, 1:50:32 PM)

logging: Also Avoid infinite loop/deadlock in log_check_level()

A LOG() macro being called inside an already-logging path will first
call log_check_level() before calling osmo_vlogp(). Since calling
happens with the mutex hold, it has been seen to deadlock in eg.
osmo-hnbgw.

Change-Id: I0098629b335b3aa174b49fd79c33d22b04bc4785
Pau Espin Pedrol at

#20132 (Jan 30, 2026, 1:50:31 PM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20131 (Jan 30, 2026, 1:50:30 PM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20130 (Jan 30, 2026, 1:50:29 PM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20129 (Jan 30, 2026, 1:50:29 PM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20128 (Jan 30, 2026, 1:50:28 PM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20127 (Jan 30, 2026, 1:50:28 PM)

logging: Also Avoid infinite loop/deadlock in log_check_level()

A LOG() macro being called inside an already-logging path will first
call log_check_level() before calling osmo_vlogp(). Since calling
happens with the mutex hold, it has been seen to deadlock in eg.
osmo-hnbgw.

Change-Id: I0098629b335b3aa174b49fd79c33d22b04bc4785
Pau Espin Pedrol at

#20126 (Jan 30, 2026, 1:50:27 PM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20125 (Jan 30, 2026, 1:26:20 PM)

vty: Use osmo_fd_{write,read}_enable() API helper

Change-Id: Icba439fb33a29626ffce9ca1d61d30e88426f526
Pau Espin Pedrol at

#20124 (Jan 30, 2026, 1:25:24 PM)

vty: Use osmo_fd_{write,read}_enable() API helper

Change-Id: Icba439fb33a29626ffce9ca1d61d30e88426f526
Pau Espin Pedrol at

#20123 (Jan 30, 2026, 1:25:23 PM)

vty: Use osmo_fd_{write,read}_enable() API helper

Change-Id: Icba439fb33a29626ffce9ca1d61d30e88426f526
Pau Espin Pedrol at

#20122 (Jan 30, 2026, 11:28:24 AM)

Fix 'logging: Avoid infinite loop logging inside logging path'

I didn't see the early return of log_cache_check(), which should leave
the logging_active variable as true forever.

Fixes: bc400626b28c85fe0f52ce25947a90650b0d06b5
Change-Id: I13ed182688597c7da279a50bf057eff6d13f0867
Pau Espin Pedrol at

#20121 (Jan 30, 2026, 11:28:23 AM)

Fix 'logging: Avoid infinite loop logging inside logging path'

I didn't see the early return of log_cache_check(), which should leave
the logging_active variable as true forever.

Fixes: bc400626b28c85fe0f52ce25947a90650b0d06b5
Change-Id: I13ed182688597c7da279a50bf057eff6d13f0867
Pau Espin Pedrol at

#20120 (Jan 30, 2026, 11:28:23 AM)

Fix 'logging: Avoid infinite loop logging inside logging path'

I didn't see the early return of log_cache_check(), which should leave
the logging_active variable as true forever.

Fixes: bc400626b28c85fe0f52ce25947a90650b0d06b5
Change-Id: I13ed182688597c7da279a50bf057eff6d13f0867
Pau Espin Pedrol at

#20119 (Jan 30, 2026, 9:46:01 AM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20118 (Jan 30, 2026, 9:46:00 AM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20117 (Jan 30, 2026, 9:45:59 AM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20116 (Jan 30, 2026, 9:45:55 AM)

logging: Avoid infinite loop logging inside logging path

If eg. gsmtap_log target is requested to log a message but the iofd
wqueue is full, it may try to log an error message, which will create an
infinite stack loop.

Change-Id: If3b8c0ee97537242162558fdd1c99f03b32af811
Pau Espin Pedrol at

#20115 (Jan 30, 2026, 9:45:50 AM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20114 (Jan 30, 2026, 9:45:43 AM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20113 (Jan 30, 2026, 9:45:33 AM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20112 (Jan 30, 2026, 9:44:56 AM)

logging: Avoid infinite loop logging inside logging path

If eg. gsmtap_log target is requested to log a message but the iofd
wqueue is full, it may try to log an error message, which will create an
infinite stack loop.

Change-Id: If3b8c0ee97537242162558fdd1c99f03b32af811
Pau Espin Pedrol at

#20111 (Jan 30, 2026, 9:44:47 AM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20110 (Jan 30, 2026, 9:44:46 AM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20109 (Jan 30, 2026, 9:44:45 AM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20108 (Jan 30, 2026, 9:44:36 AM)

logging: Avoid infinite loop logging inside logging path

If eg. gsmtap_log target is requested to log a message but the iofd
wqueue is full, it may try to log an error message, which will create an
infinite stack loop.

Change-Id: If3b8c0ee97537242162558fdd1c99f03b32af811
Pau Espin Pedrol at

#20107 (Jan 29, 2026, 11:20:41 AM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20106 (Jan 29, 2026, 11:20:36 AM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20105 (Jan 29, 2026, 11:20:29 AM)

Use same queue length for gsmtap_log and gsmtap_file

Take the chance to also deduplicate MAX_LOG_SIZE.

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20104 (Jan 29, 2026, 11:17:36 AM)

Use same queue length for gsmtap_log and gsmtap_file

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20103 (Jan 29, 2026, 11:17:36 AM)

Use same queue length for gsmtap_log and gsmtap_file

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20102 (Jan 29, 2026, 11:17:32 AM)

Use same queue length for gsmtap_log and gsmtap_file

Change-Id: I3772d291f97626ee325731f3515a5110eda70d3d
Pau Espin Pedrol at

#20101 (Jan 29, 2026, 11:05:08 AM)

stats_tcp.c: Remove unneeded EMBEDDED check

The HAVE_LINUX_TCP define check should be enough.

Change-Id: I68cb49925aa49ad97b266638d41f38c22fc32000
Pau Espin Pedrol at

#20100 (Jan 29, 2026, 11:04:50 AM)

stats_tcp.c: Remove unneeded EMBEDDED check

The HAVE_LINUX_TCP define check should be enough.

Change-Id: I68cb49925aa49ad97b266638d41f38c22fc32000
Pau Espin Pedrol at

#20099 (Jan 29, 2026, 11:04:50 AM)

stats_tcp.c: Remove unneeded EMBEDDED check

The HAVE_LINUX_TCP define check should be enough.

Change-Id: I68cb49925aa49ad97b266638d41f38c22fc32000
Pau Espin Pedrol at

#20098 (Jan 29, 2026, 11:02:52 AM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20097 (Jan 29, 2026, 11:02:48 AM)

logging_file: Avoid reopening file for stderr

target->tgt_file.fname is NULL for stderr log target.

Change-Id: I4a551b0c434c480e78852a0a4873700eac2f5853
Pau Espin Pedrol at

#20096 (Jan 29, 2026, 11:01:53 AM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20095 (Jan 29, 2026, 11:01:52 AM)

logging_file: Fix log_target_file_switch_to_stream on stderr

In stderr log target, the bfd of the wq was left registered despite
freeing the wq, which ended up in the callback being called and the
freed wq being used.

Change-Id: I1c0d833fb8ae82d1dd54e44cc2fc8be80d5e1b4b
Pau Espin Pedrol at

#20094 (Jan 29, 2026, 11:01:47 AM)

logging: Avoid infinite loop logging inside logging path

If eg. gsmtap_log target is requested to log a message but the iofd
wqueue is full, it may try to log an error message, which will create an
infinite stack loop.

Change-Id: If3b8c0ee97537242162558fdd1c99f03b32af811
Pau Espin Pedrol at

#20093 (Jan 29, 2026, 11:01:46 AM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20092 (Jan 29, 2026, 11:01:45 AM)

logging_file: Avoid reopening file for stderr

target->tgt_file.fname is NULL for stderr log target.

Change-Id: I4a551b0c434c480e78852a0a4873700eac2f5853
Pau Espin Pedrol at

#20091 (Jan 29, 2026, 11:00:53 AM)

logging_file: Fix log_target_file_switch_to_stream on stderr

In stderr log target, the bfd of the wq was left registered despite
freeing the wq, which ended up in the callback being called and the
freed wq being used.

Change-Id: I1c0d833fb8ae82d1dd54e44cc2fc8be80d5e1b4b
Pau Espin Pedrol at

#20090 (Jan 29, 2026, 11:00:52 AM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20089 (Jan 29, 2026, 11:00:48 AM)

logging: Avoid infinite loop logging inside logging path

If eg. gsmtap_log target is requested to log a message but the iofd
wqueue is full, it may try to log an error message, which will create an
infinite stack loop.

Change-Id: If3b8c0ee97537242162558fdd1c99f03b32af811
Pau Espin Pedrol at

#20088 (Jan 29, 2026, 11:00:47 AM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20087 (Jan 29, 2026, 11:00:46 AM)

logging_file: Avoid reopening file for stderr

target->tgt_file.fname is NULL for stderr log target.

Change-Id: I4a551b0c434c480e78852a0a4873700eac2f5853
Pau Espin Pedrol at

#20086 (Jan 29, 2026, 11:00:46 AM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20085 (Jan 29, 2026, 11:00:46 AM)

logging_file: Fix log_target_file_switch_to_stream on stderr

In stderr log target, the bfd of the wq was left registered despite
freeing the wq, which ended up in the callback being called and the
freed wq being used.

Change-Id: I1c0d833fb8ae82d1dd54e44cc2fc8be80d5e1b4b
Pau Espin Pedrol at

#20084 (Jan 29, 2026, 11:00:45 AM)

logging: Avoid infinite loop logging inside logging path

If eg. gsmtap_log target is requested to log a message but the iofd
wqueue is full, it may try to log an error message, which will create an
infinite stack loop.

Change-Id: If3b8c0ee97537242162558fdd1c99f03b32af811
Pau Espin Pedrol at

#20083 (Jan 29, 2026, 10:54:03 AM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20082 (Jan 29, 2026, 10:53:53 AM)

logging: Avoid infinite loop logging inside logging path

If eg. gsmtap_log target is requested to log a message but the iofd
wqueue is full, it may try to log an error message, which will create an
infinite stack loop.

Change-Id: If3b8c0ee97537242162558fdd1c99f03b32af811
Pau Espin Pedrol at

#20081 (Jan 29, 2026, 10:53:47 AM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20080 (Jan 29, 2026, 10:53:23 AM)

logging: Avoid infinite loop logging inside logging path

If eg. gsmtap_log target is requested to log a message but the iofd
wqueue is full, it may try to log an error message, which will create an
infinite stack loop.

Change-Id: If3b8c0ee97537242162558fdd1c99f03b32af811
Pau Espin Pedrol at

#20079 (Jan 29, 2026, 10:53:21 AM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20078 (Jan 29, 2026, 10:53:20 AM)

logging: Avoid infinite loop logging inside logging path

If eg. gsmtap_log target is requested to log a message but the iofd
wqueue is full, it may try to log an error message, which will create an
infinite stack loop.

Change-Id: If3b8c0ee97537242162558fdd1c99f03b32af811
Pau Espin Pedrol at

#20077 (Jan 29, 2026, 10:38:50 AM)

core: always build tun.c and gate TUN support by headers

Always build tun.c and move platform-specific checks into the
implementation.

Guard the TUN-specific code paths based on the availability of
linux/if_tun.h detected at configure time. If TUN support is not
available, osmo_tundev_open() returns -ENOTSUP.

This keeps the public TUN API available while disabling unsupported
functionality in a capability-based way.

Change-Id: I6d1ea1644d12ef59a54cf2f73b9155def58b17a9
dtv.comp at

#20076 (Jan 29, 2026, 10:38:49 AM)

core: always build tun.c and gate TUN support by headers

Always build tun.c and move platform-specific checks into the
implementation.

Guard the TUN-specific code paths based on the availability of
linux/if_tun.h detected at configure time. If TUN support is not
available, osmo_tundev_open() returns -ENOTSUP.

This keeps the public TUN API available while disabling unsupported
functionality in a capability-based way.

Change-Id: I6d1ea1644d12ef59a54cf2f73b9155def58b17a9
dtv.comp at

#20075 (Jan 29, 2026, 10:38:48 AM)

core: always build tun.c and gate TUN support by headers

Always build tun.c and move platform-specific checks into the
implementation.

Guard the TUN-specific code paths based on the availability of
linux/if_tun.h detected at configure time. If TUN support is not
available, osmo_tundev_open() returns -ENOTSUP.

This keeps the public TUN API available while disabling unsupported
functionality in a capability-based way.

Change-Id: I6d1ea1644d12ef59a54cf2f73b9155def58b17a9
dtv.comp at

#20074 (Jan 29, 2026, 9:47:39 AM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20073 (Jan 29, 2026, 9:47:39 AM)

logging_file: Fix log_target_file_switch_to_stream on stderr

In stderr log target, the bfd of the wq was left registered despite
freeing the wq, which ended up in the callback being called and the
freed wq being used.

Change-Id: I1c0d833fb8ae82d1dd54e44cc2fc8be80d5e1b4b
Pau Espin Pedrol at

#20072 (Jan 29, 2026, 9:47:37 AM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20071 (Jan 29, 2026, 9:47:37 AM)

logging_file: Fix log_target_file_switch_to_stream on stderr

In stderr log target, the bfd of the wq was left registered despite
freeing the wq, which ended up in the callback being called and the
freed wq being used.

Change-Id: I1c0d833fb8ae82d1dd54e44cc2fc8be80d5e1b4b
Pau Espin Pedrol at

#20070 (Jan 29, 2026, 9:47:33 AM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20069 (Jan 29, 2026, 9:47:33 AM)

logging_file: Fix log_target_file_switch_to_stream on stderr

In stderr log target, the bfd of the wq was left registered despite
freeing the wq, which ended up in the callback being called and the
freed wq being used.

Change-Id: I1c0d833fb8ae82d1dd54e44cc2fc8be80d5e1b4b
Pau Espin Pedrol at

#20068 (Jan 29, 2026, 7:49:01 AM)

Modified to dynamically adjust the returned QoS length to ensure compatibility with older modules.

Related: OS#6922
Change-Id: I872d882de4ce186f644b1b3ab684963050709d4f
canghaiwuhen at

#20067 (Jan 29, 2026, 7:49:00 AM)

Modified to dynamically adjust the returned QoS length to ensure compatibility with older modules.

Related: OS#6922
Change-Id: I872d882de4ce186f644b1b3ab684963050709d4f
canghaiwuhen at

#20066 (Jan 28, 2026, 5:17:22 PM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20065 (Jan 28, 2026, 5:17:21 PM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20064 (Jan 28, 2026, 5:17:16 PM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20063 (Jan 28, 2026, 5:17:16 PM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20062 (Jan 28, 2026, 5:17:14 PM)

logging_file: Clean log_target_file_reopen()

Move specific assert for wq further below.
Do early return to get rid of extra indentation.

Change-Id: Ibcb50320ad80b034115cccc3b7ab90501ac1d091
Pau Espin Pedrol at

#20061 (Jan 28, 2026, 5:17:14 PM)

Implement log file target using osmo_io

Reuse (struct log_target)->tgt_file->wqueue->except_cb to store the iofd
pointer internally, since we are not allowed to change the struct
log_target because it's public and we don't want to break the ABI.
Using the wqueue except_cb is fine since that field was never used.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20060 (Jan 28, 2026, 4:49:46 PM)

logging_file: Avoid reopning file for stderr

target->tgt_file.fname is NULL for stderr log target.

Change-Id: I4a551b0c434c480e78852a0a4873700eac2f5853
Pau Espin Pedrol at

#20059 (Jan 28, 2026, 4:49:46 PM)

logging_file: Avoid reopning file for stderr

target->tgt_file.fname is NULL for stderr log target.

Change-Id: I4a551b0c434c480e78852a0a4873700eac2f5853
Pau Espin Pedrol at

#20058 (Jan 28, 2026, 4:49:42 PM)

logging_file: Avoid reopning file for stderr

target->tgt_file.fname is NULL for stderr log target.

Change-Id: I4a551b0c434c480e78852a0a4873700eac2f5853
Pau Espin Pedrol at

#20057 (Jan 27, 2026, 3:52:36 PM)

Modified to dynamically adjust the returned QoS length to ensure compatibility with older modules.

Related: OS#6922
Change-Id: I872d882de4ce186f644b1b3ab684963050709d4f
canghaiwuhen at

#20056 (Jan 27, 2026, 3:52:35 PM)

Modified to dynamically adjust the returned QoS length to ensure compatibility with older modules.

Related: OS#6922
Change-Id: I872d882de4ce186f644b1b3ab684963050709d4f
canghaiwuhen at

#20055 (Jan 27, 2026, 3:52:17 PM)

Modified to dynamically adjust the returned QoS length to ensure compatibility with older modules.

Related: OS#6922
Change-Id: I872d882de4ce186f644b1b3ab684963050709d4f
canghaiwuhen at

#20054 (Jan 27, 2026, 3:52:15 PM)

Modified to dynamically adjust the returned QoS length to ensure compatibility with older modules.

Related: OS#6922
Change-Id: I872d882de4ce186f644b1b3ab684963050709d4f
canghaiwuhen at

#20053 (Jan 27, 2026, 11:09:50 AM)

osmo_io: Fix misaligment of iofd->cmsg used as struct cmsghdr

Fixes following ASAN runtime error:
"""
src/stream.c:398:47: runtime error: member access within misaligned address 0x516000012b81 for type 'struct cmsghdr', which requires 8 byte alignment
0x516000012b81: note: pointer points here
51 00 00  00 30 00 00 00 00 00 00  00 84 00 00 00 01 00 00  00 00 00 00 00 00 00 00  00 00 00 00 03
              ^
"""

Current GCC documentation [1] states that __attribute__ ((__aligned__
(alignment))) is the older sytnax. The newer _Alignas mimics the
standarized alignas() in C23. Since we build with CLAGS=-std=gnu11 we
are fine using _Alignas, which was introduced in C11.

[1] https://www.gnu.org/software/c-intro-and-ref/manual/html_node/Type-Alignment.html

Related: OS#6905
Change-Id: Ia80dfc4dbffe85514b18dcf8d36b85bfafd76d64
Pau Espin Pedrol at

#20052 (Jan 27, 2026, 11:09:50 AM)

osmo_io: Fix misaligment of iofd->cmsg used as struct cmsghdr

Fixes following ASAN runtime error:
"""
src/stream.c:398:47: runtime error: member access within misaligned address 0x516000012b81 for type 'struct cmsghdr', which requires 8 byte alignment
0x516000012b81: note: pointer points here
51 00 00  00 30 00 00 00 00 00 00  00 84 00 00 00 01 00 00  00 00 00 00 00 00 00 00  00 00 00 00 03
              ^
"""

Current GCC documentation [1] states that __attribute__ ((__aligned__
(alignment))) is the older sytnax. The newer _Alignas mimics the
standarized alignas() in C23. Since we build with CLAGS=-std=gnu11 we
are fine using _Alignas, which was introduced in C11.

[1] https://www.gnu.org/software/c-intro-and-ref/manual/html_node/Type-Alignment.html

Related: OS#6905
Change-Id: Ia80dfc4dbffe85514b18dcf8d36b85bfafd76d64
Pau Espin Pedrol at

#20051 (Jan 27, 2026, 11:09:46 AM)

osmo_io: Fix misaligment of iofd->cmsg used as struct cmsghdr

Fixes following ASAN runtime error:
"""
src/stream.c:398:47: runtime error: member access within misaligned address 0x516000012b81 for type 'struct cmsghdr', which requires 8 byte alignment
0x516000012b81: note: pointer points here
51 00 00  00 30 00 00 00 00 00 00  00 84 00 00 00 01 00 00  00 00 00 00 00 00 00 00  00 00 00 00 03
              ^
"""

Current GCC documentation [1] states that __attribute__ ((__aligned__
(alignment))) is the older sytnax. The newer _Alignas mimics the
standarized alignas() in C23. Since we build with CLAGS=-std=gnu11 we
are fine using _Alignas, which was introduced in C11.

[1] https://www.gnu.org/software/c-intro-and-ref/manual/html_node/Type-Alignment.html

Related: OS#6905
Change-Id: Ia80dfc4dbffe85514b18dcf8d36b85bfafd76d64
Pau Espin Pedrol at

#20050 (Jan 27, 2026, 10:14:47 AM)

Implement log file target using osmo_io

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20049 (Jan 27, 2026, 10:14:47 AM)

logging: Make struct log_context and struct log_target private

Change-Id: Iecbd07995ccb465a44be0debcc97458b2b240a0e
Pau Espin Pedrol at

#20048 (Jan 27, 2026, 10:14:45 AM)

Implement log file target using osmo_io

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20047 (Jan 27, 2026, 10:14:45 AM)

logging: Make struct log_context and struct log_target private

Change-Id: Iecbd07995ccb465a44be0debcc97458b2b240a0e
Pau Espin Pedrol at

#20046 (Jan 27, 2026, 10:14:43 AM)

Implement log file target using osmo_io

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#20045 (Jan 27, 2026, 10:14:43 AM)

logging: Make struct log_context and struct log_target private

Change-Id: Iecbd07995ccb465a44be0debcc97458b2b240a0e
Pau Espin Pedrol at

#20044 (Jan 27, 2026, 5:48:47 AM)

Modified to dynamically adjust the returned QoS length to ensure compatibility with older modules.

Related: OS#6922
Change-Id: I872d882de4ce186f644b1b3ab684963050709d4f
canghaiwuhen at

#20043 (Jan 27, 2026, 5:48:44 AM)

Modified to dynamically adjust the returned QoS length to ensure compatibility with older modules.

Related: OS#6922
Change-Id: I872d882de4ce186f644b1b3ab684963050709d4f
canghaiwuhen at

#20042 (Jan 27, 2026, 5:47:05 AM)

Modified to dynamically adjust the returned QoS length to ensure compatibility with older modules.

Related: OS#6922
Change-Id: I872d882de4ce186f644b1b3ab684963050709d4f
canghaiwuhen at

#20041 (Jan 27, 2026, 5:47:04 AM)

Modified to dynamically adjust the returned QoS length to ensure compatibility with older modules.

Related: OS#6922
Change-Id: I872d882de4ce186f644b1b3ab684963050709d4f
canghaiwuhen at

#20040 (Jan 27, 2026, 2:09:02 AM)

Modified to dynamically adjust the returned QoS length to ensure compatibility with older modules.

Related: OS#6922
Change-Id: I872d882de4ce186f644b1b3ab684963050709d4f
canghaiwuhen at

#20039 (Jan 27, 2026, 2:08:56 AM)

Modified to dynamically adjust the returned QoS length to ensure compatibility with older modules.

Related: OS#6922
Change-Id: I872d882de4ce186f644b1b3ab684963050709d4f
canghaiwuhen at

#20038 (Jan 26, 2026, 7:16:46 PM)

gitignore: ignore generated .wasm files

Change-Id: I879e698f2d514cf6e2f7bb33b4d6148f79aea6f6
dtv.comp at

#20037 (Jan 26, 2026, 7:16:44 PM)

gitignore: ignore generated .wasm files

Change-Id: I879e698f2d514cf6e2f7bb33b4d6148f79aea6f6
dtv.comp at

#20036 (Jan 26, 2026, 6:43:49 PM)

gitignore: ignore generated .wasm files

Change-Id: I023158cc39989d6fe98080fecb61410aa4e535ab
dtv.comp at

#20035 (Jan 26, 2026, 6:43:48 PM)

gitignore: ignore generated .wasm files

Change-Id: I023158cc39989d6fe98080fecb61410aa4e535ab
dtv.comp at

#20034 (Jan 26, 2026, 6:43:48 PM)

gitignore: ignore generated .wasm files

Change-Id: I023158cc39989d6fe98080fecb61410aa4e535ab
dtv.comp at

#20033 (Jan 26, 2026, 6:21:48 PM)

configure: disable libsctp by default when building with emscripten

Detect the emscripten compiler and introduce a HAVE_EMSCRIPTEN
conditional.

When building with emscripten, disable libsctp by default, as SCTP is
not supported in that environment. Native builds keep libsctp enabled
by default.

Also ignore generated .wasm artifacts.

Change-Id: I023158cc39989d6fe98080fecb61410aa4e535ab
dtv.comp at

#20032 (Jan 26, 2026, 6:21:48 PM)

stream: Fix build with --disable-libsctp

Guard SCTP-specific includes and code paths with HAVE_LIBSCTP to
allow building libosmo-netif without libsctp support.

This avoids unconditional inclusion of <osmocom/netif/sctp.h> and
ensures that SCTP-specific variables and send paths are only compiled
when SCTP support is enabled.

No functional change when HAVE_LIBSCTP is defined.

Change-Id: I07ef25f3fcc39f9bee023d9264a72c4381b82b65
dtv.comp at

#20031 (Jan 26, 2026, 6:21:45 PM)

configure: disable libsctp by default when building with emscripten

Detect the emscripten compiler and introduce a HAVE_EMSCRIPTEN
conditional.

When building with emscripten, disable libsctp by default, as SCTP is
not supported in that environment. Native builds keep libsctp enabled
by default.

Also ignore generated .wasm artifacts.

Change-Id: I023158cc39989d6fe98080fecb61410aa4e535ab
dtv.comp at

#20030 (Jan 26, 2026, 6:21:44 PM)

stream: Fix build with --disable-libsctp

Guard SCTP-specific includes and code paths with HAVE_LIBSCTP to
allow building libosmo-netif without libsctp support.

This avoids unconditional inclusion of <osmocom/netif/sctp.h> and
ensures that SCTP-specific variables and send paths are only compiled
when SCTP support is enabled.

No functional change when HAVE_LIBSCTP is defined.

Change-Id: I07ef25f3fcc39f9bee023d9264a72c4381b82b65
dtv.comp at

#20029 (Jan 26, 2026, 6:21:44 PM)

configure: disable libsctp by default when building with emscripten

Detect the emscripten compiler and introduce a HAVE_EMSCRIPTEN
conditional.

When building with emscripten, disable libsctp by default, as SCTP is
not supported in that environment. Native builds keep libsctp enabled
by default.

Also ignore generated .wasm artifacts.

Change-Id: I023158cc39989d6fe98080fecb61410aa4e535ab
dtv.comp at

#20028 (Jan 26, 2026, 6:21:43 PM)

stream: Fix build with --disable-libsctp

Guard SCTP-specific includes and code paths with HAVE_LIBSCTP to
allow building libosmo-netif without libsctp support.

This avoids unconditional inclusion of <osmocom/netif/sctp.h> and
ensures that SCTP-specific variables and send paths are only compiled
when SCTP support is enabled.

No functional change when HAVE_LIBSCTP is defined.

Change-Id: I07ef25f3fcc39f9bee023d9264a72c4381b82b65
dtv.comp at

#20027 (Jan 26, 2026, 5:13:49 PM)

stream: make SCTP usage conditional on HAVE_LIBSCTP

Guard SCTP-specific includes and code paths with HAVE_LIBSCTP to
allow building libosmo-netif without libsctp support.

This avoids unconditional inclusion of <osmocom/netif/sctp.h> and
ensures that SCTP-specific variables and send paths are only compiled
when SCTP support is enabled.

No functional change when HAVE_LIBSCTP is defined.

Change-Id: I07ef25f3fcc39f9bee023d9264a72c4381b82b65
dtv.comp at

#20026 (Jan 26, 2026, 5:12:57 PM)

configure: disable libsctp by default when building with emscripten

Detect the emscripten compiler and introduce a HAVE_EMSCRIPTEN
conditional.

When building with emscripten, disable libsctp by default, as SCTP is
not supported in that environment. Native builds keep libsctp enabled
by default.

Also ignore generated .wasm artifacts.

Change-Id: I023158cc39989d6fe98080fecb61410aa4e535ab
dtv.comp at

#20025 (Jan 26, 2026, 5:12:56 PM)

stream: make SCTP usage conditional on HAVE_LIBSCTP

Guard SCTP-specific includes and code paths with HAVE_LIBSCTP to
allow building libosmo-netif without libsctp support.

This avoids unconditional inclusion of <osmocom/netif/sctp.h> and
ensures that SCTP-specific variables and send paths are only compiled
when SCTP support is enabled.

No functional change when HAVE_LIBSCTP is defined.

Change-Id: I07ef25f3fcc39f9bee023d9264a72c4381b82b65
dtv.comp at

#20024 (Jan 26, 2026, 5:12:25 PM)

configure: disable libsctp by default when building with emscripten

Detect the emscripten compiler and introduce a HAVE_EMSCRIPTEN
conditional.

When building with emscripten, disable libsctp by default, as SCTP is
not supported in that environment. Native builds keep libsctp enabled
by default.

Also ignore generated .wasm artifacts.

Change-Id: I023158cc39989d6fe98080fecb61410aa4e535ab
dtv.comp at

#20023 (Jan 26, 2026, 5:12:07 PM)

stream: make SCTP usage conditional on HAVE_LIBSCTP

Guard SCTP-specific includes and code paths with HAVE_LIBSCTP to
allow building libosmo-netif without libsctp support.

This avoids unconditional inclusion of <osmocom/netif/sctp.h> and
ensures that SCTP-specific variables and send paths are only compiled
when SCTP support is enabled.

No functional change when HAVE_LIBSCTP is defined.

Change-Id: I07ef25f3fcc39f9bee023d9264a72c4381b82b65
dtv.comp at

#20022 (Jan 26, 2026, 5:11:48 PM)

configure: disable libsctp by default when building with emscripten

Detect the emscripten compiler and introduce a HAVE_EMSCRIPTEN
conditional.

When building with emscripten, disable libsctp by default, as SCTP is
not supported in that environment. Native builds keep libsctp enabled
by default.

Also ignore generated .wasm artifacts.

Change-Id: I023158cc39989d6fe98080fecb61410aa4e535ab
dtv.comp at

#20021 (Jan 26, 2026, 4:57:32 PM)

configure: handle emscripten builds and disable unsupported features

Detect emscripten compiler and adjust default configure options
accordingly. When building with emcc, disable ortp and DAHDI
support by default, as these components are not applicable in
Emscripten environments.

Also ignore generated .wasm artifacts in .gitignore.

No functional change for native builds.

Change-Id: I879e698f2d514cf6e2f7bb33b4d6148f79aea6f6
dtv.comp at

#20020 (Jan 26, 2026, 4:57:03 PM)

lapd-over-datagram-user: fix printf format for timeval fields

Use inttypes.h and PRI* macros when printing struct timeval
members. This avoids format string mismatches and makes the
example code portable across architectures where time_t /
suseconds_t may differ in size.

No functional change intended.

Change-Id: I7067eae1132c604aff3b37e5dff06fadb0759cb6
dtv.comp at

#20019 (Jan 26, 2026, 4:56:24 PM)

configure: handle emscripten builds and disable unsupported features

Detect emscripten compiler and adjust default configure options
accordingly. When building with emcc, disable ortp and DAHDI
support by default, as these components are not applicable in
Emscripten environments.

Also ignore generated .wasm artifacts in .gitignore.

No functional change for native builds.

Change-Id: I879e698f2d514cf6e2f7bb33b4d6148f79aea6f6
dtv.comp at

#20018 (Jan 26, 2026, 4:56:23 PM)

lapd-over-datagram-user: fix printf format for timeval fields

Use inttypes.h and PRI* macros when printing struct timeval
members. This avoids format string mismatches and makes the
example code portable across architectures where time_t /
suseconds_t may differ in size.

No functional change intended.

Change-Id: I7067eae1132c604aff3b37e5dff06fadb0759cb6
dtv.comp at

#20017 (Jan 26, 2026, 4:33:56 PM)

xua_snm: Fix typo in comment

Change-Id: I533809a0d319e75f2f18c706ddc4318503b9915a
Pau Espin Pedrol at

#20016 (Jan 26, 2026, 4:33:56 PM)

xua_snm: Fix typo in comment

Change-Id: I533809a0d319e75f2f18c706ddc4318503b9915a
Pau Espin Pedrol at

#20015 (Jan 26, 2026, 4:23:17 PM)

lapd-over-datagram-user: fix printf format for timeval fields

Use inttypes.h and PRI* macros when printing struct timeval
members. This avoids format string mismatches and makes the
example code portable across architectures where time_t /
suseconds_t may differ in size.

No functional change intended.

Change-Id: I7067eae1132c604aff3b37e5dff06fadb0759cb6
dtv.comp at

#20014 (Jan 26, 2026, 4:23:09 PM)

configure: handle emscripten builds and disable unsupported features

Detect emscripten compiler and adjust default configure options
accordingly. When building with emcc, disable ortp and DAHDI
support by default, as these components are not applicable in
Emscripten environments.

Also ignore generated .wasm artifacts in .gitignore.

No functional change for native builds.

Change-Id: I879e698f2d514cf6e2f7bb33b4d6148f79aea6f6
dtv.comp at

#20013 (Jan 26, 2026, 4:23:05 PM)

configure: handle emscripten builds and disable unsupported features

Detect emscripten compiler and adjust default configure options
accordingly. When building with emcc, disable ortp and DAHDI
support by default, as these components are not applicable in
Emscripten environments.

Also ignore generated .wasm artifacts in .gitignore.

No functional change for native builds.

Change-Id: I879e698f2d514cf6e2f7bb33b4d6148f79aea6f6
dtv.comp at

#20012 (Jan 26, 2026, 4:23:04 PM)

lapd-over-datagram-user: fix printf format for timeval fields

Use inttypes.h and PRI* macros when printing struct timeval
members. This avoids format string mismatches and makes the
example code portable across architectures where time_t /
suseconds_t may differ in size.

No functional change intended.

Change-Id: I7067eae1132c604aff3b37e5dff06fadb0759cb6
dtv.comp at

#20011 (Jan 26, 2026, 4:13:19 PM)

stream: make SCTP usage conditional on HAVE_LIBSCTP

Guard SCTP-specific includes and code paths with HAVE_LIBSCTP to
allow building libosmo-netif without libsctp support.

This avoids unconditional inclusion of <osmocom/netif/sctp.h> and
ensures that SCTP-specific variables and send paths are only compiled
when SCTP support is enabled.

No functional change when HAVE_LIBSCTP is defined.

Change-Id: I07ef25f3fcc39f9bee023d9264a72c4381b82b65
dtv.comp at

#20010 (Jan 26, 2026, 4:13:19 PM)

configure: disable libsctp by default when building with emscripten

Detect the emscripten compiler and introduce a HAVE_EMSCRIPTEN
conditional.

When building with emscripten, disable libsctp by default, as SCTP is
not supported in that environment. Native builds keep libsctp enabled
by default.

Also ignore generated .wasm artifacts.

Change-Id: I023158cc39989d6fe98080fecb61410aa4e535ab
dtv.comp at

#20009 (Jan 26, 2026, 4:12:57 PM)

stream: make SCTP usage conditional on HAVE_LIBSCTP

Guard SCTP-specific includes and code paths with HAVE_LIBSCTP to
allow building libosmo-netif without libsctp support.

This avoids unconditional inclusion of <osmocom/netif/sctp.h> and
ensures that SCTP-specific variables and send paths are only compiled
when SCTP support is enabled.

No functional change when HAVE_LIBSCTP is defined.

Change-Id: I07ef25f3fcc39f9bee023d9264a72c4381b82b65
dtv.comp at

#20008 (Jan 26, 2026, 4:12:56 PM)

configure: disable libsctp by default when building with emscripten

Detect the emscripten compiler and introduce a HAVE_EMSCRIPTEN
conditional.

When building with emscripten, disable libsctp by default, as SCTP is
not supported in that environment. Native builds keep libsctp enabled
by default.

Also ignore generated .wasm artifacts.

Change-Id: I023158cc39989d6fe98080fecb61410aa4e535ab
dtv.comp at

#20007 (Jan 26, 2026, 4:12:52 PM)

stream: make SCTP usage conditional on HAVE_LIBSCTP

Guard SCTP-specific includes and code paths with HAVE_LIBSCTP to
allow building libosmo-netif without libsctp support.

This avoids unconditional inclusion of <osmocom/netif/sctp.h> and
ensures that SCTP-specific variables and send paths are only compiled
when SCTP support is enabled.

No functional change when HAVE_LIBSCTP is defined.

Change-Id: I07ef25f3fcc39f9bee023d9264a72c4381b82b65
dtv.comp at

#20006 (Jan 26, 2026, 4:12:51 PM)

configure: disable libsctp by default when building with emscripten

Detect the emscripten compiler and introduce a HAVE_EMSCRIPTEN
conditional.

When building with emscripten, disable libsctp by default, as SCTP is
not supported in that environment. Native builds keep libsctp enabled
by default.

Also ignore generated .wasm artifacts.

Change-Id: I023158cc39989d6fe98080fecb61410aa4e535ab
dtv.comp at

#20005 (Jan 26, 2026, 3:29:51 PM)

server: Clarify reason of rolling pcap due to max-file-size vty config

Change the logging to print the VTY config name, so user can relate the
exct string, otherwise it can be confusing.

Related: SYS#7842
Change-Id: I6d2a2217e556afeedad78a1e9217f6a448d674c0
Pau Espin Pedrol at

#20004 (Jan 26, 2026, 3:29:50 PM)

server: Clarify reason of rolling pcap due to max-file-size vty config

Change the logging to print the VTY config name, so user can relate the
exct string, otherwise it can be confusing.

Related: SYS#7842
Change-Id: I6d2a2217e556afeedad78a1e9217f6a448d674c0
Pau Espin Pedrol at

#20003 (Jan 26, 2026, 3:29:46 PM)

server: Clarify reason of rolling pcap due to max-file-size vty config

Change the logging to print the VTY config name, so user can relate the
exct string, otherwise it can be confusing.

Related: SYS#7842
Change-Id: I6d2a2217e556afeedad78a1e9217f6a448d674c0
Pau Espin Pedrol at

#20002 (Jan 26, 2026, 3:17:28 PM)

osmo_io: Fix misaligment of iofd->cmsg used as struct cmsghdr

Fixes following ASAN runtime error:
"""
src/stream.c:398:47: runtime error: member access within misaligned address 0x516000012b81 for type 'struct cmsghdr', which requires 8 byte alignment
0x516000012b81: note: pointer points here
51 00 00  00 30 00 00 00 00 00 00  00 84 00 00 00 01 00 00  00 00 00 00 00 00 00 00  00 00 00 00 03
              ^
"""

Related: OS#6905
Change-Id: Ia80dfc4dbffe85514b18dcf8d36b85bfafd76d64
Pau Espin Pedrol at

#20001 (Jan 26, 2026, 3:17:27 PM)

osmo_io: Fix misaligment of iofd->cmsg used as struct cmsghdr

Fixes following ASAN runtime error:
"""
src/stream.c:398:47: runtime error: member access within misaligned address 0x516000012b81 for type 'struct cmsghdr', which requires 8 byte alignment
0x516000012b81: note: pointer points here
51 00 00  00 30 00 00 00 00 00 00  00 84 00 00 00 01 00 00  00 00 00 00 00 00 00 00  00 00 00 00 03
              ^
"""

Related: OS#6905
Change-Id: Ia80dfc4dbffe85514b18dcf8d36b85bfafd76d64
Pau Espin Pedrol at

#20000 (Jan 26, 2026, 3:17:25 PM)

osmo_io: Fix misaligment of iofd->cmsg used as struct cmsghdr

Fixes following ASAN runtime error:
"""
src/stream.c:398:47: runtime error: member access within misaligned address 0x516000012b81 for type 'struct cmsghdr', which requires 8 byte alignment
0x516000012b81: note: pointer points here
51 00 00  00 30 00 00 00 00 00 00  00 84 00 00 00 01 00 00  00 00 00 00 00 00 00 00  00 00 00 00 03
              ^
"""

Related: OS#6905
Change-Id: Ia80dfc4dbffe85514b18dcf8d36b85bfafd76d64
Pau Espin Pedrol at

#19999 (Jan 26, 2026, 2:59:26 PM)

xua: Implement User Part Unavailable HMDT -> HMRT

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

#19998 (Jan 26, 2026, 2:59:24 PM)

xua: Implement User Part Unavailable HMDT -> HMRT

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

#19997 (Jan 26, 2026, 2:08:58 PM)

Related: OS#6922 Modified to dynamically adjust the returned QoS length to ensure compatibility with older modules.

Change-Id: I872d882de4ce186f644b1b3ab684963050709d4f
canghaiwuhen at

#19996 (Jan 26, 2026, 2:08:58 PM)

Related: OS#6922 Modified to dynamically adjust the returned QoS length to ensure compatibility with older modules.

Change-Id: I872d882de4ce186f644b1b3ab684963050709d4f
canghaiwuhen at

#19995 (Jan 26, 2026, 1:48:38 PM)

Related: OS#6922 Modified to dynamically adjust the returned QoS length to ensure compatibility with older modules.

Change-Id: I872d882de4ce186f644b1b3ab684963050709d4f
canghaiwuhen at

#19994 (Jan 26, 2026, 1:48:37 PM)

Related: OS#6922 Modified to dynamically adjust the returned QoS length to ensure compatibility with older modules.

Change-Id: I872d882de4ce186f644b1b3ab684963050709d4f
canghaiwuhen at

#19993 (Jan 26, 2026, 1:27:39 PM)

rspro_server.c: Fix missing include for inet_ntoa()

This file was calling inet_ntoa() without including arpa/inet.h, which
is the header defining the function according to man and posix
documentation.

Change-Id: I49352bcc2b8e418e17453809354382bd37eb838e
Pau Espin Pedrol at

#19992 (Jan 26, 2026, 1:26:56 PM)

rspro_server.c: Fix missing include for inet_ntoa()

This file was calling inet_ntoa() without including arpa/inet.h, which
is the header defining the function according to man and posix
documentation.

Change-Id: I49352bcc2b8e418e17453809354382bd37eb838e
Pau Espin Pedrol at

#19991 (Jan 26, 2026, 12:58:52 PM)

fake_trx: reset settings on CMD POWEROFF

When running ttcn3-bts-test, parameters such as SETTA, FAKE_RSSI,
FAKE_TOA, and others may persist across testcases if not explicitly
reset, leading to unintended cross-test interference.

Reset all transceiver settings on CMD POWEROFF to ensure proper
test isolation and predictable behavior between testcases.

Change-Id: I5c58bc684acc7a58d7aa940bb2ae7597d4a282f2
(cherry picked from commit 754d5ebb1e120e661fd3b1e025abfc5b5216ac80)
Vadim Yanitskiy at

#19990 (Jan 26, 2026, 12:58:51 PM)

fake_trx: reset settings on CMD POWEROFF

When running ttcn3-bts-test, parameters such as SETTA, FAKE_RSSI,
FAKE_TOA, and others may persist across testcases if not explicitly
reset, leading to unintended cross-test interference.

Reset all transceiver settings on CMD POWEROFF to ensure proper
test isolation and predictable behavior between testcases.

Change-Id: I5c58bc684acc7a58d7aa940bb2ae7597d4a282f2
(cherry picked from commit 754d5ebb1e120e661fd3b1e025abfc5b5216ac80)
Vadim Yanitskiy at

#19989 (Jan 26, 2026, 12:56:04 PM)

fake_trx: reset settings on CMD POWEROFF

When running ttcn3-bts-test, parameters such as SETTA, FAKE_RSSI,
FAKE_TOA, and others may persist across testcases if not explicitly
reset, leading to unintended cross-test interference.

Reset all transceiver settings on CMD POWEROFF to ensure proper
test isolation and predictable behavior between testcases.

Change-Id: I5c58bc684acc7a58d7aa940bb2ae7597d4a282f2
Vadim Yanitskiy at

#19988 (Jan 26, 2026, 12:55:59 PM)

fake_trx: reset settings on CMD POWEROFF

When running ttcn3-bts-test, parameters such as SETTA, FAKE_RSSI,
FAKE_TOA, and others may persist across testcases if not explicitly
reset, leading to unintended cross-test interference.

Reset all transceiver settings on CMD POWEROFF to ensure proper
test isolation and predictable behavior between testcases.

Change-Id: I5c58bc684acc7a58d7aa940bb2ae7597d4a282f2
Vadim Yanitskiy at

#19987 (Jan 26, 2026, 11:41:03 AM)

Modify the QoS length to ensure compatibility with some GPRS modules, such as Air20X.

Change-Id: Iee49745809195fe7d0897dd1e9cba2427ff7008e
canghaiwuhen at

#19986 (Jan 26, 2026, 11:41:00 AM)

Modify the QoS length to ensure compatibility with some GPRS modules, such as Air20X.

Change-Id: Iee49745809195fe7d0897dd1e9cba2427ff7008e
canghaiwuhen at

#19985 (Jan 26, 2026, 11:31:44 AM)

logging: Make struct log_context and struct log_target private

Change-Id: Iecbd07995ccb465a44be0debcc97458b2b240a0e
Pau Espin Pedrol at

#19984 (Jan 26, 2026, 11:30:39 AM)

logging: Make struct log_context and struct log_target private

Change-Id: Iecbd07995ccb465a44be0debcc97458b2b240a0e
Pau Espin Pedrol at

#19983 (Jan 26, 2026, 11:29:44 AM)

logging: Make struct log_context and struct log_target private

Change-Id: Iecbd07995ccb465a44be0debcc97458b2b240a0e
Pau Espin Pedrol at

#19982 (Jan 26, 2026, 11:28:58 AM)

logging: Move log target file to its own file

We already have all other log_target implementations each on its own
file. Move the file (and stderr, a specific case of file) into its own
file too, properly separating most file-specific logic from general
logging logic.

Change-Id: I8e32e31c75b66ff0649d92c2f469f8895689fbad
Pau Espin Pedrol at

#19981 (Jan 26, 2026, 11:28:56 AM)

logging: Move log target file to its own file

We already have all other log_target implementations each on its own
file. Move the file (and stderr, a specific case of file) into its own
file too, properly separating most file-specific logic from general
logging logic.

Change-Id: I8e32e31c75b66ff0649d92c2f469f8895689fbad
Pau Espin Pedrol at

#19980 (Jan 26, 2026, 11:28:54 AM)

logging: Move log target file to its own file

We already have all other log_target implementations each on its own
file. Move the file (and stderr, a specific case of file) into its own
file too, properly separating most file-specific logic from general
logging logic.

Change-Id: I8e32e31c75b66ff0649d92c2f469f8895689fbad
Pau Espin Pedrol at

#19979 (Jan 26, 2026, 11:08:07 AM)

Implement log file target using osmo_io

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#19978 (Jan 26, 2026, 11:08:04 AM)

Implement log file target using osmo_io

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#19977 (Jan 26, 2026, 11:08:04 AM)

Implement log file target using osmo_io

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#19976 (Jan 26, 2026, 11:06:16 AM)

osmo_io.h: Avoid including sys/socket.h

sys/socket.h may not always be available (eg. arm-none-eabi toolchain).
In the header file we only really need the forward declaration of struct
msghdr, so simply do that.

Change-Id: I5bcba8f72a2be6161d7782a3100d25a7025341d0
Pau Espin Pedrol at

#19975 (Jan 26, 2026, 11:05:37 AM)

osmo_io.h: Avoid including sys/socket.h

sys/socket.h may not always be available (eg. arm-none-eabi toolchain).
In the header file we only really need the forward declaration of struct
msghdr, so simply do that.

Change-Id: I5bcba8f72a2be6161d7782a3100d25a7025341d0
Pau Espin Pedrol at

#19974 (Jan 26, 2026, 11:05:21 AM)

osmo_io.h: Avoid including sys/socket.h

sys/socket.h may not always be available (eg. arm-none-eabi toolchain).
In the header file we only really need the forward declaration of struct
msghdr, so simply do that.

Change-Id: I5bcba8f72a2be6161d7782a3100d25a7025341d0
Pau Espin Pedrol at

#19973 (Jan 26, 2026, 11:02:56 AM)

core: guard TCP stats on availability of linux/tcp.h

Detect availability of linux/tcp.h at configure time
and build TCP statistics code conditionally based on that.

This replaces platform-specific conditionals with proper feature checks
and avoids build failures on systems lacking Linux TCP headers or types
(e.g. non-Linux or cross-build environments).

When TCP_INFO support is unavailable, the public API remains unchanged,
but all related functions return -ENOTSUP.

No functional changes on systems where linux/tcp.h are available.

Change-Id: Ibcd00f15131b0291f0b10eca51401c518b77cc39
dtv.comp at

#19972 (Jan 26, 2026, 11:02:55 AM)

core: guard TCP stats on availability of linux/tcp.h

Detect availability of linux/tcp.h at configure time
and build TCP statistics code conditionally based on that.

This replaces platform-specific conditionals with proper feature checks
and avoids build failures on systems lacking Linux TCP headers or types
(e.g. non-Linux or cross-build environments).

When TCP_INFO support is unavailable, the public API remains unchanged,
but all related functions return -ENOTSUP.

No functional changes on systems where linux/tcp.h are available.

Change-Id: Ibcd00f15131b0291f0b10eca51401c518b77cc39
dtv.comp at

#19971 (Jan 26, 2026, 11:02:55 AM)

core: guard TCP stats on availability of linux/tcp.h

Detect availability of linux/tcp.h at configure time
and build TCP statistics code conditionally based on that.

This replaces platform-specific conditionals with proper feature checks
and avoids build failures on systems lacking Linux TCP headers or types
(e.g. non-Linux or cross-build environments).

When TCP_INFO support is unavailable, the public API remains unchanged,
but all related functions return -ENOTSUP.

No functional changes on systems where linux/tcp.h are available.

Change-Id: Ibcd00f15131b0291f0b10eca51401c518b77cc39
dtv.comp at

#19970 (Jan 26, 2026, 10:28:42 AM)

socket_compat.h improvements to always have struct osmo_sockaddr available

Having a #if (!EMBEDDED) based on compiler defined variable is not a
good idea. Instead, add minimal sys/socket.h and netient/in.h to always
have the definition of struct osmo_sockaddr available.

Change-Id: I5b10e09770727c72812af15360ab3385b957509b
Pau Espin Pedrol at

#19969 (Jan 26, 2026, 10:27:34 AM)

socket_compat.h improvements to always have struct osmo_sockaddr available

Having a #if (!EMBEDDED) based on compiler defined variable is not a
good idea. Instead, add minimal sys/socket.h and netient/in.h to always
have the definition of struct osmo_sockaddr available.

Change-Id: I5b10e09770727c72812af15360ab3385b957509b
Pau Espin Pedrol at

#19968 (Jan 26, 2026, 10:27:34 AM)

socket_compat.h improvements to always have struct osmo_sockaddr available

Having a #if (!EMBEDDED) based on compiler defined variable is not a
good idea. Instead, add minimal sys/socket.h and netient/in.h to always
have the definition of struct osmo_sockaddr available.

Change-Id: I5b10e09770727c72812af15360ab3385b957509b
Pau Espin Pedrol at

#19967 (Jan 26, 2026, 10:21:34 AM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#19966 (Jan 26, 2026, 10:21:34 AM)

core: guard Linux netlink headers by libmnl usage

Only include Linux-specific netlink headers when the libmnl backend
is enabled.

The code paths requiring <linux/if_link.h> and <linux/rtnetlink.h>
are entirely guarded by ENABLE_LIBMNL conditionals, so the headers should
not be included unconditionally.

This avoids pulling in Linux-only headers when the corresponding
backend is not built.

Change-Id: I0b681deb1f1e025e3ea9996f19b1de06a5feb408
dtv.comp at

#19965 (Jan 26, 2026, 10:21:34 AM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#19964 (Jan 26, 2026, 10:20:44 AM)

core: guard Linux netlink headers by libmnl usage

Only include Linux-specific netlink headers when the libmnl backend
is enabled.

The code paths requiring <linux/if_link.h> and <linux/rtnetlink.h>
are entirely guarded by ENABLE_LIBMNL conditionals, so the headers should
not be included unconditionally.

This avoids pulling in Linux-only headers when the corresponding
backend is not built.

Change-Id: I0b681deb1f1e025e3ea9996f19b1de06a5feb408
dtv.comp at

#19963 (Jan 26, 2026, 10:20:09 AM)

core: guard Linux netlink headers by libmnl usage

Only include Linux-specific netlink headers when the libmnl backend
is enabled.

The code paths requiring <linux/if_link.h> and <linux/rtnetlink.h>
are entirely guarded by ENABLE_LIBMNL conditionals, so the headers should
not be included unconditionally.

This avoids pulling in Linux-only headers when the corresponding
backend is not built.

Change-Id: I0b681deb1f1e025e3ea9996f19b1de06a5feb408
dtv.comp at

#19962 (Jan 26, 2026, 10:20:09 AM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#19961 (Jan 26, 2026, 10:17:46 AM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#19960 (Jan 26, 2026, 10:17:36 AM)

core: guard Linux netlink headers by libmnl usage

Only include Linux-specific netlink headers when the libmnl backend
is enabled.

The code paths requiring <linux/if_link.h> and <linux/rtnetlink.h>
are entirely guarded by ENABLE_LIBMNL conditionals, so the headers should
not be included unconditionally.

This avoids pulling in Linux-only headers when the corresponding
backend is not built.

Change-Id: I0b681deb1f1e025e3ea9996f19b1de06a5feb408
dtv.comp at

#19959 (Jan 26, 2026, 10:17:17 AM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#19957 (Jan 26, 2026, 10:16:50 AM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#19956 (Jan 26, 2026, 10:16:39 AM)

core: guard Linux netlink headers by libmnl usage

Only include Linux-specific netlink headers when the libmnl backend
is enabled.

The code paths requiring <linux/if_link.h> and <linux/rtnetlink.h>
are entirely guarded by ENABLE_LIBMNL conditionals, so the headers should
not be included unconditionally.

This avoids pulling in Linux-only headers when the corresponding
backend is not built.

Change-Id: I0b681deb1f1e025e3ea9996f19b1de06a5feb408
dtv.comp at

#19955 (Jan 26, 2026, 10:14:46 AM)

socket_compat.h improvements to always have struct osmo_sockaddr available

Having a #if (!EMBEDDED) based on compiler defined variable is not a
good idea. Instead, add minimal sys/socket.h and netient/in.h to always
have the definition of struct osmo_sockaddr available.

Change-Id: I5b10e09770727c72812af15360ab3385b957509b
Pau Espin Pedrol at

#19954 (Jan 26, 2026, 10:14:17 AM)

socket_compat.h improvements to always have struct osmo_sockaddr available

Having a #if (!EMBEDDED) based on compiler defined variable is not a
good idea. Instead, add minimal sys/socket.h and netient/in.h to always
have the definition of struct osmo_sockaddr available.

Change-Id: I5b10e09770727c72812af15360ab3385b957509b
Pau Espin Pedrol at

#19953 (Jan 26, 2026, 10:13:18 AM)

socket_compat.h improvements to always have struct osmo_sockaddr available

Having a #if (!EMBEDDED) based on compiler defined variable is not a
good idea. Instead, add minimal sys/socket.h and netient/in.h to always
have the definition of struct osmo_sockaddr available.

Change-Id: I5b10e09770727c72812af15360ab3385b957509b
Pau Espin Pedrol at

#19952 (Jan 26, 2026, 10:09:17 AM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#19949 (Jan 26, 2026, 10:07:07 AM)

core: always build tun.c and gate TUN support by headers

Always build tun.c and move platform-specific checks into the
implementation.

Guard the TUN-specific code paths based on the availability of
linux/if_tun.h detected at configure time. If TUN support is not
available, osmo_tundev_open() returns -ENOTSUP.

This keeps the public TUN API available while disabling unsupported
functionality in a capability-based way.

Change-Id: I6d1ea1644d12ef59a54cf2f73b9155def58b17a9
dtv.comp at

#19948 (Jan 26, 2026, 10:06:48 AM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#19947 (Jan 26, 2026, 10:06:29 AM)

core: guard Linux netlink headers by libmnl usage

Only include Linux-specific netlink headers when the libmnl backend
is enabled.

The code paths requiring <linux/if_link.h> and <linux/rtnetlink.h>
are entirely guarded by ENABLE_LIBMNL conditionals, so the headers should
not be included unconditionally.

This avoids pulling in Linux-only headers when the corresponding
backend is not built.

Change-Id: I0b681deb1f1e025e3ea9996f19b1de06a5feb408
dtv.comp at

#19945 (Jan 26, 2026, 10:04:58 AM)

core: always build tun.c and gate TUN support by headers

Always build tun.c and move platform-specific checks into the
implementation.

Guard the TUN-specific code paths based on the availability of
linux/if_tun.h detected at configure time. If TUN support is not
available, osmo_tundev_open() returns -ENOTSUP.

This keeps the public TUN API available while disabling unsupported
functionality in a capability-based way.

Change-Id: I6d1ea1644d12ef59a54cf2f73b9155def58b17a9
dtv.comp at

#19943 (Jan 26, 2026, 10:03:32 AM)

core: guard Linux netlink headers by libmnl usage

Only include Linux-specific netlink headers when the libmnl backend
is enabled.

The code paths requiring <linux/if_link.h> and <linux/rtnetlink.h>
are entirely guarded by ENABLE_LIBMNL conditionals, so the headers should
not be included unconditionally.

This avoids pulling in Linux-only headers when the corresponding
backend is not built.

Change-Id: I0b681deb1f1e025e3ea9996f19b1de06a5feb408
dtv.comp at

#19942 (Jan 26, 2026, 10:01:54 AM)

core: guard TCP stats on availability of linux/tcp.h

Detect availability of linux/tcp.h at configure time
and build TCP statistics code conditionally based on that.

This replaces platform-specific conditionals with proper feature checks
and avoids build failures on systems lacking Linux TCP headers or types
(e.g. non-Linux or cross-build environments).

When TCP_INFO support is unavailable, the public API remains unchanged,
but all related functions return -ENOTSUP.

No functional changes on systems where linux/tcp.h are available.

Change-Id: Ibcd00f15131b0291f0b10eca51401c518b77cc39
dtv.comp at

#19940 (Jan 26, 2026, 9:25:45 AM)

socket.h: Include netinet/in.h instead of arpa/inet.h

In socket.h we are mainly interested in netinet/int.h, since that's the
one defining INET_ADDRSTRLEN, struct sockaddr_in, struct in_addr, ec.

Header arpa/inet.h usually defines several functions which use those,
like htonl(), inet_ntop(), etc.

See POSIX:
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/arpa_inet.h.html#tag_13_03
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html

Change-Id: I03919c4adc962bbcfabc9030c6f12c0e10ff060c
Pau Espin Pedrol at

#19939 (Jan 26, 2026, 9:23:06 AM)

Implement log file target using osmo_io

TODO: re-add talloc_pool.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#19938 (Jan 26, 2026, 9:22:56 AM)

configure.ac: Add arpa/inet.h to AC_CHECK_HEADERS

We use arpa/inet.h in several places in the code, so it's good to look
up for presence even if it's only to debug toolchain compatibility.

Change-Id: Ib2d1fb3efb1dcb429b511698691249c257e00720
Pau Espin Pedrol at

#19937 (Jan 26, 2026, 9:22:55 AM)

remove references to define EMBEDDED in public headers

It's not a good idea to base opt-in/out of code in public headers based
on some specific non-standard define being set at compile time when
calling the compiler. Get rid of those references; Now that
osmocom/core/socket.h can be included thanks to improved
osmocom/core/socket_compat.h, it shouldn't be a problem.

Change-Id: I7a657d67077dfbe861959c6123eb9163bc791694
Pau Espin Pedrol at

#19936 (Jan 26, 2026, 9:19:38 AM)

osmo_io.h: Avoid including sys/socket.h

sys/socket.h may not always be available (eg. arm-none-eabi toolchain).
In the header file we only really need the forward declaration of struct
msghdr, so simply do that.

Change-Id: I5bcba8f72a2be6161d7782a3100d25a7025341d0
Pau Espin Pedrol at

#19935 (Jan 26, 2026, 9:19:24 AM)

logging: Make struct log_context and struct log_target private

Change-Id: Iecbd07995ccb465a44be0debcc97458b2b240a0e
Pau Espin Pedrol at

#19934 (Jan 26, 2026, 9:19:15 AM)

socket_compat.h improvements to always have struct osmo_sockaddr available

Having a #if (!EMBEDDED) based on compiler defined variable is not a
good idea. Instead, add minimal sys/socket.h and netient/in.h to always
have the definition of struct osmo_sockaddr available.

Change-Id: I5b10e09770727c72812af15360ab3385b957509b
Pau Espin Pedrol at

#19933 (Jan 26, 2026, 9:17:07 AM)

logging: Move log target file to its own file

We already have all other log_target implementations each on its own
file. Move the file (and stderr, a specific case of file) into its own
file too, properly separating most file-specific logic from general
logging logic.

Change-Id: I8e32e31c75b66ff0649d92c2f469f8895689fbad
Pau Espin Pedrol at

#19932 (Jan 26, 2026, 9:17:01 AM)

socket.h: Include netinet/in.h instead of arpa/inet.h

In socket.h we are mainly interested in netinet/int.h, since that's the
one defining INET_ADDRSTRLEN, struct sockaddr_in, struct in_addr, ec.

Header arpa/inet.h usually defines several functions which use those,
like htonl(), inet_ntop(), etc.

See POSIX:
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/arpa_inet.h.html#tag_13_03
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html

Change-Id: I03919c4adc962bbcfabc9030c6f12c0e10ff060c
Pau Espin Pedrol at

#19931 (Jan 26, 2026, 9:16:39 AM)

Implement log file target using osmo_io

TODO: re-add talloc_pool.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#19930 (Jan 26, 2026, 9:14:32 AM)

configure.ac: Add arpa/inet.h to AC_CHECK_HEADERS

We use arpa/inet.h in several places in the code, so it's good to look
up for presence even if it's only to debug toolchain compatibility.

Change-Id: Ib2d1fb3efb1dcb429b511698691249c257e00720
Pau Espin Pedrol at

#19929 (Jan 26, 2026, 9:14:26 AM)

remove references to define EMBEDDED in public headers

It's not a good idea to base opt-in/out of code in public headers based
on some specific non-standard define being set at compile time when
calling the compiler. Get rid of those references; Now that
osmocom/core/socket.h can be included thanks to improved
osmocom/core/socket_compat.h, it shouldn't be a problem.

Change-Id: I7a657d67077dfbe861959c6123eb9163bc791694
Pau Espin Pedrol at

#19928 (Jan 26, 2026, 9:14:01 AM)

logging: Make struct log_context and struct log_target private

Change-Id: Iecbd07995ccb465a44be0debcc97458b2b240a0e
Pau Espin Pedrol at

#19927 (Jan 26, 2026, 9:11:34 AM)

socket_compat.h improvements to always have struct osmo_sockaddr available

Having a #if (!EMBEDDED) based on compiler defined variable is not a
good idea. Instead, add minimal sys/socket.h and netient/in.h to always
have the definition of struct osmo_sockaddr available.

Change-Id: I5b10e09770727c72812af15360ab3385b957509b
Pau Espin Pedrol at

#19926 (Jan 26, 2026, 9:11:32 AM)

osmo_io.h: Avoid including sys/socket.h

sys/socket.h may not always be available (eg. arm-none-eabi toolchain).
In the header file we only really need the forward declaration of struct
msghdr, so simply do that.

Change-Id: I5bcba8f72a2be6161d7782a3100d25a7025341d0
Pau Espin Pedrol at

#19925 (Jan 26, 2026, 9:11:03 AM)

logging: Move log target file to its own file

We already have all other log_target implementations each on its own
file. Move the file (and stderr, a specific case of file) into its own
file too, properly separating most file-specific logic from general
logging logic.

Change-Id: I8e32e31c75b66ff0649d92c2f469f8895689fbad
Pau Espin Pedrol at

#19924 (Jan 26, 2026, 9:10:06 AM)

socket.h: Include netinet/in.h instead of arpa/inet.h

In socket.h we are mainly interested in netinet/int.h, since that's the
one defining INET_ADDRSTRLEN, struct sockaddr_in, struct in_addr, ec.

Header arpa/inet.h usually defines several functions which use those,
like htonl(), inet_ntop(), etc.

See POSIX:
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/arpa_inet.h.html#tag_13_03
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html

Change-Id: I03919c4adc962bbcfabc9030c6f12c0e10ff060c
Pau Espin Pedrol at

#19923 (Jan 26, 2026, 9:10:04 AM)

configure.ac: Add arpa/inet.h to AC_CHECK_HEADERS

We use arpa/inet.h in several places in the code, so it's good to look
up for presence even if it's only to debug toolchain compatibility.

Change-Id: Ib2d1fb3efb1dcb429b511698691249c257e00720
Pau Espin Pedrol at

#19922 (Jan 26, 2026, 9:09:39 AM)

Implement log file target using osmo_io

TODO: re-add talloc_pool.

Related: OS#6918
Change-Id: Ieb6420246454ef59442b1fd7b1d14e2c00fa69a5
Pau Espin Pedrol at

#19921 (Jan 26, 2026, 9:08:36 AM)

remove references to define EMBEDDED in public headers

It's not a good idea to base opt-in/out of code in public headers based
on some specific non-standard define being set at compile time when
calling the compiler. Get rid of those references; Now that
osmocom/core/socket.h can be included thanks to improved
osmocom/core/socket_compat.h, it shouldn't be a problem.

Change-Id: I7a657d67077dfbe861959c6123eb9163bc791694
Pau Espin Pedrol at

#19920 (Jan 26, 2026, 9:08:30 AM)

socket_compat.h improvements to always have struct osmo_sockaddr available

Having a #if (!EMBEDDED) based on compiler defined variable is not a
good idea. Instead, add minimal sys/socket.h and netient/in.h to always
have the definition of struct osmo_sockaddr available.

Change-Id: I5b10e09770727c72812af15360ab3385b957509b
Pau Espin Pedrol at

#19919 (Jan 26, 2026, 9:07:53 AM)

logging: Make struct log_context and struct log_target private

Change-Id: Iecbd07995ccb465a44be0debcc97458b2b240a0e
Pau Espin Pedrol at

#19918 (Jan 26, 2026, 9:06:49 AM)

osmo_io.h: Avoid including sys/socket.h

sys/socket.h may not always be available (eg. arm-none-eabi toolchain).
In the header file we only really need the forward declaration of struct
msghdr, so simply do that.

Change-Id: I5bcba8f72a2be6161d7782a3100d25a7025341d0
Pau Espin Pedrol at

#19917 (Jan 26, 2026, 9:06:36 AM)

logging: Move log target file to its own file

We already have all other log_target implementations each on its own
file. Move the file (and stderr, a specific case of file) into its own
file too, properly separating most file-specific logic from general
logging logic.

Change-Id: I8e32e31c75b66ff0649d92c2f469f8895689fbad
Pau Espin Pedrol at

#19916 (Jan 26, 2026, 8:55:02 AM)

osmo_io: Add assert to validate inconditional

The do-while loop is entered:
* First time: "tail_msg != NULL" (since it was set to "msg").
* Subsequent times: coming from "while" condition:
** tail_msg != NULL
** res == IOFD_SEG_ACT_HANDLE_MORE, which means iofd->pending != NULL.

Hence, always either "iofd->pending" or "tail_msg" is valid when entering
the loop, and hence "msg" will also be valid.

Related: Coverity CID#557196
Change-Id: If29363edfba576370e306fb5b160d9f038018130
Pau Espin Pedrol at

#19915 (Jan 26, 2026, 8:52:33 AM)

osmo_io: Add assert to validate inconditional

The do-while loop is entered:
* First time: "tail_msg != NULL" (since it was set to "msg").
* Subsequent times: coming from "while" condition:
** tail_msg != NULL
** res == IOFD_SEG_ACT_HANDLE_MORE, which means iofd->pending != NULL.

Hence, always either "iofd->pending" or "tail_msg" is valid when entering
the loop, and hence "msg" will also be valid.

Related: Coverity CID#557196
Change-Id: If29363edfba576370e306fb5b160d9f038018130
Pau Espin Pedrol at

#19914 (Jan 26, 2026, 8:50:35 AM)

osmo_io: Add assert to validate inconditional

The do-while loop is entered:
* First time: "tail_msg != NULL" (since it was set to "msg").
* Subsequent times: coming from "while" condition:
** tail_msg != NULL
** res == IOFD_SEG_ACT_HANDLE_MORE, which means iofd->pending != NULL.

Hence, always either "iofd->pending" or "tail_msg" is valid when entering
the loop, and hence "msg" will also be valid.

Related: Coverity CID#557196
Change-Id: If29363edfba576370e306fb5b160d9f038018130
Pau Espin Pedrol at

#19913 (Jan 25, 2026, 6:55:01 PM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#19912 (Jan 25, 2026, 6:55:01 PM)

core: fix printf format casts for struct timeval fields

Explicitly cast struct timeval fields to long when passing them to
printf-style functions.

This avoids compiler warnings/errors on platforms where tv_sec or
tv_usec are not exactly of type long, while keeping the existing log
and control output unchanged.

Change-Id: Icac9e392c728948a7976970658e37f5e0da41709
dtv.comp at

#19911 (Jan 25, 2026, 6:53:01 PM)

core: guard TCP stats on availability of linux/tcp.h

Detect availability of linux/tcp.h at configure time
and build TCP statistics code conditionally based on that.

This replaces platform-specific conditionals with proper feature checks
and avoids build failures on systems lacking Linux TCP headers or types
(e.g. non-Linux or cross-build environments).

When TCP_INFO support is unavailable, the public API remains unchanged,
but all related functions return -ENOTSUP.

No functional changes on systems where linux/tcp.h are available.

Change-Id: Ibcd00f15131b0291f0b10eca51401c518b77cc39
dtv.comp at

#19910 (Jan 25, 2026, 6:52:01 PM)

core: always build tun.c and gate TUN support by headers

Always build tun.c and move platform-specific checks into the
implementation.

Guard the TUN-specific code paths based on the availability of
linux/if_tun.h detected at configure time. If TUN support is not
available, osmo_tundev_open() returns -ENOTSUP.

This keeps the public TUN API available while disabling unsupported
functionality in a capability-based way.

Change-Id: I6d1ea1644d12ef59a54cf2f73b9155def58b17a9
dtv.comp at

#19909 (Jan 25, 2026, 6:51:49 PM)

build: keep netns API public and gate features with HAVE_*

The netns API was previously guarded by platform-specific preprocessor
conditions (e.g. !EMBEDDED and defined(__linux__)), which caused the
netns headers and implementation to be entirely excluded from non-Linux
builds such as Emscripten. This in turn led to build failures in code
depending on the netns API, as the symbols and declarations were not
available at all.

Always build netns.c and keep the public declarations available
for non-embedded builds. Move platform/feature conditionals into the
implementation: guard the netns code paths with HAVE_SETNS/HAVE_UNSHARE/
HAVE_MOUNT and HAVE_CLONE_NEWNET, and return -ENOTSUP when the required
functionality is not available.

Add configure-time checks for the required headers/functions and for the
CLONE_NEWNET declaration, defining the
corresponding HAVE_* macros.

No functional changes intended for platforms where netns is available.

Change-Id: I2322eb2936bea35596f1fd6b6a713ea5f997b1ea
dtv.comp at

#19908 (Jan 25, 2026, 6:51:47 PM)

core: remove SCTP include from osmo_io_internal.h

No functional changes intended.

Change-Id: Icd626d908192a954d55d76a46d7cc863ed332631
dtv.comp at

#19907 (Jan 25, 2026, 6:51:47 PM)

vty: guard definition of _XOPEN_SOURCE

Define _XOPEN_SOURCE only if it is not already provided by the build
environment.

This avoids redefinition warnings/errors while ensuring required POSIX
interfaces are available.

Change-Id: I4f53aff1afef02abce7cb70d1b29080ba900ff41
dtv.comp at

#19906 (Jan 25, 2026, 6:51:41 PM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#19905 (Jan 25, 2026, 6:49:31 PM)

core: always build tun.c and gate TUN support by headers

Always build tun.c and move platform-specific checks into the
implementation.

Guard the TUN-specific code paths based on the availability of
linux/if_tun.h detected at configure time. If TUN support is not
available, osmo_tundev_open() returns -ENOTSUP.

This keeps the public TUN API available while disabling unsupported
functionality in a capability-based way.

Change-Id: I6d1ea1644d12ef59a54cf2f73b9155def58b17a9
dtv.comp at

#19904 (Jan 25, 2026, 6:48:22 PM)

core: guard TCP stats on availability of linux/tcp.h

Detect availability of linux/tcp.h at configure time
and build TCP statistics code conditionally based on that.

This replaces platform-specific conditionals with proper feature checks
and avoids build failures on systems lacking Linux TCP headers or types
(e.g. non-Linux or cross-build environments).

When TCP_INFO support is unavailable, the public API remains unchanged,
but all related functions return -ENOTSUP.

No functional changes on systems where linux/tcp.h are available.

Change-Id: Ibcd00f15131b0291f0b10eca51401c518b77cc39
dtv.comp at

#19903 (Jan 25, 2026, 6:48:17 PM)

core: fix printf format casts for struct timeval fields

Explicitly cast struct timeval fields to long when passing them to
printf-style functions.

This avoids compiler warnings/errors on platforms where tv_sec or
tv_usec are not exactly of type long, while keeping the existing log
and control output unchanged.

Change-Id: Icac9e392c728948a7976970658e37f5e0da41709
dtv.comp at

#19902 (Jan 25, 2026, 6:48:12 PM)

vty: guard definition of _XOPEN_SOURCE

Define _XOPEN_SOURCE only if it is not already provided by the build
environment.

This avoids redefinition warnings/errors while ensuring required POSIX
interfaces are available.

Change-Id: I4f53aff1afef02abce7cb70d1b29080ba900ff41
dtv.comp at

#19901 (Jan 25, 2026, 6:48:08 PM)

core: remove SCTP include from osmo_io_internal.h

No functional changes intended.

Change-Id: Icd626d908192a954d55d76a46d7cc863ed332631
dtv.comp at

#19900 (Jan 25, 2026, 6:48:08 PM)

build: keep netns API public and gate features with HAVE_*

The netns API was previously guarded by platform-specific preprocessor
conditions (e.g. !EMBEDDED and defined(__linux__)), which caused the
netns headers and implementation to be entirely excluded from non-Linux
builds such as Emscripten. This in turn led to build failures in code
depending on the netns API, as the symbols and declarations were not
available at all.

Always build netns.c and keep the public declarations available
for non-embedded builds. Move platform/feature conditionals into the
implementation: guard the netns code paths with HAVE_SETNS/HAVE_UNSHARE/
HAVE_MOUNT and HAVE_CLONE_NEWNET, and return -ENOTSUP when the required
functionality is not available.

Add configure-time checks for the required headers/functions and for the
CLONE_NEWNET declaration, defining the
corresponding HAVE_* macros.

No functional changes intended for platforms where netns is available.

Change-Id: I2322eb2936bea35596f1fd6b6a713ea5f997b1ea
dtv.comp at

#19899 (Jan 25, 2026, 6:48:06 PM)

core: guard TCP stats on availability of linux/tcp.h

Detect availability of linux/tcp.h at configure time
and build TCP statistics code conditionally based on that.

This replaces platform-specific conditionals with proper feature checks
and avoids build failures on systems lacking Linux TCP headers or types
(e.g. non-Linux or cross-build environments).

When TCP_INFO support is unavailable, the public API remains unchanged,
but all related functions return -ENOTSUP.

No functional changes on systems where linux/tcp.h are available.

Change-Id: Ibcd00f15131b0291f0b10eca51401c518b77cc39
dtv.comp at

#19898 (Jan 25, 2026, 6:44:57 PM)

core: always build tun.c and gate TUN support by headers

Always build tun.c and move platform-specific checks into the
implementation.

Guard the TUN-specific code paths based on the availability of
linux/if_tun.h detected at configure time. If TUN support is not
available, osmo_tundev_open() returns -ENOTSUP.

This keeps the public TUN API available while disabling unsupported
functionality in a capability-based way.

Change-Id: I6d1ea1644d12ef59a54cf2f73b9155def58b17a9
dtv.comp at

#19897 (Jan 25, 2026, 6:44:38 PM)

core: fix printf format casts for struct timeval fields

Explicitly cast struct timeval fields to long when passing them to
printf-style functions.

This avoids compiler warnings/errors on platforms where tv_sec or
tv_usec are not exactly of type long, while keeping the existing log
and control output unchanged.

Change-Id: Icac9e392c728948a7976970658e37f5e0da41709
dtv.comp at

#19896 (Jan 25, 2026, 6:44:37 PM)

core: remove SCTP include from osmo_io_internal.h

No functional changes intended.

Change-Id: Icd626d908192a954d55d76a46d7cc863ed332631
dtv.comp at

#19895 (Jan 25, 2026, 6:44:37 PM)

build: keep netns API public and gate features with HAVE_*

The netns API was previously guarded by platform-specific preprocessor
conditions (e.g. !EMBEDDED and defined(__linux__)), which caused the
netns headers and implementation to be entirely excluded from non-Linux
builds such as Emscripten. This in turn led to build failures in code
depending on the netns API, as the symbols and declarations were not
available at all.

Always build netns.c and keep the public declarations available
for non-embedded builds. Move platform/feature conditionals into the
implementation: guard the netns code paths with HAVE_SETNS/HAVE_UNSHARE/
HAVE_MOUNT and HAVE_CLONE_NEWNET, and return -ENOTSUP when the required
functionality is not available.

Add configure-time checks for the required headers/functions and for the
CLONE_NEWNET declaration, defining the
corresponding HAVE_* macros.

No functional changes intended for platforms where netns is available.

Change-Id: I2322eb2936bea35596f1fd6b6a713ea5f997b1ea
dtv.comp at

#19894 (Jan 25, 2026, 6:44:37 PM)

Add Emscripten build support and JS callback logging backend

This change enables building libosmocore for sandboxed, non-POSIX
environments, specifically WebAssembly targets produced via the
Emscripten toolchain.

The broader motivation is to allow partial execution of selected
Osmocom components in isolated runtime environments where direct access
to hardware and traditional operating system facilities (filesystem,
sockets, privileged execution) is not available.

One intended use case is running a GSM 2G base station where the
radio-facing components are executed inside a web environment, while
the remaining Osmocom stack and core network components continue to run
unchanged on a conventional backend server. In this model, highly
stripped-down variants of osmo-bts and osmo-trx are built as static
WebAssembly libraries and executed in the browser, while depending on
core libraries such as libosmocore, libosmo-netif, and libosmo-abis.

A practical advantage of this approach is that no deployment or
privileged setup is required on the radio endpoint side. A user can
instantiate a radio endpoint with minimal configuration, while all
stateful logic and operational complexity remains centralized on the
backend. Multiple such radio endpoints may connect to the same backend
core network, effectively forming a single logical network from the
core network perspective, independent of the physical location of the
radio endpoints.

Existing libosmocore build logic and platform assumptions rely on the
availability of POSIX APIs and OS services which are not present in
WebAssembly runtimes. This currently prevents libosmocore from being
built for such targets without targeted, build-time adjustments. This
patch introduces the minimal set of changes required to enable such
builds, without affecting native platforms.

As part of this groundwork, a minimal callback-based logging hook is
introduced. When building for Emscripten, this hook allows forwarding
log messages to an external environment via a user-provided JavaScript
callback. This enables integration with browser-side logging or UI
infrastructure without introducing new logging backends or runtime
dependencies. For all other build targets, the hook resolves to a no-op
implementation and does not alter existing logging behavior.

No runtime behavior, protocol semantics, or network interactions are
changed by this patch. All modifications are strictly limited to
build-time and platform-specific code paths and are only active when
targeting Emscripten. Native builds and existing deployment scenarios
remain unaffected.

This patch is intended as groundwork. Follow-up changes, proposed
separately and incrementally, may extend similar support to other
Osmocom components such as libosmo-netif, libosmo-abis, osmo-bts, and
osmo-trx, while keeping all such changes optional and isolated from
native builds.

Change-Id: Ia8d5f4bb6570b5e055826f3a051e5e5896866e31
dtv.comp at

#19893 (Jan 25, 2026, 6:44:35 PM)

vty: guard definition of _XOPEN_SOURCE

Define _XOPEN_SOURCE only if it is not already provided by the build
environment.

This avoids redefinition warnings/errors while ensuring required POSIX
interfaces are available.

Change-Id: I4f53aff1afef02abce7cb70d1b29080ba900ff41
dtv.comp at