bluetooth: host: refactor bt_hci_le_per_adv_report data reassembly

Refactoring the periodic advertisment report receive function
to make the handling of data reassembly more readable.

Signed-off-by: Pierce Lowe <pierce.lowe@nordicsemi.no>
This commit is contained in:
Pierce Lowe 2023-01-24 19:13:28 +01:00 committed by Carles Cufí
parent a7c1c27e38
commit ba09a252ec

View file

@ -798,37 +798,41 @@ void bt_hci_le_per_adv_report(struct net_buf *buf)
if (!per_adv_sync->report_truncated) { if (!per_adv_sync->report_truncated) {
#if CONFIG_BT_PER_ADV_SYNC_BUF_SIZE > 0 #if CONFIG_BT_PER_ADV_SYNC_BUF_SIZE > 0
if (evt->data_status == BT_HCI_LE_ADV_EVT_TYPE_DATA_STATUS_COMPLETE && if (net_buf_simple_tailroom(&per_adv_sync->reassembly) < evt->length) {
per_adv_sync->reassembly.len == 0) { /* The buffer is too small for the entire report. Drop it */
/* We have not received any partial data before. LOG_WRN("Buffer is too small to reassemble the report. "
* This buffer can be forwarded without an extra copy. "Use CONFIG_BT_PER_ADV_SYNC_BUF_SIZE to change "
*/ "the buffer size.");
bt_hci_le_per_adv_report_recv(per_adv_sync, &buf->b, &info);
} else {
if (evt->data_status == BT_HCI_LE_ADV_EVT_TYPE_DATA_STATUS_INCOMPLETE) {
LOG_DBG("Received incomplete advertising data. "
"Advertising report dropped.");
per_adv_sync->report_truncated = true; per_adv_sync->report_truncated = true;
net_buf_simple_reset(&per_adv_sync->reassembly); net_buf_simple_reset(&per_adv_sync->reassembly);
return; return;
} }
if (net_buf_simple_tailroom(&per_adv_sync->reassembly) < evt->length) {
/* The buffer is too small for the entire report. Drop it */
LOG_WRN("Buffer is too small to reassemble the report. "
"Use CONFIG_BT_PER_ADV_SYNC_BUF_SIZE to change "
"the buffer size.");
per_adv_sync->report_truncated = true; if (evt->data_status == BT_HCI_LE_ADV_EVT_TYPE_DATA_STATUS_COMPLETE) {
net_buf_simple_reset(&per_adv_sync->reassembly); if (per_adv_sync->reassembly.len == 0) {
return; /* We have not received any partial data before.
} * This buffer can be forwarded without an extra copy.
net_buf_simple_add_mem(&per_adv_sync->reassembly, buf->data, evt->length); */
if (evt->data_status == BT_HCI_LE_ADV_EVT_TYPE_DATA_STATUS_COMPLETE) { bt_hci_le_per_adv_report_recv(per_adv_sync, &buf->b, &info);
} else {
net_buf_simple_add_mem(&per_adv_sync->reassembly,
buf->data, evt->length);
bt_hci_le_per_adv_report_recv(per_adv_sync, bt_hci_le_per_adv_report_recv(per_adv_sync,
&per_adv_sync->reassembly, &info); &per_adv_sync->reassembly, &info);
net_buf_simple_reset(&per_adv_sync->reassembly); net_buf_simple_reset(&per_adv_sync->reassembly);
} }
} else if (evt->data_status == BT_HCI_LE_ADV_EVT_TYPE_DATA_STATUS_INCOMPLETE) {
LOG_DBG("Received incomplete advertising data. "
"Advertising report dropped.");
per_adv_sync->report_truncated = true;
net_buf_simple_reset(&per_adv_sync->reassembly);
} else if (evt->data_status == BT_HCI_LE_ADV_EVT_TYPE_DATA_STATUS_PARTIAL) {
net_buf_simple_add_mem(&per_adv_sync->reassembly, buf->data, evt->length);
} else {
__ASSERT(false, "Invalid data status 0x%02X", evt->data_status);
} }
#else /* CONFIG_BT_PER_ADV_SYNC_BUF_SIZE > 0 */ #else /* CONFIG_BT_PER_ADV_SYNC_BUF_SIZE > 0 */
if (evt->data_status == BT_HCI_LE_ADV_EVT_TYPE_DATA_STATUS_COMPLETE) { if (evt->data_status == BT_HCI_LE_ADV_EVT_TYPE_DATA_STATUS_COMPLETE) {