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;