Skip to content

Commit 6467237

Browse files
anhmolteivindj-nordic
authored andcommitted
lib: bluetooth: ble_conn_params: suggestions to conn_param update
* Add role field to the links structure. * Rename ppcp to pcp because this field will now also be used for central and not only peripheral. * The override function will now modify the window of acceptable connection parameters used when checking if requested parameters are acceptable. Signed-off-by: Andreas Moltumyr <andreas.moltumyr@nordicsemi.no>
1 parent 5407638 commit 6467237

2 files changed

Lines changed: 42 additions & 28 deletions

File tree

doc/nrf-bm/release_notes/release_notes_changelog.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ Libraries
7979
* Support for the :c:macro:`BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST` SoftDevice event.
8080

8181
* Updated the :c:func:`ble_conn_params_phy_radio_mode_set` function to return :c:macro:`NRF_ERROR_INVALID_PARAM` if the ``phy_pref`` parameter contains PHY modes not supported by the SoftDevice.
82+
* Updated the :c:func:`ble_conn_params_override` function to allow runtime overrides of the acceptable connection parameter window used when validating peripheral requests to change the connection parameters.
83+
Previously, this window was set statically by Kconfig options and was not possible to override at runtime.
84+
8285

8386
* Fixed:
8487

@@ -92,7 +95,6 @@ Bluetooth LE Services
9295

9396
* Changed :c:member:`ble_scan_filter_data.addr_filter.addr` and :c:member:`ble_scan_filter_data.name_filter.name` to ``const`` in the :c:struct:`ble_scan_filter_data` structure.
9497

95-
9698
Libraries for NFC
9799
-----------------
98100

lib/bluetooth/ble_conn_params/conn_param.c

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,18 @@ LOG_MODULE_DECLARE(ble_conn_params, CONFIG_BLE_CONN_PARAMS_LOG_LEVEL);
1414

1515
extern void ble_conn_params_event_send(const struct ble_conn_params_evt *evt);
1616

