Skip to content

Loading builds...

Changes

#21473 (Apr 8, 2026, 11:00:06 PM)

handover_fsm: send_handover_performed(): check lchan != NULL

The target lchan is expected to be valid on HO_RESULT_OK, but it's
still safer to check it against NULL before dereferencing.

Change-Id: Iee734c98dc79681808e7d75360c208a941cc6821
Related: 107391d8c ("handover_fsm: fix send_handover_performed() using wrong lchan")
Vadim Yanitskiy at

#21472 (Apr 8, 2026, 11:00:03 PM)

assignment_fsm: ipacc_chan_mode_supported(): log unsupported chan_mode

Change-Id: I1718994e25ff1349618bdb4660afbe735c5c3977
Related: aa959d74f ("assignment_fsm: check ipaccess channel mode support")
Vadim Yanitskiy at

#21471 (Apr 8, 2026, 11:00:02 PM)

handover_fsm: send_handover_performed(): check lchan != NULL

The target lchan is expected to be valid on HO_RESULT_OK, but it's
still safer to check it against NULL before dereferencing.

Change-Id: Iee734c98dc79681808e7d75360c208a941cc6821
Related: 107391d8c ("handover_fsm: fix send_handover_performed() using wrong lchan")
Vadim Yanitskiy at

#21470 (Apr 8, 2026, 11:00:01 PM)

assignment_fsm: ipacc_chan_mode_supported(): log unsupported chan_mode

Change-Id: I1718994e25ff1349618bdb4660afbe735c5c3977
Related: aa959d74f ("assignment_fsm: check ipaccess channel mode support")
Vadim Yanitskiy at

#21469 (Apr 7, 2026, 1:29:42 PM)

gprs_gmm: gsm48_rx_gmm_att_req(): drop stale PDP contexts on re-Attach

When an MS sends an Attach Request with a known IMSI or P-TMSI, it
implies the MS has restarted and lost all its PDP context state.  The
SGSN must clean up any PDP contexts it still holds for that subscriber;
otherwise it will not create new ones upon subsequent PDP Context
Activation, causing data connectivity failure after a device reboot.

Change-Id: I20c1f5f741275115635188b2f4b1c5fe7c6e40f1
Related: OS#6922
Vadim Yanitskiy at

#21468 (Apr 7, 2026, 1:29:40 PM)

gprs_gmm: gsm48_rx_gmm_att_req(): drop stale PDP contexts on re-Attach

When an MS sends an Attach Request with a known IMSI or P-TMSI, it
implies the MS has restarted and lost all its PDP context state.  The
SGSN must clean up any PDP contexts it still holds for that subscriber;
otherwise it will not create new ones upon subsequent PDP Context
Activation, causing data connectivity failure after a device reboot.

Change-Id: I20c1f5f741275115635188b2f4b1c5fe7c6e40f1
Related: OS#6922
Vadim Yanitskiy at

#21467 (Apr 7, 2026, 11:02:12 AM)

tests/osmo-sgsn_test-nodes.vty: add missing list entries

Change-Id: I6b4cbbae30c602d0fd4ef9b2f91c97f20217eb53
Vadim Yanitskiy at

#21466 (Apr 7, 2026, 11:02:11 AM)

gprs_sm: QoS: make max-sdu-size configurable

Some phones, such as the Sony Ericsson Z520, reject or ignore the
Activate PDP Context Accept if they dislike the max-sdu-size value
in the QoS profile.  Make this value configurable via the VTY so
it can be adjusted to accommodate such devices.

Change-Id: I0819da18dafecf322f8902643dae8dbcaa5dc98b
Related: OS#6735
Vadim Yanitskiy at

#21465 (Apr 7, 2026, 11:02:05 AM)

tests/osmo-sgsn_test-nodes.vty: add missing list entries

Change-Id: I6b4cbbae30c602d0fd4ef9b2f91c97f20217eb53
Vadim Yanitskiy at

#21464 (Apr 7, 2026, 11:02:02 AM)

gprs_sm: QoS: make max-sdu-size configurable

Some phones, such as the Sony Ericsson Z520, reject or ignore the
Activate PDP Context Accept if they dislike the max-sdu-size value
in the QoS profile.  Make this value configurable via the VTY so
it can be adjusted to accommodate such devices.

Change-Id: I0819da18dafecf322f8902643dae8dbcaa5dc98b
Related: OS#6735
Vadim Yanitskiy at

#21463 (Apr 7, 2026, 9:35:55 AM)

osmo-bts-omldummy: properly report NM_ATT_IPACC_SUPP_FEATURES

osmo-bts-omldummy is used as the OML backend in the ttcn3-bsc-test.
The common OML code encodes bts->support.* and trx->support.* fields
verbatim into the IPA Supported Features IE (NM_ATT_IPACC_SUPP_FEATURES)
in Get Attributes Responses.  Since bts_model_init() and
bts_model_trx_init() never initialized these fields, they were reported
as all-zeros to osmo-bsc.

osmo-bsc now inspects the supported channel modes before activating a
channel.  An all-zero chan_modes value (present but no bits set) causes
osmo-bsc to reject every speech mode, breaking all assignment-related
TTCN-3 test cases.

Initialize ciphers, gprs_codings, freq_bands, chan_types and chan_modes
to sensible values, matching what osmo-bts-virtual does, so that
osmo-bts-omldummy reports its capabilities correctly.

Change-Id: I7fe83f78c829c300e70a59509847b815a77974d7
Fixes: 0978d1df ("oml: implement handling of NM_ATT_IPACC_SUPP_FEATURES")
Related: OS#6324
Vadim Yanitskiy at

#21462 (Apr 7, 2026, 9:35:54 AM)

osmo-bts-omldummy: properly report NM_ATT_IPACC_SUPP_FEATURES

osmo-bts-omldummy is used as the OML backend in the ttcn3-bsc-test.
The common OML code encodes bts->support.* and trx->support.* fields
verbatim into the IPA Supported Features IE (NM_ATT_IPACC_SUPP_FEATURES)
in Get Attributes Responses.  Since bts_model_init() and
bts_model_trx_init() never initialized these fields, they were reported
as all-zeros to osmo-bsc.

osmo-bsc now inspects the supported channel modes before activating a
channel.  An all-zero chan_modes value (present but no bits set) causes
osmo-bsc to reject every speech mode, breaking all assignment-related
TTCN-3 test cases.

Initialize ciphers, gprs_codings, freq_bands, chan_types and chan_modes
to sensible values, matching what osmo-bts-virtual does, so that
osmo-bts-omldummy reports its capabilities correctly.

Change-Id: I7fe83f78c829c300e70a59509847b815a77974d7
Fixes: 0978d1df ("oml: implement handling of NM_ATT_IPACC_SUPP_FEATURES")
Related: OS#6324
Vadim Yanitskiy at

#21461 (Apr 6, 2026, 4:57:33 PM)

gprs_sm: QoS: make max-sdu-size configurable

Some phones, such as the Sony Ericsson Z520, reject or ignore the
Activate PDP Context Accept if they dislike the max-sdu-size value
in the QoS profile.  Make this value configurable via the VTY so
it can be adjusted to accommodate such devices.

Change-Id: I0819da18dafecf322f8902643dae8dbcaa5dc98b
Related: OS#6735
Vadim Yanitskiy at

#21460 (Apr 6, 2026, 4:57:33 PM)

tests/osmo-sgsn_test-nodes.vty: add missing list entries

Change-Id: I6b4cbbae30c602d0fd4ef9b2f91c97f20217eb53
Vadim Yanitskiy at

#21459 (Apr 6, 2026, 4:57:29 PM)

gprs_sm: QoS: make max-sdu-size configurable

Some phones, such as the Sony Ericsson Z520, reject or ignore the
Activate PDP Context Accept if they dislike the max-sdu-size value
in the QoS profile.  Make this value configurable via the VTY so
it can be adjusted to accommodate such devices.

Change-Id: I0819da18dafecf322f8902643dae8dbcaa5dc98b
Related: OS#6735
Vadim Yanitskiy at

#21458 (Apr 6, 2026, 4:57:28 PM)

tests/osmo-sgsn_test-nodes.vty: add missing list entries

Change-Id: I6b4cbbae30c602d0fd4ef9b2f91c97f20217eb53
Vadim Yanitskiy at

#21457 (Apr 6, 2026, 4:25:31 PM)

gprs_sm: gsm48_tx_gsm_act_pdp_acc(): fix QoS profile length

The Activate PDP Context Accept was always sending sizeof(default_qos)
(14 bytes) as the QoS profile length, regardless of what the UE
requested.  Older modules such as the Air20X may crash and restart
during PDP attachment because of that.

In GTP, qos_req.l encodes 1 ARP byte followed by the QoS profile
octets, so (qos_req.l - 1) is the actual profile length.  Mirror
back the same QoS profile length the UE sent in its request,
capped at sizeof(default_qos) to avoid overrunning the default_qos
buffer.  This matters in particular for R97/R98 UEs that send a
3-byte QoS profile and should not receive a 14-byte response.

Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
Related: OS#6922
Vadim Yanitskiy at

#21456 (Apr 6, 2026, 4:25:31 PM)

gprs_gmm: gsm48_rx_gmm_att_req(): drop stale PDP contexts on re-Attach

When an MS sends an Attach Request with a known IMSI or P-TMSI, it
implies the MS has restarted and lost all its PDP context state.  The
SGSN must clean up any PDP contexts it still holds for that subscriber;
otherwise it will not create new ones upon subsequent PDP Context
Activation, causing data connectivity failure after a device reboot.

Change-Id: I20c1f5f741275115635188b2f4b1c5fe7c6e40f1
Related: OS#6922
Vadim Yanitskiy at

#21455 (Apr 6, 2026, 4:25:29 PM)

gprs_sm: gsm48_tx_gsm_act_pdp_acc(): fix QoS profile length

The Activate PDP Context Accept was always sending sizeof(default_qos)
(14 bytes) as the QoS profile length, regardless of what the UE
requested.  Older modules such as the Air20X may crash and restart
during PDP attachment because of that.

In GTP, qos_req.l encodes 1 ARP byte followed by the QoS profile
octets, so (qos_req.l - 1) is the actual profile length.  Mirror
back the same QoS profile length the UE sent in its request,
capped at sizeof(default_qos) to avoid overrunning the default_qos
buffer.  This matters in particular for R97/R98 UEs that send a
3-byte QoS profile and should not receive a 14-byte response.

Change-Id: I11c24b64f0e49cf80c825969dbf018b2948d855c
Related: OS#6922
Vadim Yanitskiy at

#21454 (Apr 6, 2026, 4:25:28 PM)

gprs_gmm: gsm48_rx_gmm_att_req(): drop stale PDP contexts on re-Attach

When an MS sends an Attach Request with a known IMSI or P-TMSI, it
implies the MS has restarted and lost all its PDP context state.  The
SGSN must clean up any PDP contexts it still holds for that subscriber;
otherwise it will not create new ones upon subsequent PDP Context
Activation, causing data connectivity failure after a device reboot.

Change-Id: I20c1f5f741275115635188b2f4b1c5fe7c6e40f1
Related: OS#6922
Vadim Yanitskiy at

#21453 (Apr 6, 2026, 2:52:19 PM)

bssap: use LOGPFSML in bssmap_handle_assignm_req()

Change-Id: If99661c0ff1177214bacdb2d1bcb9da1d2d2957c
Vadim Yanitskiy at

#21452 (Apr 6, 2026, 2:49:11 PM)

lchan_fsm: don't mark lchan as BORKEN on unsupported mode NACK

When the BTS NACKs a Channel Activation with RSL_ERR_SERV_OPT_UNAVAIL
or RSL_ERR_SERV_OPT_UNIMPL, it means the requested service or channel
mode is not supported - not that the hardware is broken.  In this
case the lchan should transition to LCHAN_ST_WAIT_AFTER_ERROR rather
than LCHAN_ST_BORKEN, which is reserved for genuine hardware failures.

Also add LCHAN_EV_RTP_ERROR to LCHAN_ST_WAIT_AFTER_ERROR's in_event_mask
so that a late LCHAN_EV_RTP_ERROR (e.g. MGCP CRCX timeout arriving after
the NACK was already handled) is silently absorbed rather than triggering
an unexpected-event warning.

Change-Id: Ide3830a697501a0c245a41451302f1e68d553b3c
Related: osmo-ttcn3-hacks.git I000b7b44749380c5af4da42abe37b4ada6e06ee4
Related: OS#6324
Vadim Yanitskiy at

#21451 (Apr 6, 2026, 2:48:45 PM)

assignment_fsm: pass lchan to lchan_type_compat_with_mode()

The lchan pointer is needed by the next patch, which will check
the BTS ipaccess supported-features flags to reject channel modes
that the BTS has reported as unsupported before attempting to
activate the lchan.

Change-Id: I51d5d1a1cf3c51f85f738196967d5c69870681bb
Related: OS#6324
Vadim Yanitskiy at

#21450 (Apr 6, 2026, 2:48:39 PM)

bssap: mark some pointers as const

Change-Id: Iebb28d6ae0b468545994669248a442dd17f36d4c
Vadim Yanitskiy at

#21449 (Apr 6, 2026, 2:48:38 PM)

assignment_fsm: check ipaccess channel mode support

Add ipacc_chan_mode_supported(), which checks the NM_IPAC_F_CHANM_*
flags stored in the Baseband Transceiver's MO state (populated during
OML bring-up) to decide whether the BTS can handle a requested channel
mode.  If the IE containing supported channel modes was never received,
the function returns true as if the given mode was supported.

Without this change, requesting a channel mode not supported by the
BTS results in a NACK to the RSL Channel Activation, which causes
the lchan to be marked as BROKEN and thus unavailable.

Change-Id: I680ba7993786f5486d671f931e75df4543670a37
Related: OS#6324
Vadim Yanitskiy at

#21448 (Apr 6, 2026, 2:48:37 PM)

ipaccess: fix buffer overread in ipacc_parse_supp_flags()

The loop used OSMO_MAX(e->len, 4), which iterates at least 4 times
even when the IE is shorter than 4 bytes, causing a buffer overread.
Replace with OSMO_MIN(e->len, sizeof(u32)) to cap the iteration both
at the actual IE length and at the uint32_t accumulator size.

Change-Id: I97c69a71eb650cbef1cc3652d0a2a966cfd6cf60
Vadim Yanitskiy at

#21447 (Apr 6, 2026, 2:48:36 PM)

bssap: use LOGPFSML in bssmap_handle_ass_req_tp_codec_list()

Change-Id: Ie51ada174388f4c3e9ffe8a5bec4297bda38584b
Vadim Yanitskiy at

#21446 (Apr 6, 2026, 2:48:36 PM)

lchan_fsm: ignore late lchan_rtp_fsm events

The lchan_rtp_fsm is a child FSM that manages the MGW/RTP endpoint.
When the parent lchan_fsm transitions away before the child has
finished its work (e.g. a CRCX timeout or a DLCX completing after
the lchan is already idle), the child can still deliver
LCHAN_EV_RTP_RELEASED or LCHAN_EV_RTP_ERROR to the parent.

Currently these late events are not in the in_event_mask of every
state that can be reached with the child still running:

* LCHAN_ST_UNUSED: entered from WAIT_AFTER_ERROR after the error timer
  fires, while a DLCX triggered at error time may still be in flight.
* LCHAN_ST_WAIT_AFTER_ERROR: already handles LCHAN_EV_RTP_RELEASED but
  misses LCHAN_EV_RTP_ERROR (e.g. CRCX timeout arriving after the
  NACK was handled).

Add the missing events to both states' in_event_mask and provide a
no-op handler in lchan_fsm_unused() so that the assert is not hit.

Change-Id: Ie6333bd941e4e5a6ddf0e3f113b8764e8bc2bbc0
Vadim Yanitskiy at

#21445 (Apr 6, 2026, 2:47:45 PM)

ipaccess: store Supported Features IE to the MO state

Change-Id: Ic89d42c478677ffda4d544f461e7850dd3157040
Related: OS#6324
Vadim Yanitskiy at

#21444 (Apr 6, 2026, 2:47:44 PM)

handover_fsm: fix send_handover_performed() using wrong lchan

send_handover_performed() is called from handover_end() before
gscon_change_primary_lchan() updates conn->lchan to the new lchan.
As a result, the Cell Identifier, Chosen Channel, Chosen Encryption
Algorithm, and Speech Version/Codec IEs were all populated from the
source (old) lchan rather than the target (new) lchan.

As per 3GPP TS 48.008 §3.2.1.25, HANDOVER PERFORMED must report the
target cell and channel.  For intra-BSC handover to a different BTS
this caused the MSC to receive the wrong Cell Identifier.

Fix by initialising lchan from ho->new_lchan instead of conn->lchan,
and deriving the BTS via lchan->ts->trx->bts.

Change-Id: I4111351dc38fc2dbe844c2bd07b3ecfaaadd864e
Related: osmo-ttcn3-hacks.git I82aadcc3a80c183cb93522b829071294b156a218
Found-By: Claude Sonnet 4.6
Vadim Yanitskiy at

#21443 (Apr 6, 2026, 2:47:44 PM)

lchan_fsm: don't mark lchan as BORKEN on unsupported mode NACK

When the BTS NACKs a Channel Activation with RSL_ERR_SERV_OPT_UNAVAIL
or RSL_ERR_SERV_OPT_UNIMPL, it means the requested service or channel
mode is not supported - not that the hardware is broken.  In this
case the lchan should transition to LCHAN_ST_WAIT_AFTER_ERROR rather
than LCHAN_ST_BORKEN, which is reserved for genuine hardware failures.

Also add LCHAN_EV_RTP_ERROR to LCHAN_ST_WAIT_AFTER_ERROR's in_event_mask
so that a late LCHAN_EV_RTP_ERROR (e.g. MGCP CRCX timeout arriving after
the NACK was already handled) is silently absorbed rather than triggering
an unexpected-event warning.

Change-Id: Ide3830a697501a0c245a41451302f1e68d553b3c
Related: osmo-ttcn3-hacks.git I000b7b44749380c5af4da42abe37b4ada6e06ee4
Related: OS#6324
Vadim Yanitskiy at

#21442 (Apr 6, 2026, 2:44:49 PM)

assignment_fsm: pass lchan to lchan_type_compat_with_mode()

The lchan pointer is needed by the next patch, which will check
the BTS ipaccess supported-features flags to reject channel modes
that the BTS has reported as unsupported before attempting to
activate the lchan.

Change-Id: I51d5d1a1cf3c51f85f738196967d5c69870681bb
Related: OS#6324
Vadim Yanitskiy at

#21441 (Apr 6, 2026, 2:44:30 PM)

bssap: use LOGPFSML in bssmap_handle_assignm_req()

Change-Id: If99661c0ff1177214bacdb2d1bcb9da1d2d2957c
Vadim Yanitskiy at

#21440 (Apr 6, 2026, 2:44:26 PM)

bssap: mark some pointers as const

Change-Id: Iebb28d6ae0b468545994669248a442dd17f36d4c
Vadim Yanitskiy at

#21439 (Apr 6, 2026, 2:44:24 PM)

ipaccess: fix buffer overread in ipacc_parse_supp_flags()

The loop used OSMO_MAX(e->len, 4), which iterates at least 4 times
even when the IE is shorter than 4 bytes, causing a buffer overread.
Replace with OSMO_MIN(e->len, sizeof(u32)) to cap the iteration both
at the actual IE length and at the uint32_t accumulator size.

Change-Id: I97c69a71eb650cbef1cc3652d0a2a966cfd6cf60
Vadim Yanitskiy at

#21438 (Apr 6, 2026, 2:43:52 PM)

assignment_fsm: check ipaccess channel mode support

Add ipacc_chan_mode_supported(), which checks the NM_IPAC_F_CHANM_*
flags stored in the Baseband Transceiver's MO state (populated during
OML bring-up) to decide whether the BTS can handle a requested channel
mode.  If the IE containing supported channel modes was never received,
the function returns true as if the given mode was supported.

Without this change, requesting a channel mode not supported by the
BTS results in a NACK to the RSL Channel Activation, which causes
the lchan to be marked as BROKEN and thus unavailable.

Change-Id: I680ba7993786f5486d671f931e75df4543670a37
Related: OS#6324
Vadim Yanitskiy at

#21437 (Apr 6, 2026, 2:43:51 PM)

bssap: use LOGPFSML in bssmap_handle_ass_req_tp_codec_list()

Change-Id: Ie51ada174388f4c3e9ffe8a5bec4297bda38584b
Vadim Yanitskiy at

#21436 (Apr 6, 2026, 2:43:51 PM)

lchan_fsm: ignore late lchan_rtp_fsm events

