Bluetooth: controller: Fix overflow with preferred periodicity

Avoid possibly overflowing maximum interval when calculating interval
with preferred periodicity.

Changed calculation to round down from maximum interval and reset to
maximum in case of underflowing minimum interval.

Signed-off-by: Wolfgang Puffitsch <wopu@demant.com>
This commit is contained in:
Wolfgang Puffitsch 2021-04-24 15:10:00 +02:00 committed by Carles Cufí
commit feb9943e84

View file

@ -3340,6 +3340,9 @@ static inline void event_conn_param_rsp(struct ll_conn *conn)
/* master respond with connection update */ /* master respond with connection update */
if (!conn->lll.role) { if (!conn->lll.role) {
uint16_t interval_max;
uint8_t preferred_periodicity;
if (conn->llcp_cu.req != conn->llcp_cu.ack) { if (conn->llcp_cu.req != conn->llcp_cu.ack) {
return; return;
} }
@ -3350,15 +3353,20 @@ static inline void event_conn_param_rsp(struct ll_conn *conn)
/* Initiate connection update procedure */ /* Initiate connection update procedure */
conn->llcp_cu.win_size = 1U; conn->llcp_cu.win_size = 1U;
conn->llcp_cu.win_offset_us = 0U; conn->llcp_cu.win_offset_us = 0U;
if (conn->llcp_conn_param.preferred_periodicity) {
conn->llcp_cu.interval = interval_max = conn->llcp_conn_param.interval_max;
((conn->llcp_conn_param.interval_min / preferred_periodicity = conn->llcp_conn_param.preferred_periodicity;
conn->llcp_conn_param.preferred_periodicity) + if (preferred_periodicity) {
1) * /* Find interval with preferred periodicity by rounding down from max */
conn->llcp_conn_param.preferred_periodicity; conn->llcp_cu.interval = (interval_max / preferred_periodicity) *
preferred_periodicity;
/* Use maximum in case of underflowing minimum interval */
if (conn->llcp_cu.interval < conn->llcp_conn_param.interval_min) {
conn->llcp_cu.interval = interval_max;
}
} else { } else {
conn->llcp_cu.interval = /* Choose maximum interval as default */
conn->llcp_conn_param.interval_max; conn->llcp_cu.interval = interval_max;
} }
conn->llcp_cu.latency = conn->llcp_conn_param.latency; conn->llcp_cu.latency = conn->llcp_conn_param.latency;
conn->llcp_cu.timeout = conn->llcp_conn_param.timeout; conn->llcp_cu.timeout = conn->llcp_conn_param.timeout;