17-
/* Preferred connection parameters */
18-
static const ble_gap_conn_params_t ppcp = {
17+
/* Preferred connection parameters. */
18+
static const ble_gap_conn_params_t pcp_default = {
1919
.min_conn_interval = CONFIG_BLE_CONN_PARAMS_MIN_CONN_INTERVAL,
2020
.max_conn_interval = CONFIG_BLE_CONN_PARAMS_MAX_CONN_INTERVAL,
2121
.slave_latency = CONFIG_BLE_CONN_PARAMS_PERIPHERAL_LATENCY,
2222
.conn_sup_timeout = CONFIG_BLE_CONN_PARAMS_SUP_TIMEOUT,
2323
};
2424

2525
static struct {
26-
ble_gap_conn_params_t ppcp;
26+
ble_gap_conn_params_t pcp;
2727
uint8_t retries;
28+
uint8_t role;
2829
} links[CONFIG_NRF_SDH_BLE_TOTAL_LINK_COUNT] = {
2930
[0 ... CONFIG_NRF_SDH_BLE_TOTAL_LINK_COUNT - 1] = {
3031
.retries = CONFIG_BLE_CONN_PARAMS_NEGOTIATION_RETRIES,
@@ -37,33 +38,34 @@ static void conn_params_negotiate(uint16_t conn_handle, int idx)
3738

3839
LOG_DBG("Negotiating desired parameters with peer %#x", conn_handle);
3940

40-
nrf_err = sd_ble_gap_conn_param_update(conn_handle, &links[idx].ppcp);
41+
nrf_err = sd_ble_gap_conn_param_update(conn_handle, &links[idx].pcp);
4142
if (nrf_err) {
4243
LOG_ERR("Failed to request GAP connection parameters update, nrf_error %#x",
4344
nrf_err);
4445
}
4546
}
4647

47-
static bool conn_params_can_agree(const ble_gap_conn_params_t *conn_params)
48+
static bool conn_params_can_agree(const ble_gap_conn_params_t *conn_params, int idx)
4849
{
4950
uint16_t peripheral_latency_min;
5051
uint16_t peripheral_latency_max;
5152
uint16_t conn_sup_timeout_min;
5253
uint16_t conn_sup_timeout_max;
54+
const ble_gap_conn_params_t *const pcp = &links[idx].pcp;
5355

54-
/* The max_conn_interval field in the event contains the client connection interval */
55-
if ((conn_params->max_conn_interval < ppcp.min_conn_interval) ||
56-
(conn_params->max_conn_interval > ppcp.max_conn_interval)) {
56+
/* The max_conn_interval field in the event contains the central's connection interval. */
57+
if ((conn_params->max_conn_interval < pcp->min_conn_interval) ||
58+
(conn_params->max_conn_interval > pcp->max_conn_interval)) {
5759
LOG_DBG("Could not agree on connection interval %#x",
5860
conn_params->max_conn_interval);
5961
return false;
6062
}
6163

6264
peripheral_latency_min =
63-
CLAMP(ppcp.slave_latency - CONFIG_BLE_CONN_PARAMS_MAX_PERIPHERAL_LATENCY_DEVIATION,
65+
CLAMP(pcp->slave_latency - CONFIG_BLE_CONN_PARAMS_MAX_PERIPHERAL_LATENCY_DEVIATION,
6466
0, UINT16_MAX);
6567
peripheral_latency_max =
66-
CLAMP(ppcp.slave_latency + CONFIG_BLE_CONN_PARAMS_MAX_PERIPHERAL_LATENCY_DEVIATION,
68+
CLAMP(pcp->slave_latency + CONFIG_BLE_CONN_PARAMS_MAX_PERIPHERAL_LATENCY_DEVIATION,
6769
0, UINT16_MAX);
6870

6971
if (conn_params->slave_latency < peripheral_latency_min ||
@@ -73,11 +75,11 @@ static bool conn_params_can_agree(const ble_gap_conn_params_t *conn_params)
7375
}
7476

7577
conn_sup_timeout_min =
76-
CLAMP(ppcp.conn_sup_timeout - CONFIG_BLE_CONN_PARAMS_MAX_SUP_TIMEOUT_DEVIATION, 0,
77-
UINT16_MAX);
78+
CLAMP(pcp->conn_sup_timeout - CONFIG_BLE_CONN_PARAMS_MAX_SUP_TIMEOUT_DEVIATION,
79+
0, UINT16_MAX);
7880
conn_sup_timeout_max =
79-
CLAMP(ppcp.conn_sup_timeout + CONFIG_BLE_CONN_PARAMS_MAX_SUP_TIMEOUT_DEVIATION, 0,
80-
UINT16_MAX);
81+
CLAMP(pcp->conn_sup_timeout + CONFIG_BLE_CONN_PARAMS_MAX_SUP_TIMEOUT_DEVIATION,
82+
0, UINT16_MAX);
8183

8284
if (conn_params->conn_sup_timeout < conn_sup_timeout_min ||
8385
conn_params->conn_sup_timeout > conn_sup_timeout_max) {
@@ -92,12 +94,13 @@ static bool conn_params_can_agree(const ble_gap_conn_params_t *conn_params)
9294
static void on_connected(uint16_t conn_handle, int idx, const ble_gap_evt_connected_t *evt)
9395
{
9496
links[idx].retries = CONFIG_BLE_CONN_PARAMS_NEGOTIATION_RETRIES;
97+
links[idx].role = evt->role;
9598

96-
/* Copy default ppcp */
97-
memcpy(&links[idx].ppcp, &ppcp, sizeof(ble_gap_conn_params_t));
99+
/* Copy default pcp. */
100+
memcpy(&links[idx].pcp, &pcp_default, sizeof(ble_gap_conn_params_t));
98101

99102
if (evt->role == BLE_GAP_ROLE_PERIPH) {
100-
if (!conn_params_can_agree(&evt->conn_params)) {
103+
if (!conn_params_can_agree(&evt->conn_params, idx)) {
101104
conn_params_negotiate(conn_handle, idx);
102105
}
103106
}
@@ -113,7 +116,14 @@ static void on_conn_params_update(uint16_t conn_handle, int idx,
113116
evt->conn_params.slave_latency,
114117
evt->conn_params.conn_sup_timeout);
115118

116-
if (conn_params_can_agree(&evt->conn_params)) {
119+
#if defined(CONFIG_SOFTDEVICE_CENTRAL)
120+
if (links[idx].role == BLE_GAP_ROLE_CENTRAL) {
121+
/* Central decides connection parameters. No retry logic required. */
122+
return;
123+
}
124+
#endif /* CONFIG_SOFTDEVICE_CENTRAL */
125+
126+
if (conn_params_can_agree(&evt->conn_params, idx)) {
117127
const struct ble_conn_params_evt app_evt = {
118128
.evt_type = BLE_CONN_PARAMS_EVT_UPDATED,
119129
.conn_handle = conn_handle,
@@ -149,13 +159,14 @@ static void on_conn_params_update_request(uint16_t conn_handle, int idx,
149159
const ble_gap_evt_conn_param_update_request_t *evt)
150160
{
151161
uint32_t nrf_err;
162+
const ble_gap_conn_params_t *conn_params = NULL;
152163

153-
if (conn_params_can_agree(&evt->conn_params)) {
154-
nrf_err = sd_ble_gap_conn_param_update(conn_handle, &evt->conn_params);
155-
} else {
156-
nrf_err = sd_ble_gap_conn_param_update(conn_handle, NULL);
164+
/* Use the requested parameters if they are acceptable. Otherwise pass NULL to reject. */
165+
if (conn_params_can_agree(&evt->conn_params, idx)) {
166+
conn_params = &evt->conn_params;
157167
}
158168

169+
nrf_err = sd_ble_gap_conn_param_update(conn_handle, conn_params);
159170
if (nrf_err) {
160171
LOG_ERR("Failed to update connection params, nrf_error %#x", nrf_err);
161172
}
@@ -181,6 +192,7 @@ static void on_ble_evt(const ble_evt_t *evt, void *ctx)
181192
case BLE_GAP_EVT_CONN_PARAM_UPDATE:
182193
on_conn_params_update(conn_handle, idx, &evt->evt.gap_evt.params.conn_param_update);
183194
break;
195+
184196
#if defined(CONFIG_SOFTDEVICE_CENTRAL)
185197
case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST:
186198
on_conn_params_update_request(conn_handle, idx,
@@ -206,7 +218,7 @@ static int on_state_evt(enum nrf_sdh_state_evt evt, void *ctx)
206218
return 0;
207219
}
208220

209-
nrf_err = sd_ble_gap_ppcp_set(&ppcp);
221+
nrf_err = sd_ble_gap_ppcp_set(&pcp_default);
210222
if (nrf_err) {
211223
LOG_ERR("Failed to set preferred conn params, nrf_error %#x", nrf_err);
212224

@@ -217,9 +229,9 @@ static int on_state_evt(enum nrf_sdh_state_evt evt, void *ctx)
217229
}
218230

219231
LOG_DBG("conn. interval min %u max %u, peripheral latency %u, sup. timeout %u",
220-
ppcp.min_conn_interval, ppcp.max_conn_interval,
221-
ppcp.slave_latency,
222-
ppcp.conn_sup_timeout);
232+
pcp_default.min_conn_interval, pcp_default.max_conn_interval,
233+
pcp_default.slave_latency,
234+
pcp_default.conn_sup_timeout);
223235

224236
return 0;
225237
}
@@ -237,7 +249,7 @@ uint32_t ble_conn_params_override(uint16_t conn_handle, const ble_gap_conn_param
237249
return NRF_ERROR_NULL;
238250
}
239251

240-
links[idx].ppcp = *conn_params;
252+
links[idx].pcp = *conn_params;
241253
nrf_err = sd_ble_gap_conn_param_update(conn_handle, conn_params);
242254
if (nrf_err) {
243255
return nrf_err;

0 commit comments

Comments
 (0)