mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-08-20 00:39:59 +00:00
nimble/ll: Fix sync packet offset in syncinfo
We need to move periodic advertising event start time by full interval (not only ticks) as otherwise any calculation of start time in the future event will not be accurate.
This commit is contained in:
committed by
Szymon Janc
parent
6d5fe383ef
commit
5504556792
@@ -623,48 +623,51 @@ ble_ll_adv_put_syncinfo(struct ble_ll_adv_sm *advsm,
|
||||
uint8_t *dptr)
|
||||
{
|
||||
#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER)
|
||||
uint8_t anchor_usecs;
|
||||
uint16_t conn_cnt;
|
||||
#endif
|
||||
unsigned int event_cnt_off = 0;
|
||||
uint32_t offset = 0;
|
||||
uint32_t anchor;
|
||||
uint32_t itvl_us;
|
||||
uint32_t anchor_ticks;
|
||||
uint8_t anchor_rem_us;
|
||||
uint8_t units;
|
||||
|
||||
if (connsm) {
|
||||
#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER)
|
||||
anchor = connsm->anchor_point;
|
||||
anchor_usecs = connsm->anchor_point_usecs;
|
||||
anchor_ticks = connsm->anchor_point;
|
||||
anchor_rem_us = connsm->anchor_point_usecs;
|
||||
conn_cnt = connsm->event_cntr;
|
||||
|
||||
/* get anchor for conn event that is before periodic_adv_event_start_time */
|
||||
while (LL_TMR_GT(anchor, advsm->periodic_adv_event_start_time)) {
|
||||
ble_ll_conn_get_anchor(connsm, --conn_cnt, &anchor, &anchor_usecs);
|
||||
while (LL_TMR_GT(anchor_ticks, advsm->periodic_adv_event_start_time)) {
|
||||
ble_ll_conn_get_anchor(connsm, --conn_cnt, &anchor_ticks, &anchor_rem_us);
|
||||
}
|
||||
|
||||
offset = ble_ll_tmr_t2u(advsm->periodic_adv_event_start_time - anchor);
|
||||
offset -= anchor_usecs;
|
||||
offset = ble_ll_tmr_t2u(advsm->periodic_adv_event_start_time - anchor_ticks);
|
||||
offset -= anchor_rem_us;
|
||||
offset += advsm->periodic_adv_event_start_time_remainder;
|
||||
|
||||
/* connEventCount */
|
||||
put_le16(conn_event_cnt, conn_cnt);
|
||||
#endif
|
||||
} else {
|
||||
anchor = advsm->periodic_adv_event_start_time;
|
||||
anchor_ticks = advsm->periodic_adv_event_start_time;
|
||||
anchor_rem_us = advsm->periodic_adv_event_start_time_remainder;
|
||||
itvl_us = advsm->periodic_adv_itvl * BLE_LL_ADV_PERIODIC_ITVL;
|
||||
|
||||
/* Get periodic event that is past AUX start time (so that we always
|
||||
* provide valid offset if it is not too far in future). This can
|
||||
* happen if advertising event is interleaved with periodic advertising
|
||||
* event (when chaining).
|
||||
*/
|
||||
while (LL_TMR_GT(AUX_CURRENT(advsm)->start_time, anchor)) {
|
||||
anchor += advsm->periodic_adv_itvl_ticks;
|
||||
while (LL_TMR_GEQ(AUX_CURRENT(advsm)->start_time, anchor_ticks)) {
|
||||
ble_ll_tmr_add(&anchor_ticks, &anchor_rem_us, itvl_us);
|
||||
event_cnt_off++;
|
||||
}
|
||||
|
||||
offset = ble_ll_tmr_t2u(anchor - AUX_CURRENT(advsm)->start_time);
|
||||
offset += advsm->periodic_adv_event_start_time_remainder;
|
||||
offset += advsm->periodic_adv_itvl_rem_us;
|
||||
/* We always schedule aux with 0 rem_us so no need to include it here */
|
||||
offset = ble_ll_tmr_t2u(anchor_ticks - AUX_CURRENT(advsm)->start_time);
|
||||
offset += anchor_rem_us;
|
||||
}
|
||||
|
||||
/* Sync Packet Offset (13 bits), Offset Units (1 bit), Offset Adjust (1 bit),
|
||||
|
||||
Reference in New Issue
Block a user