Skip to content

nimble/host: L2CAP fallback for LL conn param rejection#2192

Open
gmarull wants to merge 1 commit intoapache:masterfrom
pebble-dev:conn-update-fix
Open

nimble/host: L2CAP fallback for LL conn param rejection#2192
gmarull wants to merge 1 commit intoapache:masterfrom
pebble-dev:conn-update-fix

Conversation

@gmarull
Copy link
Copy Markdown
Contributor

@gmarull gmarull commented Mar 30, 2026

When the peripheral calls ble_gap_update_params() and the peer's supported features indicate CONN_PARAM_REQUEST support, NimBLE sends the LE Connection Update HCI command. However, if the local controller does not support the BLE 4.1 LL Connection Parameters Request procedure (e.g. an external controller with limited feature set), the HCI command is rejected synchronously with BLE_ERR_UNSUPP_REM_FEATURE (0x1a).

NimBLE already handles this error asynchronously in ble_gap_rx_update_complete() by falling back to L2CAP signaling, but the synchronous rejection path had no such fallback, causing the update to fail and be retried futilely by upper layers.

Add a synchronous fallback: when ble_gap_update_tx() returns BLE_ERR_UNSUPP_REM_FEATURE and the local device is the slave, switch to the L2CAP Connection Parameter Update Request procedure.

* If the controller rejects the LL update with "Unsupported Remote
* Feature" and we are the slave, fall back to L2CAP signaling. This
* can happen when the peer advertises CONN_PARAM_REQUEST support at
* the host level but the local controller does not support the 4.1 LL
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should this comment be about peer's controller, not local controller?

as per spec:
Unsupported Remote Feature (0x1A)
"The Controller is the Peripheral and the local Controller supports the Connection Parameters Request procedure but the peer Controller does not."

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

adjusted

When the peripheral calls ble_gap_update_params() and the peer's
supported features indicate CONN_PARAM_REQUEST support, NimBLE sends
the LE Connection Update HCI command. However, if the peer's controller
does not support the BLE 4.1 LL Connection Parameters Request procedure,
the HCI command is rejected synchronously with
BLE_ERR_UNSUPP_REM_FEATURE (0x1a).

NimBLE already handles this error asynchronously in
ble_gap_rx_update_complete() by falling back to L2CAP signaling, but
the synchronous rejection path had no such fallback, causing the update
to fail and be retried futilely by upper layers.

Add a synchronous fallback: when ble_gap_update_tx() returns
BLE_ERR_UNSUPP_REM_FEATURE and the local device is the slave, switch to
the L2CAP Connection Parameter Update Request procedure.

Signed-Off-By: Gerard Marull-Paretas <gerard@teslabs.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants