You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by pa...@apache.org on 2016/06/02 21:15:48 UTC

[5/6] incubator-mynewt-core git commit: first cut at LL privacy

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d6bbacbd/net/nimble/controller/src/ble_ll_whitelist.c
----------------------------------------------------------------------
diff --git a/net/nimble/controller/src/ble_ll_whitelist.c b/net/nimble/controller/src/ble_ll_whitelist.c
index 5ee3e84..f3af569 100644
--- a/net/nimble/controller/src/ble_ll_whitelist.c
+++ b/net/nimble/controller/src/ble_ll_whitelist.c
@@ -21,13 +21,21 @@
 #include <string.h>
 #include "os/os.h"
 #include "nimble/ble.h"
+#include "nimble/nimble_opt.h"
+#include "ble/xcvr.h"
 #include "controller/ble_ll_whitelist.h"
 #include "controller/ble_ll_hci.h"
 #include "controller/ble_ll_adv.h"
 #include "controller/ble_ll_scan.h"
 #include "controller/ble_hw.h"
+#include "hal/hal_cputime.h"
+
+#if (NIMBLE_OPT_LL_WHITELIST_SIZE < BLE_HW_WHITE_LIST_SIZE)
+#define BLE_LL_WHITELIST_SIZE       NIMBLE_OPT_LL_WHITELIST_SIZE
+#else
+#define BLE_LL_WHITELIST_SIZE       BLE_HW_WHITE_LIST_SIZE
+#endif
 
-#ifndef BLE_USES_HW_WHITELIST
 struct ble_ll_whitelist_entry
 {
     uint8_t wl_valid;
@@ -35,8 +43,7 @@ struct ble_ll_whitelist_entry
     uint8_t wl_dev_addr[BLE_DEV_ADDR_LEN];
 };
 
-struct ble_ll_whitelist_entry g_ble_ll_whitelist[NIMBLE_OPT_LL_WHITELIST_SIZE];
-#endif
+struct ble_ll_whitelist_entry g_ble_ll_whitelist[BLE_LL_WHITELIST_SIZE];
 
 static int
 ble_ll_whitelist_chg_allowed(void)
