Repository: incubator-mynewt-core Updated Branches: refs/heads/develop d416d5515 -> f6014227f
MYNEWT-668: Improve throughput of BLE connections We will now send the number of completed packets event faster than it was being sent before, assuming that more than 2 packets were completed in a connection event. The old code would send the event at the end of the connection event and this impacted single connection throughput when trying to max out the throughput. Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/f6014227 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/f6014227 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/f6014227 Branch: refs/heads/develop Commit: f6014227f9173aec3c27e7c109f8a2289255eaca Parents: d416d55 Author: William San Filippo <[email protected]> Authored: Mon Apr 3 15:35:05 2017 -0700 Committer: William San Filippo <[email protected]> Committed: Mon Apr 3 15:36:56 2017 -0700 ---------------------------------------------------------------------- net/nimble/controller/include/controller/ble_ll.h | 3 +++ net/nimble/controller/src/ble_ll.c | 14 +++++++++----- net/nimble/controller/src/ble_ll_conn.c | 8 +++++--- net/nimble/controller/src/ble_ll_conn_hci.c | 7 ++++++- 4 files changed, 23 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f6014227/net/nimble/controller/include/controller/ble_ll.h ---------------------------------------------------------------------- diff --git a/net/nimble/controller/include/controller/ble_ll.h b/net/nimble/controller/include/controller/ble_ll.h index 2094290..f55bc8e 100644 --- a/net/nimble/controller/include/controller/ble_ll.h +++ b/net/nimble/controller/include/controller/ble_ll.h @@ -123,6 +123,9 @@ struct ble_ll_obj /* Data buffer overflow event */ struct os_event ll_dbuf_overflow_ev; + /* Number of completed packets event */ + struct os_event ll_comp_pkt_ev; + /* HW error callout */ struct os_callout ll_hw_err_timer; }; http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f6014227/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 3204ff2..72ec9cd 100644 --- a/net/nimble/controller/src/ble_ll.c +++ b/net/nimble/controller/src/ble_ll.c @@ -52,11 +52,6 @@ * 4) Should look into always disabled the wfr interrupt if we receive the * start of a frame. Need to look at the various states to see if this is the * right thing to do. - * 5) I am not sure that if we are passed the output compare that we actually - * get the interrupt. Test this. - * 6) I am not sure that if we receive a packet while scanning that we actually - * go back to scanning. I need to make sure we re-enable the receive. - * Put an event in the log! */ /* Supported states */ @@ -987,6 +982,12 @@ ble_ll_event_dbuf_overflow(struct os_event *ev) ble_ll_hci_ev_databuf_overflow(); } +static void +ble_ll_event_comp_pkts(struct os_event *ev) +{ + ble_ll_conn_num_comp_pkts_event_send(NULL); +} + /** * Link Layer task. * @@ -1268,7 +1269,10 @@ ble_ll_init(void) /* Initialize transmit (from host) and receive packet (from phy) event */ lldata->ll_rx_pkt_ev.ev_cb = ble_ll_event_rx_pkt; lldata->ll_tx_pkt_ev.ev_cb = ble_ll_event_tx_pkt; + + /* Initialize data buffer overflow event and completed packets */ lldata->ll_dbuf_overflow_ev.ev_cb = ble_ll_event_dbuf_overflow; + lldata->ll_comp_pkt_ev.ev_cb = ble_ll_event_comp_pkts; /* Initialize the HW error timer */ os_callout_init(&g_ble_ll_data.ll_hw_err_timer, http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f6014227/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 741ca0f..8d3173b 100644 --- a/net/nimble/controller/src/ble_ll_conn.c +++ b/net/nimble/controller/src/ble_ll_conn.c @@ -986,7 +986,7 @@ ble_ll_conn_tx_data_pdu(struct ble_ll_conn_sm *connsm) } ticks = os_cputime_usecs_to_ticks(ticks); - if ((os_cputime_get32() + ticks) < next_event_time) { + if ((int32_t)((os_cputime_get32() + ticks) - next_event_time) < 0) { md = 1; } } @@ -3010,6 +3010,10 @@ ble_ll_conn_rx_isr_end(uint8_t *rxbuf, struct ble_mbuf_hdr *rxhdr) bletest_completed_pkt(connsm->conn_handle); #endif ++connsm->completed_pkts; + if (connsm->completed_pkts > 2) { + os_eventq_put(&g_ble_ll_data.ll_evq, + &g_ble_ll_data.ll_comp_pkt_ev); + } } os_mbuf_free_chain(txpdu); connsm->cur_tx_pdu = NULL; @@ -3464,5 +3468,3 @@ ble_ll_conn_module_init(void) /* Call reset to finish reset of initialization */ ble_ll_conn_module_reset(); } - - http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f6014227/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 9b25002..4239a66 100644 --- a/net/nimble/controller/src/ble_ll_conn_hci.c +++ b/net/nimble/controller/src/ble_ll_conn_hci.c @@ -253,11 +253,15 @@ ble_ll_conn_num_comp_pkts_event_send(struct ble_ll_conn_sm *connsm) uint8_t *comp_pkt_ptr; uint8_t handles; + if (connsm == NULL) { + goto skip_conn; + } + /* * At some periodic rate, make sure we go through all active connections * and send the number of completed packet events. We do this mainly * because the spec says we must update the host even though no packets - * have completed by there are data packets in the controller buffers + * have completed but there are data packets in the controller buffers * (i.e. enqueued in a connection state machine). */ if ((uint32_t)(g_ble_ll_last_num_comp_pkt_evt - os_time_get()) < @@ -283,6 +287,7 @@ ble_ll_conn_num_comp_pkts_event_send(struct ble_ll_conn_sm *connsm) } /* Iterate through all the active, created connections */ +skip_conn: evbuf = NULL; handles = 0; handle_ptr = NULL;
