You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ry...@apache.org on 2019/01/11 14:48:41 UTC
[mynewt-nimble] 04/07: nimble/ll: Fix extended chaining scanning
This is an automated email from the ASF dual-hosted git repository.
rymek pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git
commit 5ace22629d5ab0961019db4586f87b0ae2c3c3cd
Author: Ćukasz Rymanowski <lu...@codecoup.pl>
AuthorDate: Fri Jan 11 10:46:06 2019 +0100
nimble/ll: Fix extended chaining scanning
This patch fix scanning for the advertising events where
last chain packet has extended header len 0
---
nimble/controller/include/controller/ble_ll_scan.h | 1 +
nimble/controller/src/ble_ll_scan.c | 101 ++++++++++++---------
2 files changed, 59 insertions(+), 43 deletions(-)
diff --git a/nimble/controller/include/controller/ble_ll_scan.h b/nimble/controller/include/controller/ble_ll_scan.h
index 388a599..82133b7 100644
--- a/nimble/controller/include/controller/ble_ll_scan.h
+++ b/nimble/controller/include/controller/ble_ll_scan.h
@@ -98,6 +98,7 @@ struct ble_ll_scan_params
#define BLE_LL_AUX_HAS_ADI 0x80
#define BLE_LL_SET_AUX_FLAG(aux_data, flag) ((aux_data)->flags |= flag)
+#define BLE_LL_CLEAR_AUX_FLAG(aux_data, flag) ((aux_data)->flags &= ~flag)
#define BLE_LL_CHECK_AUX_FLAG(aux_data, flag) (!!((aux_data)->flags & flag))
struct ble_ll_aux_data {
diff --git a/nimble/controller/src/ble_ll_scan.c b/nimble/controller/src/ble_ll_scan.c
index 95977dc..a0b151a 100644
--- a/nimble/controller/src/ble_ll_scan.c
+++ b/nimble/controller/src/ble_ll_scan.c
@@ -1855,6 +1855,18 @@ ble_ll_scan_get_aux_data(struct ble_mbuf_hdr *ble_hdr, uint8_t *rxbuf)
return -1;
}
+ if (ext_hdr_len == 0) {
+ if (current_aux) {
+ /* This is last element in the chain.
+ * Clear incomplete flag
+ */
+ BLE_LL_CLEAR_AUX_FLAG(current_aux, BLE_LL_AUX_INCOMPLETE_BIT);
+ return 1;
+ }
+
+ return -1;
+ }
+
ext_hdr_flags = rxbuf[3];
ext_hdr = &rxbuf[4];
@@ -2025,55 +2037,56 @@ ble_ll_scan_parse_ext_hdr(struct os_mbuf *om,
ext_hdr_flags = rxbuf[3];
ext_hdr = &rxbuf[4];
- i = 0;
- if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_ADVA_BIT)) {
- i += BLE_LL_EXT_ADV_ADVA_SIZE;
- }
+ if (ext_hdr_len) {
+ i = 0;
+ if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_ADVA_BIT)) {
+ i += BLE_LL_EXT_ADV_ADVA_SIZE;
+ }
- if (adva) {
- memcpy(out_evt->addr, adva, 6);
- out_evt->addr_type = adva_type;
- }
+ if (adva) {
+ memcpy(out_evt->addr, adva, 6);
+ out_evt->addr_type = adva_type;
+ }
- if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_TARGETA_BIT)) {
- i += BLE_LL_EXT_ADV_TARGETA_SIZE;
- }
+ if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_TARGETA_BIT)) {
+ i += BLE_LL_EXT_ADV_TARGETA_SIZE;
+ }
- if (inita) {
- memcpy(out_evt->dir_addr, inita, 6);
- out_evt->dir_addr_type = inita_type;
- out_evt->evt_type |= BLE_HCI_ADV_DIRECT_MASK;
- }
+ if (inita) {
+ memcpy(out_evt->dir_addr, inita, 6);
+ out_evt->dir_addr_type = inita_type;
+ out_evt->evt_type |= BLE_HCI_ADV_DIRECT_MASK;
+ }
- if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_RFU_BIT)) {
- /* Just skip it for now*/
- i += 1;
- }
+ if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_RFU_BIT)) {
+ /* Just skip it for now*/
+ i += 1;
+ }
- if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_DATA_INFO_BIT)) {
- ble_ll_ext_scan_parse_adv_info(scansm, out_evt, (ext_hdr + i));
- i += BLE_LL_EXT_ADV_DATA_INFO_SIZE;
- } else if (out_evt->evt_type & BLE_HCI_ADV_SCAN_RSP_MASK) {
- out_evt->sid = (aux_data->adi >> 12);
- }
+ if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_DATA_INFO_BIT)) {
+ ble_ll_ext_scan_parse_adv_info(scansm, out_evt, (ext_hdr + i));
+ i += BLE_LL_EXT_ADV_DATA_INFO_SIZE;
+ } else if (out_evt->evt_type & BLE_HCI_ADV_SCAN_RSP_MASK) {
+ out_evt->sid = (aux_data->adi >> 12);
+ }
- /* In this point of time we don't want to care about aux ptr */
- if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT)) {
- i += BLE_LL_EXT_ADV_AUX_PTR_SIZE;
- }
+ /* In this point of time we don't want to care about aux ptr */
+ if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT)) {
+ i += BLE_LL_EXT_ADV_AUX_PTR_SIZE;
+ }
- if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_SYNC_INFO_BIT)) {
- /* TODO Handle periodic adv */
- i += BLE_LL_EXT_ADV_SYNC_INFO_SIZE;
- }
+ if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_SYNC_INFO_BIT)) {
+ /* TODO Handle periodic adv */
+ i += BLE_LL_EXT_ADV_SYNC_INFO_SIZE;
+ }
- if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_TX_POWER_BIT)) {
- out_evt->tx_power = *(ext_hdr + i);
- i += BLE_LL_EXT_ADV_TX_POWER_SIZE;
- }
+ if (ext_hdr_flags & (1 << BLE_LL_EXT_ADV_TX_POWER_BIT)) {
+ out_evt->tx_power = *(ext_hdr + i);
+ i += BLE_LL_EXT_ADV_TX_POWER_SIZE;
+ }
- /* Skip ADAC if it is there */
- i = ext_hdr_len;
+ /* TODO Handle ACAD if needed */
+ }
/* In the event we need information on primary and secondary PHY used during
* advertising.
@@ -2086,8 +2099,10 @@ ble_ll_scan_parse_ext_hdr(struct os_mbuf *om,
out_evt->sec_phy = aux_data->aux_phy;
out_evt->prim_phy = aux_data->aux_primary_phy;
- /* Adjust mbuf to contain advertising data only */
- os_mbuf_adj(om, i);
+ if (ext_hdr_len) {
+ /* Adjust mbuf to contain advertising data only */
+ os_mbuf_adj(om, ext_hdr_len);
+ }
/* Let us first keep update event type in aux data.
* Note that in aux chain and aux scan response packets
@@ -2097,7 +2112,7 @@ ble_ll_scan_parse_ext_hdr(struct os_mbuf *om,
out_evt->evt_type = aux_data->evt_type;
done:
- return pdu_len - i - 1;
+ return pdu_len - ext_hdr_len - 1;
}
static int