Skip to content

Commit 95655da

Browse files
committed
nimble/ll: Add LE CS Set Procedure Parameters command
1 parent 7ac54d3 commit 95655da

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
@@ -1151,7 +1151,61 @@ int
11511151
ble_ll_cs_hci_set_proc_params(const uint8_t *cmdbuf, uint8_t cmdlen,
11521152
uint8_t *rspbuf, uint8_t *rsplen)
11531153
{
1154-
return BLE_ERR_UNSUPPORTED;
1154+
const struct ble_hci_le_cs_set_proc_params_cp *cmd = (const void *)cmdbuf;
1155+
struct ble_hci_le_cs_set_proc_params_rp *rsp = (void *)rspbuf;
1156+
struct ble_ll_conn_sm *connsm;
1157+
struct ble_ll_cs_config *conf;
1158+
struct ble_ll_cs_pref_proc_params *params;
1159+
1160+
if (cmdlen != sizeof(*cmd)) {
1161+
return BLE_ERR_INV_HCI_CMD_PARMS;
1162+
}
1163+
1164+
/* If no connection handle exit with error */
1165+
connsm = ble_ll_conn_find_by_handle(le16toh(cmd->conn_handle));
1166+
if (!connsm) {
1167+
return BLE_ERR_UNK_CONN_ID;
1168+
}
1169+
1170+
if (cmd->config_id >= ARRAY_SIZE(connsm->cssm->config)) {
1171+
return BLE_ERR_INV_HCI_CMD_PARMS;
1172+
}
1173+
1174+
conf = &connsm->cssm->config[cmd->config_id];
1175+
1176+
/* If CS configuration with Config_ID does not exists */
1177+
if (!conf->config_enabled) {
1178+
return BLE_ERR_INV_HCI_CMD_PARMS;
1179+
}
1180+
1181+
/* If CS measurement is enabled exit with error */
1182+
if (connsm->cssm->measurement_enabled) {
1183+
return BLE_ERR_CMD_DISALLOWED;
1184+
}
1185+
1186+
if (g_ble_ll_cs_chan_count < 15) {
1187+
return BLE_ERR_INSUFFICIENT_CHAN;
1188+
}
1189+
1190+
params = &conf->pref_proc_params;
1191+
params->max_procedure_len = htole16(cmd->max_procedure_len);
1192+
params->min_procedure_interval = htole16(cmd->min_procedure_interval);
1193+
params->max_procedure_interval = htole16(cmd->max_procedure_interval);
1194+
params->max_procedure_count = htole16(cmd->max_procedure_count);
1195+
params->min_subevent_len = get_le24(cmd->min_subevent_len);
1196+
params->max_subevent_len = get_le24(cmd->max_subevent_len);
1197+
params->aci = cmd->tone_antenna_config_selection;
1198+
params->phy = cmd->phy;
1199+
params->tx_power_delta = cmd->tx_power_delta;
1200+
params->preferred_peer_antenna = cmd->preferred_peer_antenna;
1201+
params->snr_control_initiator = cmd->snr_control_initiator & 0x0F;
1202+
params->snr_control_reflector = cmd->snr_control_reflector & 0x0F;
1203+
params->params_ready = 1;
1204+
1205+
rsp->conn_handle = cmd->conn_handle;
1206+
*rsplen = sizeof(*rsp);
1207+
1208+
return BLE_ERR_SUCCESS;
11551209
}
11561210

11571211
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)