Skip to content

Commit 54d5bab

Browse files
committed
nimble/ll: Add initial Channel Sounding scheduling
1 parent 75a3ab0 commit 54d5bab

14 files changed

+2064
-18
lines changed

nimble/controller/include/controller/ble_ll.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@
3333
#include "hal/hal_timer.h"
3434
#endif
3535

36+
#if MYNEWT_VAL(BLE_LL_CHANNEL_SOUNDING)
37+
#include "controller/ble_ll_cs.h"
38+
#endif
39+
3640
#ifdef __cplusplus
3741
extern "C" {
3842
#endif
@@ -243,6 +247,9 @@ extern STATS_SECT_DECL(ble_ll_stats) ble_ll_stats;
243247
#if MYNEWT_VAL(BLE_LL_ISO_BROADCASTER)
244248
#define BLE_LL_STATE_BIG (9)
245249
#endif
250+
#if MYNEWT_VAL(BLE_LL_CHANNEL_SOUNDING)
251+
#define BLE_LL_STATE_CS (10)
252+
#endif
246253

247254
/* LL Features */
248255
#define BLE_LL_FEAT_LE_ENCRYPTION (0x0000000000001)

nimble/controller/include/controller/ble_ll_cs.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ void ble_ll_cs_capabilities_pdu_make(struct ble_ll_conn_sm *connsm, uint8_t *dpt
3535
void ble_ll_cs_config_req_make(struct ble_ll_conn_sm *connsm, uint8_t *dptr);
3636
void ble_ll_cs_security_req_make(struct ble_ll_conn_sm *connsm, uint8_t *dptr);
3737
void ble_ll_cs_start_req_make(struct ble_ll_conn_sm *connsm, uint8_t *dptr);
38+
void ble_ll_cs_terminate_req_make(struct ble_ll_conn_sm *connsm, uint8_t *dptr);
3839

3940
int ble_ll_cs_rx_capabilities_req(struct ble_ll_conn_sm *connsm, uint8_t *dptr, uint8_t *rspbuf);
4041
void ble_ll_cs_rx_capabilities_rsp(struct ble_ll_conn_sm *connsm, uint8_t *dptr);
@@ -52,6 +53,9 @@ int ble_ll_cs_rx_cs_start_req(struct ble_ll_conn_sm *connsm, uint8_t *dptr, uint
5253
int ble_ll_cs_rx_cs_start_rsp(struct ble_ll_conn_sm *connsm, uint8_t *dptr, uint8_t *rspbuf);
5354
int ble_ll_cs_rx_cs_start_ind(struct ble_ll_conn_sm *connsm, uint8_t *dptr, uint8_t *rspbuf);
5455
void ble_ll_cs_rx_cs_start_rejected(struct ble_ll_conn_sm *connsm, uint8_t ble_error);
56+
int ble_ll_cs_rx_cs_terminate_req(struct ble_ll_conn_sm *connsm, uint8_t *dptr, uint8_t *rspbuf);
57+
void ble_ll_cs_rx_cs_terminate_rsp(struct ble_ll_conn_sm *connsm, uint8_t *dptr);
58+
void ble_ll_cs_rx_cs_terminate_req_rejected(struct ble_ll_conn_sm *connsm, uint8_t ble_error);
5559

5660
/* HCI handlers */
5761
int ble_ll_cs_hci_rd_loc_supp_cap(uint8_t *rspbuf, uint8_t *rsplen);
@@ -69,6 +73,15 @@ int ble_ll_cs_hci_proc_enable(const uint8_t *cmdbuf, uint8_t cmdlen);
6973
int ble_ll_cs_hci_test(const uint8_t *cmdbuf, uint8_t cmdlen, uint8_t *rspbuf, uint8_t *rsplen);
7074
int ble_ll_cs_hci_test_end(void);
7175

76+
uint8_t ble_ll_cs_rtt_tx_make(uint8_t *dptr, uint8_t *hdr_byte);
77+
void ble_ll_cs_sync_wfr_timer_exp(void);
78+
void ble_ll_cs_sync_tx_end(struct ble_phy_cs_sync_results *results);
79+
void ble_ll_cs_sync_rx_end(struct ble_phy_cs_sync_results *results);
80+
void ble_ll_cs_tone_tx_end(struct ble_phy_cs_tone_results *results);
81+
void ble_ll_cs_tone_rx_end(struct ble_phy_cs_tone_results *results);
82+
void ble_ll_cs_proc_rm_from_sched(void *cb_arg);
83+
void ble_ll_cs_proc_halt(void);
84+
7285
#ifdef __cplusplus
7386
}
7487
#endif

nimble/controller/include/controller/ble_ll_ctrl.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ extern "C" {
4848
#define BLE_LL_CTRL_PROC_CS_CONF (16)
4949
#define BLE_LL_CTRL_PROC_CS_SEC_START (17)
5050
#define BLE_LL_CTRL_PROC_CS_START (18)
51-
#define BLE_LL_CTRL_PROC_NUM (19)
51+
#define BLE_LL_CTRL_PROC_CS_TERMINATE (19)
52+
#define BLE_LL_CTRL_PROC_NUM (20)
5253
#define BLE_LL_CTRL_PROC_IDLE (255)
5354

5455
/* Checks if a particular control procedure is running */
@@ -116,14 +117,15 @@ extern "C" {
116117
#define BLE_LL_CTRL_CS_REQ (0x32)
117118
#define BLE_LL_CTRL_CS_RSP (0x33)
118119
#define BLE_LL_CTRL_CS_IND (0x34)
119-
#define BLE_LL_CTRL_CS_TERMINATE_IND (0x35)
120+
#define BLE_LL_CTRL_CS_TERMINATE_REQ (0x35)
120121
#define BLE_LL_CTRL_CS_FAE_REQ (0x36)
121122
#define BLE_LL_CTRL_CS_FAE_RSP (0x37)
122123
#define BLE_LL_CTRL_CS_CHANNEL_MAP_IND (0x38)
123124
#define BLE_LL_CTRL_CS_SEC_REQ (0x39)
125+
#define BLE_LL_CTRL_CS_TERMINATE_RSP (0x3A)
124126

125127
/* Maximum opcode value */
126-
#define BLE_LL_CTRL_OPCODES (BLE_LL_CTRL_CS_SEC_REQ + 1)
128+
#define BLE_LL_CTRL_OPCODES (BLE_LL_CTRL_CS_TERMINATE_RSP + 1)
127129

128130
extern const uint8_t g_ble_ll_ctrl_pkt_lengths[BLE_LL_CTRL_OPCODES];
129131

@@ -329,11 +331,12 @@ struct ble_ll_len_req
329331
#define BLE_LL_CTRL_CS_REQ_LEN (28)
330332
#define BLE_LL_CTRL_CS_RSP_LEN (21)
331333
#define BLE_LL_CTRL_CS_IND_LEN (18)
332-
#define BLE_LL_CTRL_CS_TERMINATE_IND_LEN (4)
334+
#define BLE_LL_CTRL_CS_TERMINATE_REQ_LEN (4)
333335
#define BLE_LL_CTRL_CS_FAE_REQ_LEN (0)
334336
#define BLE_LL_CTRL_CS_FAE_RSP_LEN (72)
335337
#define BLE_LL_CTRL_CS_CHANNEL_MAP_IND_LEN (12)
336338
#define BLE_LL_CTRL_CS_SEC_REQ_LEN (20)
339+
#define BLE_LL_CTRL_CS_TERMINATE_RSP_LEN (4)
337340

338341
/* API */
339342
struct ble_ll_conn_sm;

nimble/controller/include/controller/ble_ll_sched.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ extern uint8_t g_ble_ll_sched_offset_ticks;
7171
#define BLE_LL_SCHED_TYPE_SYNC (7)
7272
#define BLE_LL_SCHED_TYPE_SCAN_AUX (8)
7373
#define BLE_LL_SCHED_TYPE_BIG (9)
74+
#define BLE_LL_SCHED_TYPE_CS (10)
7475
#if MYNEWT_VAL(BLE_LL_EXT)
7576
#define BLE_LL_SCHED_TYPE_EXTERNAL (255)
7677
#endif
@@ -222,6 +223,10 @@ uint32_t ble_ll_sched_css_get_conn_interval_us(void);
222223
int ble_ll_sched_iso_big(struct ble_ll_sched_item *sch, int first, int fixed);
223224
#endif /* BLE_LL_ISO_BROADCASTER */
224225

226+
#if MYNEWT_VAL(BLE_LL_CHANNEL_SOUNDING)
227+
int ble_ll_sched_cs_proc(struct ble_ll_sched_item *sch);
228+
#endif /* BLE_LL_CHANNEL_SOUNDING */
229+
225230
#ifdef __cplusplus
226231
}
227232
#endif

nimble/controller/src/ble_ll_conn.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2302,7 +2302,7 @@ ble_ll_conn_anchor_get(struct ble_ll_conn_sm *connsm, uint16_t *event_cntr,
23022302
*anchor_usecs = connsm->anchor_point_usecs;
23032303
}
23042304

2305-
#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER)
2305+
#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PERIODIC_ADV_SYNC_TRANSFER) || MYNEWT_VAL(BLE_LL_CHANNEL_SOUNDING)
23062306
void
23072307
ble_ll_conn_anchor_event_cntr_get(struct ble_ll_conn_sm *connsm,
23082308
uint16_t event_cntr, uint32_t *anchor,

nimble/controller/src/ble_ll_cs.c

Lines changed: 101 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@
6464
#define T_PM_CAP_ID_20US 1
6565
#define T_PM_CAP_ID_40US 2
6666

67-
static struct ble_ll_cs_supp_cap g_ble_ll_cs_local_cap;
68-
static struct ble_ll_cs_sm g_ble_ll_cs_sm[MYNEWT_VAL(BLE_MAX_CONNECTIONS)];
67+
struct ble_ll_cs_supp_cap g_ble_ll_cs_local_cap;
68+
struct ble_ll_cs_sm g_ble_ll_cs_sm[MYNEWT_VAL(BLE_MAX_CONNECTIONS)];
6969
static const uint8_t t_ip1[] = {10, 20, 30, 40, 50, 60, 80, 145};
7070
static const uint8_t t_ip2[] = {10, 20, 30, 40, 50, 60, 80, 145};
7171
static const uint8_t t_fcs[] = {15, 20, 30, 40, 50, 60, 80, 100, 120, 150};
@@ -74,8 +74,8 @@ static const uint8_t default_channel_classification[10] = {
7474
0xFC, 0xFF, 0x7F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F
7575
};
7676
static uint8_t g_ble_ll_cs_chan_class[10];
77-
static uint8_t g_ble_ll_cs_chan_count = 0;
78-
static uint8_t g_ble_ll_cs_chan_indices[72];
77+
uint8_t g_ble_ll_cs_chan_count = 0;
78+
uint8_t g_ble_ll_cs_chan_indices[72];
7979

8080
#define MIN_CONN_EVENT_COUNT_BEFORE_START 10
8181
#define OFFSET_FROM_CONN_EVENT_TICKS 10
@@ -410,6 +410,8 @@ ble_ll_cs_rx_security_req(struct ble_ll_conn_sm *connsm, uint8_t *dptr,
410410

411411
ble_ll_cs_drbg_init(&connsm->cssm->drbg_ctx);
412412

413+
connsm->cssm->start_procedure_count = 0;
414+
413415
return BLE_LL_CTRL_CS_SEC_RSP;
414416
}
415417

@@ -454,6 +456,8 @@ ble_ll_cs_rx_security_rsp(struct ble_ll_conn_sm *connsm, uint8_t *dptr)
454456

455457
rc = ble_ll_cs_drbg_init(drbg_ctx);
456458

459+
connsm->cssm->start_procedure_count = 0;
460+
457461
/* Stop the control procedure and send an event to the host */
458462
ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_CS_SEC_START);
459463
ble_ll_cs_ev_sec_enable_complete(connsm, rc ? BLE_ERR_INV_LMP_LL_PARM :
@@ -1289,7 +1293,16 @@ ble_ll_cs_hci_proc_enable(const uint8_t *cmdbuf, uint8_t cmdlen)
12891293
/* Start scheduling CS procedures */
12901294
ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_CS_START, NULL);
12911295
} else {
1292-
/* TODO: Terminate the CS measurement early */
1296+
if (!connsm->cssm->measurement_enabled) {
1297+
return BLE_ERR_CMD_DISALLOWED;
1298+
}
1299+
1300+
connsm->cssm->terminate_measurement = 1;
1301+
connsm->cssm->terminate_config_id = cmd->config_id;
1302+
connsm->cssm->terminate_error_code = BLE_ERR_SUCCESS;
1303+
1304+
/* Terminate the CS measurement early */
1305+
ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_CS_TERMINATE, NULL);
12931306
}
12941307

12951308
return BLE_ERR_SUCCESS;
@@ -1740,6 +1753,89 @@ ble_ll_cs_rx_cs_start_rejected(struct ble_ll_conn_sm *connsm, uint8_t ble_error)
17401753
ble_ll_cs_ev_cs_proc_enable_complete(connsm, connsm->cssm->config_req_id, ble_error);
17411754
}
17421755

