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 2018/12/05 12:24:07 UTC

[mynewt-nimble] 02/13: nimble/ll: Fix parsing aux_ptr

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 21c809bc7407a80a7038c1c165c14e3f06cd4faf
Author: Ɓukasz Rymanowski <lu...@codecoup.pl>
AuthorDate: Mon Nov 5 15:30:49 2018 +0100

    nimble/ll: Fix parsing aux_ptr
    
    With this patch we make sure that when parsing aux ptr we store
    advertiser and target address.
---
 nimble/controller/src/ble_ll_scan.c | 59 ++++++++++++++++++++++++-------------
 1 file changed, 39 insertions(+), 20 deletions(-)

diff --git a/nimble/controller/src/ble_ll_scan.c b/nimble/controller/src/ble_ll_scan.c
index 7823478..2dd9caa 100644
--- a/nimble/controller/src/ble_ll_scan.c
+++ b/nimble/controller/src/ble_ll_scan.c
@@ -1640,6 +1640,7 @@ ble_ll_scan_get_aux_data(struct ble_ll_scan_sm *scansm,
     uint8_t has_adi = 0;
     int i;
     struct ble_ll_aux_data tmp_aux_data = { 0 };
+    int rc;
 
     pdu_len = rxbuf[1];
     if (pdu_len == 0) {
@@ -1706,6 +1707,7 @@ ble_ll_scan_get_aux_data(struct ble_ll_scan_sm *scansm,
             (*aux_data)->flags |= BLE_LL_AUX_CHAIN_BIT;
             (*aux_data)->flags |= BLE_LL_AUX_INCOMPLETE_BIT;
         } else if (ble_ll_scan_ext_adv_init(aux_data) < 0) {
+            /* Out of memory */
             return -1;
         }
 
@@ -1719,34 +1721,51 @@ ble_ll_scan_get_aux_data(struct ble_ll_scan_sm *scansm,
             scansm->cur_aux_data = NULL;
         }
 
-        if (has_adi) {
-            (*aux_data)->adi = tmp_aux_data.adi;
-        }
-
         (*aux_data)->chan = tmp_aux_data.chan;
         (*aux_data)->offset = tmp_aux_data.offset;
         (*aux_data)->mode = tmp_aux_data.mode;
-        if (has_addr) {
-            memcpy((*aux_data)->addr, tmp_aux_data.addr, 6);
-            (*aux_data)->addr_type = tmp_aux_data.addr_type;
-            (*aux_data)->flags |= BLE_LL_AUX_HAS_ADDRA;
-        }
-        if (has_dir_addr) {
-            memcpy((*aux_data)->dir_addr, tmp_aux_data.dir_addr, 6);
-            (*aux_data)->dir_addr_type = tmp_aux_data.dir_addr_type;
-            (*aux_data)->flags |= BLE_LL_AUX_HAS_DIR_ADDRA;
+
+        /* New aux_data or chaining */
+        rc = 0;
+    } else {
+
+        /* So ext packet does not have aux ptr. It can be because
+         * a) it is empty beacon (no aux ptr at all)
+         * b) there is no chaining or chaining has just stopped. In this case we do hava aux_data */
+
+        if (!scansm->cur_aux_data) {
+            (*aux_data) = NULL;
+            return 1;
         }
-        return 0;
+
+        /*If there is no new aux ptr, just get current one */
+        (*aux_data) = scansm->cur_aux_data;
+        scansm->cur_aux_data = NULL;
+
+        /* Clear incomplete flag */
+        (*aux_data)->flags &= ~BLE_LL_AUX_INCOMPLETE_BIT;
+
+        /* Current processing aux_ptr */
+        rc = 1;
     }
 
-    /*If there is no new aux ptr, just get current one */
-    (*aux_data) = scansm->cur_aux_data;
-    scansm->cur_aux_data = NULL;
+    if (has_adi) {
+         (*aux_data)->adi = tmp_aux_data.adi;
+    }
 
-    /* Clear incomplete flag */
-    (*aux_data)->flags &= ~BLE_LL_AUX_INCOMPLETE_BIT;
+    if (has_addr) {
+        memcpy((*aux_data)->addr, tmp_aux_data.addr, 6);
+        (*aux_data)->addr_type = tmp_aux_data.addr_type;
+        (*aux_data)->flags |= BLE_LL_AUX_HAS_ADDRA;
+    }
 
-    return 1;
+    if (has_dir_addr) {
+        memcpy((*aux_data)->dir_addr, tmp_aux_data.dir_addr, 6);
+        (*aux_data)->dir_addr_type = tmp_aux_data.dir_addr_type;
+        (*aux_data)->flags |= BLE_LL_AUX_HAS_DIR_ADDRA;
+    }
+
+    return rc;
 }
 /**
  * Called when a receive ADV_EXT PDU has ended.