Repository: incubator-mynewt-larva
Updated Branches:
  refs/heads/develop 8d16fadc0 -> 555578380


MYNEWT-111:support random static addresses


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/55557838
Tree: 
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/55557838
Diff: 
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/55557838

Branch: refs/heads/develop
Commit: 555578380fefe40dca02a6e124a86d85a27ef1c0
Parents: 8d16fad
Author: wes3 <w...@micosa.io>
Authored: Wed Feb 24 12:23:22 2016 -0800
Committer: wes3 <w...@micosa.io>
Committed: Wed Feb 24 12:23:27 2016 -0800

----------------------------------------------------------------------
 net/nimble/controller/src/ble_ll.c          |  3 ++
 net/nimble/controller/src/ble_ll_adv.c      | 35 +++++++++++---------
 net/nimble/controller/src/ble_ll_conn.c     |  7 ++--
 net/nimble/controller/src/ble_ll_conn_hci.c | 11 +++++++
 net/nimble/controller/src/ble_ll_scan.c     | 16 ++++-----
 net/nimble/host/src/host_hci_cmd.c          |  3 +-
 project/bletest/src/main.c                  | 42 ++++++++++++++++++++----
 7 files changed, 80 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/55557838/net/nimble/controller/src/ble_ll.c
----------------------------------------------------------------------
diff --git a/net/nimble/controller/src/ble_ll.c 
b/net/nimble/controller/src/ble_ll.c
index 7a72d37..2229c89 100644
--- a/net/nimble/controller/src/ble_ll.c
+++ b/net/nimble/controller/src/ble_ll.c
@@ -944,6 +944,9 @@ ble_ll_reset(void)
     /* Set state to standby */
     ble_ll_state_set(BLE_LL_STATE_STANDBY);
 