@@ -65,24 +72,23 @@ ble_ll_whitelist_chg_allowed(void)
 int
 ble_ll_whitelist_clear(void)
 {
+    int i;
+    struct ble_ll_whitelist_entry *wl;
 
     /* Check proper state */
     if (!ble_ll_whitelist_chg_allowed()) {
         return BLE_ERR_CMD_DISALLOWED;
     }
 
-#ifdef BLE_USES_HW_WHITELIST
-    ble_hw_whitelist_clear();
-#else
-    int i;
-    struct ble_ll_whitelist_entry *wl;
-
     /* Set the number of entries to 0 */
     wl = &g_ble_ll_whitelist[0];
-    for (i = 0; i < NIMBLE_OPT_LL_WHITELIST_SIZE; ++i) {
+    for (i = 0; i < BLE_LL_WHITELIST_SIZE; ++i) {
         wl->wl_valid = 0;
         ++wl;
     }
+
+#if (BLE_USES_HW_WHITELIST == 1)
+    ble_hw_whitelist_clear();
 #endif
 
     return BLE_ERR_SUCCESS;
@@ -99,20 +105,17 @@ ble_ll_whitelist_clear(void)
 int
 ble_ll_whitelist_read_size(uint8_t *rspbuf, uint8_t *rsplen)
 {
-#ifdef BLE_USES_HW_WHITELIST
-    rspbuf[0] = ble_hw_whitelist_size();
-#else
-    rspbuf[0] = NIMBLE_OPT_LL_WHITELIST_SIZE;
-#endif
+    rspbuf[0] = BLE_LL_WHITELIST_SIZE;
     *rsplen = 1;
     return BLE_ERR_SUCCESS;
 }
 
-#ifndef BLE_USES_HW_WHITELIST
 /**
- * Used to determine if the device is on the whitelist.
+ * Searches the whitelist to determine if the address is present in the
+ * whitelist. This is an internal API that only searches the link layer
+ * whitelist and does not care about the hardware whitelist
  *
- * @param addr
+ * @param addr      Device or identity address to check.
  * @param addr_type Public address (0) or random address (1)
  *
  * @return int 0: device is not on whitelist; otherwise the return value
@@ -120,13 +123,13 @@ ble_ll_whitelist_read_size(uint8_t *rspbuf, uint8_t *rsplen)
  * plus 1).
  */
 static int
-ble_ll_is_on_whitelist(uint8_t *addr, uint8_t addr_type)
+ble_ll_whitelist_search(uint8_t *addr, uint8_t addr_type)
 {
     int i;
     struct ble_ll_whitelist_entry *wl;
 
     wl = &g_ble_ll_whitelist[0];
-    for (i = 0; i < NIMBLE_OPT_LL_WHITELIST_SIZE; ++i) {
+    for (i = 0; i < BLE_LL_WHITELIST_SIZE; ++i) {
         if ((wl->wl_valid) && (wl->wl_addr_type == addr_type) &&
             (!memcmp(&wl->wl_dev_addr[0], addr, BLE_DEV_ADDR_LEN))) {
             return i + 1;
@@ -136,24 +139,37 @@ ble_ll_is_on_whitelist(uint8_t *addr, uint8_t addr_type)
 
     return 0;
 }
-#endif
 
 /**
- * Is there a match between the device and a device on the whitelist
+ * Is there a match between the device and a device on the whitelist.
+ *
+ * NOTE: This API uses the HW, if present, to determine if there was a match
+ * between a received address and an address in the whitelist. If the HW does
+ * not support whitelisting this API is the same as the whitelist search API
  *
  * @param addr
  * @param addr_type Public address (0) or random address (1)
+ * @param is_ident  True if addr is an identity address; false otherwise
  *
  * @return int
  */
 int
-ble_ll_whitelist_match(uint8_t *addr, uint8_t addr_type)
+ble_ll_whitelist_match(uint8_t *addr, uint8_t addr_type, int is_ident)
 {
     int rc;
-#ifdef BLE_USES_HW_WHITELIST
-    rc = ble_hw_whitelist_match();
+#if (BLE_USES_HW_WHITELIST == 1)
+    /*
+     * XXX: This should be changed. This is HW specific: some HW may be able
+     * to both resolve a private address and perform a whitelist check. The
+     * current BLE hw cannot support this.
+     */
+    if (is_ident) {
+        rc = ble_ll_whitelist_search(addr, addr_type);
+    } else {
+        rc = ble_hw_whitelist_match();
+    }
 #else
-    rc = ble_ll_is_on_whitelist(addr, addr_type);
+    rc = ble_ll_whitelist_search(addr, addr_type);
 #endif
     return rc;
 }
@@ -166,7 +182,9 @@ ble_ll_whitelist_match(uint8_t *addr, uint8_t addr_type)
 int
 ble_ll_whitelist_add(uint8_t *addr, uint8_t addr_type)
 {
+    int i;
     int rc;
+    struct ble_ll_whitelist_entry *wl;
 
     /* Must be in proper state */
     if (!ble_ll_whitelist_chg_allowed()) {
@@ -174,16 +192,10 @@ ble_ll_whitelist_add(uint8_t *addr, uint8_t addr_type)
     }
 
     /* Check if we have any open entries */
-#ifdef BLE_USES_HW_WHITELIST
-    rc = ble_hw_whitelist_add(addr, addr_type);
-#else
-    int i;
-    struct ble_ll_whitelist_entry *wl;
-
     rc = BLE_ERR_SUCCESS;
-    if (!ble_ll_is_on_whitelist(addr, addr_type)) {
+    if (!ble_ll_whitelist_search(addr, addr_type)) {
         wl = &g_ble_ll_whitelist[0];
-        for (i = 0; i < NIMBLE_OPT_LL_WHITELIST_SIZE; ++i) {
+        for (i = 0; i < BLE_LL_WHITELIST_SIZE; ++i) {
             if (wl->wl_valid == 0) {
                 memcpy(&wl->wl_dev_addr[0], addr, BLE_DEV_ADDR_LEN);
                 wl->wl_addr_type = addr_type;
@@ -193,11 +205,14 @@ ble_ll_whitelist_add(uint8_t *addr, uint8_t addr_type)
             ++wl;
         }
 
-        if (i == NIMBLE_OPT_LL_WHITELIST_SIZE) {
+        if (i == BLE_LL_WHITELIST_SIZE) {
             rc = BLE_ERR_MEM_CAPACITY;
+        } else {
+#if (BLE_USES_HW_WHITELIST == 1)
+            rc = ble_hw_whitelist_add(addr, addr_type);
+#endif
         }
     }
-#endif
 
     return rc;
 }
@@ -212,20 +227,20 @@ ble_ll_whitelist_add(uint8_t *addr, uint8_t addr_type)
 int
 ble_ll_whitelist_rmv(uint8_t *addr, uint8_t addr_type)
 {
+    int position;
+
     /* Must be in proper state */
     if (!ble_ll_whitelist_chg_allowed()) {
         return BLE_ERR_CMD_DISALLOWED;
     }
 
-#ifdef BLE_USES_HW_WHITELIST
-    ble_hw_whitelist_rmv(addr, addr_type);
-#else
-    int position;
-
-    position = ble_ll_is_on_whitelist(addr, addr_type);
+    position = ble_ll_whitelist_search(addr, addr_type);
     if (position) {
         g_ble_ll_whitelist[position - 1].wl_valid = 0;
     }
+
+#if (BLE_USES_HW_WHITELIST == 1)
+    ble_hw_whitelist_rmv(addr, addr_type);
 #endif
 
     return BLE_ERR_SUCCESS;
@@ -239,7 +254,7 @@ ble_ll_whitelist_rmv(uint8_t *addr, uint8_t addr_type)
 void
 ble_ll_whitelist_enable(void)
 {
-#ifdef BLE_USES_HW_WHITELIST
+#if (BLE_USES_HW_WHITELIST == 1)
     ble_hw_whitelist_enable();
 #endif
 }
@@ -252,9 +267,7 @@ ble_ll_whitelist_enable(void)
 void
 ble_ll_whitelist_disable(void)
 {
-#ifdef BLE_USES_HW_WHITELIST
+#if (BLE_USES_HW_WHITELIST == 1)
     ble_hw_whitelist_disable();
 #endif
 }
-
-

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d6bbacbd/net/nimble/drivers/nrf51/include/ble/xcvr.h
----------------------------------------------------------------------
diff --git a/net/nimble/drivers/nrf51/include/ble/xcvr.h b/net/nimble/drivers/nrf51/include/ble/xcvr.h
index 34abd7a..7041d8d 100644
--- a/net/nimble/drivers/nrf51/include/ble/xcvr.h
+++ b/net/nimble/drivers/nrf51/include/ble/xcvr.h
@@ -29,4 +29,10 @@
 #define XCVR_RX_SCHED_DELAY_USECS     \
     (XCVR_RX_START_DELAY_USECS + XCVR_PROC_DELAY_USECS)
 
+/*
+ * Define HW whitelist size. This is the total possible whitelist size;
+ * not necessarily the size that will be used (may be smaller)
+ */
+#define BLE_HW_WHITE_LIST_SIZE        (8)
+
 #endif /* H_BLE_XCVR_ */

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d6bbacbd/net/nimble/drivers/nrf51/src/ble_hw.c
----------------------------------------------------------------------
diff --git a/net/nimble/drivers/nrf51/src/ble_hw.c b/net/nimble/drivers/nrf51/src/ble_hw.c
index 498840d..43c7b9d 100644
--- a/net/nimble/drivers/nrf51/src/ble_hw.c
+++ b/net/nimble/drivers/nrf51/src/ble_hw.c
@@ -21,15 +21,13 @@
 #include <assert.h>
 #include <string.h>
 #include "os/os.h"
+#include "ble/xcvr.h"
 #include "nimble/ble.h"
 #include "nimble/nimble_opt.h"
 #include "mcu/nrf51_bitfields.h"
 #include "controller/ble_hw.h"
 #include "bsp/cmsis_nvic.h"
 
-/* Total number of white list elements */
-#define BLE_HW_WHITE_LIST_SIZE      (8)
-
 /* Total number of resolving list elements */
 #define BLE_HW_RESOLV_LIST_SIZE     (16)
 
@@ -399,9 +397,10 @@ ble_hw_resolv_list_rmv(int index)
 }
 
 /**
- * Returns the size of the whitelist in HW
+ * Returns the size of the resolving list. NOTE: this returns the maximum
+ * allowable entries in the HW. Configuration options may limit this.
  *
- * @return int Number of devices allowed in whitelist
+ * @return int Number of devices allowed in resolving list
  */
 uint8_t
 ble_hw_resolv_list_size(void)

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d6bbacbd/net/nimble/drivers/nrf51/src/ble_phy.c
----------------------------------------------------------------------
diff --git a/net/nimble/drivers/nrf51/src/ble_phy.c b/net/nimble/drivers/nrf51/src/ble_phy.c
index e44b04d..0c05011 100644
--- a/net/nimble/drivers/nrf51/src/ble_phy.c
+++ b/net/nimble/drivers/nrf51/src/ble_phy.c
@@ -266,6 +266,7 @@ ble_phy_rx_xcvr_setup(void)
                            (2 << RADIO_PCNF0_S1LEN_Pos) |
                            (NRF_S0_LEN << RADIO_PCNF0_S0LEN_Pos);
         NRF_AAR->ENABLE = AAR_ENABLE_ENABLE_Enabled;
+        NRF_AAR->IRKPTR = (uint32_t)&g_nrf_irk_list[0];
         NRF_AAR->ADDRPTR = (uint32_t)g_ble_phy_data.rxpdu->om_data;
         NRF_AAR->SCRATCHPTR = (uint32_t)&g_ble_phy_data.phy_aar_scratch;
         NRF_AAR->EVENTS_END = 0;
@@ -821,7 +822,6 @@ ble_phy_rx_set_start_time(uint32_t cputime)
     return rc;
 }
 
-
 int
 ble_phy_tx(struct os_mbuf *txpdu, uint8_t end_trans)
 {
@@ -869,6 +869,7 @@ ble_phy_tx(struct os_mbuf *txpdu, uint8_t end_trans)
         NRF_RADIO->PCNF0 = (NRF_LFLEN_BITS << RADIO_PCNF0_LFLEN_Pos) |
                            (NRF_S0_LEN << RADIO_PCNF0_S0LEN_Pos);
         NRF_PPI->CHENCLR = PPI_CHEN_CH23_Msk;
+        NRF_AAR->IRKPTR = (uint32_t)&g_nrf_irk_list[0];
 #endif
         /* RAM representation has S0 and LENGTH fields (2 bytes) */
         dptr = (uint8_t *)&g_ble_phy_txrx_buf[0];

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d6bbacbd/net/nimble/drivers/nrf52/include/ble/xcvr.h
----------------------------------------------------------------------
diff --git a/net/nimble/drivers/nrf52/include/ble/xcvr.h b/net/nimble/drivers/nrf52/include/ble/xcvr.h
index f3e60fa..a05a0c7 100644
--- a/net/nimble/drivers/nrf52/include/ble/xcvr.h
+++ b/net/nimble/drivers/nrf52/include/ble/xcvr.h
@@ -20,7 +20,7 @@
 #ifndef H_BLE_XCVR_
 #define H_BLE_XCVR_
 
-/* Transceiver specific defintions */
+/* Transceiver specific definitions */
 #define XCVR_RX_START_DELAY_USECS     (140)
 #define XCVR_TX_START_DELAY_USECS     (140)
 #define XCVR_PROC_DELAY_USECS         (50)
@@ -29,4 +29,10 @@
 #define XCVR_RX_SCHED_DELAY_USECS     \
     (XCVR_RX_START_DELAY_USECS + XCVR_PROC_DELAY_USECS)
 
+/*
+ * Define HW whitelist size. This is the total possible whitelist size;
+ * not necessarily the size that will be used (may be smaller)
+ */
+#define BLE_HW_WHITE_LIST_SIZE        (8)
+
 #endif /* H_BLE_XCVR_ */

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d6bbacbd/net/nimble/drivers/nrf52/src/ble_hw.c
----------------------------------------------------------------------
diff --git a/net/nimble/drivers/nrf52/src/ble_hw.c b/net/nimble/drivers/nrf52/src/ble_hw.c
index ea32ce4..b461136 100644
--- a/net/nimble/drivers/nrf52/src/ble_hw.c
+++ b/net/nimble/drivers/nrf52/src/ble_hw.c
@@ -21,15 +21,13 @@
 #include <assert.h>
 #include <string.h>
 #include "os/os.h"
+#include "ble/xcvr.h"
 #include "nimble/ble.h"
 #include "nimble/nimble_opt.h"
 #include "mcu/nrf52_bitfields.h"
 #include "controller/ble_hw.h"
 #include "bsp/cmsis_nvic.h"
 
-/* Total number of white list elements */
-#define BLE_HW_WHITE_LIST_SIZE      (8)
-
 /* Total number of resolving list elements */
 #define BLE_HW_RESOLV_LIST_SIZE     (16)
 
@@ -399,9 +397,10 @@ ble_hw_resolv_list_rmv(int index)
 }
 
 /**
- * Returns the size of the whitelist in HW
+ * Returns the size of the resolving list. NOTE: this returns the maximum
+ * allowable entries in the HW. Configuration options may limit this.
  *
- * @return int Number of devices allowed in whitelist
+ * @return int Number of devices allowed in resolving list
  */
 uint8_t
 ble_hw_resolv_list_size(void)

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d6bbacbd/net/nimble/drivers/nrf52/src/ble_phy.c
----------------------------------------------------------------------
diff --git a/net/nimble/drivers/nrf52/src/ble_phy.c b/net/nimble/drivers/nrf52/src/ble_phy.c
index 08d0d8d..541ece9 100644
--- a/net/nimble/drivers/nrf52/src/ble_phy.c
+++ b/net/nimble/drivers/nrf52/src/ble_phy.c
@@ -265,6 +265,7 @@ ble_phy_rx_xcvr_setup(void)
 #if (BLE_LL_CFG_FEAT_LL_PRIVACY == 1)
     if (g_ble_phy_data.phy_privacy) {
         NRF_AAR->ENABLE = AAR_ENABLE_ENABLE_Enabled;
+        NRF_AAR->IRKPTR = (uint32_t)&g_nrf_irk_list[0];
         NRF_AAR->ADDRPTR = (uint32_t)g_ble_phy_data.rxpdu->om_data;
         NRF_AAR->SCRATCHPTR = (uint32_t)&g_ble_phy_data.phy_aar_scratch;
         NRF_AAR->EVENTS_END = 0;
@@ -840,6 +841,7 @@ ble_phy_tx(struct os_mbuf *txpdu, uint8_t end_trans)
     } else {
 #if (BLE_LL_CFG_FEAT_LL_PRIVACY == 1)
         NRF_PPI->CHENCLR = PPI_CHEN_CH23_Msk;
+        NRF_AAR->IRKPTR = (uint32_t)&g_nrf_irk_list[0];
 #endif
         dptr = (uint8_t *)&g_ble_phy_txrx_buf[0];
     }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d6bbacbd/net/nimble/host/src/host_dbg.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/host_dbg.c b/net/nimble/host/src/host_dbg.c
index f8c9a43..6303f62 100644
--- a/net/nimble/host/src/host_dbg.c
+++ b/net/nimble/host/src/host_dbg.c
@@ -39,17 +39,30 @@ host_hci_dbg_le_event_disp(uint8_t subev, uint8_t len, uint8_t *evdata)
     char adv_data_buf[32];
 
     switch (subev) {
+    case BLE_HCI_LE_SUBEV_ENH_CONN_COMPLETE:
     case BLE_HCI_LE_SUBEV_CONN_COMPLETE:
         status = evdata[0];
         if (status == BLE_ERR_SUCCESS) {
             BLE_HS_LOG(DEBUG, "LE connection complete. handle=%u role=%u "
-                              "paddrtype=%u addr=%x.%x.%x.%x.%x.%x itvl=%u "
-                              "latency=%u spvn_tmo=%u mca=%u\n",
+                              "paddrtype=%u addr=%x.%x.%x.%x.%x.%x ",
                        le16toh(evdata + 1), evdata[3], evdata[4],
                        evdata[10], evdata[9], evdata[8], evdata[7],
-                       evdata[6], evdata[5], le16toh(evdata + 11),
-                       le16toh(evdata + 13), le16toh(evdata + 15),
-                       evdata[17]);
+                       evdata[6], evdata[5]);
+
+            evdata += 11;
+            if (subev == BLE_HCI_LE_SUBEV_ENH_CONN_COMPLETE) {
+                BLE_HS_LOG(DEBUG, "local_rpa=%x.%x.%x.%x.%x.%x "
+                                   "peer_rpa=%x.%x.%x.%x.%x.%x ",
+                           evdata[5], evdata[4], evdata[3], evdata[2],
+                           evdata[1], evdata[0],
+                           evdata[11], evdata[10], evdata[9], evdata[8],
+                           evdata[7], evdata[6]);
+
+                evdata += 12;
+            }
+            BLE_HS_LOG(DEBUG, "itvl=%u latency=%u spvn_tmo=%u mca=%u\n",
+                       le16toh(evdata), le16toh(evdata + 2),
+                       le16toh(evdata + 4), evdata[6]);
         } else {
             BLE_HS_LOG(DEBUG, "LE connection complete. FAIL (status=%u)\n",
                        status);

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d6bbacbd/net/nimble/include/nimble/ble.h
----------------------------------------------------------------------
diff --git a/net/nimble/include/nimble/ble.h b/net/nimble/include/nimble/ble.h
index f2e7976..e75a685 100644
--- a/net/nimble/include/nimble/ble.h
+++ b/net/nimble/include/nimble/ble.h
@@ -62,7 +62,7 @@ struct ble_mbuf_hdr_rxinfo
     uint8_t flags;
     uint8_t channel;
     uint8_t handle;
-    int8_t rssi;
+    int8_t  rssi;
 };
 
 /* Flag definitions for rxinfo  */

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d6bbacbd/net/nimble/include/nimble/hci_common.h
----------------------------------------------------------------------
diff --git a/net/nimble/include/nimble/hci_common.h b/net/nimble/include/nimble/hci_common.h
index be72f5b..ea19cdd 100644
--- a/net/nimble/include/nimble/hci_common.h
+++ b/net/nimble/include/nimble/hci_common.h
@@ -498,6 +498,7 @@
 
 /* LE advertising report event. (sub event 0x02) */
 #define BLE_HCI_LE_ADV_RPT_MIN_LEN          (12)
+#define BLE_HCI_LE_ADV_DIRECT_RPT_LEN       (18)
 #define BLE_HCI_LE_ADV_RPT_NUM_RPTS_MIN     (1)
 #define BLE_HCI_LE_ADV_RPT_NUM_RPTS_MAX     (0x19)
 
@@ -537,6 +538,9 @@
 #define BLE_LMP_VER_BCS_4_1                 (7)
 #define BLE_LMP_VER_BCS_4_2                 (8)
 
+/* Sub-event 0x0A: enhanced connection complete */
+#define BLE_HCI_LE_ENH_CONN_COMPLETE_LEN    (31)
+
 /*--- Shared data structures ---*/
 /* Read local version information (OGF=0x0004, OCF=0x0001) */
 struct hci_loc_ver_info