diff --git a/nimble/controller/src/ble_ll_adv.c b/nimble/controller/src/ble_ll_adv.c index 0ce13a6da..f194ec21c 100644 --- a/nimble/controller/src/ble_ll_adv.c +++ b/nimble/controller/src/ble_ll_adv.c @@ -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),