You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by we...@apache.org on 2015/10/30 21:05:32 UTC
incubator-mynewt-larva git commit: Fix scan response reception and
modify code to add a packet number to advertisements (for debugging
purposes). Use console for advertising report display
Repository: incubator-mynewt-larva
Updated Branches:
refs/heads/master 0c7295431 -> 85c4011ae
Fix scan response reception and modify code to add a packet number to advertisements (for debugging purposes). Use console for advertising report display
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/85c4011a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/85c4011a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/85c4011a
Branch: refs/heads/master
Commit: 85c4011ae0a53435e2f47bd609cbccf11133720e
Parents: 0c72954
Author: Willam San Filippo <wi...@micosa.io>
Authored: Fri Oct 30 13:05:05 2015 -0700
Committer: Willam San Filippo <wi...@micosa.io>
Committed: Fri Oct 30 13:05:28 2015 -0700
----------------------------------------------------------------------
.gitignore | 1 +
net/nimble/controller/include/controller/ll.h | 5 +-
.../controller/include/controller/ll_adv.h | 5 +-
net/nimble/controller/src/ble_ll_scan.c | 93 +++++++++----------
net/nimble/controller/src/ll.c | 70 ++++++++++-----
net/nimble/controller/src/ll_adv.c | 61 ++++++-------
net/nimble/controller/src/ll_hci.c | 2 +-
net/nimble/controller/src/phy.c | 14 ++-
net/nimble/host/src/host_dbg.c | 95 ++++++++++++++++++++
net/nimble/host/src/host_dbg.h | 22 +++++
net/nimble/host/src/host_hci.c | 9 +-
project/bletest/src/main.c | 63 ++++++++++---
12 files changed, 307 insertions(+), 133 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/85c4011a/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index c8dec68..30e9109 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@ tags
.gdb_history
*~
.nest
+.DS_Store
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/85c4011a/net/nimble/controller/include/controller/ll.h
----------------------------------------------------------------------
diff --git a/net/nimble/controller/include/controller/ll.h b/net/nimble/controller/include/controller/ll.h
index aa23582..7fbf8db 100644
--- a/net/nimble/controller/include/controller/ll.h
+++ b/net/nimble/controller/include/controller/ll.h
@@ -403,7 +403,7 @@ enum ll_init_filt_policy
int ll_init(void);
/* 'Boolean' function returning true if address is a valid random address */
-int ll_is_valid_rand_addr(uint8_t *addr);
+int ble_ll_is_valid_random_addr(uint8_t *addr);
/* Calculate the amount of time a pdu of 'len' bytes will take to transmit */
uint16_t ll_pdu_tx_time_get(uint16_t len);
@@ -431,4 +431,7 @@ void ble_ll_state_set(int ll_state);
/* Send an event to LL task */
void ble_ll_event_send(struct os_event *ev);
+/* Set random address */
+int ble_ll_set_random_addr(uint8_t *addr);
+
#endif /* H_LL_ */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/85c4011a/net/nimble/controller/include/controller/ll_adv.h
----------------------------------------------------------------------
diff --git a/net/nimble/controller/include/controller/ll_adv.h b/net/nimble/controller/include/controller/ll_adv.h
index a302f20..0f0a8b7 100644
--- a/net/nimble/controller/include/controller/ll_adv.h
+++ b/net/nimble/controller/include/controller/ll_adv.h
@@ -134,9 +134,6 @@ int ll_adv_set_adv_data(uint8_t *cmd, uint8_t len);
/* Set scan response data */
int ll_adv_set_scan_rsp_data(uint8_t *cmd, uint8_t len);
-/* Set random address */
-int ll_adv_set_rand_addr(uint8_t *addr);
-
/* Set advertising parameters */
int ll_adv_set_adv_params(uint8_t *cmd);
@@ -151,6 +148,6 @@ void ll_adv_tx_done_proc(void *arg);
void ll_adv_init(void);
/* Called when a scan request has been received. */
-int ll_adv_rx_scan_req(uint8_t *rxbuf);
+int ble_ll_adv_rx_scan_req(uint8_t *rxbuf);
#endif /* H_LL_ADV_ */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/85c4011a/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 29e42c6..554ebe4 100644
--- a/net/nimble/controller/src/ble_ll_scan.c
+++ b/net/nimble/controller/src/ble_ll_scan.c
@@ -414,7 +414,7 @@ ble_ll_hci_send_adv_report(uint8_t pdu_type, uint8_t addr_type, uint8_t *rxbuf,
subev = BLE_HCI_LE_SUBEV_ADV_RPT;
adv_data_len = rxbuf[1] & BLE_ADV_PDU_HDR_LEN_MASK;
- adv_data_len -= (BLE_LL_PDU_HDR_LEN + BLE_DEV_ADDR_LEN);
+ adv_data_len -= BLE_DEV_ADDR_LEN;
}
rc = BLE_ERR_MEM_CAPACITY;
@@ -433,18 +433,19 @@ ble_ll_hci_send_adv_report(uint8_t pdu_type, uint8_t addr_type, uint8_t *rxbuf,
} else {
evbuf[5] = BLE_HCI_ADV_OWN_ADDR_PUBLIC;
}
- memcpy(evbuf + 6, rxbuf + BLE_LL_PDU_HDR_LEN, BLE_DEV_ADDR_LEN);
+ rxbuf += BLE_LL_PDU_HDR_LEN;
+ memcpy(evbuf + 6, rxbuf, BLE_DEV_ADDR_LEN);
evbuf[12] = adv_data_len;
- memcpy(evbuf + 13, rxbuf + BLE_LL_PDU_HDR_LEN + BLE_DEV_ADDR_LEN,
+ memcpy(evbuf + 13, rxbuf + BLE_DEV_ADDR_LEN,
adv_data_len);
evbuf[13 + adv_data_len] = rssi;
- }
- rc = ble_ll_hci_event_send(evbuf);
- if (!rc) {
- /* If we are filtering, add it to list of duplicate addresses */
- if (g_ble_ll_scan_sm.scan_filt_dups) {
- ble_ll_scan_add_dup_adv(rxbuf + BLE_LL_PDU_HDR_LEN, addr_type);
+ rc = ble_ll_hci_event_send(evbuf);
+ if (!rc) {
+ /* If filtering, add it to list of duplicate addresses */
+ if (g_ble_ll_scan_sm.scan_filt_dups) {
+ ble_ll_scan_add_dup_adv(rxbuf, addr_type);
+ }
}
}
}
@@ -629,7 +630,7 @@ ble_ll_scan_sm_start(struct ble_ll_scan_sm *scansm)
* parameter (which in this case is just enable or disable).
*/
if (scansm->own_addr_type != BLE_HCI_ADV_OWN_ADDR_PUBLIC) {
- if (!ll_is_valid_rand_addr(g_random_addr)) {
+ if (!ble_ll_is_valid_random_addr(g_random_addr)) {
return BLE_ERR_CMD_DISALLOWED;
}
@@ -799,49 +800,42 @@ ble_ll_scan_rx_pdu_end(uint8_t *rxbuf)
/* We only care about indirect advertisements or scan indirect */
if ((pdu_type == BLE_ADV_PDU_TYPE_ADV_IND) ||
(pdu_type == BLE_ADV_PDU_TYPE_ADV_SCAN_IND)) {
- /* See if we should check the whitelist */
- adv_addr = rxbuf + BLE_LL_PDU_HDR_LEN;
- addr_type = rxbuf[0] & BLE_ADV_PDU_HDR_TXADD_MASK;
- if ((scansm->scan_filt_policy == BLE_HCI_SCAN_FILT_USE_WL) ||
- (scansm->scan_filt_policy == BLE_HCI_SCAN_FILT_USE_WL_INITA)) {
- /* Check if device is on whitelist. If not, leave */
- if (!ble_ll_is_on_whitelist(adv_addr, addr_type)) {
- return -1;
- }
- }
-
- /*
- * Check to see if we have received a scan response from this
- * advertisor. If so, no need to send scan request.
- */
- if (ble_ll_scan_have_rxd_scan_rsp(adv_addr, addr_type)) {
+ /* See if we should check the whitelist */
+ adv_addr = rxbuf + BLE_LL_PDU_HDR_LEN;
+ addr_type = rxbuf[0] & BLE_ADV_PDU_HDR_TXADD_MASK;
+ if ((scansm->scan_filt_policy == BLE_HCI_SCAN_FILT_USE_WL) ||
+ (scansm->scan_filt_policy == BLE_HCI_SCAN_FILT_USE_WL_INITA)) {
+ /* Check if device is on whitelist. If not, leave */
+ if (!ble_ll_is_on_whitelist(adv_addr, addr_type)) {
return -1;
}
+ }
- /* Better not be a scan response pending */
- assert(scansm->scan_rsp_pending == 0);
-
- /* We want to send a request. See if backoff allows us */
- --scansm->backoff_count;
- if (scansm->backoff_count == 0) {
- /* Setup to transmit the scan request */
- ble_ll_scan_req_pdu_make(scansm, adv_addr, addr_type);
- rc = ble_phy_tx(scansm->scan_req_pdu, BLE_PHY_TRANSITION_RX_TX,
- BLE_PHY_TRANSITION_TX_RX);
-
- /* XXX: I still may want to post an event to the LL task
- * instead of setting the scan response flag here. For now,
- just do it here. */
- /* Set "waiting for scan response" flag */
- scansm->scan_rsp_pending = 1;
- }
+ /*
+ * Check to see if we have received a scan response from this
+ * advertisor. If so, no need to send scan request.
+ */
+ if (ble_ll_scan_have_rxd_scan_rsp(adv_addr, addr_type)) {
+ return -1;
+ }
- /*
- * XXX: how do we go back into receive when in scanning mode?
- * For example, if we disable the PHY, we need to put the device
- * back into receive mode. How does that happen???? Does the rx end
- * do that or should the LL task?
- */
+ /* Better not be a scan response pending */
+ assert(scansm->scan_rsp_pending == 0);
+
+ /* We want to send a request. See if backoff allows us */
+ --scansm->backoff_count;
+ if (scansm->backoff_count == 0) {
+ /* Setup to transmit the scan request */
+ ble_ll_scan_req_pdu_make(scansm, adv_addr, addr_type);
+ rc = ble_phy_tx(scansm->scan_req_pdu, BLE_PHY_TRANSITION_RX_TX,
+ BLE_PHY_TRANSITION_TX_RX);
+
+ /* XXX: I still may want to post an event to the LL task
+ * instead of setting the scan response flag here. For now,
+ just do it here. */
+ /* Set "waiting for scan response" flag */
+ scansm->scan_rsp_pending = 1;
+ }
}
return rc;
@@ -924,6 +918,7 @@ ble_ll_scan_rx_pdu_proc(uint8_t pdu_type, uint8_t *rxbuf, int8_t rssi)
}
}
+ /* XXX: what do I do with return code here? Anything? */
/* Send the advertising report */
ble_ll_hci_send_adv_report(pdu_type, addr_type, rxbuf, rssi);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/85c4011a/net/nimble/controller/src/ll.c
----------------------------------------------------------------------
diff --git a/net/nimble/controller/src/ll.c b/net/nimble/controller/src/ll.c
index baa895d..ea25f6d 100644
--- a/net/nimble/controller/src/ll.c
+++ b/net/nimble/controller/src/ll.c
@@ -187,30 +187,9 @@ ble_ll_is_resolvable_priv_addr(uint8_t *addr)
return 0;
}
-int
-ble_ll_is_our_devaddr(uint8_t *addr, int addr_type)
-{
- int rc;
- uint8_t *our_addr;
-
- rc = 0;
- if (addr_type) {
- our_addr = g_dev_addr;
- } else {
- our_addr = g_random_addr;
- }
-
- rc = 0;
- if (!memcmp(our_addr, g_random_addr, BLE_DEV_ADDR_LEN)) {
- rc = 1;
- }
-
- return rc;
-}
-
/* Checks to see that the device is a valid random address */
int
-ll_is_valid_rand_addr(uint8_t *addr)
+ble_ll_is_valid_random_addr(uint8_t *addr)
{
int i;
int rc;
@@ -253,6 +232,51 @@ ll_is_valid_rand_addr(uint8_t *addr)
}
/**
+ * Called from the HCI command parser when the set random address command
+ * is received.
+ *
+ * Context: Link Layer task (HCI command parser)
+ *
+ * @param addr Pointer to address
+ *
+ * @return int 0: success
+ */
+int
+ble_ll_set_random_addr(uint8_t *addr)
+{
+ int rc;
+
+ rc = BLE_ERR_INV_HCI_CMD_PARMS;
+ if (ble_ll_is_valid_random_addr(addr)) {
+ memcpy(g_random_addr, addr, BLE_DEV_ADDR_LEN);
+ rc = BLE_ERR_SUCCESS;
+ }
+
+ return rc;
+}
+
+int
+ble_ll_is_our_devaddr(uint8_t *addr, int addr_type)
+{
+ int rc;
+ uint8_t *our_addr;
+
+ rc = 0;
+ if (addr_type) {
+ our_addr = g_dev_addr;
+ } else {
+ our_addr = g_random_addr;
+ }
+
+ rc = 0;
+ if (!memcmp(our_addr, g_random_addr, BLE_DEV_ADDR_LEN)) {
+ rc = 1;
+ }
+
+ return rc;
+}
+
+/**
* ll pdu tx time get
*
* Returns the number of usecs it will take to transmit a PDU of length 'len'
@@ -494,7 +518,7 @@ ll_rx_end(struct os_mbuf *rxpdu, uint8_t crcok)
if (pdu_type == BLE_ADV_PDU_TYPE_SCAN_REQ) {
/* Just bail if CRC is not good */
if (crcok) {
- rc = ll_adv_rx_scan_req(rxbuf);
+ 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.
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/85c4011a/net/nimble/controller/src/ll_adv.c
----------------------------------------------------------------------
diff --git a/net/nimble/controller/src/ll_adv.c b/net/nimble/controller/src/ll_adv.c
index 5bdfed2..497699a 100644
--- a/net/nimble/controller/src/ll_adv.c
+++ b/net/nimble/controller/src/ll_adv.c
@@ -17,6 +17,7 @@
#include <string.h>
#include <assert.h>
#include "os/os.h"
+#include "bsp/bsp.h"
#include "nimble/ble.h"
#include "nimble/hci_common.h"
#include "controller/phy.h"
@@ -25,6 +26,7 @@
#include "controller/ll_sched.h"
#include "controller/ll_scan.h"
#include "hal/hal_cputime.h"
+#include "hal/hal_gpio.h"
/*
* Advertising configuration parameters. These are parameters that I have
@@ -98,7 +100,8 @@ struct ll_adv_stats
{
uint32_t late_tx_done;
uint32_t cant_set_sched;
- /* XXX: add to these */
+ uint32_t scan_rsp_txg;
+ uint32_t adv_txg;
};
struct ll_adv_stats g_ll_adv_stats;
@@ -115,9 +118,10 @@ struct ll_adv_stats g_ll_adv_stats;
*/
#define BLE_LL_ADV_SCHED_MAX_USECS (852)
+/* For debug purposes */
+extern void bletest_inc_adv_pkt_num(void);
+
/**
- * ble ll adv first chan
- *
* Calculate the first channel that we should advertise upon when we start
* an advertising event.
*
@@ -345,6 +349,9 @@ ll_adv_tx_start_cb(struct ll_sched_item *sch)
/* Get the state machine for the event */
advsm = (struct ll_adv_sm *)sch->cb_arg;
+ /* Toggle the LED */
+ gpio_toggle(LED_BLINK_PIN);
+
/* Set channel */
rc = ble_phy_setchan(advsm->adv_chan);
assert(rc == 0);
@@ -365,6 +372,9 @@ ll_adv_tx_start_cb(struct ll_sched_item *sch)
/* Set link layer state to advertising */
ble_ll_state_set(BLE_LL_STATE_ADV);
+ /* Count # of adv. sent */
+ ++g_ll_adv_stats.adv_txg;
+
/* Set schedule item next wakeup time */
if (advsm->adv_type == BLE_HCI_ADV_TYPE_ADV_NONCONN_IND) {
sch->next_wakeup = sch->end_time;
@@ -389,7 +399,6 @@ ll_adv_tx_start_cb(struct ll_sched_item *sch)
return rc;
}
-
static struct ll_sched_item *
ll_adv_sched_set(struct ll_adv_sm *advsm)
{
@@ -564,7 +573,7 @@ ll_adv_sm_start(struct ll_adv_sm *advsm)
* parameter (which in this case is just enable or disable).
*/
if (advsm->own_addr_type != BLE_HCI_ADV_OWN_ADDR_PUBLIC) {
- if (!ll_is_valid_rand_addr(g_random_addr)) {
+ if (!ble_ll_is_valid_random_addr(g_random_addr)) {
return BLE_ERR_CMD_DISALLOWED;
}
@@ -730,39 +739,10 @@ ll_adv_set_adv_data(uint8_t *cmd, uint8_t len)
return 0;
}
-/* XXX: this might be used for both scanning and advertising. */
/**
- * ble ll adv set rand addr
- *
- * Called from the HCI command parser when the set random address command
- * is received.
- *
- * Context: Link Layer task (HCI command parser)
- *
- * @param addr Pointer to address
- *
- * @return int 0: success
- */
-int
-ll_adv_set_rand_addr(uint8_t *addr)
-{
- int rc;
-
- rc = BLE_ERR_INV_HCI_CMD_PARMS;
- if (ll_is_valid_rand_addr(addr)) {
- memcpy(g_random_addr, addr, BLE_DEV_ADDR_LEN);
- rc = BLE_ERR_SUCCESS;
- }
-
- return rc;
-}
-
-/**
- * ll adv rx scan req
- *
* Called when the LL receives a scan request.
*
- * NOTE: Called from interrupt context.
+ * Context: Called from interrupt context.
*
* @param rxbuf
*
@@ -771,7 +751,7 @@ ll_adv_set_rand_addr(uint8_t *addr)
* > 0: PHY error attempting to go from rx to tx.
*/
int
-ll_adv_rx_scan_req(uint8_t *rxbuf)
+ble_ll_adv_rx_scan_req(uint8_t *rxbuf)
{
int rc;
uint8_t rxaddr_type;
@@ -792,6 +772,9 @@ ll_adv_rx_scan_req(uint8_t *rxbuf)
/* Setup to transmit the scan response */
rc = ble_phy_tx(g_ll_adv_sm.scan_rsp_pdu, BLE_PHY_TRANSITION_RX_TX,
BLE_PHY_TRANSITION_NONE);
+ if (!rc) {
+ ++g_ll_adv_stats.scan_rsp_txg;
+ }
}
return rc;
@@ -819,6 +802,9 @@ ll_adv_tx_done_proc(void *arg)
advsm = (struct ll_adv_sm *)arg;
ble_ll_state_set(BLE_LL_STATE_STANDBY);
+ /* For debug purposes */
+ bletest_inc_adv_pkt_num();
+
/*
* Check if we have ended our advertising event. If our last advertising
* packet was sent on the last channel, it means we are done with this
@@ -841,6 +827,9 @@ ll_adv_tx_done_proc(void *arg)
itvl += rand() % (BLE_LL_ADV_DELAY_MS_MAX * 1000);
advsm->adv_event_start_time += cputime_usecs_to_ticks(itvl);
advsm->adv_pdu_start_time = advsm->adv_event_start_time;
+
+ /* Toggle the LED */
+ gpio_toggle(LED_BLINK_PIN);
} else {
/*
* Move to next advertising channel. If not in the mask, just
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/85c4011a/net/nimble/controller/src/ll_hci.c
----------------------------------------------------------------------
diff --git a/net/nimble/controller/src/ll_hci.c b/net/nimble/controller/src/ll_hci.c
index e717f75..8807a5b 100644
--- a/net/nimble/controller/src/ll_hci.c
+++ b/net/nimble/controller/src/ll_hci.c
@@ -175,7 +175,7 @@ ble_ll_hci_le_cmd_proc(uint8_t *cmdbuf, uint16_t ocf, uint8_t *rsplen)
case BLE_HCI_OCF_LE_SET_RAND_ADDR:
if (len == BLE_DEV_ADDR_LEN) {
- rc = ll_adv_set_rand_addr(cmdbuf);
+ rc = ble_ll_set_random_addr(cmdbuf);
}
break;
case BLE_HCI_OCF_LE_SET_ADV_PARAMS:
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/85c4011a/net/nimble/controller/src/phy.c
----------------------------------------------------------------------
diff --git a/net/nimble/controller/src/phy.c b/net/nimble/controller/src/phy.c
index ef698b6..83050a3 100644
--- a/net/nimble/controller/src/phy.c
+++ b/net/nimble/controller/src/phy.c
@@ -128,6 +128,7 @@ ble_phy_isr(void)
uint32_t irq_en;
uint32_t state;
uint32_t shortcuts;
+ struct os_mbuf *rxpdu;
struct ble_mbuf_hdr *ble_hdr;
/* Check for disabled event. This only happens for transmits now */
@@ -167,6 +168,10 @@ ble_phy_isr(void)
NRF_RADIO->INTENSET = RADIO_INTENSET_ADDRESS_Msk;
g_ble_phy_data.phy_state = BLE_PHY_STATE_RX;
+ } else {
+ /* Disable the phy */
+ /* XXX: count no bufs? */
+ ble_phy_disable();
}
} else {
/* Better not be going from rx to tx! */
@@ -180,6 +185,8 @@ ble_phy_isr(void)
NRF_RADIO->EVENTS_ADDRESS = 0;
NRF_RADIO->INTENCLR = RADIO_INTENCLR_ADDRESS_Msk;
+ assert(g_ble_phy_data.rxpdu != NULL);
+
/* Wait to get 1st byte of frame */
while (1) {
state = NRF_RADIO->STATE;
@@ -245,14 +252,13 @@ ble_phy_isr(void)
}
/* Call Link Layer receive payload function */
- rc = ll_rx_end(g_ble_phy_data.rxpdu, ble_hdr->crcok);
+ rxpdu = g_ble_phy_data.rxpdu;
+ g_ble_phy_data.rxpdu = NULL;
+ rc = ll_rx_end(rxpdu, ble_hdr->crcok);
if (rc < 0) {
/* Disable the PHY. */
ble_phy_disable();
}
-
- /* The receive PDU has been handed to the Link Layer */
- g_ble_phy_data.rxpdu = NULL;
}
phy_isr_exit:
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/85c4011a/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
new file mode 100644
index 0000000..ebd164e
--- /dev/null
+++ b/net/nimble/host/src/host_dbg.c
@@ -0,0 +1,95 @@
+/**
+ * Copyright (c) 2015 Runtime Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <stdint.h>
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include "os/os.h"
+#include "console/console.h"
+#include "nimble/hci_common.h"
+#include "nimble/hci_transport.h"
+
+void
+host_hci_dbg_le_event_disp(uint8_t subev, uint8_t len, uint8_t *evdata)
+{
+ int8_t rssi;
+ uint8_t advlen;
+ int i;
+ int imax;
+ uint8_t *dptr;
+ char *adv_ptr;
+ char adv_data_buf[32];
+
+ switch (subev) {
+ case 0x02:
+ advlen = evdata[9];
+ rssi = evdata[10 + advlen];
+ console_printf("LE advertising report. len=%u num=%u evtype=%u "
+ "addrtype=%u addr=%x.%x.%x.%x.%x.%x advlen=%u "
+ "rssi=%d", len, evdata[0], evdata[1], evdata[2],
+ evdata[8], evdata[7], evdata[6], evdata[5],
+ evdata[4], evdata[3], advlen, rssi);
+ if (advlen) {
+ dptr = &evdata[10];
+ while (advlen > 0) {
+ memset(adv_data_buf, 0, 32);
+ imax = advlen;
+ if (imax > 8) {
+ imax = 8;
+ }
+ adv_ptr = &adv_data_buf[0];
+ for (i = 0; i < imax; ++i) {
+ snprintf(adv_ptr, 4, "%02x ", *dptr);
+ adv_ptr += 3;
+ ++dptr;
+ }
+ advlen -= imax;
+ console_printf("%s", adv_data_buf);
+ }
+ }
+ break;
+ default:
+ console_printf("\tUnknown LE event");
+ break;
+ }
+}
+
+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);
+ break;
+ case BLE_HCI_EVCODE_LE_META:
+ host_hci_dbg_le_event_disp(evdata[0], len, evdata + 1);
+ break;
+ default:
+ console_printf("Unknown event 0x%x len=%u", evcode, len);
+ break;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/85c4011a/net/nimble/host/src/host_dbg.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/host_dbg.h b/net/nimble/host/src/host_dbg.h
new file mode 100644
index 0000000..8d28e72
--- /dev/null
+++ b/net/nimble/host/src/host_dbg.h
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2015 Stack Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef H_HOST_DBG_
+#define H_HOST_DBG_
+
+void host_hci_dbg_event_disp(uint8_t *evbuf);
+
+#endif /* H_HOST_DBG_ */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/85c4011a/net/nimble/host/src/host_hci.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/host_hci.c b/net/nimble/host/src/host_hci.c
index b658f99..837d2e8 100644
--- a/net/nimble/host/src/host_hci.c
+++ b/net/nimble/host/src/host_hci.c
@@ -20,8 +20,9 @@
#include "console/console.h"
#include "nimble/hci_common.h"
#include "nimble/hci_transport.h"
+#include "host_dbg.h"
-#define HCI_CMD_BUFS (4)
+#define HCI_CMD_BUFS (8)
#define HCI_CMD_BUF_SIZE (260) /* XXX: temporary, Fix later */
struct os_mempool g_hci_cmd_pool;
os_membuf_t g_hci_cmd_buf[OS_MEMPOOL_SIZE(HCI_CMD_BUFS, HCI_CMD_BUF_SIZE)];
@@ -280,15 +281,13 @@ host_hci_cmd_le_set_scan_enable(uint8_t enable, uint8_t filter_dups)
void
host_hci_event_proc(struct os_event *ev)
{
- uint8_t *evbuf;
os_error_t err;
/* Count events received */
++g_host_hci_stats.events_rxd;
/* Display to console */
- evbuf = (uint8_t *)ev->ev_arg;
- console_printf("Host received event %u", evbuf[0]);
+ host_hci_dbg_event_disp((uint8_t *)ev->ev_arg);
/* XXX: Process the event */
@@ -308,6 +307,8 @@ ble_hci_transport_ctlr_event_send(uint8_t *hci_ev)
os_error_t err;
struct os_event *ev;
+ assert(hci_ev != NULL);
+
/* Get an event structure off the queue */
ev = (struct os_event *)os_memblock_get(&g_hci_os_event_pool);
if (!ev) {
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/85c4011a/project/bletest/src/main.c
----------------------------------------------------------------------
diff --git a/project/bletest/src/main.c b/project/bletest/src/main.c
index 34bc283..b2cc313 100755
--- a/project/bletest/src/main.c
+++ b/project/bletest/src/main.c
@@ -47,6 +47,7 @@ uint8_t g_random_addr[BLE_DEV_ADDR_LEN];
/* A buffer for host advertising data */
uint8_t g_host_adv_data[BLE_HCI_MAX_ADV_DATA_LEN];
+uint8_t g_host_adv_len;
/* Create a mbuf pool of BLE mbufs */
#define MBUF_NUM_MBUFS (16)
@@ -64,14 +65,40 @@ 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_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_SCAN_ITVL (500000 / BLE_HCI_SCAN_ITVL)
-#define BLETEST_CFG_SCAN_WINDOW (400000 / BLE_HCI_SCAN_ITVL)
+#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)
uint32_t g_next_os_time;
int bletest_state;
+void
+bletest_inc_adv_pkt_num(void)
+{
+ int rc;
+ uint8_t *dptr;
+ uint8_t digit;
+
+ dptr = &g_host_adv_data[18];
+ while (dptr >= &g_host_adv_data[13]) {
+ digit = *dptr;
+ ++digit;
+ if (digit == 58) {
+ digit = 48;
+ *dptr = digit;
+ --dptr;
+ } else {
+ *dptr = digit;
+ break;
+ }
+ }
+
+ rc = host_hci_cmd_le_set_adv_data(g_host_adv_data, g_host_adv_len);
+ assert(rc == 0);
+}
+
uint8_t
bletest_create_adv_pdu(uint8_t *dptr)
{
@@ -95,12 +122,12 @@ bletest_create_adv_pdu(uint8_t *dptr)
dptr[7] = 'm';
dptr[8] = 'e';
dptr[9] = '-';
- dptr[10] = 'm';
- dptr[11] = 'y';
- dptr[12] = 'n';
- dptr[13] = 'e';
- dptr[14] = 'w';
- dptr[15] = 't';
+ dptr[10] = '0';
+ dptr[11] = '0';
+ dptr[12] = '0';
+ dptr[13] = '0';
+ dptr[14] = '0';
+ dptr[15] = '0';
dptr += 16;
len += 16;
@@ -111,6 +138,8 @@ bletest_create_adv_pdu(uint8_t *dptr)
memcpy(dptr + 3, g_dev_addr, BLE_DEV_ADDR_LEN);
len += 9;
+ g_host_adv_len = len;
+
return len;
}
@@ -140,6 +169,9 @@ bletest_init_advertising(void)
/* Set advertising data */
rc = host_hci_cmd_le_set_adv_data(&g_host_adv_data[0], adv_len);
assert(rc == 0);
+
+ /* Set scan response data */
+ rc = host_hci_cmd_le_set_scan_rsp_data(&g_host_adv_data[0], adv_len);
}
void
@@ -148,7 +180,7 @@ bletest_init_scanner(void)
int rc;
/* Set scanning parameters */
- rc = host_hci_cmd_le_set_scan_params(BLE_HCI_SCAN_TYPE_ACTIVE,
+ rc = host_hci_cmd_le_set_scan_params(BLE_HCI_SCAN_TYPE_PASSIVE,
BLETEST_CFG_SCAN_ITVL,
BLETEST_CFG_SCAN_WINDOW,
BLE_HCI_ADV_OWN_ADDR_PUBLIC,
@@ -216,11 +248,11 @@ bletest_execute(void)
/* Enable scanning */
if ((int32_t)(os_time_get() - g_next_os_time) >= 0) {
if (bletest_state) {
- rc = host_hci_cmd_le_set_scan_enable(0, 1);
+ rc = host_hci_cmd_le_set_scan_enable(0, BLETEST_CFG_FILT_DUP_ADV);
assert(rc == 0);
bletest_state = 0;
} else {
- rc = host_hci_cmd_le_set_scan_enable(1, 1);
+ rc = host_hci_cmd_le_set_scan_enable(1, BLETEST_CFG_FILT_DUP_ADV);
assert(rc == 0);
bletest_state = 1;
}
@@ -280,12 +312,21 @@ main(void)
assert(rc == 0);
/* Dummy device address */
+#if BLETEST_CFG_ROLE == BLETEST_ROLE_ADVERTISER
g_dev_addr[0] = 0x00;
g_dev_addr[1] = 0x00;
g_dev_addr[2] = 0x00;
g_dev_addr[3] = 0x88;
g_dev_addr[4] = 0x88;
g_dev_addr[5] = 0x08;
+#else
+ g_dev_addr[0] = 0x00;
+ g_dev_addr[1] = 0x00;
+ g_dev_addr[2] = 0x00;
+ g_dev_addr[3] = 0x99;
+ g_dev_addr[4] = 0x99;
+ g_dev_addr[5] = 0x09;
+#endif
/*
* Seed random number generator with least significant bytes of device