The lchan_rtp_fsm is a child FSM that manages the MGW/RTP endpoint.
When the parent lchan_fsm transitions away before the child has
finished its work (e.g. a CRCX timeout or a DLCX completing after
the lchan is already idle), the child can still deliver
LCHAN_EV_RTP_RELEASED or LCHAN_EV_RTP_ERROR to the parent.

Currently these late events are not in the in_event_mask of every
state that can be reached with the child still running:

* LCHAN_ST_UNUSED: entered from WAIT_AFTER_ERROR after the error timer
  fires, while a DLCX triggered at error time may still be in flight.
* LCHAN_ST_WAIT_AFTER_ERROR: already handles LCHAN_EV_RTP_RELEASED but
  misses LCHAN_EV_RTP_ERROR (e.g. CRCX timeout arriving after the
  NACK was handled).

Add the missing events to both states' in_event_mask and provide a
no-op handler in lchan_fsm_unused() so that the assert is not hit.

Change-Id: Ie6333bd941e4e5a6ddf0e3f113b8764e8bc2bbc0
Vadim Yanitskiy at

#21435 (Apr 6, 2026, 2:43:51 PM)

handover_fsm: fix send_handover_performed() using wrong lchan

send_handover_performed() is called from handover_end() before
gscon_change_primary_lchan() updates conn->lchan to the new lchan.
As a result, the Cell Identifier, Chosen Channel, Chosen Encryption
Algorithm, and Speech Version/Codec IEs were all populated from the
source (old) lchan rather than the target (new) lchan.

As per 3GPP TS 48.008 §3.2.1.25, HANDOVER PERFORMED must report the
target cell and channel.  For intra-BSC handover to a different BTS
this caused the MSC to receive the wrong Cell Identifier.

Fix by initialising lchan from ho->new_lchan instead of conn->lchan,
and deriving the BTS via lchan->ts->trx->bts.

Change-Id: I4111351dc38fc2dbe844c2bd07b3ecfaaadd864e
Related: osmo-ttcn3-hacks.git I82aadcc3a80c183cb93522b829071294b156a218
Found-By: Claude Sonnet 4.6
Vadim Yanitskiy at

#21434 (Apr 6, 2026, 2:43:51 PM)

ipaccess: store Supported Features IE to the MO state

Change-Id: Ic89d42c478677ffda4d544f461e7850dd3157040
Related: OS#6324
Vadim Yanitskiy at

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

asp: Fix wrong variable logged in ss7_asp_xua_srv_conn_rx_cb()

Change-Id: I24206a19fe57772caf8036464a2e1b6b8630fd7a
Pau Espin Pedrol at

#21432 (Apr 1, 2026, 2:31:03 PM)

Support administrative block in role ASP

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

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

#21431 (Apr 1, 2026, 2:31:03 PM)

Create missing LayerManager fsm in dynamic srv xua asps

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

Change-Id: Id01e7a24e92aecc61aa2850632b3712bb338e9f2
Pau Espin Pedrol at

#21430 (Apr 1, 2026, 2:31:02 PM)

Support administrative block in role ASP

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

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

#21429 (Apr 1, 2026, 2:31:02 PM)

asp: Fix wrong variable logged in ss7_asp_xua_srv_conn_rx_cb()

Change-Id: I24206a19fe57772caf8036464a2e1b6b8630fd7a
Pau Espin Pedrol at

#21428 (Apr 1, 2026, 2:31:01 PM)

Create missing LayerManager fsm in dynamic srv xua asps

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

Change-Id: Id01e7a24e92aecc61aa2850632b3712bb338e9f2
Pau Espin Pedrol at

#21427 (Apr 1, 2026, 12:32:35 PM)

asp: Fix wrong variable logged in ss7_asp_xua_srv_conn_rx_cb()

Change-Id: I24206a19fe57772caf8036464a2e1b6b8630fd7a
Pau Espin Pedrol at

#21426 (Apr 1, 2026, 12:31:44 PM)

cosmetic: xua_asp_fsm: Fix wrong indentation

Change-Id: I21c13ff7bc67c060e739eae38088ac00700680de
Pau Espin Pedrol at

#21425 (Apr 1, 2026, 12:31:44 PM)

Create missing LayerManager fsm in dynamic srv xua asps

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

Change-Id: Id01e7a24e92aecc61aa2850632b3712bb338e9f2
Pau Espin Pedrol at

#21424 (Apr 1, 2026, 12:31:44 PM)

xua_lm: Add S_INACTIVE state and improve state transitions

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

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

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

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

Change-Id: I7e6127c150e479d0c436875b41824b3061e4fa48
Pau Espin Pedrol at

#21423 (Apr 1, 2026, 12:31:41 PM)

Support administrative block in role ASP

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

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

#21422 (Apr 1, 2026, 12:31:41 PM)

asp: Fix wrong variable logged in ss7_asp_xua_srv_conn_rx_cb()

Change-Id: I24206a19fe57772caf8036464a2e1b6b8630fd7a
Pau Espin Pedrol at

#21421 (Apr 1, 2026, 12:31:37 PM)

Create missing LayerManager fsm in dynamic srv xua asps

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

Change-Id: Id01e7a24e92aecc61aa2850632b3712bb338e9f2
Pau Espin Pedrol at

#21420 (Apr 1, 2026, 12:31:37 PM)

xua_lm: Add S_INACTIVE state and improve state transitions

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

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

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

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

Change-Id: I7e6127c150e479d0c436875b41824b3061e4fa48
Pau Espin Pedrol at

#21419 (Apr 1, 2026, 12:31:36 PM)

cosmetic: xua_asp_fsm: Fix wrong indentation

Change-Id: I21c13ff7bc67c060e739eae38088ac00700680de
Pau Espin Pedrol at

#21418 (Apr 1, 2026, 12:31:36 PM)

Support administrative block in role ASP

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

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

#21417 (Apr 1, 2026, 12:17:16 PM)

asp: Fix wrong variable logged in ss7_asp_xua_srv_conn_rx_cb()

Change-Id: I24206a19fe57772caf8036464a2e1b6b8630fd7a
Pau Espin Pedrol at

#21416 (Apr 1, 2026, 12:16:43 PM)

asp: Fix wrong variable logged in ss7_asp_xua_srv_conn_rx_cb()

Change-Id: I24206a19fe57772caf8036464a2e1b6b8630fd7a
Pau Espin Pedrol at

#21415 (Apr 1, 2026, 12:02:42 PM)

Support administrative block in role ASP

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

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

#21414 (Apr 1, 2026, 12:02:40 PM)

Create missing LayerManager fsm in dynamic srv xua asps

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

Change-Id: Id01e7a24e92aecc61aa2850632b3712bb338e9f2
Pau Espin Pedrol at

#21413 (Apr 1, 2026, 12:02:40 PM)

Support administrative block in role ASP

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

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

#21412 (Apr 1, 2026, 12:02:35 PM)

Create missing LayerManager fsm in dynamic srv xua asps

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

Change-Id: Id01e7a24e92aecc61aa2850632b3712bb338e9f2
Pau Espin Pedrol at

#21411 (Apr 1, 2026, 10:10:10 AM)

Support administrative block in role ASP

Change-Id: If32902575e874d2acc9a5fc12509af42ed151739
Pau Espin Pedrol at

#21410 (Apr 1, 2026, 10:10:09 AM)

cosmetic: xua_asp_fsm: Fix wrong indentation

Change-Id: I21c13ff7bc67c060e739eae38088ac00700680de
Pau Espin Pedrol at

#21409 (Apr 1, 2026, 10:09:58 AM)

Support administrative block in role ASP

Change-Id: If32902575e874d2acc9a5fc12509af42ed151739
Pau Espin Pedrol at

#21408 (Apr 1, 2026, 10:09:45 AM)

cosmetic: xua_asp_fsm: Fix wrong indentation

Change-Id: I21c13ff7bc67c060e739eae38088ac00700680de
Pau Espin Pedrol at

#21407 (Apr 1, 2026, 9:47:13 AM)

xua_lm: Add S_INACTIVE state and improve state transitions

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

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

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

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

Change-Id: I7e6127c150e479d0c436875b41824b3061e4fa48
Pau Espin Pedrol at

#21406 (Apr 1, 2026, 9:47:11 AM)

xua_lm: Add S_INACTIVE state and improve state transitions

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

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

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

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

Change-Id: I7e6127c150e479d0c436875b41824b3061e4fa48
Pau Espin Pedrol at

#21405 (Apr 1, 2026, 8:43:46 AM)

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

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

Change-Id: If8e34cfb05b8b63173b8bb01a520c058daf1fe39
Pau Espin Pedrol at

#21404 (Apr 1, 2026, 8:43:46 AM)

xua_lm: Handle M-Error.ind

Change-Id: I5bdba1ab09084b3eafcb8b4aaa9c9762b15e8583
Pau Espin Pedrol at

#21403 (Apr 1, 2026, 8:43:43 AM)

xua_rkm: send_reg_req: Avoid adding Routing Context with value 0

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

Change-Id: Iaa584fea3020af06951aea16e638ac6e6a84ae21
Pau Espin Pedrol at

#21402 (Apr 1, 2026, 8:42:47 AM)

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

Change-Id: I5850d9ec9092ff3d099627856697a4184b0d5853
Pau Espin Pedrol at

#21401 (Apr 1, 2026, 8:42:45 AM)

xua_lm: Handle rx of unsolicited ASPIA ACK

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

#21400 (Apr 1, 2026, 8:42:45 AM)

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

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

Change-Id: I93d74dd7f6ea8f2e60a8bc41be15362e433e8962
Pau Espin Pedrol at

#21399 (Apr 1, 2026, 8:42:44 AM)

Use osmo_ss7_asp_active() in several places

Change-Id: I172e691cb61ac68e2410b44e124737f7a4dd2775
Pau Espin Pedrol at

#21398 (Apr 1, 2026, 8:42:37 AM)

xua_lm: Fix ending up from active to idle forever

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

Change-Id: I5c97c0ede9c27c63f9259b43b7267a3d5d71681d
Pau Espin Pedrol at

#21397 (Apr 1, 2026, 8:42:37 AM)

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

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

Change-Id: Icaeb472fe67911eb15755442cf11010d3c593f1d
Pau Espin Pedrol at

#21396 (Apr 1, 2026, 8:42:36 AM)

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

Change-Id: I81a4df1a826fed2f24a4c7ca410b514b1251b44d
Pau Espin Pedrol at

#21395 (Apr 1, 2026, 8:42:36 AM)

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

Change-Id: I582855acaced48fb838700a3013f94bee7db75ad
Pau Espin Pedrol at

#21394 (Apr 1, 2026, 8:42:35 AM)

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

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

Change-Id: If8e34cfb05b8b63173b8bb01a520c058daf1fe39
Pau Espin Pedrol at

#21393 (Apr 1, 2026, 8:42:34 AM)

xua_lm: Handle M-Error.ind

Change-Id: I5bdba1ab09084b3eafcb8b4aaa9c9762b15e8583
Pau Espin Pedrol at

#21392 (Apr 1, 2026, 8:41:30 AM)

xua_lm: Fix ending up from active to idle forever

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

Change-Id: I5c97c0ede9c27c63f9259b43b7267a3d5d71681d
Pau Espin Pedrol at

#21391 (Apr 1, 2026, 8:41:30 AM)

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

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

Change-Id: I93d74dd7f6ea8f2e60a8bc41be15362e433e8962
Pau Espin Pedrol at

#21390 (Apr 1, 2026, 8:41:30 AM)

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

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

Change-Id: Icaeb472fe67911eb15755442cf11010d3c593f1d
Pau Espin Pedrol at

#21389 (Apr 1, 2026, 8:41:29 AM)

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

Change-Id: I5850d9ec9092ff3d099627856697a4184b0d5853
Pau Espin Pedrol at

#21388 (Apr 1, 2026, 8:41:29 AM)

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

Change-Id: I582855acaced48fb838700a3013f94bee7db75ad
Pau Espin Pedrol at

#21387 (Apr 1, 2026, 8:41:29 AM)

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

Change-Id: I81a4df1a826fed2f24a4c7ca410b514b1251b44d
Pau Espin Pedrol at

#21386 (Apr 1, 2026, 8:41:28 AM)

xua_lm: Handle rx of unsolicited ASPIA ACK

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

#21385 (Apr 1, 2026, 8:41:28 AM)

Use osmo_ss7_asp_active() in several places

Change-Id: I172e691cb61ac68e2410b44e124737f7a4dd2775
Pau Espin Pedrol at

#21384 (Apr 1, 2026, 8:41:28 AM)

xua_rkm: send_reg_req: Avoid adding Routing Context with value 0

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

Change-Id: Iaa584fea3020af06951aea16e638ac6e6a84ae21
Pau Espin Pedrol at

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

Use osmo_ss7_asp_active() in several places

Change-Id: I172e691cb61ac68e2410b44e124737f7a4dd2775
Pau Espin Pedrol at

#21382 (Apr 1, 2026, 7:32:06 AM)

Use osmo_ss7_asp_active() in several places

Change-Id: I172e691cb61ac68e2410b44e124737f7a4dd2775
Pau Espin Pedrol at

#21381 (Mar 31, 2026, 3:49:41 PM)

xua_rkm: send_reg_req: Avoid adding Routing Context with value 0

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

Change-Id: Iaa584fea3020af06951aea16e638ac6e6a84ae21
Pau Espin Pedrol at

#21380 (Mar 31, 2026, 3:49:40 PM)

xua_rkm: send_reg_req: Avoid adding Routing Context with value 0

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

Change-Id: Iaa584fea3020af06951aea16e638ac6e6a84ae21
Pau Espin Pedrol at

#21379 (Mar 31, 2026, 3:49:40 PM)

xua_lm: Handle rx of unsolicited ASPIA ACK

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

#21378 (Mar 31, 2026, 3:49:40 PM)

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

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

Change-Id: Icaeb472fe67911eb15755442cf11010d3c593f1d
Pau Espin Pedrol at

#21377 (Mar 31, 2026, 3:49:37 PM)

xua_lm: Handle rx of unsolicited ASPIA ACK

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

#21376 (Mar 31, 2026, 3:49:37 PM)

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

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

Change-Id: Icaeb472fe67911eb15755442cf11010d3c593f1d
Pau Espin Pedrol at

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

xua_rkm: send_reg_req: Avoid adding Routing Context with value 0

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

Change-Id: Iaa584fea3020af06951aea16e638ac6e6a84ae21
Pau Espin Pedrol at

#21374 (Mar 31, 2026, 2:38:07 PM)

xua_rkm: send_reg_req: Avoid adding Routing Context with value 0

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

Change-Id: Iaa584fea3020af06951aea16e638ac6e6a84ae21
Pau Espin Pedrol at

#21373 (Mar 31, 2026, 1:44:28 PM)

xua_lm: Fix ending up from active to idle forever

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

Change-Id: I5c97c0ede9c27c63f9259b43b7267a3d5d71681d
Pau Espin Pedrol at

#21372 (Mar 31, 2026, 1:44:21 PM)

xua_lm: Handle M-Error.ind

Change-Id: I5bdba1ab09084b3eafcb8b4aaa9c9762b15e8583
Pau Espin Pedrol at

#21371 (Mar 31, 2026, 1:44:19 PM)

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

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

Change-Id: I93d74dd7f6ea8f2e60a8bc41be15362e433e8962
Pau Espin Pedrol at

#21370 (Mar 31, 2026, 1:44:18 PM)

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

Change-Id: I5850d9ec9092ff3d099627856697a4184b0d5853
Pau Espin Pedrol at

#21369 (Mar 31, 2026, 1:43:42 PM)

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

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

Change-Id: Ia8bff16248967209d73cd6d5b54ac30fda283247
Pau Espin Pedrol at

#21368 (Mar 31, 2026, 1:43:41 PM)

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

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

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

Change-Id: If821109701e315d17f5334c680670ea6c7bce3bd
Pau Espin Pedrol at

#21367 (Mar 31, 2026, 1:43:35 PM)

xua_as_fsm: Remove FIXME regarding queueing of msgs during state PENDING

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

Change-Id: Ie572367493066039f7022250d94b815a4da5bd16
Pau Espin Pedrol at

#21366 (Mar 31, 2026, 1:43:35 PM)

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

Reject received ASPACs when the asp is administratively blocked.

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

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

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

#21365 (Mar 31, 2026, 1:43:31 PM)

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

Change-Id: I81a4df1a826fed2f24a4c7ca410b514b1251b44d
Pau Espin Pedrol at

#21364 (Mar 31, 2026, 1:43:21 PM)

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

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

Change-Id: If8e34cfb05b8b63173b8bb01a520c058daf1fe39
Pau Espin Pedrol at

#21363 (Mar 31, 2026, 1:43:13 PM)

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

Change-Id: I582855acaced48fb838700a3013f94bee7db75ad
Pau Espin Pedrol at

#21362 (Mar 31, 2026, 1:42:55 PM)

xua_lm: Fix ending up from active to idle forever

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

Change-Id: I5c97c0ede9c27c63f9259b43b7267a3d5d71681d
Pau Espin Pedrol at

#21361 (Mar 31, 2026, 1:42:54 PM)

xua_lm: Handle M-Error.ind

Change-Id: I5bdba1ab09084b3eafcb8b4aaa9c9762b15e8583
Pau Espin Pedrol at

#21360 (Mar 31, 2026, 1:42:51 PM)

xua_as_fsm: Remove FIXME regarding queueing of msgs during state PENDING

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

Change-Id: Ie572367493066039f7022250d94b815a4da5bd16
Pau Espin Pedrol at

#21359 (Mar 31, 2026, 1:42:28 PM)

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

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

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

Change-Id: If821109701e315d17f5334c680670ea6c7bce3bd
Pau Espin Pedrol at

#21358 (Mar 31, 2026, 1:42:28 PM)

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

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

Change-Id: I93d74dd7f6ea8f2e60a8bc41be15362e433e8962
Pau Espin Pedrol at

#21357 (Mar 31, 2026, 1:42:23 PM)

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

Reject received ASPACs when the asp is administratively blocked.

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

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

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

#21356 (Mar 31, 2026, 1:42:07 PM)

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

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

Change-Id: Ia8bff16248967209d73cd6d5b54ac30fda283247
Pau Espin Pedrol at

#21355 (Mar 31, 2026, 1:42:01 PM)

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

Change-Id: I5850d9ec9092ff3d099627856697a4184b0d5853
Pau Espin Pedrol at

#21354 (Mar 31, 2026, 1:41:24 PM)

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

Change-Id: I81a4df1a826fed2f24a4c7ca410b514b1251b44d
Pau Espin Pedrol at

#21353 (Mar 31, 2026, 1:41:23 PM)

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

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

Change-Id: If8e34cfb05b8b63173b8bb01a520c058daf1fe39
Pau Espin Pedrol at

#21352 (Mar 31, 2026, 1:41:04 PM)

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

Change-Id: I582855acaced48fb838700a3013f94bee7db75ad
Pau Espin Pedrol at

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

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

Change-Id: I14c3092a3feac5661d03b9b9114889b348b11bb1
Pau Espin Pedrol at

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

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

Change-Id: I14c3092a3feac5661d03b9b9114889b348b11bb1
Pau Espin Pedrol at

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

xua_as_fsm: Remove FIXME regarding queueing of msgs during state PENDING

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

Change-Id: Ie572367493066039f7022250d94b815a4da5bd16
Pau Espin Pedrol at

#21348 (Mar 31, 2026, 9:50:39 AM)

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

Reject received ASPACs when the asp is administratively blocked.

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

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

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

#21347 (Mar 31, 2026, 9:50:38 AM)

xua_as_fsm: Remove FIXME regarding queueing of msgs during state PENDING

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

Change-Id: Ie572367493066039f7022250d94b815a4da5bd16
Pau Espin Pedrol at

#21346 (Mar 31, 2026, 9:50:37 AM)

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

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

Change-Id: If8e34cfb05b8b63173b8bb01a520c058daf1fe39
Pau Espin Pedrol at

#21345 (Mar 31, 2026, 9:50:37 AM)

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

Reject received ASPACs when the asp is administratively blocked.

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

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

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

#21344 (Mar 31, 2026, 9:50:36 AM)

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

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

Change-Id: If8e34cfb05b8b63173b8bb01a520c058daf1fe39
Pau Espin Pedrol at

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

tlv: Allow control over comprehension bit in COMPR_TLV_IE

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

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

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

#21342 (Mar 31, 2026, 7:48:14 AM)

tlv: Remove unused branch

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

Change-Id: Ia6a0656721a1fcaf5f16526fefe62c30b0ddb664
dwillmann at

#21341 (Mar 31, 2026, 7:48:11 AM)

tlv: Allow control over comprehension bit in COMPR_TLV_IE

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

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

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

#21340 (Mar 31, 2026, 7:48:11 AM)

tlv: Remove unused branch

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

Change-Id: Ia6a0656721a1fcaf5f16526fefe62c30b0ddb664
dwillmann at

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

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

