Skip to content

Commit 66e8783

Browse files
committed
nimble/ll: Add LE CS Set Procedure Parameters command
1 parent 2f2a4c3 commit 66e8783

File tree

3 files changed

+78
-1
lines changed

3 files changed

+78
-1
lines changed

nimble/controller/src/ble_ll_cs.c

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -938,7 +938,61 @@ int
938938
ble_ll_cs_hci_set_proc_params(const uint8_t *cmdbuf, uint8_t cmdlen,
939939
uint8_t *rspbuf, uint8_t *rsplen)
940940
{
941-
return BLE_ERR_UNSUPPORTED;
941+
const struct ble_hci_le_cs_set_proc_params_cp *cmd = (const void *)cmdbuf;
942+
struct ble_hci_le_cs_set_proc_params_rp *rsp = (void *)rspbuf;
943+
struct ble_ll_conn_sm *connsm;
944+
struct ble_ll_cs_config *conf;
945+
struct ble_ll_cs_pref_proc_params *params;
946+
947+
if (cmdlen != sizeof(*cmd)) {
948+
return BLE_ERR_INV_HCI_CMD_PARMS;
949+
}
950+
951+
/* If no connection handle exit with error */
952+
connsm = ble_ll_conn_find_by_handle(le16toh(cmd->conn_handle));
953+
if (!connsm) {
954+
return BLE_ERR_UNK_CONN_ID;
955+
}
956+
957+
if (cmd->config_id >= ARRAY_SIZE(connsm->cssm->config)) {
958+
return BLE_ERR_INV_HCI_CMD_PARMS;
959+
}
960+
961+
conf = &connsm->cssm->config[cmd->config_id];
962+
963+
/* If CS configuration with Config_ID does not exists */
964+
if (!conf->config_enabled) {
965+
return BLE_ERR_INV_HCI_CMD_PARMS;
966+
}
967+
968+
/* If CS measurement is enabled exit with error */
969+
if (connsm->cssm->measurement_enabled) {
970+
return BLE_ERR_CMD_DISALLOWED;
971+
}
972+
973+
if (g_ble_ll_cs_chan_count < 15) {
974+
return BLE_ERR_INSUFFICIENT_CHAN;
975+
}
976+
977+
params = &conf->pref_proc_params;
978+
params->max_procedure_len = htole16(cmd->max_procedure_len);
979+
params->min_procedure_interval = htole16(cmd->min_procedure_interval);
980+
params->max_procedure_interval = htole16(cmd->max_procedure_interval);
981+
params->max_procedure_count = htole16(cmd->max_procedure_count);
982+
params->min_subevent_len = get_le24(cmd->min_subevent_len);
983+
params->max_subevent_len = get_le24(cmd->max_subevent_len);
984+
params->aci = cmd->tone_antenna_config_selection;
985+
params->phy = cmd->phy;
986+
params->tx_power_delta = cmd->tx_power_delta;
987+
params->preferred_peer_antenna = cmd->preferred_peer_antenna;
988+
params->snr_control_initiator = cmd->snr_control_initiator & 0x0F;
989+
params->snr_control_reflector = cmd->snr_control_reflector & 0x0F;
990+
params->params_ready = 1;
991+
992+
rsp->conn_handle = cmd->conn_handle;
993+
*rsplen = sizeof(*rsp);
994+
995+
return BLE_ERR_SUCCESS;
942996
}
943997

944998
int

nimble/controller/src/ble_ll_cs_priv.h

Lines changed: 20 additions & 0 deletions
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
bool config_enabled;
6076
/* The role to use in CS procedure
@@ -88,6 +104,8 @@ struct ble_ll_cs_config {
88104
uint8_t t_ip2;
89105
uint8_t t_fcs;
90106
uint8_t t_pm;
107+
/* CS procedure parameters preferred by our Host */
108+
struct ble_ll_cs_pref_proc_params pref_proc_params;
91109
};
92110

93111
struct ble_ll_cs_sm {
@@ -110,6 +128,8 @@ struct ble_ll_cs_sm {
110128

111129
/* DRBG context, initialized onece per LE Connection */
112130
struct ble_ll_cs_drbg_ctx drbg_ctx;
131+
132+
uint8_t measurement_enabled;
113133
};
114134

115135
#ifdef __cplusplus

nimble/include/nimble/ble.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ enum ble_error_codes
264264
BLE_ERR_LIMIT_REACHED = 0x43,
265265
BLE_ERR_OPERATION_CANCELLED = 0x44,
266266
BLE_ERR_PACKET_TOO_LONG = 0x45,
267+
BLE_ERR_TOO_LATE = 0x46,
268+
BLE_ERR_TOO_EARLY = 0x47,
269+
BLE_ERR_INSUFFICIENT_CHAN = 0x48,
267270
BLE_ERR_MAX = 0xff
268271
};
269272

0 commit comments

Comments
 (0)