1756+
void
1757+
ble_ll_cs_terminate_req_make(struct ble_ll_conn_sm *connsm, uint8_t *dptr)
1758+
{
1759+
struct ble_ll_cs_sm *cssm = connsm->cssm;
1760+
uint8_t config_id = cssm->terminate_config_id;
1761+
1762+
assert(config_id < ARRAY_SIZE(cssm->config));
1763+
1764+
*dptr = config_id;
1765+
put_le16(dptr + 1, cssm->start_procedure_count + cssm->procedure_count);
1766+
dptr[3] = cssm->terminate_error_code;
1767+
}
1768+
1769+
int
1770+
ble_ll_cs_rx_cs_terminate_req(struct ble_ll_conn_sm *connsm, uint8_t *dptr,
1771+
uint8_t *rspbuf)
1772+
{
1773+
struct ble_ll_cs_sm *cssm = connsm->cssm;
1774+
uint8_t config_id = *dptr & 0b00111111;
1775+
uint16_t procedure_count = get_le16(dptr + 1);
1776+
struct ble_ll_cs_proc_params *params;
1777+
1778+
if (config_id >= ARRAY_SIZE(cssm->config)) {
1779+
ble_ll_ctrl_rej_ext_ind_make(BLE_LL_CTRL_CS_TERMINATE_REQ,
1780+
BLE_ERR_INV_LMP_LL_PARM, rspbuf);
1781+
return BLE_LL_CTRL_REJECT_IND_EXT;
1782+
}
1783+
1784+
params = &cssm->config[config_id].proc_params;
1785+
1786+
if (procedure_count > cssm->start_procedure_count + params->max_procedure_count ||
1787+
procedure_count < cssm->start_procedure_count) {
1788+
ble_ll_ctrl_rej_ext_ind_make(BLE_LL_CTRL_CS_TERMINATE_REQ,
1789+
BLE_ERR_CMD_DISALLOWED, rspbuf);
1790+
return BLE_LL_CTRL_REJECT_IND_EXT;
1791+
}
1792+
1793+
cssm->terminate_measurement = 1;
1794+
1795+
*rspbuf = config_id;
1796+
put_le16(rspbuf + 1, cssm->start_procedure_count + cssm->procedure_count);
1797+
rspbuf[3] = BLE_ERR_SUCCESS;
1798+
1799+
return BLE_LL_CTRL_CS_TERMINATE_RSP;
1800+
}
1801+
1802+
void
1803+
ble_ll_cs_rx_cs_terminate_rsp(struct ble_ll_conn_sm *connsm, uint8_t *dptr)
1804+
{
1805+
struct ble_ll_cs_sm *cssm = connsm->cssm;
1806+
uint8_t config_id = *dptr & 0b00111111;
1807+
uint8_t error_code = dptr[3];
1808+
uint16_t procedure_count = get_le16(dptr + 1);
1809+
uint16_t total_procedure_count;
1810+
1811+
if (config_id != cssm->config_req_id ||
1812+
!IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_CS_TERMINATE)) {
1813+
return;
1814+
}
1815+
1816+
total_procedure_count = cssm->start_procedure_count + cssm->procedure_count;
1817+
if (total_procedure_count < procedure_count) {
1818+
cssm->start_procedure_count = procedure_count;
1819+
} else {
1820+
cssm->start_procedure_count = total_procedure_count;
1821+
}
1822+
1823+
ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_CS_TERMINATE);
1824+
1825+
/* TODO: In d1.0r06 the LL_CS_TERMINATE_IND was replaced with
1826+
* LL_CS_TERMINATE_REQ/RSP, but not all descriptions and diagrams
1827+
* have been updated yet.
1828+
*/
1829+
ble_ll_cs_ev_cs_proc_enable_complete(connsm, config_id, error_code);
1830+
}
1831+
1832+
void
1833+
ble_ll_cs_rx_cs_terminate_req_rejected(struct ble_ll_conn_sm *connsm, uint8_t ble_error)
1834+
{
1835+
ble_ll_ctrl_proc_stop(connsm, BLE_LL_CTRL_PROC_CS_TERMINATE);
1836+
ble_ll_cs_ev_cs_proc_enable_complete(connsm, connsm->cssm->config_req_id, ble_error);
1837+
}
1838+
17431839
int
17441840
ble_ll_cs_hci_test(const uint8_t *cmdbuf, uint8_t cmdlen,
17451841
uint8_t *rspbuf, uint8_t *rsplen)

0 commit comments

Comments
 (0)