nimble/controller: Move latency calculations to ble_ll_conn_calc_dci This is to localize CSA #2 related code in order for easier compile time configuration.
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/3acdf385 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/3acdf385 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/3acdf385 Branch: refs/heads/bluetooth5 Commit: 3acdf385fa4bfc94081005d359073f0e114825b6 Parents: 6b57da9 Author: Szymon Janc <[email protected]> Authored: Tue Apr 11 13:39:39 2017 +0200 Committer: Szymon Janc <[email protected]> Committed: Tue Apr 11 13:39:39 2017 +0200 ---------------------------------------------------------------------- .../controller/include/controller/ble_ll_conn.h | 3 +- net/nimble/controller/src/ble_ll_conn.c | 62 +++++++++++--------- .../controller/test/src/ble_ll_csa2_test.c | 12 ++-- 3 files changed, 42 insertions(+), 35 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/3acdf385/net/nimble/controller/include/controller/ble_ll_conn.h ---------------------------------------------------------------------- diff --git a/net/nimble/controller/include/controller/ble_ll_conn.h b/net/nimble/controller/include/controller/ble_ll_conn.h index 3267cda..488b27c 100644 --- a/net/nimble/controller/include/controller/ble_ll_conn.h +++ b/net/nimble/controller/include/controller/ble_ll_conn.h @@ -152,7 +152,6 @@ struct ble_ll_conn_sm uint16_t channel_id; /* TODO could be union with hop and last chan used */ uint8_t hop_inc; uint8_t data_chan_index; - uint8_t unmapped_chan; uint8_t last_unmapped_chan; uint8_t num_used_chans; @@ -288,7 +287,7 @@ struct ble_ll_conn_sm struct ble_ll_conn_sm *ble_ll_conn_find_active_conn(uint16_t handle); /* required for unit testing */ -uint8_t ble_ll_conn_calc_dci(struct ble_ll_conn_sm *conn); +uint8_t ble_ll_conn_calc_dci(struct ble_ll_conn_sm *conn, uint16_t latency); #ifdef __cplusplus } http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/3acdf385/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 6d3e5e5..9a86bbb 100644 --- a/net/nimble/controller/src/ble_ll_conn.c +++ b/net/nimble/controller/src/ble_ll_conn.c @@ -664,33 +664,21 @@ ble_ll_conn_calc_dci_csa2(struct ble_ll_conn_sm *conn) return ble_ll_conn_remapped_channel(remap_index, conn->chanmap); } -/** - * Determine data channel index to be used for the upcoming/current - * connection event - * - * @param conn - * - * @return uint8_t - */ -uint8_t -ble_ll_conn_calc_dci(struct ble_ll_conn_sm *conn) +static uint8_t +ble_ll_conn_calc_dci_csa1(struct ble_ll_conn_sm *conn) { uint8_t curchan; uint8_t remap_index; uint8_t bitpos; - if (CONN_F_CSA2_SUPP(conn)) { - return ble_ll_conn_calc_dci_csa2(conn); - } - /* Get next unmapped channel */ curchan = conn->last_unmapped_chan + conn->hop_inc; if (curchan > BLE_PHY_NUM_DATA_CHANS) { curchan -= BLE_PHY_NUM_DATA_CHANS; } - /* Set the current unmapped channel */ - conn->unmapped_chan = curchan; + /* Save unmapped channel */ + conn->last_unmapped_chan = curchan; /* Is this a valid channel? */ bitpos = 1 << (curchan & 0x07); @@ -705,6 +693,34 @@ ble_ll_conn_calc_dci(struct ble_ll_conn_sm *conn) } /** + * Determine data channel index to be used for the upcoming/current + * connection event + * + * @param conn + * @param latency Used only for CSA #1 + * + * @return uint8_t + */ +uint8_t +ble_ll_conn_calc_dci(struct ble_ll_conn_sm *conn, uint16_t latency) +{ + uint8_t index; + + if (CONN_F_CSA2_SUPP(conn)) { + return ble_ll_conn_calc_dci_csa2(conn); + } + + index = conn->data_chan_index; + + while (latency > 0) { + index = ble_ll_conn_calc_dci_csa1(conn); + latency--; + } + + return index; +} + +/** * Called when we are in the connection state and the wait for response timer * fires off. * @@ -1583,12 +1599,12 @@ ble_ll_conn_set_csa(struct ble_ll_conn_sm *connsm, bool chsel) connsm->channel_id = ((connsm->access_addr & 0xffff0000) >> 16) ^ (connsm->access_addr & 0x0000ffff); - connsm->data_chan_index = ble_ll_conn_calc_dci(connsm); + connsm->data_chan_index = ble_ll_conn_calc_dci(connsm, 0); return; } connsm->last_unmapped_chan = 0; - connsm->data_chan_index = ble_ll_conn_calc_dci(connsm); + connsm->data_chan_index = ble_ll_conn_calc_dci(connsm, 1); } /** @@ -1949,15 +1965,7 @@ ble_ll_conn_next_event(struct ble_ll_conn_sm *connsm) } /* Calculate data channel index of next connection event */ - if (CONN_F_CSA2_SUPP(connsm)) { - connsm->data_chan_index = ble_ll_conn_calc_dci(connsm); - } else { - while (latency > 0) { - connsm->last_unmapped_chan = connsm->unmapped_chan; - connsm->data_chan_index = ble_ll_conn_calc_dci(connsm); - --latency; - } - } + connsm->data_chan_index = ble_ll_conn_calc_dci(connsm, latency); /* * If we are trying to terminate connection, check if next wake time is http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/3acdf385/net/nimble/controller/test/src/ble_ll_csa2_test.c ---------------------------------------------------------------------- diff --git a/net/nimble/controller/test/src/ble_ll_csa2_test.c b/net/nimble/controller/test/src/ble_ll_csa2_test.c index 9ba882c..6d199ee 100644 --- a/net/nimble/controller/test/src/ble_ll_csa2_test.c +++ b/net/nimble/controller/test/src/ble_ll_csa2_test.c @@ -53,15 +53,15 @@ TEST_CASE(ble_ll_csa2_test_1) conn.chanmap[3] = 0x1f; conn.event_cntr = 1; - rc = ble_ll_conn_calc_dci(&conn); + rc = ble_ll_conn_calc_dci(&conn, 0); TEST_ASSERT(rc == 20); conn.event_cntr = 2; - rc = ble_ll_conn_calc_dci(&conn); + rc = ble_ll_conn_calc_dci(&conn, 0); TEST_ASSERT(rc == 6); conn.event_cntr = 3; - rc = ble_ll_conn_calc_dci(&conn); + rc = ble_ll_conn_calc_dci(&conn, 0); TEST_ASSERT(rc == 21); } @@ -95,15 +95,15 @@ TEST_CASE(ble_ll_csa2_test_2) conn.chanmap[4] = 0x1e; conn.event_cntr = 6; - rc = ble_ll_conn_calc_dci(&conn); + rc = ble_ll_conn_calc_dci(&conn, 0); TEST_ASSERT(rc == 23); conn.event_cntr = 7; - rc = ble_ll_conn_calc_dci(&conn); + rc = ble_ll_conn_calc_dci(&conn, 0); TEST_ASSERT(rc == 9); conn.event_cntr = 8; - rc = ble_ll_conn_calc_dci(&conn); + rc = ble_ll_conn_calc_dci(&conn, 0); TEST_ASSERT(rc == 34); }