Reject received ASPACs when the asp is administratively blocked.

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

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

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

#21338 (Mar 30, 2026, 2:42:37 PM)

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

Reject received ASPACs when the asp is administratively blocked.

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

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

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

#21337 (Mar 30, 2026, 12:22:33 PM)

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

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

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

Change-Id: If821109701e315d17f5334c680670ea6c7bce3bd
Pau Espin Pedrol at

#21336 (Mar 30, 2026, 12:22:32 PM)

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

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

Change-Id: Ia8bff16248967209d73cd6d5b54ac30fda283247
Pau Espin Pedrol at

#21335 (Mar 30, 2026, 12:22:30 PM)

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

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

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

Change-Id: If821109701e315d17f5334c680670ea6c7bce3bd
Pau Espin Pedrol at

#21334 (Mar 30, 2026, 12:22:30 PM)

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

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

Change-Id: Ia8bff16248967209d73cd6d5b54ac30fda283247
Pau Espin Pedrol at

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

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

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

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

Change-Id: If821109701e315d17f5334c680670ea6c7bce3bd
Pau Espin Pedrol at

#21332 (Mar 30, 2026, 12:13:17 PM)

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

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

Change-Id: Ia8bff16248967209d73cd6d5b54ac30fda283247
Pau Espin Pedrol at

#21331 (Mar 30, 2026, 12:13:17 PM)

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

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

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

Change-Id: If821109701e315d17f5334c680670ea6c7bce3bd
Pau Espin Pedrol at

#21330 (Mar 30, 2026, 12:13:14 PM)

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

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

Change-Id: Ia8bff16248967209d73cd6d5b54ac30fda283247
Pau Espin Pedrol at

#21329 (Mar 30, 2026, 11:29:45 AM)

xua: Split traffic mode readonly validation from internal state update

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

Change-Id: I05ba891e774ebe341229b968c92e0383b6899bd6
Pau Espin Pedrol at

#21328 (Mar 30, 2026, 11:29:15 AM)

xua_find_as_for_asp(): Optimize lookup

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

Change-Id: If85ad27ad5e55be0c22e2716fa7329409a7b85b5
Pau Espin Pedrol at

#21327 (Mar 30, 2026, 11:29:13 AM)

asp_vty: Fix wrong vty write 'blocked' command

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

Change-Id: Ia42a064cfdbba025bc3ae5479e8e6edec4abe770
Pau Espin Pedrol at

#21326 (Mar 30, 2026, 11:29:08 AM)

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

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

Change-Id: Ie10f4048d0af384dc84c79e6fc441c8537649d55
Pau Espin Pedrol at

#21325 (Mar 30, 2026, 11:28:12 AM)

asp: Configure block and shutdown adm state independently

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

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

#21324 (Mar 30, 2026, 11:28:04 AM)

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

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

Change-Id: I40719527c527db58244972a797c4287107306532
Pau Espin Pedrol at

#21323 (Mar 30, 2026, 11:28:02 AM)

handle_rkey_dereg(): Optimize lookup

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

Change-Id: I56ac5caef9bcded9dd08ca532a413af94070a1bd
Pau Espin Pedrol at

#21322 (Mar 30, 2026, 11:28:02 AM)

xua: Split traffic mode readonly validation from internal state update

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

Change-Id: I05ba891e774ebe341229b968c92e0383b6899bd6
Pau Espin Pedrol at

#21321 (Mar 30, 2026, 11:28:02 AM)

xua_asp_fsm: XUA_ASP_E_ASPTM_ASPAC: Validate RCTX AS is associated to ASP

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

Change-Id: Idcd51b9bbe38064ed03d076a76279384a3927334
Pau Espin Pedrol at

#21320 (Mar 30, 2026, 11:28:01 AM)

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

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

Change-Id: Ie10f4048d0af384dc84c79e6fc441c8537649d55
Pau Espin Pedrol at

#21319 (Mar 30, 2026, 11:28:01 AM)

asp: Configure block and shutdown adm state independently

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

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

#21318 (Mar 30, 2026, 11:28:00 AM)

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

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

Change-Id: I40719527c527db58244972a797c4287107306532
Pau Espin Pedrol at

#21317 (Mar 30, 2026, 11:27:59 AM)

xua_find_as_for_asp(): Optimize lookup

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

Change-Id: If85ad27ad5e55be0c22e2716fa7329409a7b85b5
Pau Espin Pedrol at

#21316 (Mar 30, 2026, 11:27:57 AM)

asp_vty: Fix wrong vty write 'blocked' command

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

Change-Id: Ia42a064cfdbba025bc3ae5479e8e6edec4abe770
Pau Espin Pedrol at

#21315 (Mar 30, 2026, 11:27:54 AM)

xua_asp_fsm: XUA_ASP_E_ASPTM_ASPAC: Validate RCTX AS is associated to ASP

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

Change-Id: Idcd51b9bbe38064ed03d076a76279384a3927334
Pau Espin Pedrol at

#21314 (Mar 30, 2026, 11:27:53 AM)

handle_rkey_dereg(): Optimize lookup

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

Change-Id: I56ac5caef9bcded9dd08ca532a413af94070a1bd
Pau Espin Pedrol at

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

struct trx_power_params: fix inaccurate comment

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

#21312 (Mar 30, 2026, 9:49:57 AM)

struct trx_power_params: fix inaccurate comment

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

#21311 (Mar 29, 2026, 1:47:53 PM)

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

Change-Id: Ibf35c468310a690fd873cf968bb2c44b493ca5ea
Vadim Yanitskiy at

#21310 (Mar 29, 2026, 1:47:52 PM)

bts_shutdown_fsm: fix spurious RAMP_COMPL events in WAIT_TRX_CLOSED

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

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

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

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

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

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

Change-Id: Ia71393e871187d6b44b7f520eb421bab354aafd1
Vadim Yanitskiy at

#21309 (Mar 29, 2026, 1:47:51 PM)

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

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

Change-Id: I4cdc03dc6631ca17d13a3067ad03020e3e97eab1
Vadim Yanitskiy at

#21308 (Mar 29, 2026, 1:47:46 PM)

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

Change-Id: Ibf35c468310a690fd873cf968bb2c44b493ca5ea
Vadim Yanitskiy at

#21307 (Mar 29, 2026, 1:47:44 PM)

bts_shutdown_fsm: fix spurious RAMP_COMPL events in WAIT_TRX_CLOSED

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

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

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

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

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

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

Change-Id: Ia71393e871187d6b44b7f520eb421bab354aafd1
Vadim Yanitskiy at

#21306 (Mar 29, 2026, 1:47:42 PM)

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

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

Change-Id: I4cdc03dc6631ca17d13a3067ad03020e3e97eab1
Vadim Yanitskiy at

#21305 (Mar 27, 2026, 5:24:43 PM)

nokia_site: add objects to query TRX power and power steps

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

Change-Id: Ib5a00c0b528407144cca88e5cbde940d7a5509f0
metro4 at

#21304 (Mar 27, 2026, 5:24:43 PM)

nokia_site: add objects to query TRX power and power steps

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

Change-Id: Ib5a00c0b528407144cca88e5cbde940d7a5509f0
metro4 at

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

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

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

Change-Id: I3dc399cfae70c450d53d66bb99f3832f160fca39
Vadim Yanitskiy at

#21302 (Mar 27, 2026, 7:41:37 AM)

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

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

Change-Id: I3dc399cfae70c450d53d66bb99f3832f160fca39
Vadim Yanitskiy at

#21301 (Mar 26, 2026, 9:44:37 PM)

l1sap: check_for_ciph_cmd(): add missing msgb length check

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

Change-Id: I47690f1a6357e42913bfa8100e36c05cb4f0607a
Vadim Yanitskiy at

#21300 (Mar 26, 2026, 9:44:33 PM)

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

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

Change-Id: Iec722198f161621dd00ce3baabb732e1a1d91a37
Vadim Yanitskiy at

#21299 (Mar 26, 2026, 9:44:33 PM)

scheduler: trx_sched_is_sacch_fn(): fix returning non-bool

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

Change-Id: Ib2394687815aed4990c3880446176e4c97440667
Vadim Yanitskiy at

#21298 (Mar 26, 2026, 9:44:31 PM)

measurement: is_meas_complete(): fix fn_mod variable type

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

Change-Id: I6b0bce9bc9fca1d6effbb2da2319132cdff4e9c7
Vadim Yanitskiy at

#21297 (Mar 26, 2026, 9:44:23 PM)

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

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

Change-Id: I3dc399cfae70c450d53d66bb99f3832f160fca39
Vadim Yanitskiy at

#21296 (Mar 26, 2026, 9:44:22 PM)

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

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

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

Change-Id: I70c54652e0b07d399363276bc60946aa8b195725
Vadim Yanitskiy at

#21295 (Mar 26, 2026, 9:42:55 PM)

bts_ctrl_commands: remove debugging leftover

Change-Id: I571a10f94482e3097aa915f192db6215f085dbcd
Vadim Yanitskiy at

#21294 (Mar 26, 2026, 9:42:49 PM)

phy_link: phy_instance_link_to_trx(): add missing semicolon

Change-Id: Ica33798adfdc5aad6b6aa9e252e9cc9294bad659
Vadim Yanitskiy at

#21293 (Mar 26, 2026, 9:42:48 PM)

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

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

Change-Id: I79e9d7f5b1e5c275911cf88854211f1ce8a28669
Vadim Yanitskiy at

#21292 (Mar 26, 2026, 9:42:48 PM)

l1sap: check_for_ciph_cmd(): add missing msgb length check

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

Change-Id: I47690f1a6357e42913bfa8100e36c05cb4f0607a
Vadim Yanitskiy at

#21291 (Mar 26, 2026, 9:42:47 PM)

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

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

Change-Id: Iec722198f161621dd00ce3baabb732e1a1d91a37
Vadim Yanitskiy at

#21290 (Mar 26, 2026, 9:42:47 PM)

scheduler: trx_sched_is_sacch_fn(): fix returning non-bool

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

Change-Id: Ib2394687815aed4990c3880446176e4c97440667
Vadim Yanitskiy at

#21289 (Mar 26, 2026, 9:42:46 PM)

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

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

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

Change-Id: I70c54652e0b07d399363276bc60946aa8b195725
Vadim Yanitskiy at

#21288 (Mar 26, 2026, 9:42:46 PM)

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

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

Change-Id: I3dc399cfae70c450d53d66bb99f3832f160fca39
Vadim Yanitskiy at

#21287 (Mar 26, 2026, 9:42:45 PM)

measurement: is_meas_complete(): fix fn_mod variable type

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

Change-Id: I6b0bce9bc9fca1d6effbb2da2319132cdff4e9c7
Vadim Yanitskiy at

#21286 (Mar 26, 2026, 9:42:45 PM)

bts_ctrl_commands: remove debugging leftover

Change-Id: I571a10f94482e3097aa915f192db6215f085dbcd
Vadim Yanitskiy at

#21285 (Mar 26, 2026, 9:42:44 PM)

phy_link: phy_instance_link_to_trx(): add missing semicolon

Change-Id: Ica33798adfdc5aad6b6aa9e252e9cc9294bad659
Vadim Yanitskiy at

#21284 (Mar 26, 2026, 9:42:44 PM)

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

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

Change-Id: I79e9d7f5b1e5c275911cf88854211f1ce8a28669
Vadim Yanitskiy at

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

Implement ITU Q.704 T10 timer

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

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

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

#21282 (Mar 26, 2026, 3:13:28 PM)

Implement ITU Q.704 T10 timer

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

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

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

#21281 (Mar 26, 2026, 1:14:05 PM)

cosmetic: xua_snm: Add spec reference regarding no SSNM tx

Change-Id: I69912d5b7032c12e06648e5f5a700384182bb1f9
Pau Espin Pedrol at

#21280 (Mar 26, 2026, 1:14:05 PM)

cosmetic: xua_snm: Add spec reference regarding no SSNM tx

Change-Id: I69912d5b7032c12e06648e5f5a700384182bb1f9
Pau Espin Pedrol at

#21279 (Mar 26, 2026, 1:13:14 PM)

cosmetic: xua_snm: Add spec reference regarding no SSNM tx

Change-Id: I69912d5b7032c12e06648e5f5a700384182bb1f9
Pau Espin Pedrol at

#21278 (Mar 26, 2026, 1:13:10 PM)

cosmetic: xua_snm: Add spec reference regarding no SSNM tx

Change-Id: I69912d5b7032c12e06648e5f5a700384182bb1f9
Pau Espin Pedrol at

#21277 (Mar 25, 2026, 10:31:34 PM)

pfcp_peer: detect UPF restart via RTS mismatch in Heartbeat Response

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

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

Change-Id: I00a8384db1ea9c38d0ad9ff90b3d45ad86c3a020
Vadim Yanitskiy at

#21276 (Mar 25, 2026, 10:31:33 PM)

pfcp_peer: add configurable heartbeat fail threshold + association reset

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

Change-Id: I8cb0fb23468aba4dead9865a90d893c78c6ae074
Vadim Yanitskiy at

#21275 (Mar 25, 2026, 10:31:32 PM)

pfcp_peer: tune Heartbeat Request/Response logging

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

Change-Id: I6435cdf64fd86fa5358d57ea4d56dcad8eb9e69e
Vadim Yanitskiy at

#21274 (Mar 25, 2026, 10:31:31 PM)

pfcp_peer: implement periodic PFCP heartbeat

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

Change-Id: I306324f8eca325202a3fa23125854db9d5eaab38
Vadim Yanitskiy at

#21273 (Mar 25, 2026, 10:31:31 PM)

pfcp_peer: detect UPF restart via RTS mismatch in Heartbeat Response

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

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

Change-Id: I00a8384db1ea9c38d0ad9ff90b3d45ad86c3a020
Vadim Yanitskiy at

#21272 (Mar 25, 2026, 10:31:31 PM)

pfcp_peer: add configurable heartbeat fail threshold + association reset

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

Change-Id: I8cb0fb23468aba4dead9865a90d893c78c6ae074
Vadim Yanitskiy at

#21271 (Mar 25, 2026, 10:31:30 PM)

pfcp_peer: tune Heartbeat Request/Response logging

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

Change-Id: I6435cdf64fd86fa5358d57ea4d56dcad8eb9e69e
Vadim Yanitskiy at

#21270 (Mar 25, 2026, 10:31:30 PM)

pfcp_peer: implement periodic PFCP heartbeat

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

Change-Id: I306324f8eca325202a3fa23125854db9d5eaab38
Vadim Yanitskiy at

#21269 (Mar 25, 2026, 9:38:18 PM)

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

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

Change-Id: I288ea70091d24fa95732f7035ab50100831be841
lynxis at

#21268 (Mar 25, 2026, 9:38:15 PM)

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

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

Change-Id: I288ea70091d24fa95732f7035ab50100831be841
lynxis at

#21267 (Mar 25, 2026, 1:18:25 PM)

gtp_tunnel: Log Tx of ICMPv6 Router Solicitation

Change-Id: I5883a0e399e47b6e169c5adf8446e9d2aeecbe68
Pau Espin Pedrol at

#21266 (Mar 25, 2026, 1:18:22 PM)

gtp_tunnel: Log Tx of ICMPv6 Router Solicitation

Change-Id: I5883a0e399e47b6e169c5adf8446e9d2aeecbe68
Pau Espin Pedrol at

#21265 (Mar 25, 2026, 1:03:06 PM)

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

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

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

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

#21264 (Mar 25, 2026, 1:03:05 PM)

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

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

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

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

#21263 (Mar 24, 2026, 10:05:37 PM)

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

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

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

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

#21262 (Mar 24, 2026, 10:05:36 PM)

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

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

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

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

#21261 (Mar 24, 2026, 9:25:25 PM)

pfcp_peer: implement periodic PFCP heartbeat

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

Change-Id: I306324f8eca325202a3fa23125854db9d5eaab38
Vadim Yanitskiy at

#21260 (Mar 24, 2026, 9:25:24 PM)

gtpu_kpi: use ?ENV_DEFAULT_GTPU_KPI_{TABLE_NAME,INTERVAL}

Change-Id: Ia8194966b20da1adc26c02f416b8ec0508191d98
Vadim Yanitskiy at

#21259 (Mar 24, 2026, 9:25:23 PM)

pfcp_peer: tune Heartbeat Request/Response logging

Change-Id: I6435cdf64fd86fa5358d57ea4d56dcad8eb9e69e
Vadim Yanitskiy at

#21258 (Mar 24, 2026, 9:25:21 PM)

pfcp_peer: add configurable heartbeat miss count + association reset

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

Change-Id: I8cb0fb23468aba4dead9865a90d893c78c6ae074
Vadim Yanitskiy at

#21257 (Mar 24, 2026, 9:17:53 PM)

pfcp_peer: make assoc_setup and heartbeat_req timeouts configurable

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

Change-Id: I58a472a3bbbbad029a2f0246b084428ab3b1905c
Vadim Yanitskiy at

#21256 (Mar 24, 2026, 9:17:53 PM)

[REST] PfcpAssocState: field 'lrts' is required

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

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

#21255 (Mar 24, 2026, 9:17:50 PM)

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

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

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

Change-Id: Iba954746fe20e6b9eeaec3196e1f83e3fc3e7fc2
Vadim Yanitskiy at

#21254 (Mar 24, 2026, 9:17:49 PM)

pfcp_peer: detect UPF restart via RTS mismatch in Heartbeat Response

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

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

Change-Id: I00a8384db1ea9c38d0ad9ff90b3d45ad86c3a020
Vadim Yanitskiy at

#21253 (Mar 24, 2026, 9:17:49 PM)

pfcp_peer: implement periodic PFCP heartbeat

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

Change-Id: I306324f8eca325202a3fa23125854db9d5eaab38
Vadim Yanitskiy at

#21252 (Mar 24, 2026, 9:17:49 PM)

gtpu_kpi: use ?ENV_DEFAULT_GTPU_KPI_{TABLE_NAME,INTERVAL}

Change-Id: Ia8194966b20da1adc26c02f416b8ec0508191d98
Vadim Yanitskiy at

#21251 (Mar 24, 2026, 9:17:49 PM)

pfcp_peer: tune Heartbeat Request/Response logging

Change-Id: I6435cdf64fd86fa5358d57ea4d56dcad8eb9e69e
Vadim Yanitskiy at

#21250 (Mar 24, 2026, 9:17:48 PM)

pfcp_peer: add configurable heartbeat miss count + association reset

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

Change-Id: I8cb0fb23468aba4dead9865a90d893c78c6ae074
Vadim Yanitskiy at

#21249 (Mar 24, 2026, 9:17:48 PM)

pfcp_peer: make assoc_setup and heartbeat_req timeouts configurable

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

Change-Id: I58a472a3bbbbad029a2f0246b084428ab3b1905c
Vadim Yanitskiy at

#21248 (Mar 24, 2026, 9:17:48 PM)

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

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

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

Change-Id: Iba954746fe20e6b9eeaec3196e1f83e3fc3e7fc2
Vadim Yanitskiy at

#21247 (Mar 24, 2026, 9:17:47 PM)

pfcp_peer: detect UPF restart via RTS mismatch in Heartbeat Response

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

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

Change-Id: I00a8384db1ea9c38d0ad9ff90b3d45ad86c3a020
Vadim Yanitskiy at

#21246 (Mar 24, 2026, 9:17:47 PM)

[REST] PfcpAssocState: field 'lrts' is required

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

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

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

Depend on libosmo-netif for icmpv6 APIs

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

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

#21244 (Mar 24, 2026, 10:04:09 AM)

Depend on libosmo-netif for icmpv6 APIs

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

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

#21243 (Mar 24, 2026, 9:22:08 AM)

Depend on libosmo-netif for icmpv6 APIs

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

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

#21242 (Mar 24, 2026, 9:22:08 AM)

Depend on libosmo-netif for icmpv6 APIs

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

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

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

Support configuring IPv4v6 tunnels

Change-Id: Ic2da7a761a8df7e006fc02ca6557a48f371e4151
Pau Espin Pedrol at

#21240 (Mar 24, 2026, 9:18:44 AM)

Support configuring IPv4v6 tunnels

Change-Id: Ic2da7a761a8df7e006fc02ca6557a48f371e4151
Pau Espin Pedrol at

#21239 (Mar 24, 2026, 9:18:44 AM)

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

Change-Id: I917b5c70f143d48b55b4e270e24594d1a36f71aa
Pau Espin Pedrol at

#21238 (Mar 24, 2026, 9:18:42 AM)

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

Change-Id: I917b5c70f143d48b55b4e270e24594d1a36f71aa
Pau Espin Pedrol at

#21237 (Mar 24, 2026, 9:15:17 AM)

Implement logic to perform IPv6 SLAAC in GTPU tunnel

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

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

#21236 (Mar 24, 2026, 9:15:17 AM)

