In case of use of filtering based on: periodic advertising list and CTE type, the synchronization can hang. That is possible if a periodic advertiser uses wrong CTE type. In such situation the sync is not released in ull_sync_done call. What more the sync->timeout_reload is not cleared and Host is not able to cancel the synchronization. The periodic advertising is in a semi-sync-established state. There are no reports send to Host. Host can't use the sync set to synchronize with other device. It is only able to terminate the sync (call to ll_sync_terminate). To fix the issue following changes should be applied: - isr_rx_adv_sync_estab should call isr_rx_done_cleanup with sync_term parameter in case the sync_ok isn't SYNC_STAT_ALLOWED. In any case the CTE type is wrong, no matter is the periodic advertising list filtering is enabled or not. - ull_sync_established_report should set sync->is_term to true in case the CTE type is not allowed. That change is required for devices that do not support Direction Finding Extension. For those devices CTE type based filtering is done in ULL by ull_sync_established_report function. The sync->is_term should be set unconditionally, hence is moved up in the function. With these two changes done, ull_sync_done function will execute sync_ticker_release in case the CTE has wrong type. ULL, depending on notifications prepared by ull_sync_established_report, will follow up on sync termination if required. Signed-off-by: Piotr Pryga <piotr.pryga@nordicsemi.no> |
||
|---|---|---|
| .. | ||
| crypto | ||
| hal | ||
| hci | ||
| include | ||
| ll_sw | ||
| ticker | ||
| util | ||
| CMakeLists.txt | ||
| Kconfig | ||
| Kconfig.df | ||
| Kconfig.dtm | ||
| Kconfig.ll_sw_split | ||