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.

X-Original-Commit: 3acdf385fa4bfc94081005d359073f0e114825b6
This commit is contained in:
Szymon Janc
2017-04-11 13:39:39 +02:00
parent 5547db8bc2
commit 33568f4de7
3 changed files with 42 additions and 35 deletions
@@ -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
}
+35 -27
View File
@@ -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);
@@ -704,6 +692,34 @@ ble_ll_conn_calc_dci(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
* @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
@@ -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);
}