Implement logic to perform IPv6 SLAAC in GTPU tunnel

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

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

#21235 (Mar 23, 2026, 7:15:54 PM)

ip_checksum: Add SPDX license identifier

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

Change-Id: Ic40d01771e8d01461ed81d1a60d9e91a48fdc8d0
laforge at

#21234 (Mar 23, 2026, 7:15:53 PM)

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

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

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

Change-Id: I5a4fa18ef64c2f228e21fa2c067e55eaa4080508
laforge at

#21233 (Mar 23, 2026, 7:15:36 PM)

ip_checksum: Add SPDX license identifier

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

Change-Id: Ic40d01771e8d01461ed81d1a60d9e91a48fdc8d0
laforge at

#21232 (Mar 23, 2026, 7:15:35 PM)

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

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

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

Change-Id: I5a4fa18ef64c2f228e21fa2c067e55eaa4080508
laforge at

#21231 (Mar 23, 2026, 7:15:34 PM)

ip_checksum: Add SPDX license identifier

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

Change-Id: Ic40d01771e8d01461ed81d1a60d9e91a48fdc8d0
laforge at

#21230 (Mar 23, 2026, 7:15:33 PM)

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

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

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

Change-Id: I5a4fa18ef64c2f228e21fa2c067e55eaa4080508
laforge at

#21229 (Mar 23, 2026, 7:14:20 PM)

Depend on libosmo-netif for icmpv6 APIs

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

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

#21228 (Mar 23, 2026, 7:14:18 PM)

Depend on libosmo-netif for icmpv6 APIs

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

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

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

Support configuring IPv4v6 tunnels

Change-Id: Ic2da7a761a8df7e006fc02ca6557a48f371e4151
Pau Espin Pedrol at

#21226 (Mar 23, 2026, 7:14:12 PM)

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

Change-Id: I917b5c70f143d48b55b4e270e24594d1a36f71aa
Pau Espin Pedrol at

#21225 (Mar 23, 2026, 7:14:12 PM)

Support configuring IPv4v6 tunnels

Change-Id: Ic2da7a761a8df7e006fc02ca6557a48f371e4151
Pau Espin Pedrol at

#21224 (Mar 23, 2026, 7:14:09 PM)

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

Change-Id: I917b5c70f143d48b55b4e270e24594d1a36f71aa
Pau Espin Pedrol at

#21223 (Mar 23, 2026, 7:14:08 PM)

Implement logic to perform IPv6 SLAAC in GTPU tunnel

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

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

#21222 (Mar 23, 2026, 7:14:04 PM)

Implement logic to perform IPv6 SLAAC in GTPU tunnel

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

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

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

Support configuring IPv4v6 tunnels

Change-Id: Ic2da7a761a8df7e006fc02ca6557a48f371e4151
Pau Espin Pedrol at

#21220 (Mar 23, 2026, 4:50:53 PM)

Support configuring IPv4v6 tunnels

Change-Id: Ic2da7a761a8df7e006fc02ca6557a48f371e4151
Pau Espin Pedrol at

#21219 (Mar 23, 2026, 12:24:39 PM)

Depend on libosmo-netif for icmpv6 APIs

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

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

#21218 (Mar 23, 2026, 12:24:35 PM)

Depend on libosmo-netif for icmpv6 APIs

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

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

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

Introduce API osmo_icmpv6

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

Change-Id: I78ec7270c717af0a1b8ffd9398cd69ea7a0dbee2
Pau Espin Pedrol at

#21216 (Mar 23, 2026, 12:14:03 PM)

Introduce API osmo_icmpv6

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

Change-Id: I78ec7270c717af0a1b8ffd9398cd69ea7a0dbee2
Pau Espin Pedrol at

#21215 (Mar 23, 2026, 12:14:03 PM)

Introduce API osmo_icmpv6

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

Change-Id: I78ec7270c717af0a1b8ffd9398cd69ea7a0dbee2
Pau Espin Pedrol at

#21214 (Mar 23, 2026, 11:52:03 AM)

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

Change-Id: I917b5c70f143d48b55b4e270e24594d1a36f71aa
Pau Espin Pedrol at

#21213 (Mar 23, 2026, 11:52:03 AM)

Implement logic to perform IPv6 SLAAC in GTPU tunnel

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

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

#21212 (Mar 23, 2026, 11:51:58 AM)

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

Change-Id: I917b5c70f143d48b55b4e270e24594d1a36f71aa
Pau Espin Pedrol at

#21211 (Mar 23, 2026, 11:51:58 AM)

Implement logic to perform IPv6 SLAAC in GTPU tunnel

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

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

#21210 (Mar 23, 2026, 11:35:08 AM)

Introduce ip_checksum API

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

Change-Id: Ia09645a4715ac133036d7c89297b0fa10cf9aa3b
Pau Espin Pedrol at

#21209 (Mar 23, 2026, 11:35:07 AM)

Introduce API osmo_icmpv6

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

Change-Id: I78ec7270c717af0a1b8ffd9398cd69ea7a0dbee2
Pau Espin Pedrol at

#21208 (Mar 23, 2026, 11:35:02 AM)

Introduce ip_checksum API

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

Change-Id: Ia09645a4715ac133036d7c89297b0fa10cf9aa3b
Pau Espin Pedrol at

#21207 (Mar 23, 2026, 11:34:59 AM)

Introduce API osmo_icmpv6

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

Change-Id: I78ec7270c717af0a1b8ffd9398cd69ea7a0dbee2
Pau Espin Pedrol at

#21206 (Mar 23, 2026, 11:34:56 AM)

Introduce ip_checksum API

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

Change-Id: Ia09645a4715ac133036d7c89297b0fa10cf9aa3b
Pau Espin Pedrol at

#21205 (Mar 23, 2026, 11:34:55 AM)

Introduce API osmo_icmpv6

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

Change-Id: I78ec7270c717af0a1b8ffd9398cd69ea7a0dbee2
Pau Espin Pedrol at

#21204 (Mar 20, 2026, 3:30:02 PM)

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

Change-Id: I1570ccf5f98ac98c1af467c48f42b6b54ac3911d
Pau Espin Pedrol at

#21203 (Mar 20, 2026, 3:29:59 PM)

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

Change-Id: I1570ccf5f98ac98c1af467c48f42b6b54ac3911d
Pau Espin Pedrol at

#21202 (Mar 20, 2026, 3:24:27 PM)

Implement logic to perform IPv6 SLAAC in GTPU tunnel

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

Change-Id: I837a4d7ec7c134412ab4a2e09909670e81ecbeea
Pau Espin Pedrol at

#21201 (Mar 20, 2026, 3:24:27 PM)

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

Change-Id: I917b5c70f143d48b55b4e270e24594d1a36f71aa
Pau Espin Pedrol at

#21200 (Mar 20, 2026, 3:24:20 PM)

Implement logic to perform IPv6 SLAAC in GTPU tunnel

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

Change-Id: I837a4d7ec7c134412ab4a2e09909670e81ecbeea
Pau Espin Pedrol at

#21199 (Mar 20, 2026, 3:24:20 PM)

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

Change-Id: I917b5c70f143d48b55b4e270e24594d1a36f71aa
Pau Espin Pedrol at

#21198 (Mar 20, 2026, 1:24:19 PM)

cups_client: Log error decoding EUA

Change-Id: I98c7841da0f2662291aab5180f6113cb5fca4867
Pau Espin Pedrol at

#21197 (Mar 20, 2026, 1:24:15 PM)

cups_client: SPlit Tx of json str into its own function

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

Change-Id: I505bf2eeea998a749e55f8f3b05c5013b5761297
Pau Espin Pedrol at

#21196 (Mar 20, 2026, 1:24:08 PM)

cups_client: Log error decoding EUA

Change-Id: I98c7841da0f2662291aab5180f6113cb5fca4867
Pau Espin Pedrol at

#21195 (Mar 20, 2026, 1:24:07 PM)

cups_client: SPlit Tx of json str into its own function

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

Change-Id: I505bf2eeea998a749e55f8f3b05c5013b5761297
Pau Espin Pedrol at

#21194 (Mar 20, 2026, 1:13:24 PM)

tun: Fix typo in log line and comment

Change-Id: I2f7ec968035193e00652dc27217f46e0719e56e8
Pau Espin Pedrol at

#21193 (Mar 20, 2026, 1:13:24 PM)

tun: Fix typo in log line and comment

Change-Id: I2f7ec968035193e00652dc27217f46e0719e56e8
Pau Espin Pedrol at

#21192 (Mar 20, 2026, 1:13:22 PM)

tun: Fix typo in log line and comment

Change-Id: I2f7ec968035193e00652dc27217f46e0719e56e8
Pau Espin Pedrol at

#21191 (Mar 20, 2026, 1:11:42 PM)

Use libosmocore netdev API

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

#21190 (Mar 20, 2026, 1:11:42 PM)

Use libosmocore netdev API

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

#21189 (Mar 20, 2026, 11:47:25 AM)

Use libosmocore netdev API

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

#21188 (Mar 20, 2026, 11:47:20 AM)

Use libosmocore netdev API

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

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

Use libosmocore netdev API

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

#21186 (Mar 20, 2026, 11:42:02 AM)

Use libosmocore netdev API

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

#21185 (Mar 20, 2026, 11:38:59 AM)

contrib/jenkins_manuals: fix doc/manuals paths

Change-Id: Ibfccefec7e44a4803d4ff8ad061db395fc498b89
Oliver Smith at

#21184 (Mar 20, 2026, 11:38:59 AM)

contrib/jenkins_manuals: fix doc/manuals paths

Change-Id: Ibfccefec7e44a4803d4ff8ad061db395fc498b89
Oliver Smith at

#21183 (Mar 20, 2026, 11:25:00 AM)

s1ap_proxy: add public erab_list() type

Change-Id: I21a674537d1d9f16fdb319aaf2d758ba0906b407
Vadim Yanitskiy at

#21182 (Mar 20, 2026, 11:25:00 AM)

rest_server: log received requests (as debug)

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

#21181 (Mar 20, 2026, 11:24:59 AM)

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

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

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

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

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

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

#21180 (Mar 20, 2026, 11:24:59 AM)

enb_proxy: add missing mme_info() to proxy_info()

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

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

#21179 (Mar 20, 2026, 11:20:36 AM)

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

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

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

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

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

#21178 (Mar 20, 2026, 11:20:26 AM)

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

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

Split into two distinct types:

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

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

Additionally:

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

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

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

#21177 (Mar 20, 2026, 11:20:26 AM)

[REST] Add PLMN/eNB IDs to EnbItem

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

#21176 (Mar 20, 2026, 11:20:25 AM)

doc/manuals: cli: shorten enb_list example table

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

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

#21175 (Mar 20, 2026, 11:20:20 AM)

rest_server: log received requests (as debug)

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

#21174 (Mar 20, 2026, 11:20:19 AM)

s1ap_proxy: add public erab_list() type

Change-Id: I21a674537d1d9f16fdb319aaf2d758ba0906b407
Vadim Yanitskiy at

#21173 (Mar 20, 2026, 11:20:19 AM)

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

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

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

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

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

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

#21172 (Mar 20, 2026, 11:20:18 AM)

enb_proxy: add missing mme_info() to proxy_info()

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

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

#21171 (Mar 20, 2026, 11:20:16 AM)

[REST] Add PLMN/eNB IDs to EnbItem

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

#21170 (Mar 20, 2026, 11:20:15 AM)

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

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

Split into two distinct types:

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

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

Additionally:

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

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

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

#21169 (Mar 20, 2026, 11:20:15 AM)

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

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

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

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

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

#21168 (Mar 20, 2026, 11:20:14 AM)

doc/manuals: cli: shorten enb_list example table

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

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

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

doc/manuals: cli: shorten enb_list example table

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

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

#21166 (Mar 19, 2026, 10:39:08 PM)

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

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

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

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

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

#21165 (Mar 19, 2026, 10:39:07 PM)

enb_proxy: add missing mme_info() to proxy_info()

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

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

#21164 (Mar 19, 2026, 10:34:58 PM)

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

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

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

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

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

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

#21163 (Mar 19, 2026, 10:34:56 PM)

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

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

Split into two distinct types:

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

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

Additionally:

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

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

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

#21162 (Mar 19, 2026, 10:34:55 PM)

[REST] Add PLMN/eNB IDs to EnbItem

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

#21161 (Mar 19, 2026, 10:34:54 PM)

s1ap_proxy: add public erab_list() type

Change-Id: I21a674537d1d9f16fdb319aaf2d758ba0906b407
Vadim Yanitskiy at

#21160 (Mar 19, 2026, 10:34:54 PM)

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

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

Split into two distinct types:

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

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

Additionally:

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

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

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

#21159 (Mar 19, 2026, 10:34:54 PM)

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

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

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

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

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

#21158 (Mar 19, 2026, 10:34:54 PM)

doc/manuals: cli: shorten enb_list example table

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

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

#21157 (Mar 19, 2026, 10:34:53 PM)

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

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

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

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

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

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

#21156 (Mar 19, 2026, 10:34:52 PM)

enb_proxy: add missing mme_info() to proxy_info()

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

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

#21155 (Mar 19, 2026, 10:34:52 PM)

[REST] Add PLMN/eNB IDs to EnbItem

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

#21154 (Mar 19, 2026, 10:34:50 PM)

s1ap_proxy: add public erab_list() type

Change-Id: I21a674537d1d9f16fdb319aaf2d758ba0906b407
Vadim Yanitskiy at

#21153 (Mar 19, 2026, 9:30:53 PM)

enb_proxy: add missing mme_info() to proxy_info()

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

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

#21152 (Mar 19, 2026, 9:30:50 PM)

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

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

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

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

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

#21151 (Mar 19, 2026, 9:30:50 PM)

s1ap_proxy: add public erab_list() type

Change-Id: I21a674537d1d9f16fdb319aaf2d758ba0906b407
Vadim Yanitskiy at

#21150 (Mar 19, 2026, 9:30:50 PM)

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

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

Split into two distinct types:

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

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

Additionally:

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

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

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

#21149 (Mar 19, 2026, 9:30:50 PM)

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

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

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

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

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

#21148 (Mar 19, 2026, 9:30:45 PM)

s1ap_proxy: add public erab_list() type

Change-Id: I21a674537d1d9f16fdb319aaf2d758ba0906b407
Vadim Yanitskiy at

#21147 (Mar 19, 2026, 9:30:45 PM)

enb_proxy: add missing mme_info() to proxy_info()

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

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

#21146 (Mar 19, 2026, 9:30:43 PM)

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

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

Split into two distinct types:

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

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

Additionally:

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

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

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

#21145 (Mar 19, 2026, 4:24:46 PM)

Use libosmocore netdev

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

#21144 (Mar 19, 2026, 4:24:44 PM)

Use libosmocore netdev

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

#21143 (Mar 19, 2026, 3:11:34 PM)

netdev: Add API osmo_netdev_del_addr()

Change-Id: I75153eb59e96a6a2505dc5b29432c76e5c21ea24
Pau Espin Pedrol at

#21142 (Mar 19, 2026, 3:11:33 PM)

netdev: Add API osmo_netdev_del_addr()

Change-Id: I75153eb59e96a6a2505dc5b29432c76e5c21ea24
Pau Espin Pedrol at

#21141 (Mar 19, 2026, 3:11:30 PM)

netdev: Add API osmo_netdev_del_addr()

Change-Id: I75153eb59e96a6a2505dc5b29432c76e5c21ea24
Pau Espin Pedrol at

#21140 (Mar 19, 2026, 2:05:20 PM)

Use libosmocore netns API

Change-Id: Ia8617765d4c14483e2ad0ea09a8f2276fd7aaebf
Pau Espin Pedrol at

#21139 (Mar 19, 2026, 2:05:18 PM)

Use libosmocore netns API

Change-Id: Ia8617765d4c14483e2ad0ea09a8f2276fd7aaebf
Pau Espin Pedrol at

#21138 (Mar 19, 2026, 11:25:08 AM)

Use osmo_sockaddr everywhere

This allows getting rid of lots of explicit castings, as well as makeing
it easier do improve IPv6 support in the future.

Change-Id: Id87d9cf2ec138091681ab0fe7c7f86d648c0e98e
Pau Espin Pedrol at

#21137 (Mar 19, 2026, 11:25:07 AM)

Use osmo_sockaddr everywhere

This allows getting rid of lots of explicit castings, as well as makeing
it easier do improve IPv6 support in the future.

Change-Id: Id87d9cf2ec138091681ab0fe7c7f86d648c0e98e
Pau Espin Pedrol at

#21136 (Mar 19, 2026, 12:52:59 AM)

doc/manuals: cli: shorten enb_list example table

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

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

#21135 (Mar 19, 2026, 12:52:59 AM)

[REST] Add MME source address/port to EnbItem

The enb_proxy now captures the local address and port of the S1GW-MME
SCTP connection (mme_saddr/mme_sport) at comm_up and includes them in
conn_info().  Expose this info through the REST API (EnbItem schema),
show it as a new column/row in the CLI (enb_list/enb_info).

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

#21134 (Mar 19, 2026, 12:52:54 AM)

doc/manuals: cli: shorten enb_list example table

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

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

#21133 (Mar 19, 2026, 12:52:54 AM)

[REST] Add MME source address/port to EnbItem

The enb_proxy now captures the local address and port of the S1GW-MME
SCTP connection (mme_saddr/mme_sport) at comm_up and includes them in
conn_info().  Expose this info through the REST API (EnbItem schema),
show it as a new column/row in the CLI (enb_list/enb_info).

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

#21132 (Mar 19, 2026, 12:04:44 AM)

[REST] Add MME source address/port to EnbItem

The enb_proxy now captures the local address and port of the S1GW-MME
SCTP connection (mme_saddr/mme_sport) at comm_up and includes them in
conn_info().  Expose this info through the REST API (EnbItem schema),
show it as a new column/row in the CLI (enb_list/enb_info).

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

#21131 (Mar 19, 2026, 12:04:44 AM)

doc/manuals: cli: shorten enb_list example table

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

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

#21130 (Mar 19, 2026, 12:04:39 AM)

[REST] Add MME source address/port to EnbItem

The enb_proxy now captures the local address and port of the S1GW-MME
SCTP connection (mme_saddr/mme_sport) at comm_up and includes them in
conn_info().  Expose this info through the REST API (EnbItem schema),
show it as a new column/row in the CLI (enb_list/enb_info).

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

#21129 (Mar 19, 2026, 12:04:39 AM)

doc/manuals: cli: shorten enb_list example table

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

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

#21128 (Mar 18, 2026, 3:51:13 PM)

transceiver: add optional WebSDR device support

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

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#21127 (Mar 18, 2026, 3:51:10 PM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#21126 (Mar 18, 2026, 3:51:10 PM)

proto_trxd: add helpers to prepare burst indication packets

- introduce trxd_prepare_burst_ind_v0() and trxd_prepare_burst_ind_v1()
- reuse prepared packet size in send helpers
- handle idle frames during packet preparation
- use ssize_t consistently for prepared/write sizes

Change-Id: Ie94a1df4879cbf6056cd05c9621c46db1ed972fd
dtv.comp at

#21125 (Mar 18, 2026, 3:51:09 PM)

transceiver: add optional WebSDR device support

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

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#21124 (Mar 18, 2026, 3:51:09 PM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#21123 (Mar 18, 2026, 3:51:07 PM)

proto_trxd: add helpers to prepare burst indication packets

- introduce trxd_prepare_burst_ind_v0() and trxd_prepare_burst_ind_v1()
- reuse prepared packet size in send helpers
- handle idle frames during packet preparation
- use ssize_t consistently for prepared/write sizes

Change-Id: Ie94a1df4879cbf6056cd05c9621c46db1ed972fd
dtv.comp at

#21122 (Mar 18, 2026, 2:00:38 PM)

[REST] Implement eNB/MME selection by addr-port

Add support for selecting an MME or eNB by remote address and port
in the REST API and CLI.  The selector format is `addr:IP:PORT` for
MMEs and `enb-conn:IP:PORT` for eNBs, where IP can be an IPv4 or
IPv6 address.  The colon is used as the address/port separator.

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

#21121 (Mar 18, 2026, 2:00:38 PM)

[REST] EnbItem: expose name of the selected MME

For each eNB connection, include the name of the MME that was selected
from the pool.  Update the OpenAPI spec, CLI (enb_list/enb_info tables),
and user manual accordingly.

Change-Id: I4839275efa5d3545e84d684ad1b8b989214ef76a
Related: SYS#7066, SYS#7052
Vadim Yanitskiy at

#21120 (Mar 18, 2026, 2:00:37 PM)

[REST] Implement PfcpAssoc{Setup,Release}

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

#21119 (Mar 18, 2026, 2:00:37 PM)

[REST] Add MME source address/port

