Skip to content

Commit a206502

Browse files
committed
nimble/ll: Add LE CS Set Procedure Parameters command
1 parent 51e365a commit a206502

File tree

3 files changed

+78
-1
lines changed

3 files changed

+78
-1
lines changed

nimble/controller/src/ble_ll_cs.c

+55-1
Original file line numberDiff line numberDiff line change
@@ -1190,7 +1190,61 @@ int
11901190
ble_ll_cs_hci_set_proc_params(const uint8_t *cmdbuf, uint8_t cmdlen,
11911191
uint8_t *rspbuf, uint8_t *rsplen)
11921192
{
1193-
return BLE_ERR_UNSUPPORTED;
1193+
const struct ble_hci_le_cs_set_proc_params_cp *cmd = (const void *)cmdbuf;
1194+
struct ble_hci_le_cs_set_proc_params_rp *rsp = (void *)rspbuf;
1195+
struct ble_ll_conn_sm *connsm;
1196+
struct ble_ll_cs_config *conf;
1197+
struct ble_ll_cs_pref_proc_params *params;
1198+
1199+
if (cmdlen != sizeof(*cmd)) {
1200+
return BLE_ERR_INV_HCI_CMD_PARMS;
1201+
}
1202+
1203+
/* If no connection handle exit with error */
1204+
connsm = ble_ll_conn_find_by_handle(le16toh(cmd->conn_handle));
1205+
if (!connsm) {
1206+
return BLE_ERR_UNK_CONN_ID;
1207+
}
1208+
1209+
if (cmd->config_id >= ARRAY_SIZE(connsm->cssm->config)) {
1210+
return BLE_ERR_INV_HCI_CMD_PARMS;
1211+
}
1212+
1213+
conf = &connsm->cssm->config[cmd->config_id];
1214+
1215+
/* If CS configuration with Config_ID does not exists */
1216+
if (!conf->config_enabled) {
1217+
return BLE_ERR_INV_HCI_CMD_PARMS;
1218+
}
1219+
1220+
/* If CS measurement is enabled exit with error */
1221+
if (connsm->cssm->measurement_enabled) {
1222+
return BLE_ERR_CMD_DISALLOWED;
1223+
}
1224+
1225+
if (g_ble_ll_cs_chan_count < 15) {
1226+
return BLE_ERR_INSUFFICIENT_CHAN;
1227+
}
1228+
1229+
params = &conf->pref_proc_params;
1230+
params->max_procedure_len = htole16(cmd->max_procedure_len);
1231+
params->min_procedure_interval = htole16(cmd->min_procedure_interval);
1232+
params->max_procedure_interval = htole16(cmd->max_procedure_interval);
1233+
params->max_procedure_count = htole16(cmd->max_procedure_count);
1234+
params->min_subevent_len = get_le24(cmd->min_subevent_len);
1235+
params->max_subevent_len = get_le24(cmd->max_subevent_len);
1236+
params->aci = cmd->tone_antenna_config_selection;
1237+
params->phy = cmd->phy;
1238+
params->tx_power_delta = cmd->tx_power_delta;
1239+
params->preferred_peer_antenna = cmd->preferred_peer_antenna;
1240+
params->snr_control_initiator = cmd->snr_control_initiator & 0x0F;
1241+
params->snr_control_reflector = cmd->snr_control_reflector & 0x0F;
1242+
params->params_ready = 1;
1243+
1244+
rsp->conn_handle = cmd->conn_handle;
1245+
*rsplen = sizeof(*rsp);
1246+
1247+
return BLE_ERR_SUCCESS;
11941248
}
11951249

11961250
int

nimble/controller/src/ble_ll_cs_priv.h

+20
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,22 @@ struct ble_ll_cs_supp_cap {
5555
uint8_t tx_snr_capablity;
5656
};
5757

58+
struct ble_ll_cs_pref_proc_params {
59+
uint16_t max_procedure_len;
60+
uint16_t min_procedure_interval;
61+
uint16_t max_procedure_interval;
62+
uint16_t max_procedure_count;
63+
uint32_t min_subevent_len;
64+
uint32_t max_subevent_len;
65+
uint8_t aci;
66+
uint8_t phy;
67+
uint8_t tx_power_delta;
68+
uint8_t preferred_peer_antenna;
69+
uint8_t snr_control_initiator;
70+
uint8_t snr_control_reflector;
71+
uint8_t params_ready;
72+
};
73+
5874
struct ble_ll_cs_config {
5975
uint8_t config_in_use;
6076
uint8_t config_enabled;
@@ -94,6 +110,8 @@ struct ble_ll_cs_config {
94110
uint8_t t_ip2;
95111
uint8_t t_fcs;
96112
uint8_t t_pm;
113+
/* CS procedure parameters preferred by our Host */
114+
struct ble_ll_cs_pref_proc_params pref_proc_params;
97115
};
98116

99117
struct ble_ll_cs_sm {
@@ -117,6 +135,8 @@ struct ble_ll_cs_sm {
117135

118136
/* DRBG context, initialized onece per LE Connection */
119137
struct ble_ll_cs_drbg_ctx drbg_ctx;
138+
139+
uint8_t measurement_enabled;
120140
};
121141

122142
#ifdef __cplusplus

nimble/include/nimble/ble.h

+3
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,9 @@ enum ble_error_codes
298298
BLE_ERR_LIMIT_REACHED = 0x43,
299299
BLE_ERR_OPERATION_CANCELLED = 0x44,
300300
BLE_ERR_PACKET_TOO_LONG = 0x45,
301+
BLE_ERR_TOO_LATE = 0x46,
302+
BLE_ERR_TOO_EARLY = 0x47,
303+
BLE_ERR_INSUFFICIENT_CHAN = 0x48,
301304
BLE_ERR_MAX = 0xff
302305
};
303306

0 commit comments

Comments
 (0)