+    /* Reset our random address */
+    memset(g_random_addr, 0, BLE_DEV_ADDR_LEN);
+
     /* Re-initialize the PHY */
     rc = ble_phy_init();
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/55557838/net/nimble/controller/src/ble_ll_adv.c
----------------------------------------------------------------------
diff --git a/net/nimble/controller/src/ble_ll_adv.c 
b/net/nimble/controller/src/ble_ll_adv.c
index 7abc948..515dabf 100644
--- a/net/nimble/controller/src/ble_ll_adv.c
+++ b/net/nimble/controller/src/ble_ll_adv.c
@@ -175,6 +175,7 @@ ble_ll_adv_addr_cmp(uint8_t *rxbuf)
 static void
 ble_ll_adv_pdu_make(struct ble_ll_adv_sm *advsm)
 {
+    int         is_direct_adv;
     uint8_t     adv_data_len;
     uint8_t     *dptr;
     uint8_t     pdulen;
@@ -185,6 +186,7 @@ ble_ll_adv_pdu_make(struct ble_ll_adv_sm *advsm)
     /* assume this is not a direct ind */
     adv_data_len = advsm->adv_len;
     pdulen = BLE_DEV_ADDR_LEN + adv_data_len;
+    is_direct_adv = 0;
 
     /* Must be an advertising type! */
     switch (advsm->adv_type) {
@@ -202,6 +204,7 @@ ble_ll_adv_pdu_make(struct ble_ll_adv_sm *advsm)
 
     case BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_HD:
     case BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_LD:
+        is_direct_adv = 1;
         pdu_type = BLE_ADV_PDU_TYPE_ADV_DIRECT_IND;
         adv_data_len = 0;
         pdulen = BLE_ADV_DIRECT_IND_LEN;
@@ -225,7 +228,6 @@ ble_ll_adv_pdu_make(struct ble_ll_adv_sm *advsm)
     /* Set the PDU length in the state machine (includes header) */
     advsm->adv_pdu_len = pdulen + BLE_LL_PDU_HDR_LEN;
 
-
     /* Construct scan response */
     if (advsm->own_addr_type == BLE_HCI_ADV_OWN_ADDR_PUBLIC) {
         addr = g_dev_addr;
@@ -233,7 +235,7 @@ ble_ll_adv_pdu_make(struct ble_ll_adv_sm *advsm)
         pdu_type |= BLE_ADV_PDU_HDR_TXADD_RAND;
         addr = g_random_addr;
     } else {
-        /* XXX: unsupported for now  */
+        /* XXX: unsupported for now. Should never happen */
         addr = NULL;
         assert(0);
     }
@@ -250,7 +252,7 @@ ble_ll_adv_pdu_make(struct ble_ll_adv_sm *advsm)
     dptr += BLE_DEV_ADDR_LEN;
 
     /* For ADV_DIRECT_IND, we need to put initiators address in there */
-    if (pdu_type == BLE_ADV_PDU_TYPE_ADV_DIRECT_IND) {
+    if (is_direct_adv) {
         memcpy(dptr, advsm->initiator_addr, BLE_DEV_ADDR_LEN);
     }
 
@@ -541,6 +543,14 @@ ble_ll_adv_set_adv_params(uint8_t *cmd)
         return BLE_ERR_INV_HCI_CMD_PARMS;
     }
 
+    /* 
+     * XXX: return unsupported feature if own is address is not public or
+     * static random as we have not implemented non-static random addresses.
+     */ 
+    if (own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) {
+        return BLE_ERR_UNSUPPORTED;
+    }
+
     /* There are only three adv channels, so check for any outside the range */
     adv_chanmask = cmd[13];
     if (((adv_chanmask & 0xF8) != 0) || (adv_chanmask == 0)) {
@@ -552,8 +562,7 @@ ble_ll_adv_set_adv_params(uint8_t *cmd)
         return BLE_ERR_INV_HCI_CMD_PARMS;
     }
 
-    /* XXX: determine if there is anything that needs to be done for
-       own address type or peer address type */
+    /* Fill out rest of advertising state machine */
     advsm->own_addr_type = own_addr_type;
     advsm->peer_addr_type = peer_addr_type;
     advsm->adv_filter_policy = adv_filter_policy;
@@ -615,20 +624,16 @@ ble_ll_adv_sm_start(struct ble_ll_adv_sm *advsm)
     uint8_t adv_chan;
 
     /* 
-     * XXX: not sure if I should do this or just report whatever random
-     * address the host sent. For now, I will reject the command with a
-     * command disallowed error. All the parameter errors refer to the command
-     * parameter (which in this case is just enable or disable).
+     * This is not in the specification. I will reject the command with a
+     * command disallowed error if no random address has been sent by the
+     * host. All the parameter errors refer to the command
+     * parameter (which in this case is just enable or disable) so that
+     * is why I chose command disallowed.
      */ 
-    if (advsm->own_addr_type != BLE_HCI_ADV_OWN_ADDR_PUBLIC) {
+    if (advsm->own_addr_type == BLE_HCI_ADV_OWN_ADDR_RANDOM) {
         if (!ble_ll_is_valid_random_addr(g_random_addr)) {
             return BLE_ERR_CMD_DISALLOWED;
         }
-
-        /* XXX: support these other types */
-        if (advsm->own_addr_type != BLE_HCI_ADV_OWN_ADDR_RANDOM) {
-            assert(0);
-        }
     }
 
     /* Set flag telling us that advertising is enabled */

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/55557838/net/nimble/controller/src/ble_ll_conn.c
----------------------------------------------------------------------
diff --git a/net/nimble/controller/src/ble_ll_conn.c 
b/net/nimble/controller/src/ble_ll_conn.c
index b220cfa..4cd4439 100644
--- a/net/nimble/controller/src/ble_ll_conn.c
+++ b/net/nimble/controller/src/ble_ll_conn.c
@@ -1741,7 +1741,7 @@ ble_ll_init_rx_isr_end(struct os_mbuf *rxpdu, uint8_t 
crcok)
 
     /* Should we send a connect request? */
     if (chk_send_req) {
-        /* Check filter policy */
+        /* Get advertisers address type */
         adv_addr = rxbuf + BLE_LL_PDU_HDR_LEN;
         if (rxbuf[0] & BLE_ADV_PDU_HDR_TXADD_MASK) {
             addr_type = BLE_HCI_CONN_PEER_ADDR_RANDOM;
@@ -1768,11 +1768,10 @@ ble_ll_init_rx_isr_end(struct os_mbuf *rxpdu, uint8_t 
crcok)
             }
         }
 
-        /* XXX: note: this crashed during interop testing! 
conn_create_sm=NULL*/
         /* Attempt to schedule new connection. Possible that this might fail */
         if (!ble_ll_sched_master_new(g_ble_ll_conn_create_sm, 
-                                   ble_hdr->end_cputime,
-                                   BLE_LL_CFG_CONN_INIT_SLOTS)) {
+                                     ble_hdr->end_cputime,
+                                     BLE_LL_CFG_CONN_INIT_SLOTS)) {
             /* Setup to transmit the connect request */
             rc = ble_ll_conn_request_send(addr_type, adv_addr, 
                                           g_ble_ll_conn_create_sm->tx_win_off);

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/55557838/net/nimble/controller/src/ble_ll_conn_hci.c
----------------------------------------------------------------------
diff --git a/net/nimble/controller/src/ble_ll_conn_hci.c 
b/net/nimble/controller/src/ble_ll_conn_hci.c
index 0e9a9c9..4b86403 100644
--- a/net/nimble/controller/src/ble_ll_conn_hci.c
+++ b/net/nimble/controller/src/ble_ll_conn_hci.c
@@ -342,6 +342,12 @@ ble_ll_conn_create(uint8_t *cmdbuf)
         if (hcc->peer_addr_type > BLE_HCI_CONN_PEER_ADDR_MAX) {
             return BLE_ERR_INV_HCI_CMD_PARMS;
         }
+
+        /* XXX: not supported */
+        if (hcc->peer_addr_type > BLE_HCI_CONN_PEER_ADDR_RANDOM) {
+            return BLE_ERR_UNSUPPORTED;
+        }
+        
         memcpy(&hcc->peer_addr, cmdbuf + 6, BLE_DEV_ADDR_LEN);
     }
 
@@ -351,6 +357,11 @@ ble_ll_conn_create(uint8_t *cmdbuf)
         return BLE_ERR_INV_HCI_CMD_PARMS;
     }
 
+    /* XXX: not supported */
+    if (hcc->own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) {
+        return BLE_ERR_UNSUPPORTED;
+    }
+
     /* Check connection interval, latency and supervision timeoout */
     hcc->conn_itvl_min = le16toh(cmdbuf + 13);
     hcc->conn_itvl_max = le16toh(cmdbuf + 15);

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/55557838/net/nimble/controller/src/ble_ll_scan.c
----------------------------------------------------------------------
diff --git a/net/nimble/controller/src/ble_ll_scan.c 
b/net/nimble/controller/src/ble_ll_scan.c
index 292436e..faa4aeb 100644
--- a/net/nimble/controller/src/ble_ll_scan.c
+++ b/net/nimble/controller/src/ble_ll_scan.c
@@ -604,20 +604,16 @@ static int
 ble_ll_scan_sm_start(struct ble_ll_scan_sm *scansm)
 {
     /* 
-     * XXX: not sure if I should do this or just report whatever random
-     * address the host sent. For now, I will reject the command with a
-     * command disallowed error. All the parameter errors refer to the command
-     * parameter (which in this case is just enable or disable).
+     * This is not in the specification. I will reject the command with a
+     * command disallowed error if no random address has been sent by the
+     * host. All the parameter errors refer to the command parameter
+     * (which in this case is just enable or disable) so that is why I chose
+     * command disallowed.
      */ 
-    if (scansm->own_addr_type != BLE_HCI_ADV_OWN_ADDR_PUBLIC) {
+    if (scansm->own_addr_type == BLE_HCI_ADV_OWN_ADDR_RANDOM) {
         if (!ble_ll_is_valid_random_addr(g_random_addr)) {
             return BLE_ERR_CMD_DISALLOWED;
         }
-
-        /* XXX: support these other types */
-        if (scansm->own_addr_type != BLE_HCI_ADV_OWN_ADDR_RANDOM) {
-            assert(0);
-        }
     }
 
     /* Enable/disable whitelisting */

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/55557838/net/nimble/host/src/host_hci_cmd.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/host_hci_cmd.c 
b/net/nimble/host/src/host_hci_cmd.c
index 144f8db..526a79b 100644
--- a/net/nimble/host/src/host_hci_cmd.c
+++ b/net/nimble/host/src/host_hci_cmd.c
@@ -216,13 +216,12 @@ int
 host_hci_cmd_le_set_rand_addr(uint8_t *addr)
 {
     int rc;
-    uint8_t cmd[BLE_DEV_ADDR_LEN];
 
     /* Check for valid parameters */
     rc = -1;
     if (addr) {
         rc = host_hci_le_cmd_send(BLE_HCI_OCF_LE_SET_RAND_ADDR,
-                                  BLE_DEV_ADDR_LEN, cmd);
+                                  BLE_DEV_ADDR_LEN, addr);
     }
 
     return rc;

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/55557838/project/bletest/src/main.c
----------------------------------------------------------------------
diff --git a/project/bletest/src/main.c b/project/bletest/src/main.c
index e2a5bc5..ce5e418 100755
--- a/project/bletest/src/main.c
+++ b/project/bletest/src/main.c
@@ -96,9 +96,11 @@ os_membuf_t g_mbuf_buffer[MBUF_MEMPOOL_SIZE];
 #define BLETEST_CFG_ROLE                (BLETEST_ROLE_INITIATOR)
 //#define BLETEST_CFG_ROLE                (BLETEST_ROLE_ADVERTISER)
 //#define BLETEST_CFG_ROLE                (BLETEST_ROLE_SCANNER)
+#define BLETEST_CFG_ADV_OWN_ADDR_TYPE   (BLE_HCI_ADV_OWN_ADDR_RANDOM)
+#define BLETEST_CFG_ADV_PEER_ADDR_TYPE  (BLE_HCI_ADV_PEER_ADDR_PUBLIC)
 #define BLETEST_CFG_FILT_DUP_ADV        (0)
-#define BLETEST_CFG_ADV_ITVL            (60000 / BLE_HCI_ADV_ITVL)
-#define BLETEST_CFG_ADV_TYPE            BLE_HCI_ADV_TYPE_ADV_IND
+#define BLETEST_CFG_ADV_ITVL            (600000 / BLE_HCI_ADV_ITVL)
+#define BLETEST_CFG_ADV_TYPE            BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_LD
 #define BLETEST_CFG_ADV_FILT_POLICY     (BLE_HCI_ADV_FILT_NONE)
 #define BLETEST_CFG_SCAN_ITVL           (700000 / BLE_HCI_SCAN_ITVL)
 #define BLETEST_CFG_SCAN_WINDOW         (700000 / BLE_HCI_SCAN_ITVL)
@@ -110,6 +112,8 @@ os_membuf_t g_mbuf_buffer[MBUF_MEMPOOL_SIZE];
 #define BLETEST_CFG_CONN_SPVN_TMO       (1000)  /* 20 seconds */
 #define BLETEST_CFG_MIN_CE_LEN          (6)    
 #define BLETEST_CFG_MAX_CE_LEN          (BLETEST_CFG_CONN_ITVL)
+#define BLETEST_CFG_CONN_PEER_ADDR_TYPE (BLE_HCI_CONN_PEER_ADDR_PUBLIC)
+#define BLETEST_CFG_CONN_OWN_ADDR_TYPE  (BLE_HCI_ADV_OWN_ADDR_RANDOM)
 #define BLETEST_CFG_CONCURRENT_CONNS    (1)
 
 /* BLETEST variables */
@@ -238,6 +242,7 @@ bletest_init_advertising(void)
 {
     int rc;
     uint8_t adv_len;
+    uint8_t rand_addr[BLE_DEV_ADDR_LEN];
     struct hci_adv_params adv;
 
     /* Just zero out advertising */
@@ -247,11 +252,14 @@ bletest_init_advertising(void)
     adv.adv_type = BLETEST_CFG_ADV_TYPE;
     adv.adv_channel_map = 0x07;
     adv.adv_filter_policy = BLETEST_CFG_ADV_FILT_POLICY;
-    adv.own_addr_type = BLE_HCI_ADV_OWN_ADDR_PUBLIC;
-    adv.peer_addr_type = BLE_HCI_ADV_PEER_ADDR_PUBLIC;
+    adv.own_addr_type = BLETEST_CFG_ADV_OWN_ADDR_TYPE;
+    adv.peer_addr_type = BLETEST_CFG_ADV_PEER_ADDR_TYPE;
     if ((adv.adv_type == BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_HD) ||
         (adv.adv_type == BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_LD)) {
         memcpy(adv.peer_addr, g_bletest_cur_peer_addr, BLE_DEV_ADDR_LEN);
+        if (adv.peer_addr_type == BLE_HCI_ADV_PEER_ADDR_RANDOM) {
+            adv.peer_addr[5] |= 0xc0;
+        }
         adv_len = 0;
     } else {
         adv_len = bletest_set_adv_data(&g_host_adv_data[0]);
@@ -274,6 +282,15 @@ bletest_init_advertising(void)
     assert(rc == 0);
     host_hci_outstanding_opcode = 0;
 
+    /* If we are using a random address, we need to set it */
+    if (adv.own_addr_type == BLE_HCI_ADV_OWN_ADDR_RANDOM) {
+        memcpy(rand_addr, g_dev_addr, BLE_DEV_ADDR_LEN);
+        rand_addr[5] |= 0xc0;
+        rc = host_hci_cmd_le_set_rand_addr(rand_addr);
+        assert(rc == 0);
+        host_hci_outstanding_opcode = 0;
+    }
+
     /* Set advertising data */
     if (adv_len != 0) {
         rc = host_hci_cmd_le_set_adv_data(&g_host_adv_data[0], adv_len);
@@ -348,6 +365,7 @@ void
 bletest_init_initiator(void)
 {
     int rc;
+    uint8_t rand_addr[BLE_DEV_ADDR_LEN];
     struct hci_create_conn cc;
     struct hci_create_conn *hcc;
 
@@ -360,9 +378,12 @@ bletest_init_initiator(void)
     hcc->supervision_timeout = BLETEST_CFG_CONN_SPVN_TMO;
     hcc->scan_itvl = BLETEST_CFG_SCAN_ITVL;
     hcc->scan_window = BLETEST_CFG_SCAN_WINDOW;
-    hcc->peer_addr_type = BLE_HCI_CONN_PEER_ADDR_PUBLIC;
+    hcc->peer_addr_type = BLETEST_CFG_CONN_PEER_ADDR_TYPE;
     memcpy(hcc->peer_addr, g_bletest_cur_peer_addr, BLE_DEV_ADDR_LEN);
-    hcc->own_addr_type = BLE_HCI_CONN_PEER_ADDR_PUBLIC;
+    if (hcc->peer_addr_type == BLE_HCI_CONN_PEER_ADDR_RANDOM) {
+        hcc->peer_addr[5] |= 0xc0;
+    }
+    hcc->own_addr_type = BLETEST_CFG_CONN_OWN_ADDR_TYPE;
     hcc->min_ce_len = BLETEST_CFG_MIN_CE_LEN;
     hcc->max_ce_len = BLETEST_CFG_MAX_CE_LEN;
 
@@ -370,6 +391,15 @@ bletest_init_initiator(void)
                    hcc->peer_addr[0], hcc->peer_addr[1], hcc->peer_addr[2],
                    hcc->peer_addr[3], hcc->peer_addr[4], hcc->peer_addr[5]);
 
+    /* If we are using a random address, we need to set it */
+    if (hcc->own_addr_type == BLE_HCI_ADV_OWN_ADDR_RANDOM) {
+        memcpy(rand_addr, g_dev_addr, BLE_DEV_ADDR_LEN);
+        rand_addr[5] |= 0xc0;
+        rc = host_hci_cmd_le_set_rand_addr(rand_addr);
+        assert(rc == 0);
+        host_hci_outstanding_opcode = 0;
+    }
+
     rc = host_hci_cmd_le_create_connection(hcc);
     assert(rc == 0);
     host_hci_outstanding_opcode = 0;

Reply via email to