Change-Id: I15bbddf96ac7d5b6f9962a8d745db58fdec334e7
Vadim Yanitskiy at

#21118 (Mar 18, 2026, 2:00:36 PM)

[REST] Implement PfcpAssoc{Setup,Release}

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

#21117 (Mar 18, 2026, 2:00:36 PM)

[REST] Implement eNB/MME selection by addr-port

Add support for selecting an MME or eNB by remote address and port
in the REST API and CLI.  The selector format is `addr:IP:PORT` for
MMEs and `enb-conn:IP:PORT` for eNBs, where IP can be an IPv4 or
IPv6 address.  The colon is used as the address/port separator.

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

#21116 (Mar 18, 2026, 2:00:35 PM)

[REST] EnbItem: expose name of the selected MME

For each eNB connection, include the name of the MME that was selected
from the pool.  Update the OpenAPI spec, CLI (enb_list/enb_info tables),
and user manual accordingly.

Change-Id: I4839275efa5d3545e84d684ad1b8b989214ef76a
Related: SYS#7066, SYS#7052
Vadim Yanitskiy at

#21115 (Mar 18, 2026, 2:00:33 PM)

[REST] Add MME source address/port

Change-Id: I15bbddf96ac7d5b6f9962a8d745db58fdec334e7
Vadim Yanitskiy at

#21114 (Mar 18, 2026, 1:25:12 PM)

[REST] EnbItem: expose name of the selected MME

For each eNB connection, include the name of the MME that was selected
from the pool.  Update the OpenAPI spec, CLI (enb_list/enb_info tables),
and user manual accordingly.

Change-Id: I4839275efa5d3545e84d684ad1b8b989214ef76a
Related: SYS#7066, SYS#7052
Vadim Yanitskiy at

#21113 (Mar 18, 2026, 1:25:11 PM)

[REST] Implement PfcpAssoc{Setup,Release}

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

#21112 (Mar 18, 2026, 1:25:08 PM)

enb_proxy: obtain sctp_client sockopts from the env directly

Instead of passing the MmeConnCfg (sctp_client:cfg()) all the way
from osmo_s1gw_sup through sctp_server (as priv) into enb_proxy
(as state), read the sctp_client configuration in-place via
osmo_s1gw:get_env/2 when it is actually needed (connecting/enter).

This works because osmo_s1gw_sup already normalizes and writes back
the complete sctp_client config to the application env (set_env/2)
before starting the supervision tree.

As a result, mme_conn_cfg is removed from enb_proxy's state record,
start_link/2 no longer uses its Priv argument, and server_cfg/1 is
simplified to server_cfg/0.

Change-Id: Ic77d3eb3351c8981c87fa4b6febcdeb814b9187b
Vadim Yanitskiy at

#21111 (Mar 18, 2026, 1:23:38 PM)

rebar.lock: bump exometer_report_statsd version

The new version is using ETS instead of dict for counter lookups.
This significantly reduces performance impact when multiple eNBs
are registered, since the ETS provides O(1) average-case hash
lookups and in-place mutation.

Change-Id: I931321a831215012aa8186d851d9a8d38908a4bf
Vadim Yanitskiy at

#21110 (Mar 18, 2026, 1:23:32 PM)

[REST] Add GET /config endpoint (ConfigRead)

This endpoint returns the effective runtime configuration that
OsmoS1GW is currently using, with all defaults applied.  This
reflects the values read via `osmo_s1gw:get_env/2` at startup.

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

#21109 (Mar 18, 2026, 1:23:16 PM)

[REST] Add MME source address/port

Change-Id: I15bbddf96ac7d5b6f9962a8d745db58fdec334e7
Vadim Yanitskiy at

#21108 (Mar 18, 2026, 1:23:13 PM)

doc/manuals: update MmeItem related info

The osmo-s1gw-cli documentation was not properly updated in 63ce2c9:

* default local/bind address for an MME is "any", not "::"
* allowed TACs (--tac) was missing in help and examples

Change-Id: I0b8115fe6342a80bf1eb99bd6ad210492a013947
Fixes: 63ce2c9 ("[REST] Add MmeList, MmeAdd, MmeInfo, MmeDelete")
Related: OS#6671, SYS#7066, SYS#7052
Vadim Yanitskiy at

#21107 (Mar 18, 2026, 1:23:07 PM)

enb_proxy: signal mme_info() to the enb_registry

When an MME is selected from the pool, pass the mme_registry:mme_info()
to the enb_registry via notify_mme_connecting/2 (replacing /1).  This
makes all MME configuration details (name, address, port, TAC list)
available to consumers such as the REST server, without having to
look them up separately from the mme_registry.

Change-Id: I22e705b8196c9dcf436ed3c4d91c5c5a912e7282
Related: SYS#7052
Vadim Yanitskiy at

#21106 (Mar 18, 2026, 1:21:11 PM)

[REST] Implement eNB/MME selection by addr-port

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

#21105 (Mar 18, 2026, 1:20:14 PM)

config/sys.config: increase StatsD reporter interval to 10s

When running ttcn3-s1gw-test locally, I noticed OsmoS1GW consuming
30-40% of a CPU core while idle (not serving any eNBs).  Profiling
with etop pointed to `exometer_report_statsd` as the culprit: with
~1720 metrics registered, it was sending ~1720 datagrams per second.

A 1-second reporting interval causes noticeable CPU overhead as the
number of active metrics grows.  With per-eNB and per-MME counters,
the metric set scales with the number of connected eNBs/MMEs.

Increase the default StatsD reporting interval from 1s to 10s to
reduce that overhead.  Update the documentation accordingly.

Change-Id: Icd5e1a43d1df4a4909fe742aec67cc51a01bb857
Vadim Yanitskiy at

#21104 (Mar 18, 2026, 1:19:31 PM)

doc/manuals: merge doc/osmo-s1gw-cli.md

Change-Id: Ic2556f6add9c6a24f6da03f4388d7f86dde0c5dc
Related: OS#6671, SYS#7066
Vadim Yanitskiy at

#21103 (Mar 18, 2026, 1:19:29 PM)

contrib: add jenkins_manuals.sh

Change-Id: I54f0774575534519a2c40e0588f136c8a5e706f8
Related: osmo-ci.git Id62d806a648c8f3480cb4f162adf65f77c552848
Related: OS#6671
Vadim Yanitskiy at

#21102 (Mar 18, 2026, 1:19:29 PM)

pfcp_peer: define ?PFCP_ASSOC_SETUP_TIMEOUT

Change-Id: I0b7299d9f3eaa8c0a3c7e4a4d6331d1ec5a1c779
Vadim Yanitskiy at

#21101 (Mar 18, 2026, 1:19:26 PM)

[REST] Implement eNB/MME selection by addr-port

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

#21100 (Mar 18, 2026, 1:19:22 PM)

[REST] Implement PfcpAssoc{Setup,Release}

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

#21099 (Mar 18, 2026, 1:18:56 PM)

[REST] EnbItem: expose name of the selected MME

For each eNB connection, include the name of the MME that was selected
from the pool.  Update the OpenAPI spec, CLI (enb_list/enb_info tables),
and user manual accordingly.

Change-Id: I4839275efa5d3545e84d684ad1b8b989214ef76a
Related: SYS#7066, SYS#7052
Vadim Yanitskiy at

#21098 (Mar 18, 2026, 1:18:55 PM)

[REST] Add GET /config endpoint (ConfigRead)

This endpoint returns the effective runtime configuration that
OsmoS1GW is currently using, with all defaults applied.  This
reflects the values read via `osmo_s1gw:get_env/2` at startup.

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

#21097 (Mar 18, 2026, 1:18:53 PM)

doc/manuals: merge doc/osmo-s1gw-cli.md

Change-Id: Ic2556f6add9c6a24f6da03f4388d7f86dde0c5dc
Related: OS#6671, SYS#7066
Vadim Yanitskiy at

#21096 (Mar 18, 2026, 1:16:52 PM)

doc/manuals: update MmeItem related info

The osmo-s1gw-cli documentation was not properly updated in 63ce2c9:

* default local/bind address for an MME is "any", not "::"
* allowed TACs (--tac) was missing in help and examples

Change-Id: I0b8115fe6342a80bf1eb99bd6ad210492a013947
Fixes: 63ce2c9 ("[REST] Add MmeList, MmeAdd, MmeInfo, MmeDelete")
Related: OS#6671, SYS#7066, SYS#7052
Vadim Yanitskiy at

#21095 (Mar 18, 2026, 1:15:10 PM)

enb_proxy: signal mme_info() to the enb_registry

When an MME is selected from the pool, pass the mme_registry:mme_info()
to the enb_registry via notify_mme_connecting/2 (replacing /1).  This
makes all MME configuration details (name, address, port, TAC list)
available to consumers such as the REST server, without having to
look them up separately from the mme_registry.

Change-Id: I22e705b8196c9dcf436ed3c4d91c5c5a912e7282
Related: SYS#7052
Vadim Yanitskiy at

#21094 (Mar 18, 2026, 1:15:06 PM)

[REST] Add MME source address/port

Change-Id: I15bbddf96ac7d5b6f9962a8d745db58fdec334e7
Vadim Yanitskiy at

#21093 (Mar 18, 2026, 1:15:05 PM)

rebar.lock: bump exometer_report_statsd version

The new version is using ETS instead of dict for counter lookups.
This significantly reduces performance impact when multiple eNBs
are registered, since the ETS provides O(1) average-case hash
lookups and in-place mutation.

Change-Id: I931321a831215012aa8186d851d9a8d38908a4bf
Vadim Yanitskiy at

#21092 (Mar 18, 2026, 1:15:05 PM)

config/sys.config: increase StatsD reporter interval to 10s

When running ttcn3-s1gw-test locally, I noticed OsmoS1GW consuming
30-40% of a CPU core while idle (not serving any eNBs).  Profiling
with etop pointed to `exometer_report_statsd` as the culprit: with
~1720 metrics registered, it was sending ~1720 datagrams per second.

A 1-second reporting interval causes noticeable CPU overhead as the
number of active metrics grows.  With per-eNB and per-MME counters,
the metric set scales with the number of connected eNBs/MMEs.

Increase the default StatsD reporting interval from 1s to 10s to
reduce that overhead.  Update the documentation accordingly.

Change-Id: Icd5e1a43d1df4a4909fe742aec67cc51a01bb857
Vadim Yanitskiy at

#21091 (Mar 18, 2026, 1:15:05 PM)

enb_proxy: obtain sctp_client sockopts from the env directly

Instead of passing the MmeConnCfg (sctp_client:cfg()) all the way
from osmo_s1gw_sup through sctp_server (as priv) into enb_proxy
(as state), read the sctp_client configuration in-place via
osmo_s1gw:get_env/2 when it is actually needed (connecting/enter).

This works because osmo_s1gw_sup already normalizes and writes back
the complete sctp_client config to the application env (set_env/2)
before starting the supervision tree.

As a result, mme_conn_cfg is removed from enb_proxy's state record,
start_link/2 no longer uses its Priv argument, and server_cfg/1 is
simplified to server_cfg/0.

Change-Id: Ic77d3eb3351c8981c87fa4b6febcdeb814b9187b
Vadim Yanitskiy at

#21090 (Mar 18, 2026, 1:15:05 PM)

contrib: add jenkins_manuals.sh

Change-Id: I54f0774575534519a2c40e0588f136c8a5e706f8
Related: osmo-ci.git Id62d806a648c8f3480cb4f162adf65f77c552848
Related: OS#6671
Vadim Yanitskiy at

#21089 (Mar 18, 2026, 1:15:04 PM)

pfcp_peer: define ?PFCP_ASSOC_SETUP_TIMEOUT

Change-Id: I0b7299d9f3eaa8c0a3c7e4a4d6331d1ec5a1c779
Vadim Yanitskiy at

#21088 (Mar 18, 2026, 1:11:34 PM)

transceiver: add optional WebSDR device support

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

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#21087 (Mar 18, 2026, 1:11:29 PM)

transceiver: add optional WebSDR device support

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

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#21086 (Mar 18, 2026, 12:46:59 PM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#21085 (Mar 18, 2026, 12:46:59 PM)

proto_trxd: add helpers to prepare burst indication packets

- introduce trxd_prepare_burst_ind_v0() and trxd_prepare_burst_ind_v1()
- reuse prepared packet size in send helpers
- handle idle frames during packet preparation
- use ssize_t consistently for prepared/write sizes

Change-Id: Ie94a1df4879cbf6056cd05c9621c46db1ed972fd
dtv.comp at

#21084 (Mar 18, 2026, 12:46:59 PM)

transceiver: add optional WebSDR device support

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

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#21083 (Mar 18, 2026, 12:46:58 PM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#21082 (Mar 18, 2026, 12:46:57 PM)

proto_trxd: add helpers to prepare burst indication packets

- introduce trxd_prepare_burst_ind_v0() and trxd_prepare_burst_ind_v1()
- reuse prepared packet size in send helpers
- handle idle frames during packet preparation
- use ssize_t consistently for prepared/write sizes

Change-Id: Ie94a1df4879cbf6056cd05c9621c46db1ed972fd
dtv.comp at

#21081 (Mar 18, 2026, 12:46:56 PM)

transceiver: add optional WebSDR device support

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

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#21080 (Mar 18, 2026, 12:17:56 PM)

transceiver: add optional WebSDR device support

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

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#21079 (Mar 18, 2026, 12:17:56 PM)

transceiver: add optional WebSDR device support

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

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#21078 (Mar 18, 2026, 9:53:30 AM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#21077 (Mar 18, 2026, 9:53:30 AM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#21076 (Mar 17, 2026, 9:29:17 PM)

[REST] Implement eNB/MME selection by addr-port

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

#21075 (Mar 17, 2026, 9:29:16 PM)

enb_proxy: signal mme_info() to the enb_registry

When an MME is selected from the pool, pass the mme_registry:mme_info()
to the enb_registry via notify_mme_connecting/2 (replacing /1).  This
makes all MME configuration details (name, address, port, TAC list)
available to consumers such as the REST server, without having to
look them up separately from the mme_registry.

Change-Id: I22e705b8196c9dcf436ed3c4d91c5c5a912e7282
Related: SYS#7052
Vadim Yanitskiy at

#21074 (Mar 17, 2026, 9:23:39 PM)

pfcp_peer: define ?PFCP_ASSOC_SETUP_TIMEOUT

Change-Id: I0b7299d9f3eaa8c0a3c7e4a4d6331d1ec5a1c779
Vadim Yanitskiy at

#21073 (Mar 17, 2026, 9:23:20 PM)

[REST] Implement PfcpAssoc{Setup,Release}

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

#21072 (Mar 17, 2026, 9:23:18 PM)

[REST] EnbItem: expose name of the selected MME

For each eNB connection, include the name of the MME that was selected
from the pool.  Update the OpenAPI spec, CLI (enb_list/enb_info tables),
and user manual accordingly.

Change-Id: I4839275efa5d3545e84d684ad1b8b989214ef76a
Related: SYS#7066, SYS#7052
Vadim Yanitskiy at

#21071 (Mar 17, 2026, 9:23:18 PM)

[REST] Add GET /config endpoint (ConfigRead)

This endpoint returns the effective runtime configuration that
OsmoS1GW is currently using, with all defaults applied.  This
reflects the values read via `osmo_s1gw:get_env/2` at startup.

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

#21070 (Mar 17, 2026, 9:23:18 PM)

enb_proxy: obtain sctp_client sockopts from the env directly

Instead of passing the MmeConnCfg (sctp_client:cfg()) all the way
from osmo_s1gw_sup through sctp_server (as priv) into enb_proxy
(as state), read the sctp_client configuration in-place via
osmo_s1gw:get_env/2 when it is actually needed (connecting/enter).

This works because osmo_s1gw_sup already normalizes and writes back
the complete sctp_client config to the application env (set_env/2)
before starting the supervision tree.

As a result, mme_conn_cfg is removed from enb_proxy's state record,
start_link/2 no longer uses its Priv argument, and server_cfg/1 is
simplified to server_cfg/0.

Change-Id: Ic77d3eb3351c8981c87fa4b6febcdeb814b9187b
Vadim Yanitskiy at

#21069 (Mar 17, 2026, 9:23:17 PM)

[REST] Implement eNB/MME selection by addr-port

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

#21068 (Mar 17, 2026, 9:23:13 PM)

pfcp_peer: define ?PFCP_ASSOC_SETUP_TIMEOUT

Change-Id: I0b7299d9f3eaa8c0a3c7e4a4d6331d1ec5a1c779
Vadim Yanitskiy at

#21067 (Mar 17, 2026, 9:23:13 PM)

enb_proxy: signal mme_info() to the enb_registry

When an MME is selected from the pool, pass the mme_registry:mme_info()
to the enb_registry via notify_mme_connecting/2 (replacing /1).  This
makes all MME configuration details (name, address, port, TAC list)
available to consumers such as the REST server, without having to
look them up separately from the mme_registry.

Change-Id: I22e705b8196c9dcf436ed3c4d91c5c5a912e7282
Related: SYS#7052
Vadim Yanitskiy at

#21066 (Mar 17, 2026, 9:23:10 PM)

[REST] Add GET /config endpoint (ConfigRead)

This endpoint returns the effective runtime configuration that
OsmoS1GW is currently using, with all defaults applied.  This
reflects the values read via `osmo_s1gw:get_env/2` at startup.

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

#21065 (Mar 17, 2026, 9:23:10 PM)

[REST] EnbItem: expose name of the selected MME

For each eNB connection, include the name of the MME that was selected
from the pool.  Update the OpenAPI spec, CLI (enb_list/enb_info tables),
and user manual accordingly.

Change-Id: I4839275efa5d3545e84d684ad1b8b989214ef76a
Related: SYS#7066, SYS#7052
Vadim Yanitskiy at

#21064 (Mar 17, 2026, 9:23:08 PM)

enb_proxy: obtain sctp_client sockopts from the env directly

Instead of passing the MmeConnCfg (sctp_client:cfg()) all the way
from osmo_s1gw_sup through sctp_server (as priv) into enb_proxy
(as state), read the sctp_client configuration in-place via
osmo_s1gw:get_env/2 when it is actually needed (connecting/enter).

This works because osmo_s1gw_sup already normalizes and writes back
the complete sctp_client config to the application env (set_env/2)
before starting the supervision tree.

As a result, mme_conn_cfg is removed from enb_proxy's state record,
start_link/2 no longer uses its Priv argument, and server_cfg/1 is
simplified to server_cfg/0.

Change-Id: Ic77d3eb3351c8981c87fa4b6febcdeb814b9187b
Vadim Yanitskiy at

#21063 (Mar 17, 2026, 9:23:08 PM)

[REST] Implement PfcpAssoc{Setup,Release}

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

#21062 (Mar 17, 2026, 7:52:56 PM)

rebar.lock: bump exometer_report_statsd version

The new version is using ETS instead of dict for counter lookups.
This significantly reduces performance impact when multiple eNBs
are registered, since the ETS provides O(1) average-case hash
lookups and in-place mutation.

Change-Id: I931321a831215012aa8186d851d9a8d38908a4bf
Vadim Yanitskiy at

#21061 (Mar 17, 2026, 7:52:55 PM)

config/sys.config: increase StatsD reporter interval to 10s

When running ttcn3-s1gw-test locally, I noticed OsmoS1GW consuming
30-40% of a CPU core while idle (not serving any eNBs).  Profiling
with etop pointed to `exometer_report_statsd` as the culprit: with
~1720 metrics registered, it was sending ~1720 datagrams per second.

A 1-second reporting interval causes noticeable CPU overhead as the
number of active metrics grows.  With per-eNB and per-MME counters,
the metric set scales with the number of connected eNBs/MMEs.

Increase the default StatsD reporting interval from 1s to 10s to
reduce that overhead.  Update the documentation accordingly.

Change-Id: Icd5e1a43d1df4a4909fe742aec67cc51a01bb857
Vadim Yanitskiy at

#21060 (Mar 17, 2026, 7:52:54 PM)

rebar.lock: bump exometer_report_statsd version

The new version is using ETS instead of dict for counter lookups.
This significantly reduces performance impact when multiple eNBs
are registered, since the ETS provides O(1) average-case hash
lookups and in-place mutation.

Change-Id: I931321a831215012aa8186d851d9a8d38908a4bf
Vadim Yanitskiy at

#21059 (Mar 17, 2026, 7:52:54 PM)

config/sys.config: increase StatsD reporter interval to 10s

When running ttcn3-s1gw-test locally, I noticed OsmoS1GW consuming
30-40% of a CPU core while idle (not serving any eNBs).  Profiling
with etop pointed to `exometer_report_statsd` as the culprit: with
~1720 metrics registered, it was sending ~1720 datagrams per second.

A 1-second reporting interval causes noticeable CPU overhead as the
number of active metrics grows.  With per-eNB and per-MME counters,
the metric set scales with the number of connected eNBs/MMEs.

