Repository: incubator-mynewt-larva Updated Branches: refs/heads/master 34d3b2e51 -> 3176204a8
Add whitelist to advertising 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/3176204a Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/3176204a Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/3176204a Branch: refs/heads/master Commit: 3176204a88f266b6ac54ba850f25f7caca5aa07d Parents: 34d3b2e Author: Willam San Filippo <w...@micosa.io> Authored: Thu Nov 5 17:46:43 2015 -0800 Committer: Willam San Filippo <w...@micosa.io> Committed: Thu Nov 5 17:46:52 2015 -0800 ---------------------------------------------------------------------- .../controller/include/controller/ble_ll_adv.h | 4 +- net/nimble/controller/src/ble_ll.c | 29 +++--- net/nimble/controller/src/ble_ll_adv.c | 93 ++++++++++++++++++-- net/nimble/controller/src/ble_ll_scan.c | 4 +- net/nimble/controller/src/ble_ll_whitelist.c | 16 ++-- net/nimble/controller/src/ble_phy.c | 2 + net/nimble/host/src/host_dbg.c | 37 ++++++-- project/bletest/src/main.c | 28 +++--- 8 files changed, 151 insertions(+), 62 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/3176204a/net/nimble/controller/include/controller/ble_ll_adv.h ---------------------------------------------------------------------- diff --git a/net/nimble/controller/include/controller/ble_ll_adv.h b/net/nimble/controller/include/controller/ble_ll_adv.h index 5d46d9f..b7bca30 100644 --- a/net/nimble/controller/include/controller/ble_ll_adv.h +++ b/net/nimble/controller/include/controller/ble_ll_adv.h @@ -147,8 +147,8 @@ void ble_ll_adv_tx_done_proc(void *arg); /* Called to initialize advertising functionality. */ void ble_ll_adv_init(void); -/* Called when a scan request has been received. */ -int ble_ll_adv_rx_scan_req(uint8_t *rxbuf); +/* Called on rx pdu end when in advertising state */ +int ble_ll_adv_rx_pdu_end(uint8_t pdu_type, struct os_mbuf *rxpdu); /* Boolean function denoting whether or not the whitelist can be changed */ int ble_ll_adv_can_chg_whitelist(void); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/3176204a/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 1894e92..f7b8746 100644 --- a/net/nimble/controller/src/ble_ll.c +++ b/net/nimble/controller/src/ble_ll.c @@ -26,7 +26,14 @@ #include "controller/ble_ll_scan.h" #include "controller/ble_ll_hci.h" -/* XXX: use the sanity task! */ +/* XXX: + * + * 1) use the sanity task! + * 2) Need to figure out what to do with packets that we hand up that did + * not pass the filter policy for the given state. Currently I count all + * packets I think. Need to figure out what to do with this. + * + */ /* Connection related define */ #define BLE_LL_CONN_INIT_MAX_REMOTE_OCTETS (27) @@ -502,24 +509,8 @@ ble_ll_rx_end(struct os_mbuf *rxpdu, uint8_t crcok) rc = -1; switch (g_ble_ll_data.ll_state) { case BLE_LL_STATE_ADV: - /* If we get a scan request*/ - if (pdu_type == BLE_ADV_PDU_TYPE_SCAN_REQ) { - /* Just bail if CRC is not good */ - if (crcok) { - rc = ble_ll_adv_rx_scan_req(rxbuf); - if (rc) { - /* XXX: One thing left to reconcile here. We have - * the advertisement schedule element still running. - * How to deal with the end of the advertising event? - * Need to figure that out. - */ - } - } - } else { - if (pdu_type == BLE_ADV_PDU_TYPE_CONNECT_REQ) { - rc = 0; - /* XXX: deal with this */ - } + if (crcok) { + rc = ble_ll_adv_rx_pdu_end(pdu_type, rxpdu); } break; case BLE_LL_STATE_SCANNING: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/3176204a/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 959f4ce..adab080 100644 --- a/net/nimble/controller/src/ble_ll_adv.c +++ b/net/nimble/controller/src/ble_ll_adv.c @@ -25,6 +25,7 @@ #include "controller/ble_ll_adv.h" #include "controller/ble_ll_sched.h" #include "controller/ble_ll_scan.h" +#include "controller/ble_ll_whitelist.h" #include "hal/hal_cputime.h" #include "hal/hal_gpio.h" @@ -56,8 +57,7 @@ * we need to send a CONNECTION COMPLETE event. Do this. * 9) How does the advertising channel tx power get set? I dont implement * that currently. - * 10) Add whitelist! Do this to the code. Need to enable/disable whitelisting - * appropriately. Also need to set appropriate bits at the PHY (DEVMATCH). + * 10) Deal with whitelisting at LL when pdu is handed up to LL task. */ /* @@ -463,8 +463,8 @@ ble_ll_adv_set_adv_params(uint8_t *cmd) adv_itvl_max = le16toh(cmd + 2); adv_type = cmd[4]; - /* Min has to be less than max and cannot equal max */ - if ((adv_itvl_min > adv_itvl_max) || (adv_itvl_min == adv_itvl_max)) { + /* Min has to be less than max */ + if (adv_itvl_min >= adv_itvl_max) { return BLE_ERR_INV_HCI_CMD_PARMS; } @@ -483,7 +483,6 @@ ble_ll_adv_set_adv_params(uint8_t *cmd) break; } - /* XXX: isnt there a maximum that we need to check? */ /* Make sure interval minimum is valid for the advertising type */ if ((adv_itvl_min < min_itvl) || (adv_itvl_min > BLE_HCI_ADV_ITVL_MAX)) { return BLE_ERR_INV_HCI_CMD_PARMS; @@ -534,6 +533,9 @@ ble_ll_adv_sm_stop(struct ble_ll_adv_sm *advsm) { /* XXX: Stop any timers we may have started */ + /* Disable whitelisting (just in case) */ + ble_ll_whitelist_disable(); + /* Remove any scheduled advertising items */ ble_ll_sched_rmv(BLE_LL_SCHED_TYPE_ADV); @@ -542,7 +544,9 @@ ble_ll_adv_sm_stop(struct ble_ll_adv_sm *advsm) } /** - * Start the advertising state machine. + * Start the advertising state machine. This is called when the host sends + * the "enable advertising" command and is not called again while in the + * advertising state. * * Context: Link-layer task. * @@ -591,6 +595,13 @@ ble_ll_adv_sm_start(struct ble_ll_adv_sm *advsm) adv_chan = ble_ll_adv_first_chan(advsm); advsm->adv_chan = adv_chan; + /* Enable/disable whitelisting based on filter policy */ + if (advsm->adv_filter_policy != BLE_HCI_ADV_FILT_NONE) { + ble_ll_whitelist_enable(); + } else { + ble_ll_whitelist_disable(); + } + /* * Set start time for the advertising event. This time is the same * as the time we will send the first PDU. Since there does not seem @@ -751,15 +762,20 @@ ble_ll_adv_set_adv_data(uint8_t *cmd, uint8_t len) * 0: Scan request is for us and we successfully went from rx to tx. * > 0: PHY error attempting to go from rx to tx. */ -int -ble_ll_adv_rx_scan_req(uint8_t *rxbuf) +static int +ble_ll_adv_rx_scan_req(struct os_mbuf *rxpdu) { int rc; uint8_t rxaddr_type; uint8_t *our_addr; uint8_t *adva; + uint8_t addr_type; + uint8_t *rxbuf; + struct ble_mbuf_hdr *ble_hdr; + struct ble_ll_adv_sm *advsm; /* Determine if this is addressed to us */ + rxbuf = rxpdu->om_data; rxaddr_type = rxbuf[0] & BLE_ADV_PDU_HDR_RXADD_MASK; if (rxaddr_type) { our_addr = g_random_addr; @@ -770,8 +786,28 @@ ble_ll_adv_rx_scan_req(uint8_t *rxbuf) rc = -1; adva = rxbuf + BLE_LL_PDU_HDR_LEN + BLE_DEV_ADDR_LEN; if (!memcmp(our_addr, adva, BLE_DEV_ADDR_LEN)) { + /* Set device match bit if we are whitelisting */ + advsm = &g_ble_ll_adv_sm; + if (advsm->adv_filter_policy & 1) { + /* Get the scanners address type */ + if (rxbuf[0] & BLE_ADV_PDU_HDR_TXADD_MASK) { + addr_type = BLE_ADDR_TYPE_RANDOM; + } else { + addr_type = BLE_ADDR_TYPE_PUBLIC; + } + + /* Check for whitelist match */ + if (!ble_ll_whitelist_match(rxbuf + BLE_LL_PDU_HDR_LEN, + addr_type)) { + return rc; + } else { + ble_hdr = BLE_MBUF_HDR_PTR(rxpdu); + ble_hdr->flags |= BLE_MBUF_HDR_F_DEVMATCH; + } + } + /* Setup to transmit the scan response */ - rc = ble_phy_tx(g_ble_ll_adv_sm.scan_rsp_pdu, BLE_PHY_TRANSITION_RX_TX, + rc = ble_phy_tx(advsm->scan_rsp_pdu, BLE_PHY_TRANSITION_RX_TX, BLE_PHY_TRANSITION_NONE); if (!rc) { ++g_ble_ll_adv_stats.scan_rsp_txg; @@ -782,6 +818,45 @@ ble_ll_adv_rx_scan_req(uint8_t *rxbuf) } /** + * Called on phy rx pdu end when in advertising state. + * + * Context: Interrupt + * + * @param pdu_type + * @param rxpdu + * + * @return int + * < 0: Disable the phy after reception. + * == 0: Do not disable the PHY as we are gi + * > 0: Do not disable PHY as that has already been done. + */ +int +ble_ll_adv_rx_pdu_end(uint8_t pdu_type, struct os_mbuf *rxpdu) +{ + int rc; + + /* We only care about scan requests and connection requests */ + rc = -1; + if (pdu_type == BLE_ADV_PDU_TYPE_SCAN_REQ) { + rc = ble_ll_adv_rx_scan_req(rxpdu); + if (rc) { + /* XXX: One thing left to reconcile here. We have + * the advertisement schedule element still running. + * How to deal with the end of the advertising event? + * Need to figure that out. + */ + } + } else { + if (pdu_type == BLE_ADV_PDU_TYPE_CONNECT_REQ) { + rc = 0; + /* XXX: deal with this. Dont forget filter policy */ + } + } + + return rc; +} + +/** * Process advertistement tx done event. * * Context: Link Layer task. http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/3176204a/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 e95d9c6..521ec2b 100644 --- a/net/nimble/controller/src/ble_ll_scan.c +++ b/net/nimble/controller/src/ble_ll_scan.c @@ -706,10 +706,10 @@ ble_ll_scan_win_end_proc(void *arg) /* Set next scan window start time */ itvl = cputime_usecs_to_ticks(scansm->scan_itvl * BLE_HCI_SCAN_ITVL); scansm->scan_win_start_time += itvl; - + /* Set next scanning window start. */ delta_t = (int32_t)(cputime_get32() - scansm->scan_win_start_time); - if (delta_t >= win_ticks) { + while (delta_t >= (int32_t)win_ticks) { /* * Since it is possible to scan continuously, it is possible * that we will be late here if the scan window is equal to the http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/3176204a/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 6eea1c4..5cfcf07 100644 --- a/net/nimble/controller/src/ble_ll_whitelist.c +++ b/net/nimble/controller/src/ble_ll_whitelist.c @@ -228,25 +228,29 @@ ble_ll_whitelist_rmv(uint8_t *addr, uint8_t addr_type) return BLE_ERR_SUCCESS; } -/* Enable whitelisting */ +/** + * Enable whitelisting. + * + * Note: This function has no effect if we are not using HW whitelisting + */ void ble_ll_whitelist_enable(void) { #ifdef BLE_USES_HW_WHITELIST ble_hw_whitelist_enable(); -#else - /* XXX: Is there anything to do here? */ #endif } -/* Disable whitelisting */ +/** + * Disable whitelisting. + * + * Note: This function has no effect if we are not using HW whitelisting + */ void ble_ll_whitelist_disable(void) { #ifdef BLE_USES_HW_WHITELIST ble_hw_whitelist_disable(); -#else - /* XXX: Is there anything to do here? */ #endif } http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/3176204a/net/nimble/controller/src/ble_phy.c ---------------------------------------------------------------------- diff --git a/net/nimble/controller/src/ble_phy.c b/net/nimble/controller/src/ble_phy.c index 126c4a8..6be96b0 100644 --- a/net/nimble/controller/src/ble_phy.c +++ b/net/nimble/controller/src/ble_phy.c @@ -61,6 +61,7 @@ struct ble_phy_statistics uint32_t tx_fail; uint32_t tx_bytes; uint32_t rx_starts; + uint32_t rx_aborts; uint32_t rx_valid; uint32_t rx_crc_err; uint32_t phy_isrs; @@ -226,6 +227,7 @@ ble_phy_isr(void) /* Disable PHY */ ble_phy_disable(); irq_en = 0; + ++g_ble_phy_stats.rx_aborts; } /* Count rx starts */ http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/3176204a/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 ebd164e..f2e1245 100644 --- a/net/nimble/host/src/host_dbg.c +++ b/net/nimble/host/src/host_dbg.c @@ -34,7 +34,7 @@ host_hci_dbg_le_event_disp(uint8_t subev, uint8_t len, uint8_t *evdata) char adv_data_buf[32]; switch (subev) { - case 0x02: + case BLE_HCI_LE_SUBEV_ADV_RPT: advlen = evdata[9]; rssi = evdata[10 + advlen]; console_printf("LE advertising report. len=%u num=%u evtype=%u " @@ -68,22 +68,47 @@ host_hci_dbg_le_event_disp(uint8_t subev, uint8_t len, uint8_t *evdata) } void +host_hci_dbg_cmd_complete_disp(uint8_t *evdata, uint8_t len) +{ + uint8_t ogf; + uint8_t ocf; + uint16_t opcode; + char parmbuf[32]; + + opcode = le16toh(evdata + 1); + ogf = BLE_HCI_OGF(opcode); + ocf = BLE_HCI_OCF(opcode); + + /* Display parameters based on command. */ + parmbuf[0] = '\0'; + if (ogf == BLE_HCI_OGF_LE) { + switch (ocf) { + case BLE_HCI_OCF_LE_SET_ADV_DATA: + snprintf(parmbuf, 12, "status=%-3d ", evdata[3]); + break; + default: + break; + } + } + + console_printf("Command Complete: cmd_pkts=%u ocf=0x%x ogf=0x%x %s", + evdata[0], ocf, ogf, parmbuf); +} + +void host_hci_dbg_event_disp(uint8_t *evbuf) { uint8_t *evdata; uint8_t evcode; uint8_t len; - uint16_t opcode; - + evcode = evbuf[0]; len = evbuf[1]; evdata = evbuf + 2; switch (evcode) { case BLE_HCI_EVCODE_COMMAND_COMPLETE: - opcode = le16toh(evdata +1); - console_printf("Command Complete: cmd_pkts=%u ocf=0x%x ogf=0x%x", - evdata[0], opcode & 0x3FF, opcode >> 10); + host_hci_dbg_cmd_complete_disp(evdata, len); break; case BLE_HCI_EVCODE_LE_META: host_hci_dbg_le_event_disp(evdata[0], len, evdata + 1); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/3176204a/project/bletest/src/main.c ---------------------------------------------------------------------- diff --git a/project/bletest/src/main.c b/project/bletest/src/main.c index 748e7ee..b9ff2b9 100755 --- a/project/bletest/src/main.c +++ b/project/bletest/src/main.c @@ -66,13 +66,14 @@ os_membuf_t g_mbuf_buffer[MBUF_MEMPOOL_SIZE]; /* Some application configurations */ #define BLETEST_ROLE_ADVERTISER (0) #define BLETEST_ROLE_SCANNER (1) +#define BLETEST_CFG_ROLE (BLETEST_ROLE_SCANNER) #define BLETEST_CFG_FILT_DUP_ADV (0) #define BLETEST_CFG_ADV_ITVL (500000 / BLE_HCI_ADV_ITVL) #define BLETEST_CFG_ADV_TYPE BLE_HCI_ADV_TYPE_ADV_SCAN_IND +#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 (650000 / BLE_HCI_SCAN_ITVL) -#define BLETEST_CFG_ROLE (BLETEST_ROLE_SCANNER) -#define BLETEST_CFG_SCAN_TYPE (BLE_HCI_SCAN_TYPE_PASSIVE) +#define BLETEST_CFG_SCAN_TYPE (BLE_HCI_SCAN_TYPE_ACTIVE) #define BLETEST_CFG_SCAN_FILT_POLICY (BLE_HCI_SCAN_FILT_USE_WL) /* BLETEST variables */ @@ -169,7 +170,7 @@ bletest_init_advertising(void) adv_itvl = BLETEST_CFG_ADV_ITVL; /* Advertising interval */ adv.adv_type = BLETEST_CFG_ADV_TYPE; adv.adv_channel_map = 0x07; - adv.adv_filter_policy = BLE_HCI_ADV_FILT_NONE; + 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.adv_itvl_min = BLE_HCI_ADV_ITVL_NONCONN_MIN; @@ -204,23 +205,14 @@ bletest_init_scanner(void) filter_policy = BLETEST_CFG_SCAN_FILT_POLICY; if (filter_policy & 1) { /* Add some whitelist addresses */ - dev_addr[0] = 0x91; - dev_addr[1] = 0xab; - dev_addr[2] = 0x1c; - dev_addr[3] = 0x7e; - dev_addr[4] = 0x4f; - dev_addr[5] = 0xd0; + dev_addr[0] = 0x00; + dev_addr[1] = 0x00; + dev_addr[2] = 0x00; + dev_addr[3] = 0x08; + dev_addr[4] = 0x08; + dev_addr[5] = 0x08; rc = host_hci_cmd_le_add_to_whitelist(dev_addr, BLE_ADDR_TYPE_PUBLIC); assert(rc == 0); - - dev_addr[0] = 0x94; - dev_addr[1] = 0x0e; - dev_addr[2] = 0xf4; - dev_addr[3] = 0x8f; - dev_addr[4] = 0x20; - dev_addr[5] = 0xe7; - rc = host_hci_cmd_le_add_to_whitelist(dev_addr, BLE_ADDR_TYPE_RANDOM); - assert(rc == 0); } }