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