Increase the default StatsD reporting interval from 1s to 10s to
reduce that overhead.  Update the documentation accordingly.

Change-Id: Icd5e1a43d1df4a4909fe742aec67cc51a01bb857
Vadim Yanitskiy at

#21058 (Mar 17, 2026, 3:53:50 PM)

doc/manuals: update MmeItem related info

The osmo-s1gw-cli documentation was not properly updated in 63ce2c9:

* default local/bind address for an MME is "any", not "::"
* allowed TACs (--tac) was missing in help and examples

Change-Id: I0b8115fe6342a80bf1eb99bd6ad210492a013947
Fixes: 63ce2c9 ("[REST] Add MmeList, MmeAdd, MmeInfo, MmeDelete")
Related: OS#6671, SYS#7066, SYS#7052
Vadim Yanitskiy at

#21057 (Mar 17, 2026, 3:53:47 PM)

doc/manuals: add overview, document running and configuration

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

#21056 (Mar 17, 2026, 3:53:46 PM)

doc/manuals: document the REST interface

Change-Id: I8bc9183fff8f65db71554ee26369db9bdb61b78a
Related: OS#6671, SYS#7066
Vadim Yanitskiy at

#21055 (Mar 17, 2026, 3:53:45 PM)

doc/manuals: document GTP-U KPI monitoring

Change-Id: I2709cd545bfd6c8f6e34358caf9d372c02dd5c3e
Related: OS#6671, SYS#7307
Vadim Yanitskiy at

#21054 (Mar 17, 2026, 3:53:44 PM)

doc/manuals: document the metrics

Change-Id: Iacfefd387d0cd26eebbbeba0cd37efa78f90bb46
Related: OS#6671, SYS#7065
Vadim Yanitskiy at

#21053 (Mar 17, 2026, 3:48:57 PM)

config/sys.config: increase StatsD reporter interval to 10s

A 1-second reporting interval causes noticeable CPU overhead as the
number of active metrics grows.  With per-eNB and per-MME counters,
the metric set scales with the number of connected eNBs/MMEs.

Increase the default StatsD reporting interval from 1s to 10s to
reduce that overhead.  Update the documentation.

Change-Id: Icd5e1a43d1df4a4909fe742aec67cc51a01bb857
Vadim Yanitskiy at

#21052 (Mar 17, 2026, 3:48:54 PM)

contrib: add jenkins_manuals.sh

Change-Id: I54f0774575534519a2c40e0588f136c8a5e706f8
Related: osmo-ci.git Id62d806a648c8f3480cb4f162adf65f77c552848
Related: OS#6671
Vadim Yanitskiy at

#21051 (Mar 17, 2026, 3:48:54 PM)

doc/manuals: merge doc/osmo-s1gw-cli.md

Change-Id: Ic2556f6add9c6a24f6da03f4388d7f86dde0c5dc
Related: OS#6671, SYS#7066
Vadim Yanitskiy at

#21050 (Mar 17, 2026, 3:48:50 PM)

doc/manuals: update MmeItem related info

The osmo-s1gw-cli documentation was not properly updated in 63ce2c9:

* default local/bind address for an MME is "any", not "::"
* allowed TACs (--tac) was missing in help and examples

Change-Id: I0b8115fe6342a80bf1eb99bd6ad210492a013947
Fixes: 63ce2c9 ("[REST] Add MmeList, MmeAdd, MmeInfo, MmeDelete")
Related: OS#6671, SYS#7066, SYS#7052
Vadim Yanitskiy at

#21049 (Mar 17, 2026, 3:48:47 PM)

doc/manuals: add overview, document running and configuration

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

#21048 (Mar 17, 2026, 3:48:47 PM)

doc/manuals: document GTP-U KPI monitoring

Change-Id: I2709cd545bfd6c8f6e34358caf9d372c02dd5c3e
Related: OS#6671, SYS#7307
Vadim Yanitskiy at

#21047 (Mar 17, 2026, 3:48:47 PM)

doc/manuals: document the REST interface

Change-Id: I8bc9183fff8f65db71554ee26369db9bdb61b78a
Related: OS#6671, SYS#7066
Vadim Yanitskiy at

#21046 (Mar 17, 2026, 3:48:47 PM)

doc/manuals: document the metrics

Change-Id: Iacfefd387d0cd26eebbbeba0cd37efa78f90bb46
Related: OS#6671, SYS#7065
Vadim Yanitskiy at

#21045 (Mar 17, 2026, 3:48:46 PM)

config/sys.config: increase StatsD reporter interval to 10s

A 1-second reporting interval causes noticeable CPU overhead as the
number of active metrics grows.  With per-eNB and per-MME counters,
the metric set scales with the number of connected eNBs/MMEs.

Increase the default StatsD reporting interval from 1s to 10s to
reduce that overhead.  Update the documentation.

Change-Id: Icd5e1a43d1df4a4909fe742aec67cc51a01bb857
Vadim Yanitskiy at

#21044 (Mar 17, 2026, 3:48:46 PM)

contrib: add jenkins_manuals.sh

Change-Id: I54f0774575534519a2c40e0588f136c8a5e706f8
Related: osmo-ci.git Id62d806a648c8f3480cb4f162adf65f77c552848
Related: OS#6671
Vadim Yanitskiy at

#21043 (Mar 17, 2026, 3:48:46 PM)

doc/manuals: merge doc/osmo-s1gw-cli.md

Change-Id: Ic2556f6add9c6a24f6da03f4388d7f86dde0c5dc
Related: OS#6671, SYS#7066
Vadim Yanitskiy at

#21042 (Mar 17, 2026, 11:06:51 AM)

transceiver: return -EINVAL for invalid SETSLOT

Change-Id: I90bda68268abdeee9c766a3bf4189fba8f13da53
dtv.comp at

#21041 (Mar 17, 2026, 11:06:49 AM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#21040 (Mar 17, 2026, 11:06:44 AM)

transceiver: replace sprintf() with snprintf() in ctrl_sock_handle_rx

Change-Id: I7b725534c83a759e7b8f72f605dbcc38d778b1f2
dtv.comp at

#21039 (Mar 17, 2026, 11:02:13 AM)

transceiver: make control command parsing arguments const

Change-Id: I2f3aa5363c337791451a388f394d7351d3183908
dtv.comp at

#21038 (Mar 17, 2026, 11:02:09 AM)

proto_trxd: add helpers to prepare burst indication packets

- introduce trxd_prepare_burst_ind_v0() and trxd_prepare_burst_ind_v1()
- reuse prepared packet size in send helpers
- handle idle frames during packet preparation
- use ssize_t consistently for prepared/write sizes

Change-Id: Ie94a1df4879cbf6056cd05c9621c46db1ed972fd
dtv.comp at

#21037 (Mar 17, 2026, 11:02:08 AM)

device/websdr: add WebSDR transceiver backend and build target

- add libosmo-trx-websdr library and pkg-config file
- integrate WebSDR device into the autotools build system
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#21036 (Mar 17, 2026, 11:02:08 AM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#21035 (Mar 17, 2026, 11:02:04 AM)

transceiver: return -EINVAL for invalid SETSLOT

Change-Id: I90bda68268abdeee9c766a3bf4189fba8f13da53
dtv.comp at

#21034 (Mar 17, 2026, 11:02:04 AM)

proto_trxd: add helpers to prepare burst indication packets

- introduce trxd_prepare_burst_ind_v0() and trxd_prepare_burst_ind_v1()
- reuse prepared packet size in send helpers
- handle idle frames during packet preparation
- use ssize_t consistently for prepared/write sizes

Change-Id: Ie94a1df4879cbf6056cd05c9621c46db1ed972fd
dtv.comp at

#21033 (Mar 17, 2026, 11:02:01 AM)

transceiver: make control command parsing arguments const

Change-Id: I2f3aa5363c337791451a388f394d7351d3183908
dtv.comp at

#21032 (Mar 17, 2026, 11:02:01 AM)

transceiver: replace sprintf() with snprintf() in ctrl_sock_handle_rx

Change-Id: I7b725534c83a759e7b8f72f605dbcc38d778b1f2
dtv.comp at

#21031 (Mar 17, 2026, 11:01:59 AM)

device/websdr: add WebSDR transceiver backend and build target

- add libosmo-trx-websdr library and pkg-config file
- integrate WebSDR device into the autotools build system
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#21030 (Mar 16, 2026, 6:17:34 PM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#21029 (Mar 16, 2026, 6:17:34 PM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#21028 (Mar 16, 2026, 5:03:46 PM)

transceiver: return -EINVAL for invalid SETSLOT and preserve original behavior

Change-Id: I90bda68268abdeee9c766a3bf4189fba8f13da53
dtv.comp at

#21027 (Mar 16, 2026, 5:03:45 PM)

transceiver: make control command parsing arguments const

Change-Id: I2f3aa5363c337791451a388f394d7351d3183908
dtv.comp at

#21026 (Mar 16, 2026, 5:02:42 PM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#21025 (Mar 16, 2026, 5:02:00 PM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#21024 (Mar 16, 2026, 5:01:14 PM)

device/websdr: add WebSDR transceiver backend and build target

- add libosmo-trx-websdr library and pkg-config file
- integrate WebSDR device into the autotools build system
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#21023 (Mar 16, 2026, 5:01:13 PM)

transceiver: return -EINVAL for invalid SETSLOT and preserve original behavior

Change-Id: I90bda68268abdeee9c766a3bf4189fba8f13da53
dtv.comp at

#21022 (Mar 16, 2026, 5:01:13 PM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#21021 (Mar 16, 2026, 5:01:13 PM)

transceiver: make control command parsing arguments const

Change-Id: I2f3aa5363c337791451a388f394d7351d3183908
dtv.comp at

#21020 (Mar 16, 2026, 5:01:13 PM)

device/websdr: add WebSDR transceiver backend and build target

- add libosmo-trx-websdr library and pkg-config file
- integrate WebSDR device into the autotools build system
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#21019 (Mar 16, 2026, 5:01:12 PM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#21018 (Mar 16, 2026, 2:52:18 PM)

doc/manuals: document the REST interface

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

#21017 (Mar 16, 2026, 2:52:16 PM)

[REST] Add GET /config endpoint for reading the current configuration

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

#21016 (Mar 16, 2026, 2:52:07 PM)

doc/manuals: add overview, document running and configuration

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

#21015 (Mar 16, 2026, 2:52:06 PM)

doc/manuals: document the metrics

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

#21014 (Mar 16, 2026, 2:52:04 PM)

doc/manuals: document GTP-U KPI monitoring

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

#21013 (Mar 16, 2026, 2:48:15 PM)

doc/manuals: merge doc/osmo-s1gw-cli.md

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

#21012 (Mar 16, 2026, 2:48:08 PM)

doc/manuals: document the REST interface

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

#21011 (Mar 16, 2026, 2:48:08 PM)

doc/manuals: add overview, document running and configuration

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

#21010 (Mar 16, 2026, 2:48:07 PM)

doc/manuals: document the metrics

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

#21009 (Mar 16, 2026, 2:48:07 PM)

[REST] Add GET /config endpoint for reading the current configuration

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

#21008 (Mar 16, 2026, 2:48:07 PM)

doc/manuals: document GTP-U KPI monitoring

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

#21007 (Mar 16, 2026, 2:48:06 PM)

doc/manuals: merge doc/osmo-s1gw-cli.md

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

#21006 (Mar 16, 2026, 2:34:25 PM)

doc/manuals: merge doc/osmo-s1gw-cli.md

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

#21005 (Mar 16, 2026, 2:34:18 PM)

doc/manuals: add overview, document running and configuration

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

#21004 (Mar 16, 2026, 2:34:15 PM)

doc/manuals: document the REST interface

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

#21003 (Mar 16, 2026, 2:30:23 PM)

doc/manuals: document the metrics

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

#21002 (Mar 16, 2026, 2:30:22 PM)

doc/manuals: document GTP-U KPI monitoring

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

#21001 (Mar 16, 2026, 2:30:22 PM)

[REST] Add GET /config endpoint for reading the current configuration

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

#21000 (Mar 16, 2026, 2:30:22 PM)

doc/manuals: add overview, document running and configuration

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

#20999 (Mar 16, 2026, 2:30:21 PM)

doc/manuals: document the REST interface

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

#20998 (Mar 16, 2026, 2:30:21 PM)

doc/manuals: merge doc/osmo-s1gw-cli.md

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

#20997 (Mar 16, 2026, 2:30:19 PM)

doc/manuals: document the metrics

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

#20996 (Mar 16, 2026, 2:30:19 PM)

[REST] Add GET /config endpoint for reading the current configuration

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

#20995 (Mar 16, 2026, 2:30:18 PM)

doc/manuals: document GTP-U KPI monitoring

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

#20994 (Mar 16, 2026, 11:46:06 AM)

rebar.lock: bump exometer_report_statsd version

The new version is using ETS instead of dict for counter lookups.
This significantly reduces performance impact when multiple eNBs
are registered, since the ETS provides O(1) average-case hash
lookups and in-place mutation.

Change-Id: I931321a831215012aa8186d851d9a8d38908a4bf
Vadim Yanitskiy at

#20993 (Mar 16, 2026, 11:45:58 AM)

rebar.lock: bump exometer_report_statsd version

The new version is using ETS instead of dict for counter lookups.
This significantly reduces performance impact when multiple eNBs
are registered, since the ETS provides O(1) average-case hash
lookups and in-place mutation.

Change-Id: I931321a831215012aa8186d851d9a8d38908a4bf
Vadim Yanitskiy at

#20992 (Mar 16, 2026, 10:15:00 AM)

doc/manuals: document the REST interface

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

#20991 (Mar 16, 2026, 10:14:50 AM)

doc/manuals: add overview, document running and configuration

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

#20990 (Mar 16, 2026, 10:14:46 AM)

contrib: add jenkins_manuals.sh

Change-Id: I54f0774575534519a2c40e0588f136c8a5e706f8
Related: osmo-ci.git Id62d806a648c8f3480cb4f162adf65f77c552848
Related: OS#6671
Vadim Yanitskiy at

#20989 (Mar 16, 2026, 10:14:23 AM)

doc/manuals: merge doc/osmo-s1gw-cli.md

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

#20988 (Mar 16, 2026, 10:14:18 AM)

doc/manuals: update MmeItem related info

The osmo-s1gw-cli documentation was not properly updated in 63ce2c9:

* default local/bind address for an MME is "any", not "::"
* allowed TACs (--tac) was missing in help and examples

Change-Id: I0b8115fe6342a80bf1eb99bd6ad210492a013947
Fixes: 63ce2c9 ("[REST] Add MmeList, MmeAdd, MmeInfo, MmeDelete")
Related: OS#6671
Vadim Yanitskiy at

#20987 (Mar 16, 2026, 10:13:15 AM)

doc/manuals: document the metrics

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

#20986 (Mar 16, 2026, 10:11:16 AM)

doc/manuals: document GTP-U KPI monitoring

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

#20985 (Mar 16, 2026, 10:11:06 AM)

doc/manuals: add overview, document running and configuration

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

#20984 (Mar 16, 2026, 10:10:30 AM)

doc/manuals: document the REST interface

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

#20983 (Mar 16, 2026, 10:10:28 AM)

doc/manuals: merge doc/osmo-s1gw-cli.md

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

#20982 (Mar 16, 2026, 10:10:27 AM)

contrib: add jenkins_manuals.sh

Change-Id: I54f0774575534519a2c40e0588f136c8a5e706f8
Related: osmo-ci.git Id62d806a648c8f3480cb4f162adf65f77c552848
Related: OS#6671
Vadim Yanitskiy at

#20981 (Mar 16, 2026, 10:10:27 AM)

doc/manuals: update MmeItem related info

The osmo-s1gw-cli documentation was not properly updated in 63ce2c9:

* default local/bind address for an MME is "any", not "::"
* allowed TACs (--tac) was missing in help and examples

Change-Id: I0b8115fe6342a80bf1eb99bd6ad210492a013947
Fixes: 63ce2c9 ("[REST] Add MmeList, MmeAdd, MmeInfo, MmeDelete")
Related: OS#6671
Vadim Yanitskiy at

#20980 (Mar 16, 2026, 10:10:27 AM)

doc/manuals: document the metrics

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

#20979 (Mar 16, 2026, 10:10:26 AM)

doc/manuals: document GTP-U KPI monitoring

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

#20978 (Mar 16, 2026, 9:54:53 AM)

osmo_io: Fix msgb memleak if iofd is unregistered during write_cb with >1 io buffers

The msgbs are not allocated under the msghdr, hence if user unregistered
the iofd we need to manually free all remaining msgbs when freeing the
msghdr.

Change-Id: I579bc2142bba02947021c47d94bf2fe4f2040b01
Pau Espin Pedrol at

#20977 (Mar 16, 2026, 9:54:53 AM)

osmo_io: Fix msgb memleak if iofd is unregistered during write_cb with >1 io buffers

The msgbs are not allocated under the msghdr, hence if user unregistered
the iofd we need to manually free all remaining msgbs when freeing the
msghdr.

Change-Id: I579bc2142bba02947021c47d94bf2fe4f2040b01
Pau Espin Pedrol at

#20976 (Mar 16, 2026, 9:54:49 AM)

osmo_io: Fix msgb memleak if iofd is unregistered during write_cb with >1 io buffers

The msgbs are not allocated under the msghdr, hence if user unregistered
the iofd we need to manually free all remaining msgbs when freeing the
msghdr.

Change-Id: I579bc2142bba02947021c47d94bf2fe4f2040b01
Pau Espin Pedrol at

#20975 (Mar 16, 2026, 9:46:04 AM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- make command input read-only where applicable
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#20974 (Mar 16, 2026, 9:46:03 AM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20973 (Mar 16, 2026, 9:46:03 AM)

device/websdr: add WebSDR transceiver backend and build target

- add libosmo-trx-websdr library and pkg-config file
- integrate WebSDR device into the autotools build system
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#20972 (Mar 16, 2026, 9:46:03 AM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- make command input read-only where applicable
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#20971 (Mar 16, 2026, 9:46:02 AM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20970 (Mar 16, 2026, 9:46:02 AM)

device/websdr: add WebSDR transceiver backend and build target

- add libosmo-trx-websdr library and pkg-config file
- integrate WebSDR device into the autotools build system
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#20969 (Mar 16, 2026, 9:35:18 AM)

device/websdr: add WebSDR transceiver backend and build target

- add libosmo-trx-websdr library and pkg-config file
- integrate WebSDR device into the autotools build system
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#20968 (Mar 16, 2026, 9:35:18 AM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- make command input read-only where applicable
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#20967 (Mar 16, 2026, 9:35:12 AM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20966 (Mar 16, 2026, 9:35:12 AM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- make command input read-only where applicable
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#20965 (Mar 16, 2026, 9:35:12 AM)

device/websdr: add WebSDR transceiver backend and build target

- add libosmo-trx-websdr library and pkg-config file
- integrate WebSDR device into the autotools build system
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#20964 (Mar 16, 2026, 9:35:12 AM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20963 (Mar 16, 2026, 9:18:57 AM)

device/websdr: add WebSDR transceiver backend and build target

- add libosmo-trx-websdr library and pkg-config file
- integrate WebSDR device into the autotools build system
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#20962 (Mar 16, 2026, 9:18:57 AM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20961 (Mar 16, 2026, 9:18:53 AM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- make command input read-only where applicable
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#20960 (Mar 16, 2026, 9:18:52 AM)

device/websdr: add WebSDR transceiver backend and build target

- add libosmo-trx-websdr library and pkg-config file
- integrate WebSDR device into the autotools build system
- update .gitignore for wasm and pkg-config artifacts

Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
dtv.comp at

#20959 (Mar 16, 2026, 9:18:49 AM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20958 (Mar 16, 2026, 9:18:48 AM)

transceiver: split control command handling from socket I/O

- move control command parsing/response generation into ctrl_cmd_handle()
- keep ctrl_sock_handle_rx() focused on socket read/write
- make command input read-only where applicable
- switch response formatting from sprintf() to snprintf()

Change-Id: I5413aa511e951522270c75635e89448395fc429e
dtv.comp at

#20957 (Mar 16, 2026, 9:07:34 AM)

gsm48: remove duplicate GSM48_MT_RR_HANDO_INFO

Change-Id: Ic1cbba2b2a746667b9920ed2ed19b3848185977d
Vadim Yanitskiy at

#20956 (Mar 16, 2026, 9:07:22 AM)

gsmtap_util: gsmtap_gsm_channel_names[]: fix PTCCH string

Change-Id: Ic65668ae0363b991966bcf8ba4fb913940639964
Vadim Yanitskiy at

#20955 (Mar 16, 2026, 9:07:21 AM)

gsm48: fix missing/misspelled value-strings

