mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-10-08 23:57:21 +00:00
nimble/ll: Fix crash in periodic sync when connected
Periodic sync and periodic advertising were using same scheduler type which was resulting in calling wrong function when sync was removed from scheduler.
This commit is contained in:
@@ -74,7 +74,8 @@ extern uint8_t g_ble_ll_sched_offset_ticks;
|
||||
#define BLE_LL_SCHED_TYPE_CONN (3)
|
||||
#define BLE_LL_SCHED_TYPE_AUX_SCAN (4)
|
||||
#define BLE_LL_SCHED_TYPE_DTM (5)
|
||||
#define BLE_LL_SCHED_TYPE_SYNC (6)
|
||||
#define BLE_LL_SCHED_TYPE_PERIODIC (6)
|
||||
#define BLE_LL_SCHED_TYPE_SYNC (7)
|
||||
|
||||
/* Return values for schedule callback. */
|
||||
#define BLE_LL_SCHED_STATE_RUNNING (0)
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct ble_ll_sync_sm;
|
||||
|
||||
int ble_ll_sync_create(const uint8_t *cmdbuf, uint8_t len);
|
||||
int ble_ll_sync_cancel(ble_ll_hci_post_cmd_complete_cb *post_cmd_cb);
|
||||
int ble_ll_sync_terminate(const uint8_t *cmdbuf, uint8_t len);
|
||||
@@ -47,6 +49,7 @@ int ble_ll_sync_rx_isr_end(uint8_t *rxbuf, struct ble_mbuf_hdr *rxhdr);
|
||||
void ble_ll_sync_rx_pkt_in(struct os_mbuf *rxpdu, struct ble_mbuf_hdr *hdr);
|
||||
void ble_ll_sync_wfr_timer_exp(void);
|
||||
void ble_ll_sync_halt(void);
|
||||
void ble_ll_sync_rmvd_from_sched(struct ble_ll_sync_sm *sm);
|
||||
|
||||
uint32_t ble_ll_sync_get_event_end_time(void);
|
||||
|
||||
|
||||
@@ -4775,10 +4775,10 @@ ble_ll_adv_sm_init(struct ble_ll_adv_sm *advsm)
|
||||
advsm->periodic_sync_active = 0;
|
||||
advsm->periodic_sync[0].sch.cb_arg = advsm;
|
||||
advsm->periodic_sync[0].sch.sched_cb = ble_ll_adv_sync_tx_start_cb;
|
||||
advsm->periodic_sync[0].sch.sched_type = BLE_LL_SCHED_TYPE_SYNC;
|
||||
advsm->periodic_sync[0].sch.sched_type = BLE_LL_SCHED_TYPE_PERIODIC;
|
||||
advsm->periodic_sync[1].sch.cb_arg = advsm;
|
||||
advsm->periodic_sync[1].sch.sched_cb = ble_ll_adv_sync_tx_start_cb;
|
||||
advsm->periodic_sync[1].sch.sched_type = BLE_LL_SCHED_TYPE_SYNC;
|
||||
advsm->periodic_sync[1].sch.sched_type = BLE_LL_SCHED_TYPE_PERIODIC;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
@@ -252,9 +252,12 @@ ble_ll_sched_conn_reschedule(struct ble_ll_conn_sm *connsm)
|
||||
ble_ll_scan_end_adv_evt((struct ble_ll_aux_data *)entry->cb_arg);
|
||||
break;
|
||||
#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV)
|
||||
case BLE_LL_SCHED_TYPE_SYNC:
|
||||
case BLE_LL_SCHED_TYPE_PERIODIC:
|
||||
ble_ll_adv_periodic_rmvd_from_sched((struct ble_ll_adv_sm *)entry->cb_arg);
|
||||
break;
|
||||
case BLE_LL_SCHED_TYPE_SYNC:
|
||||
ble_ll_sync_rmvd_from_sched((struct ble_ll_sync_sm *)entry->cb_arg);
|
||||
break;
|
||||
#endif
|
||||
#endif
|
||||
default:
|
||||
|
||||
@@ -1637,6 +1637,16 @@ ble_ll_sync_receive_enable(const uint8_t *cmdbuf, uint8_t len)
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Called when a sync scan event has been removed from the scheduler
|
||||
* without being run.
|
||||
*/
|
||||
void
|
||||
ble_ll_sync_rmvd_from_sched(struct ble_ll_sync_sm *sm)
|
||||
{
|
||||
ble_ll_event_send(&sm->sync_ev_end);
|
||||
}
|
||||
|
||||
void
|
||||
ble_ll_sync_reset(void)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user