SDC peripheral opens no receive window for 1 to 4 s after a connection update whose first new anchor meets a synchronized BIG

## Environment

- nRF Connect SDK v3.4.0-99553055607b, Zephyr v4.4.0-bf801e4e3d19
- SoftDevice Controller on the nRF5340 network core (`ipc_radio`,
`CONFIG_BT_LL_SOFTDEVICE=y`), HCI reports "Standard Bluetooth controller
(0x00) Version 200.12506 Build 888207768"
- Reproduced in BabbleSim (`nrf5340bsim`, `bs_2G4_phy_v1 -dump`). It is also
seen on hardware (nRF5340 Audio DK, BlueZ central), where the link later
ended with 0x28 (Instant Passed) or 0x08.

## Setup

- DUT: peripheral, synchronized to a BIG (10 ms ISO interval, one BIS), PA
synced. No CIS.
- Central: a second device (SDC central in bsim) on a 1001.25 ms (801 units)
connection to the DUT.
- The DUT host asks for 11 units (13.75 ms) through the connection parameter
update procedure. The central sends:
`LL_CONNECTION_UPDATE_IND winSize=1 (1.25 ms) winOffset=0 interval=11
latency=0 timeout=600 (6 s)`.

## Observed (phy dump, link access address 0xE8CB3499)

BIG held at the switch:

```
95.044075 DUT rx link st=1 last packet on the old 801-unit timing
96.045459 CEN tx (no DUT rx window)
97.046709 CEN tx first new 13.75 ms anchor; no DUT rx window
97.047936 DUT rx BIG BIG event 1.2 ms later
97.060458 CEN tx no DUT rx window (clear of the BIG events at .0579/.0679)
97.074208 CEN tx no DUT rx window
... 137 central events from 96.9 s to 99.0 s, 0 DUT receive windows on the link
99.026185 DUT rx link st=1 first window, then about 85 to 95 % of events received
```

Per 0.5 s bin: the central sends 31 to 35 events, and the DUT opens 0 windows
from 96.0 s to 99.0 s. From 99.0 s on it opens 20 to 24 windows and receives
18 to 22.

The same update with the BIG terminated by the host until the new anchors are
on air: the DUT opens a window on the first new anchor (`95.044075 DUT rx link
st=1`, central tx `95.044209`), keeps 27 of 32 events in the next 0.5 s, and
the link stays up with a 2 s timeout.

With `timeout=200` (2 s) and the BIG held, the peripheral disconnects with
0x08 1.0 s after reporting the update. The 2 s supervision timer runs from the
last packet, one old 1 s event before the instant.

## Expected

The BIG has priority over the ACL, so losing the first anchor (window plus
widening overlapping the BIG event) is understood. After that, the 13.75 ms
anchors walk all phases of the 10 ms BIG, and most of them are clear. The
peripheral should keep opening its (widened) window on each following anchor
until it receives a packet, as it does when the BIG is not running. Instead it
schedules nothing on the link for about 2 s (6 s timeout) or until the link
times out (2 s timeout).

## Impact

- A 1 s link moved to a short interval under a synchronized BIG is deaf for
seconds. With 2 s supervision it drops (0x08). With 6 s it survives, but on
hardware a later procedure's instant was then missed (0x28).
- The workaround in our application: never let such an update take effect
while a BIG is synchronized (keep the link on its long interval, or stop the
BIG through the switch), and keep a released BIG off for one old interval
after LE Connection Update Complete, because that event comes up to one old
interval before the new anchors start.

## Questions

1. Is skipping every anchor after a missed post-update transmit window,
while a BIG is synchronized, intended scheduling? Or is the link meant to be
retried on later non-conflicting anchors?
2. Is there a parameter (event priority, window widening policy) that makes
the peripheral keep retrying?

## Reproducer

A 4-node bsim scenario (source, DUT sink, LE Audio phone model, second
central) plus the phy-dump analysis scripts (`anchors.py`, `edge.py`,
`conn_update_ind.py`) are available on request. They live in a private repository.

  • Addendum: incoming connections fail with 0x3e while the peripheral is synchronized to a BIG

    Same setup as above (nRF5340, SDC on the network core, NCS v3.4.0, peripheral synchronized to a 10 ms BIG). A second, related observation from our bench:

    Hardware (two nRF5340 Audio DKs, BlueZ central)
    - With the peripheral synchronized to a BIG, 14 of 103 incoming connections failed to establish (0x3e, "Connection Failed to be Established"). With no BIG, 0 of 28 failed.
    - A 30 ms connection interval (three times the 10 ms ISO interval) failed most often.
    - Split by whether our application releases the BIG right after connecting: 13 of 80 failed with the release, 1 of 23 without it.

    BabbleSim (real SDC library, bs_2G4_phy -dump)
    - We could not reproduce the 0x3e: 0 failures in about 610 attempts over five setups. These covered 7 intervals, BIG release 0 to 100 ms after Connected, both BIS synced with ±40 ppm drift, and a central holding a second link so that winOffset
    spreads over the whole BIG period.
    - In bsim the SDC central always sends winSize=5, winOffset=0. The transmit window opens 2.5 ms after CONNECT_IND, which goes out on advertising the peripheral schedules clear of its BIG. So the window never fell inside a BIG event.
    - When the first anchors did land inside BIG events (second-link setup), the BIG won 54 of 120 times. Every link still got a packet within its first two events, so none failed.

    Related deafness with the BIG held (no release)
    After the second connection event, the peripheral opened no receive window for about 3.9 s, even on anchors clear of the BIG:

    8.105331 DUT rx link (event 1)
    8.165370 CEN tx every 30 ms, no DUT receive window
    12.034943 DUT rx link (just before the 4 s supervision timeout)

    This hit 16 of 27 attempts at 24 and 48 units, 5 of 14 at 16, 1 of 13 at 12, and none at 11, 20 or 25 units. It looks like the same behaviour as in our original post, here without any connection update. Releasing the BIG right after Connected avoids
    it in bsim.

    Questions
    1. After a missed early anchor of a new connection, while a BIG is synchronized, is it intended that the peripheral schedules no receive window for several seconds?
    2. Could the 0x3e on hardware come from the transmit window or the first anchors colliding with BIG events, with a central whose window placement differs from the SDC central (BlueZ here)?
    3. Is there a recommended interval, offset policy or scheduling setting that makes a new connection robust next to a synchronized BIG?

    The bsim scenario and phy-dump analysis scripts are available on request.

  • Hi, 

    ## Reproducer

    A 4-node bsim scenario (source, DUT sink, LE Audio phone model, second
    central) plus the phy-dump analysis scripts (`anchors.py`, `edge.py`,
    `conn_update_ind.py`) are available on request. They live in a private repository.

    Yes, please. 

    Arkadiusz said:
    The bsim scenario and phy-dump analysis scripts are available on request.

    Yes, please. 

    Regards,
    Amanda H.

Related