Change-Id: I8d2333290c7715fd75ce7e7c759cb564a26b7461
Vadim Yanitskiy at

#20954 (Mar 16, 2026, 9:07:20 AM)

netdev: netdev_mnl_set_mtu(): drop unneeded variables

Change-Id: I8f9d39733a80a0ec4e8c462f4ae32b4ac52b5849
Vadim Yanitskiy at

#20953 (Mar 16, 2026, 9:07:07 AM)

gsmtap_util: gsmtap_gsm_channel_names[]: fix PTCCH string

Change-Id: Ic65668ae0363b991966bcf8ba4fb913940639964
Vadim Yanitskiy at

#20952 (Mar 16, 2026, 9:06:26 AM)

gsm48: fix missing/misspelled value-strings

Change-Id: I8d2333290c7715fd75ce7e7c759cb564a26b7461
Vadim Yanitskiy at

#20951 (Mar 16, 2026, 9:06:24 AM)

gsm48: remove duplicate GSM48_MT_RR_HANDO_INFO

Change-Id: Ic1cbba2b2a746667b9920ed2ed19b3848185977d
Vadim Yanitskiy at

#20950 (Mar 16, 2026, 9:06:21 AM)

netdev: netdev_mnl_set_mtu(): drop unneeded variables

Change-Id: I8f9d39733a80a0ec4e8c462f4ae32b4ac52b5849
Vadim Yanitskiy at

#20949 (Mar 16, 2026, 9:06:16 AM)

gsm48: remove duplicate GSM48_MT_RR_HANDO_INFO

Change-Id: Ic1cbba2b2a746667b9920ed2ed19b3848185977d
Vadim Yanitskiy at

#20948 (Mar 16, 2026, 9:06:16 AM)

gsm48: fix missing/misspelled value-strings

Change-Id: I8d2333290c7715fd75ce7e7c759cb564a26b7461
Vadim Yanitskiy at

#20947 (Mar 16, 2026, 9:06:16 AM)

gsmtap_util: gsmtap_gsm_channel_names[]: fix PTCCH string

Change-Id: Ic65668ae0363b991966bcf8ba4fb913940639964
Vadim Yanitskiy at

#20946 (Mar 16, 2026, 9:06:16 AM)

netdev: netdev_mnl_set_mtu(): drop unneeded variables

Change-Id: I8f9d39733a80a0ec4e8c462f4ae32b4ac52b5849
Vadim Yanitskiy at

#20945 (Mar 15, 2026, 11:15:55 PM)

gsmtap_util: gsmtap_gsm_channel_names[]: fix PTCCH string

Change-Id: Ic65668ae0363b991966bcf8ba4fb913940639964
Vadim Yanitskiy at

#20944 (Mar 15, 2026, 11:15:55 PM)

gsm48: remove duplicate GSM48_MT_RR_HANDO_INFO

Change-Id: Ic1cbba2b2a746667b9920ed2ed19b3848185977d
Vadim Yanitskiy at

#20943 (Mar 15, 2026, 11:15:55 PM)

gsm48: fix missing/misspelled value-strings

Change-Id: I8d2333290c7715fd75ce7e7c759cb564a26b7461
Vadim Yanitskiy at

#20942 (Mar 15, 2026, 11:15:55 PM)

gsmtap_util: gsmtap_gsm_channel_names[]: fix PTCCH string

Change-Id: Ic65668ae0363b991966bcf8ba4fb913940639964
Vadim Yanitskiy at

#20941 (Mar 15, 2026, 11:15:52 PM)

gsm48: remove duplicate GSM48_MT_RR_HANDO_INFO

Change-Id: Ic1cbba2b2a746667b9920ed2ed19b3848185977d
Vadim Yanitskiy at

#20940 (Mar 15, 2026, 11:15:52 PM)

gsm48: fix missing/misspelled value-strings

Change-Id: I8d2333290c7715fd75ce7e7c759cb564a26b7461
Vadim Yanitskiy at

#20939 (Mar 15, 2026, 11:15:50 PM)

gsmtap_util: gsmtap_gsm_channel_names[]: fix PTCCH string

Change-Id: Ic65668ae0363b991966bcf8ba4fb913940639964
Vadim Yanitskiy at

#20938 (Mar 15, 2026, 11:15:49 PM)

gsm48: remove duplicate GSM48_MT_RR_HANDO_INFO

Change-Id: Ic1cbba2b2a746667b9920ed2ed19b3848185977d
Vadim Yanitskiy at

#20937 (Mar 15, 2026, 11:15:49 PM)

gsm48: fix missing/misspelled value-strings

Change-Id: I8d2333290c7715fd75ce7e7c759cb564a26b7461
Vadim Yanitskiy at

#20936 (Mar 15, 2026, 10:41:56 PM)

stats: osmo_stats_reporter_udp_open(): fix unconditional jump

Change-Id: Ifb4842ea11e4df0cae8733438b3812a086396b99
Fixes: cc3694b65 ("Fix build for OSX")
Vadim Yanitskiy at

#20935 (Mar 15, 2026, 10:41:54 PM)

netdev: netdev_mnl_set_mtu(): drop unneeded variables

Setting an MTU via `RTM_NEWLINK` does not require `ifi_flags`/
`ifi_change`, so we don't really need to set these fields.

Change-Id: I8f9d39733a80a0ec4e8c462f4ae32b4ac52b5849
Vadim Yanitskiy at

#20934 (Mar 15, 2026, 10:41:54 PM)

gsup: encode_pdp_info(): fix wrong pdp_address index

The `PDP_TYPE_N_IETF_IPv4v6` case encodes two addresses: IPv4 from
`pdp_address[0]` and IPv6 from `pdp_address[1]`.  The IPv4 part is
encoded correctly, but the IPv6 part checks the wrong index.

The decoder decode_pdp_address() correctly puts the IPv4 address in
`pdp_address[0]` and the IPv6 address in `pdp_address[1]`.  Because
`pdp_address[0].sa_family` is `AF_INET` (not `AF_INET6`), the second
condition is always false in a proper dual-stack context, so the IPv6
part is silently dropped from every outgoing dual-stack GSUP message.

Change-Id: Ibc4a438ee7b06346839e78dc14d9d5b11b1c5bbd
Vadim Yanitskiy at

#20933 (Mar 15, 2026, 10:41:54 PM)

socket: osmo_sockaddr_from_str_and_uint(): fix memleak

`addrinfo_helper()` internally calls `getaddrinfo()`, whose result
must be freed with `freeaddrinfo()`.  On the size-check error path
the function returns early without freeing.  Fix this.

Change-Id: Ib05e1b8f2465e0db79e7b45de151dc9945e27924
Vadim Yanitskiy at

#20932 (Mar 15, 2026, 10:41:54 PM)

stats: osmo_stats_reporter_udp_open(): fix unconditional jump

Change-Id: Ifb4842ea11e4df0cae8733438b3812a086396b99
Fixes: cc3694b65 ("Fix build for OSX")
Vadim Yanitskiy at

#20931 (Mar 15, 2026, 10:41:53 PM)

netdev: netdev_mnl_set_mtu(): drop unneeded variables

Setting an MTU via `RTM_NEWLINK` does not require `ifi_flags`/
`ifi_change`, so we don't really need to set these fields.

Change-Id: I8f9d39733a80a0ec4e8c462f4ae32b4ac52b5849
Vadim Yanitskiy at

#20930 (Mar 15, 2026, 10:41:50 PM)

gsup: encode_pdp_info(): fix wrong pdp_address index

The `PDP_TYPE_N_IETF_IPv4v6` case encodes two addresses: IPv4 from
`pdp_address[0]` and IPv6 from `pdp_address[1]`.  The IPv4 part is
encoded correctly, but the IPv6 part checks the wrong index.

The decoder decode_pdp_address() correctly puts the IPv4 address in
`pdp_address[0]` and the IPv6 address in `pdp_address[1]`.  Because
`pdp_address[0].sa_family` is `AF_INET` (not `AF_INET6`), the second
condition is always false in a proper dual-stack context, so the IPv6
part is silently dropped from every outgoing dual-stack GSUP message.

Change-Id: Ibc4a438ee7b06346839e78dc14d9d5b11b1c5bbd
Vadim Yanitskiy at

#20929 (Mar 15, 2026, 10:41:50 PM)

socket: osmo_sockaddr_from_str_and_uint(): fix memleak

`addrinfo_helper()` internally calls `getaddrinfo()`, whose result
must be freed with `freeaddrinfo()`.  On the size-check error path
the function returns early without freeing.  Fix this.

Change-Id: Ib05e1b8f2465e0db79e7b45de151dc9945e27924
Vadim Yanitskiy at

#20928 (Mar 15, 2026, 10:41:48 PM)

stats: osmo_stats_reporter_udp_open(): fix unconditional jump

Change-Id: Ifb4842ea11e4df0cae8733438b3812a086396b99
Fixes: cc3694b65 ("Fix build for OSX")
Vadim Yanitskiy at

#20927 (Mar 15, 2026, 10:41:48 PM)

gsup: encode_pdp_info(): fix wrong pdp_address index

The `PDP_TYPE_N_IETF_IPv4v6` case encodes two addresses: IPv4 from
`pdp_address[0]` and IPv6 from `pdp_address[1]`.  The IPv4 part is
encoded correctly, but the IPv6 part checks the wrong index.

The decoder decode_pdp_address() correctly puts the IPv4 address in
`pdp_address[0]` and the IPv6 address in `pdp_address[1]`.  Because
`pdp_address[0].sa_family` is `AF_INET` (not `AF_INET6`), the second
condition is always false in a proper dual-stack context, so the IPv6
part is silently dropped from every outgoing dual-stack GSUP message.

Change-Id: Ibc4a438ee7b06346839e78dc14d9d5b11b1c5bbd
Vadim Yanitskiy at

#20926 (Mar 15, 2026, 10:41:46 PM)

netdev: netdev_mnl_set_mtu(): drop unneeded variables

Setting an MTU via `RTM_NEWLINK` does not require `ifi_flags`/
`ifi_change`, so we don't really need to set these fields.

Change-Id: I8f9d39733a80a0ec4e8c462f4ae32b4ac52b5849
Vadim Yanitskiy at

#20925 (Mar 15, 2026, 10:41:45 PM)

socket: osmo_sockaddr_from_str_and_uint(): fix memleak

`addrinfo_helper()` internally calls `getaddrinfo()`, whose result
must be freed with `freeaddrinfo()`.  On the size-check error path
the function returns early without freeing.  Fix this.

Change-Id: Ib05e1b8f2465e0db79e7b45de151dc9945e27924
Vadim Yanitskiy at

#20924 (Mar 15, 2026, 9:48:45 PM)

firmware/layer1: toa_input(): minor formatting fix

Change-Id: Iba061badfde8a3875cbf7e7cd19ef89064922f57
Vadim Yanitskiy at

#20923 (Mar 15, 2026, 9:48:44 PM)

mobile: gsm48_cc_tx_release_compl(): actually send the message

The message buffer is allocated, filled in, and then leaked when
`trans_free(trans)` is called.  The RELEASE COMPLETE message is
never transmitted to the network.

Change-Id: Ic754fe1ddd7e2908627374590f01e6fc81a73c77
Vadim Yanitskiy at

#20922 (Mar 15, 2026, 9:42:03 PM)

layer23: gsm_mncc_names[]: fix whitespace in a string

Change-Id: I93b5445db267985f3d8c53cde08ff28f166ae79c
Vadim Yanitskiy at

#20921 (Mar 15, 2026, 9:41:56 PM)

firmware/layer1: l1s_tch_{cmd,resp}(): fix misspelled FACCH

Change-Id: I85646a8a0b37478ca517407fcca92d0b89d6aaca
Vadim Yanitskiy at

#20920 (Mar 15, 2026, 9:41:55 PM)

mobile: gsm48_mmxx_msg_names[]: fix some strings

Change-Id: Iab3e249acc18057416a5c1fc00322b597df403d4
Vadim Yanitskiy at

#20919 (Mar 15, 2026, 9:41:55 PM)

layer23: gsm48_sysinfo_dump(): remove unused print argument

Change-Id: I0a26d5ac3183dc7ccb2e7d3d77ab41b58ad5b871
Vadim Yanitskiy at

#20918 (Mar 15, 2026, 9:41:55 PM)

firmware/layer1: l1a_rach_compl(): fix copy-pasted comment

Change-Id: I8000218836bcb58946db48184360f821617dc93f
Vadim Yanitskiy at

#20917 (Mar 15, 2026, 9:41:54 PM)

firmware/layer1: toa_input(): minor formatting fix

Change-Id: Iba061badfde8a3875cbf7e7cd19ef89064922f57
Vadim Yanitskiy at

#20916 (Mar 15, 2026, 9:41:54 PM)

mobile: gsm48_cc_tx_release_compl(): actually send the message

The message buffer is allocated, filled in, and then leaked when
`trans_free(trans)` is called.  The RELEASE COMPLETE message is
never transmitted to the network.

Change-Id: Ic754fe1ddd7e2908627374590f01e6fc81a73c77
Vadim Yanitskiy at

#20915 (Mar 15, 2026, 9:41:54 PM)

layer23: gsm_mncc_names[]: fix whitespace in a string

Change-Id: I93b5445db267985f3d8c53cde08ff28f166ae79c
Vadim Yanitskiy at

#20914 (Mar 15, 2026, 9:41:53 PM)

firmware/layer1: l1a_rach_compl(): fix copy-pasted comment

Change-Id: I8000218836bcb58946db48184360f821617dc93f
Vadim Yanitskiy at

#20913 (Mar 15, 2026, 9:41:53 PM)

mobile: gsm48_mmxx_msg_names[]: fix some strings

Change-Id: Iab3e249acc18057416a5c1fc00322b597df403d4
Vadim Yanitskiy at

#20912 (Mar 15, 2026, 9:41:53 PM)

layer23: gsm48_sysinfo_dump(): remove unused print argument

Change-Id: I0a26d5ac3183dc7ccb2e7d3d77ab41b58ad5b871
Vadim Yanitskiy at

#20911 (Mar 15, 2026, 9:41:52 PM)

firmware/layer1: l1s_tch_{cmd,resp}(): fix misspelled FACCH

Change-Id: I85646a8a0b37478ca517407fcca92d0b89d6aaca
Vadim Yanitskiy at

#20910 (Mar 14, 2026, 7:43:40 PM)

contrib: add jenkins_manuals.sh

Change-Id: I54f0774575534519a2c40e0588f136c8a5e706f8
Related: osmo-ci.git Id62d806a648c8f3480cb4f162adf65f77c552848
Related: OS#6671
Vadim Yanitskiy at

#20909 (Mar 14, 2026, 7:43:40 PM)

contrib: add jenkins_manuals.sh

Change-Id: I54f0774575534519a2c40e0588f136c8a5e706f8
Related: osmo-ci.git Id62d806a648c8f3480cb4f162adf65f77c552848
Related: OS#6671
Vadim Yanitskiy at

#20908 (Mar 14, 2026, 7:11:23 PM)

doc/manuals: document the REST interface

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

#20907 (Mar 14, 2026, 7:11:21 PM)

doc/manuals: document GTP-U KPI monitoring

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

#20906 (Mar 14, 2026, 7:11:21 PM)

doc/manuals: merge doc/osmo-s1gw-cli.md

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

#20905 (Mar 14, 2026, 7:11:21 PM)

doc/manuals: update MmeItem related info

The osmo-s1gw-cli documentation was not properly updated in 63ce2c9:

* default local/bind address for an MME is "any", not "::"
* allowed TACs (--tac) was missing in help and examples

Change-Id: I0b8115fe6342a80bf1eb99bd6ad210492a013947
Fixes: 63ce2c9 ("[REST] Add MmeList, MmeAdd, MmeInfo, MmeDelete")
Related: OS#6671
Vadim Yanitskiy at

#20904 (Mar 14, 2026, 7:11:21 PM)

doc/manuals: document the metrics

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

#20903 (Mar 14, 2026, 7:11:20 PM)

doc/manuals: add overview, document running and configuration

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

#20902 (Mar 14, 2026, 7:11:17 PM)

doc/manuals: document the REST interface

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

#20901 (Mar 14, 2026, 7:11:14 PM)

doc/manuals: document GTP-U KPI monitoring

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

#20900 (Mar 14, 2026, 7:11:14 PM)

doc/manuals: merge doc/osmo-s1gw-cli.md

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

#20899 (Mar 14, 2026, 7:11:12 PM)

doc/manuals: add overview, document running and configuration

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

#20898 (Mar 14, 2026, 7:11:12 PM)

doc/manuals: document the metrics

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

#20897 (Mar 14, 2026, 7:11:12 PM)

doc/manuals: update MmeItem related info

The osmo-s1gw-cli documentation was not properly updated in 63ce2c9:

* default local/bind address for an MME is "any", not "::"
* allowed TACs (--tac) was missing in help and examples

Change-Id: I0b8115fe6342a80bf1eb99bd6ad210492a013947
Fixes: 63ce2c9 ("[REST] Add MmeList, MmeAdd, MmeInfo, MmeDelete")
Related: OS#6671
Vadim Yanitskiy at

#20896 (Mar 14, 2026, 2:05:10 PM)

gsup: align ordering of IEs

Align with the IE order produced by libosmocore's GSUP encoder.

Change-Id: I5caa3101da310cddfa311d068ad889bca697b438
Related: 54343caa ("common/gsup.adoc: document Supplementary Services extension")
Related: ce32ec2a ("gsup: Document ePDG Tunnel Req/Res/Err")
Related: 92cf519c ("GSUP: document inter-MSC handover additions")
Vadim Yanitskiy at

#20895 (Mar 14, 2026, 2:04:55 PM)

gsup: align ordering of IEs

Align with the IE order produced by libosmocore's GSUP encoder.

Change-Id: I5caa3101da310cddfa311d068ad889bca697b438
Related: 54343caa ("common/gsup.adoc: document Supplementary Services extension")
Related: ce32ec2a ("gsup: Document ePDG Tunnel Req/Res/Err")
Related: 92cf519c ("GSUP: document inter-MSC handover additions")
Vadim Yanitskiy at

#20894 (Mar 14, 2026, 1:45:36 PM)

enb_proxy/mme_registry: add per-MME counters for connection events

Register a set of per-MME counters when an MME is added to the pool,
and increment them from enb_proxy at the relevant state transitions:

  - selected          (MME chosen for a connection attempt)
  - conn_est_timeout  (SCTP connection establishment timed out)
  - conn_est_failure  (SCTP connection establishment failed)
  - s1setup_rsp       (S1 SETUP RESPONSE received successfully)
  - s1setup_failure   (S1 SETUP FAILURE received from MME)
  - s1setup_rsp_timeout (timed out waiting for S1 SETUP RESPONSE)

A new global aggregate counter ?S1GW_CTR_ENB_PROXY_MME_SELECTED is
also added alongside the existing ?S1GW_CTR_ENB_PROXY_MME_SELECT_ERROR.

Change-Id: Ie0149c1ad0754af6d8f5f95d4e8919993eac3760
Related: SYS#7052
Vadim Yanitskiy at

#20893 (Mar 14, 2026, 1:45:36 PM)

enb_proxy/mme_registry: add per-MME counters for connection events

Register a set of per-MME counters when an MME is added to the pool,
and increment them from enb_proxy at the relevant state transitions:

  - selected          (MME chosen for a connection attempt)
  - conn_est_timeout  (SCTP connection establishment timed out)
  - conn_est_failure  (SCTP connection establishment failed)
  - s1setup_rsp       (S1 SETUP RESPONSE received successfully)
  - s1setup_failure   (S1 SETUP FAILURE received from MME)
  - s1setup_rsp_timeout (timed out waiting for S1 SETUP RESPONSE)

A new global aggregate counter ?S1GW_CTR_ENB_PROXY_MME_SELECTED is
also added alongside the existing ?S1GW_CTR_ENB_PROXY_MME_SELECT_ERROR.

Change-Id: Ie0149c1ad0754af6d8f5f95d4e8919993eac3760
Related: SYS#7052
Vadim Yanitskiy at

#20892 (Mar 13, 2026, 8:29:00 PM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20891 (Mar 13, 2026, 8:29:00 PM)

proto_trxd: add helpers to prepare burst indication packets

- introduce trxd_prepare_burst_ind_v0() and trxd_prepare_burst_ind_v1()
- reuse prepared packet size in send helpers
- handle idle frames during packet preparation
- use ssize_t consistently for prepared/write sizes

Change-Id: Ie94a1df4879cbf6056cd05c9621c46db1ed972fd
dtv.comp at

#20890 (Mar 13, 2026, 8:28:59 PM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20889 (Mar 13, 2026, 8:28:59 PM)

proto_trxd: add helpers to prepare burst indication packets

- introduce trxd_prepare_burst_ind_v0() and trxd_prepare_burst_ind_v1()
- reuse prepared packet size in send helpers
- handle idle frames during packet preparation
- use ssize_t consistently for prepared/write sizes

Change-Id: Ie94a1df4879cbf6056cd05c9621c46db1ed972fd
dtv.comp at

#20888 (Mar 13, 2026, 8:01:09 PM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20887 (Mar 13, 2026, 8:01:08 PM)

proto_trxd: add helpers to prepare burst indication packets

- introduce trxd_prepare_burst_ind_v0() and trxd_prepare_burst_ind_v1()
- reuse prepared packet size in send helpers
- handle idle frames during packet preparation
- use ssize_t consistently for prepared/write sizes

Change-Id: Ie94a1df4879cbf6056cd05c9621c46db1ed972fd
dtv.comp at

#20886 (Mar 13, 2026, 8:01:03 PM)

proto_trxd: add helpers to prepare burst indication packets

- introduce trxd_prepare_burst_ind_v0() and trxd_prepare_burst_ind_v1()
- reuse prepared packet size in send helpers
- handle idle frames during packet preparation
- use ssize_t consistently for prepared/write sizes

Change-Id: Ie94a1df4879cbf6056cd05c9621c46db1ed972fd
dtv.comp at

#20885 (Mar 13, 2026, 8:00:59 PM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20884 (Mar 13, 2026, 8:00:53 PM)

enb_proxy: fix stale SCTP events misprocessed during MME pool selection

When closing a connection to one MME and opening a new one to the next,
a SHUTDOWN_COMP event from the old (now-closed) socket can still be
pending in the process mailbox.  The sctp_assoc_change handlers in the
'connecting' and 'wait_s1setup_rsp' states were matching '_Socket',
ignoring the socket identity.  A stale SHUTDOWN_COMP would therefore
fall into the '_ -> repeat_state_and_data' branch, triggering a spurious
re-entry of 'connecting', which immediately closed the newly established
connection to the next MME and skipped to yet another pool entry.

Fix this by matching the Socket against the current S#state.sock in both
handlers.  Events arriving on a previously closed socket no longer match
these clauses and are silently dropped by the catch-all handle_event/4.

This was found thanks to the MME pooling TCs in ttcn3-s1gw-test.

Change-Id: I4211dd343607f045cf4dd33fa568ed580c79dd9f
Related: SYS#7052
Vadim Yanitskiy at

#20883 (Mar 13, 2026, 8:00:47 PM)

enb_proxy: fix stale SCTP events misprocessed during MME pool selection

When closing a connection to one MME and opening a new one to the next,
a SHUTDOWN_COMP event from the old (now-closed) socket can still be
pending in the process mailbox.  The sctp_assoc_change handlers in the
'connecting' and 'wait_s1setup_rsp' states were matching '_Socket',
ignoring the socket identity.  A stale SHUTDOWN_COMP would therefore
fall into the '_ -> repeat_state_and_data' branch, triggering a spurious
re-entry of 'connecting', which immediately closed the newly established
connection to the next MME and skipped to yet another pool entry.

Fix this by matching the Socket against the current S#state.sock in both
handlers.  Events arriving on a previously closed socket no longer match
these clauses and are silently dropped by the catch-all handle_event/4.

This was found thanks to the MME pooling TCs in ttcn3-s1gw-test.

Change-Id: I4211dd343607f045cf4dd33fa568ed580c79dd9f
Related: SYS#7052
Vadim Yanitskiy at

#20882 (Mar 13, 2026, 5:44:12 PM)

osmo_io: Rewrite iofd_handle_send_completion() to fix multiple issues

Previous implementation had multiple issues, which this patch addresses:
* Didn't call user cb updating completed bytes for a given msg which had
  a partial write.
* rc checks against "Incomplete write" were wrong, because rc was not
  being decremented with previous msgs idxs being processed.
* Didn't take into account the write(0, fd, buf) = 0 valid user case for
  regular files.

The rewrite also simplifies the logic by splitting the "rc < 0" (error) paths
from the "rc >= 0" (successful) paths.

Related: SYS#7842
Change-Id: Ia016e4df7be5e534a8212f7271caff9779e08eb1
Pau Espin Pedrol at

#20881 (Mar 13, 2026, 5:44:10 PM)

osmo_io: Rewrite iofd_handle_send_completion() to fix multiple issues

Previous implementation had multiple issues, which this patch addresses:
* Didn't call user cb updating completed bytes for a given msg which had
  a partial write.
* rc checks against "Incomplete write" were wrong, because rc was not
  being decremented with previous msgs idxs being processed.
* Didn't take into account the write(0, fd, buf) = 0 valid user case for
  regular files.

The rewrite also simplifies the logic by splitting the "rc < 0" (error) paths
from the "rc >= 0" (successful) paths.

Related: SYS#7842
Change-Id: Ia016e4df7be5e534a8212f7271caff9779e08eb1
Pau Espin Pedrol at

#20880 (Mar 13, 2026, 5:44:10 PM)

osmo_io: Rewrite iofd_handle_send_completion() to fix multiple issues

Previous implementation had multiple issues, which this patch addresses:
* Didn't call user cb updating completed bytes for a given msg which had
  a partial write.
* rc checks against "Incomplete write" were wrong, because rc was not
  being decremented with previous msgs idxs being processed.
* Didn't take into account the write(0, fd, buf) = 0 valid user case for
  regular files.

The rewrite also simplifies the logic by splitting the "rc < 0" (error) paths
from the "rc >= 0" (successful) paths.

Related: SYS#7842
Change-Id: Ia016e4df7be5e534a8212f7271caff9779e08eb1
Pau Espin Pedrol at

#20879 (Mar 13, 2026, 2:15:14 PM)

enb_proxy: add initial MME pooling support

Rework the CONNECTING state to dynamically select an MME from the pool
via mme_registry:mme_select/1, passing the eNB's Tracking Area Codes
(from the ?'id-SupportedTAs' IE of the S1 SETUP REQUEST) and a list of
already-tried MMEs, so successive attempts pick a different candidate.

On connection failure (SCTP establishment timeout or error), or when the
selected MME rejects the S1 SETUP REQUEST or fails to respond in time,
the FSM re-enters the CONNECTING state rather than terminating.  This
triggers another mme_select/1 call with the failed MME added to the
tried_mmes list.  S1 SETUP FAILURE PDUs from the MME are intentionally
not forwarded to the eNB, so the retry is fully transparent.

Once mme_select/1 exhausts all candidates it returns 'error'; at that
point the FSM builds and sends an S1 SETUP FAILURE PDU to the eNB and
terminates.

Other changes:
* add close_sock/1, close_conn/1 helpers; simplify terminate/3
* add ?S1GW_CTR_ENB_PROXY_MME_SELECT_ERROR counter

Change-Id: I83dc4a78c78a7b87e87f5ca9a941a168d6c1dc36
Related: SYS#7052
Vadim Yanitskiy at

#20878 (Mar 13, 2026, 2:15:13 PM)

mme_registry: add backwards compat for old sctp_client config

When 'mme_pool' is absent from the config, automatically populate the
MME pool with a single 'default' entry derived from the 'sctp_client'
section (including legacy mme_loc_addr/mme_rem_addr params), and emit
a deprecation warning.  osmo_s1gw_sup:init/1 normalises 'sctp_client'
in the app env (with all defaults applied) before children start, so
mme_registry can safely read it without duplicating the parsing logic.

Change-Id: Ia97fb61bbb5ace6f43d1a6768fb5fb6883158532
Related: SYS#7052
Vadim Yanitskiy at

#20877 (Mar 13, 2026, 2:15:09 PM)

enb_proxy: add initial MME pooling support

Rework the CONNECTING state to dynamically select an MME from the pool
via mme_registry:mme_select/1, passing the eNB's Tracking Area Codes
(from the ?'id-SupportedTAs' IE of the S1 SETUP REQUEST) and a list of
already-tried MMEs, so successive attempts pick a different candidate.

On connection failure (SCTP establishment timeout or error), or when the
selected MME rejects the S1 SETUP REQUEST or fails to respond in time,
the FSM re-enters the CONNECTING state rather than terminating.  This
triggers another mme_select/1 call with the failed MME added to the
tried_mmes list.  S1 SETUP FAILURE PDUs from the MME are intentionally
not forwarded to the eNB, so the retry is fully transparent.

Once mme_select/1 exhausts all candidates it returns 'error'; at that
point the FSM builds and sends an S1 SETUP FAILURE PDU to the eNB and
terminates.

Other changes:
* add close_sock/1, close_conn/1 helpers; simplify terminate/3
* add ?S1GW_CTR_ENB_PROXY_MME_SELECT_ERROR counter

Change-Id: I83dc4a78c78a7b87e87f5ca9a941a168d6c1dc36
Related: SYS#7052
Vadim Yanitskiy at

#20876 (Mar 13, 2026, 2:15:09 PM)

mme_registry: add backwards compat for old sctp_client config

When 'mme_pool' is absent from the config, automatically populate the
MME pool with a single 'default' entry derived from the 'sctp_client'
section (including legacy mme_loc_addr/mme_rem_addr params), and emit
a deprecation warning.  osmo_s1gw_sup:init/1 normalises 'sctp_client'
in the app env (with all defaults applied) before children start, so
mme_registry can safely read it without duplicating the parsing logic.

Change-Id: Ia97fb61bbb5ace6f43d1a6768fb5fb6883158532
Related: SYS#7052
Vadim Yanitskiy at

#20875 (Mar 13, 2026, 8:58:26 AM)

Fix lint errors: don't use star imports

tests/test_tlv.py:21:1: F403 `from osmocom.tlv import *` used; unable to detect undefined names
   |
19 | import unittest
20 | from construct import Int8ub, GreedyBytes
21 | from osmocom.tlv import *
   | ^^^^^^^^^^^^^^^^^^^^^^^^^ F403
22 | from osmocom.utils import h2b

Change-Id: I0ca76a40d47f72635682de9303ff73e9b2197266
Oliver Smith at

#20874 (Mar 13, 2026, 8:58:24 AM)

Fix lint errors: don't use star imports

tests/test_tlv.py:21:1: F403 `from osmocom.tlv import *` used; unable to detect undefined names
   |
19 | import unittest
20 | from construct import Int8ub, GreedyBytes
21 | from osmocom.tlv import *
   | ^^^^^^^^^^^^^^^^^^^^^^^^^ F403
22 | from osmocom.utils import h2b

Change-Id: I0ca76a40d47f72635682de9303ff73e9b2197266
Oliver Smith at

#20873 (Mar 11, 2026, 2:09:50 PM)

build: add --disable-multi-arfcn configure option

- add configure flag to disable Multi ARFCN support
- compile Channelizer, Synthesis, RadioInterfaceMulti and fft.c only when enabled
- guard Multi ARFCN-specific code with ENABLE_MULTI_ARFCN
- avoid requiring fftw3f when Multi ARFCN support is disabled

Change-Id: I2495c5b5c79f2fe74bef83902058e1d2207c1f3c
dtv.comp at

#20872 (Mar 11, 2026, 2:09:50 PM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20871 (Mar 11, 2026, 2:09:47 PM)

build: add --disable-multi-arfcn configure option

- add configure flag to disable Multi ARFCN support
- compile Channelizer, Synthesis, RadioInterfaceMulti and fft.c only when enabled
- guard Multi ARFCN-specific code with ENABLE_MULTI_ARFCN
- avoid requiring fftw3f when Multi ARFCN support is disabled

Change-Id: I2495c5b5c79f2fe74bef83902058e1d2207c1f3c
dtv.comp at

#20870 (Mar 11, 2026, 2:09:47 PM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20869 (Mar 11, 2026, 11:27:27 AM)

build: add --disable-multi-arfcn configure option

- add configure flag to disable Multi ARFCN support
- compile Channelizer, Synthesis, RadioInterfaceMulti and fft.c only when enabled
- guard Multi ARFCN-specific code with ENABLE_MULTI_ARFCN
- avoid requiring fftw3f when Multi ARFCN support is disabled

Change-Id: I2495c5b5c79f2fe74bef83902058e1d2207c1f3c
dtv.comp at

#20868 (Mar 11, 2026, 11:27:23 AM)

build: add --disable-multi-arfcn configure option

- add configure flag to disable Multi ARFCN support
- compile Channelizer, Synthesis, RadioInterfaceMulti and fft.c only when enabled
- guard Multi ARFCN-specific code with ENABLE_MULTI_ARFCN
- avoid requiring fftw3f when Multi ARFCN support is disabled

Change-Id: I2495c5b5c79f2fe74bef83902058e1d2207c1f3c
dtv.comp at

#20867 (Mar 11, 2026, 11:27:23 AM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20866 (Mar 11, 2026, 11:27:20 AM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20865 (Mar 11, 2026, 11:00:35 AM)

build: add --disable-multi-arfcn configure option

- add configure flag to disable Multi ARFCN support
- compile Channelizer, Synthesis, RadioInterfaceMulti and fft.c only when enabled
- guard Multi ARFCN-specific code with ENABLE_MULTI_ARFCN
- avoid requiring fftw3f when Multi ARFCN support is disabled

Change-Id: I2495c5b5c79f2fe74bef83902058e1d2207c1f3c
dtv.comp at

#20864 (Mar 11, 2026, 11:00:35 AM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20863 (Mar 11, 2026, 11:00:35 AM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20862 (Mar 11, 2026, 11:00:34 AM)

build: add --disable-multi-arfcn configure option

- add configure flag to disable Multi ARFCN support
- compile Channelizer, Synthesis, RadioInterfaceMulti and fft.c only when enabled
- guard Multi ARFCN-specific code with ENABLE_MULTI_ARFCN
- avoid requiring fftw3f when Multi ARFCN support is disabled

Change-Id: I2495c5b5c79f2fe74bef83902058e1d2207c1f3c
dtv.comp at

#20861 (Mar 11, 2026, 12:35:25 AM)

build: add --disable-multi-arfcn configure option

- add configure flag to disable Multi ARFCN support
- compile Channelizer, Synthesis, RadioInterfaceMulti and fft.c only when enabled
- guard Multi ARFCN-specific code with ENABLE_MULTI_ARFCN
- avoid requiring fftw3f when Multi ARFCN support is disabled

Change-Id: I2495c5b5c79f2fe74bef83902058e1d2207c1f3c
dtv.comp at

#20860 (Mar 11, 2026, 12:35:25 AM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20859 (Mar 11, 2026, 12:35:24 AM)

build: add --disable-multi-arfcn configure option

- add configure flag to disable Multi ARFCN support
- compile Channelizer, Synthesis, RadioInterfaceMulti and fft.c only when enabled
- guard Multi ARFCN-specific code with ENABLE_MULTI_ARFCN
- avoid requiring fftw3f when Multi ARFCN support is disabled

Change-Id: I2495c5b5c79f2fe74bef83902058e1d2207c1f3c
dtv.comp at

#20858 (Mar 11, 2026, 12:35:23 AM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20857 (Mar 11, 2026, 12:22:38 AM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20856 (Mar 11, 2026, 12:22:38 AM)

build: add --disable-multi-arfcn configure option

- add configure flag to disable Multi ARFCN support
- compile Channelizer, Synthesis, RadioInterfaceMulti and fft.c only when enabled
- guard Multi ARFCN-specific code with ENABLE_MULTI_ARFCN
- avoid requiring fftw3f when Multi ARFCN support is disabled

Change-Id: I2495c5b5c79f2fe74bef83902058e1d2207c1f3c
dtv.comp at

#20855 (Mar 11, 2026, 12:22:35 AM)

build: add --disable-multi-arfcn configure option

- add configure flag to disable Multi ARFCN support
- compile Channelizer, Synthesis, RadioInterfaceMulti and fft.c only when enabled
- guard Multi ARFCN-specific code with ENABLE_MULTI_ARFCN
- avoid requiring fftw3f when Multi ARFCN support is disabled

Change-Id: I2495c5b5c79f2fe74bef83902058e1d2207c1f3c
dtv.comp at

#20854 (Mar 11, 2026, 12:22:35 AM)

transceiver: add optional Laurent burst LUT modulation (int16)

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

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

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

Change-Id: I1715c2d33dc55fe1c7be5c6e7259d378ea5e80b2
dtv.comp at

#20853 (Mar 10, 2026, 4:27:57 PM)

core: fix config.h

While exploring why logging is disabled but still shows up in the binaries
I kind of wondered how all the config.h HAVE_XX checks we have everwhere work.
Apparently they do not work at all, due to missing or misplaced include of config.h.

This affects tons of other checks as well.

The jenkins hook ensures the include order is checked to ensure config.h
does not get misplaced or lost in the future.

Change-Id: Ic2cf52a3b60f43a2f5d3fe01c41a41f6fd9a8000
ewild at

#20852 (Mar 10, 2026, 4:27:57 PM)

core: fix config.h

While exploring why logging is disabled but still shows up in the binaries
I kind of wondered how all the config.h HAVE_XX checks we have everwhere work.
Apparently they do not work at all, due to missing or misplaced include of config.h.

This affects tons of other checks as well.

The jenkins hook ensures the include order is checked to ensure config.h
does not get misplaced or lost in the future.

Change-Id: Ic2cf52a3b60f43a2f5d3fe01c41a41f6fd9a8000
ewild at

#20851 (Mar 10, 2026, 4:27:53 PM)

core: fix config.h

While exploring why logging is disabled but still shows up in the binaries
I kind of wondered how all the config.h HAVE_XX checks we have everwhere work.
Apparently they do not work at all, due to missing or misplaced include of config.h.

This affects tons of other checks as well.

The jenkins hook ensures the include order is checked to ensure config.h
does not get misplaced or lost in the future.

Change-Id: Ic2cf52a3b60f43a2f5d3fe01c41a41f6fd9a8000
ewild at

#20850 (Mar 10, 2026, 4:11:34 PM)

core: fix config.h

While exploring why logging is disabled but still shows up in the binaries
I kind of wondered how all the config.h HAVE_XX checks we have everwhere work.
Apparently they do not work at all, due to missing or misplaced include of config.h.

This affects tons of other checks as well.

The jenkins hook ensures the include order is checked to ensure config.h
does not get misplaced or lost in the future.

Change-Id: Ic2cf52a3b60f43a2f5d3fe01c41a41f6fd9a8000
ewild at

#20849 (Mar 10, 2026, 4:11:32 PM)

core: fix config.h

While exploring why logging is disabled but still shows up in the binaries
I kind of wondered how all the config.h HAVE_XX checks we have everwhere work.
Apparently they do not work at all, due to missing or misplaced include of config.h.

This affects tons of other checks as well.

The jenkins hook ensures the include order is checked to ensure config.h
does not get misplaced or lost in the future.

Change-Id: Ic2cf52a3b60f43a2f5d3fe01c41a41f6fd9a8000
ewild at

#20848 (Mar 10, 2026, 4:11:32 PM)

core: fix config.h

While exploring why logging is disabled but still shows up in the binaries
I kind of wondered how all the config.h HAVE_XX checks we have everwhere work.
Apparently they do not work at all, due to missing or misplaced include of config.h.

This affects tons of other checks as well.

The jenkins hook ensures the include order is checked to ensure config.h
does not get misplaced or lost in the future.

Change-Id: Ic2cf52a3b60f43a2f5d3fe01c41a41f6fd9a8000
ewild at

#20847 (Mar 10, 2026, 1:36:13 PM)

sane embedded builds without host talloc

So far host talloc was always required.
This fixes this up to only build a subset of stuff
that actually works for embedded targets while
using the pseudotalloc header file, and the actual
firmware can supply its own talloc, without
involving some random build system supplied talloc
headers.

Unfortunately static symbols can't really be weak,
so just going for always-on weak pseudotalloc does
not work.

Change-Id: Ibb309a01ac6cad827b33ac18be408be1ac2cf7e0
ewild at

#20846 (Mar 10, 2026, 1:36:13 PM)

sane embedded builds without host talloc

So far host talloc was always required.
This fixes this up to only build a subset of stuff
that actually works for embedded targets while
using the pseudotalloc header file, and the actual
firmware can supply its own talloc, without
involving some random build system supplied talloc
headers.

Unfortunately static symbols can't really be weak,
so just going for always-on weak pseudotalloc does
not work.

Change-Id: Ibb309a01ac6cad827b33ac18be408be1ac2cf7e0
ewild at

#20845 (Mar 10, 2026, 1:36:11 PM)

sane embedded builds without host talloc

So far host talloc was always required.
This fixes this up to only build a subset of stuff
that actually works for embedded targets while
using the pseudotalloc header file, and the actual
firmware can supply its own talloc, without
involving some random build system supplied talloc
headers.

Unfortunately static symbols can't really be weak,
so just going for always-on weak pseudotalloc does
not work.

Change-Id: Ibb309a01ac6cad827b33ac18be408be1ac2cf7e0
ewild at