Bluetooth: Prefer struct bt_le_conn_param over individual values

This reduces stack pressure a little bit, and also paves the way for
introducing an application callback for accepting an incoming
connection parameter update request.

Change-Id: Ib02c14e27cbe34f85d663f36abd0597683ae1dc1
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
This commit is contained in:
Johan Hedberg 2017-01-13 13:20:22 +02:00
commit e564de0deb
5 changed files with 36 additions and 37 deletions

View file

@ -1449,8 +1449,7 @@ struct bt_conn *bt_conn_create_le(const bt_addr_le_t *peer,
{ {
struct bt_conn *conn; struct bt_conn *conn;
if (!bt_le_conn_params_valid(param->interval_min, param->interval_max, if (!bt_le_conn_params_valid(param)) {
param->latency, param->timeout)) {
return NULL; return NULL;
} }
@ -1492,10 +1491,7 @@ int bt_le_set_auto_conn(bt_addr_le_t *addr,
{ {
struct bt_conn *conn; struct bt_conn *conn;
if (param && !bt_le_conn_params_valid(param->interval_min, if (param && !bt_le_conn_params_valid(param)) {
param->interval_max,
param->latency,
param->timeout)) {
return -EINVAL; return -EINVAL;
} }

View file

@ -784,21 +784,24 @@ static void le_remote_feat_complete(struct net_buf *buf)
bt_conn_unref(conn); bt_conn_unref(conn);
} }
bool bt_le_conn_params_valid(uint16_t min, uint16_t max, bool bt_le_conn_params_valid(const struct bt_le_conn_param *param)
uint16_t latency, uint16_t timeout)
{ {
if (min > max || min < 6 || max > 3200) { if (param->interval_min > param->interval_max ||
param->interval_min < 6 || param->interval_max > 3200) {
return false; return false;
} }
/* Limits according to BT Core spec 4.2 [Vol 2, Part E, 7.8.12] */ /* Limits according to BT Core spec 4.2 [Vol 2, Part E, 7.8.12] */
if (timeout < 10 || timeout > 3200 || if (param->timeout < 10 || param->timeout > 3200 ||
(2 * timeout) < ((1 + latency) * max * 5)) { ((2 * param->timeout) <
((1 + param->latency) * param->interval_max * 5))) {
return false; return false;
} }
/* Limits according to BT Core spec 4.2 [Vol 6, Part B, 4.5.1] */ /* Limits according to BT Core spec 4.2 [Vol 6, Part B, 4.5.1] */
if (latency > 499 || ((latency + 1) * max) > (timeout * 4)) { if (param->latency > 499 ||
(((param->latency + 1) * param->interval_max) >
(param->timeout * 4))) {
return false; return false;
} }
@ -823,8 +826,8 @@ static int le_conn_param_neg_reply(uint16_t handle, uint8_t reason)
return bt_hci_cmd_send(BT_HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, buf); return bt_hci_cmd_send(BT_HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, buf);
} }
static int le_conn_param_req_reply(uint16_t handle, uint16_t min, uint16_t max, static int le_conn_param_req_reply(uint16_t handle,
uint16_t latency, uint16_t timeout) const struct bt_le_conn_param *param)
{ {
struct bt_hci_cp_le_conn_param_req_reply *cp; struct bt_hci_cp_le_conn_param_req_reply *cp;
struct net_buf *buf; struct net_buf *buf;
@ -838,10 +841,10 @@ static int le_conn_param_req_reply(uint16_t handle, uint16_t min, uint16_t max,
memset(cp, 0, sizeof(*cp)); memset(cp, 0, sizeof(*cp));
cp->handle = sys_cpu_to_le16(handle); cp->handle = sys_cpu_to_le16(handle);
cp->interval_min = sys_cpu_to_le16(min); cp->interval_min = sys_cpu_to_le16(param->interval_min);
cp->interval_max = sys_cpu_to_le16(max); cp->interval_max = sys_cpu_to_le16(param->interval_max);
cp->latency = sys_cpu_to_le16(latency); cp->latency = sys_cpu_to_le16(param->latency);
cp->timeout = sys_cpu_to_le16(timeout); cp->timeout = sys_cpu_to_le16(param->timeout);
return bt_hci_cmd_send(BT_HCI_OP_LE_CONN_PARAM_REQ_REPLY, buf); return bt_hci_cmd_send(BT_HCI_OP_LE_CONN_PARAM_REQ_REPLY, buf);
} }
@ -849,14 +852,15 @@ static int le_conn_param_req_reply(uint16_t handle, uint16_t min, uint16_t max,
static int le_conn_param_req(struct net_buf *buf) static int le_conn_param_req(struct net_buf *buf)
{ {
struct bt_hci_evt_le_conn_param_req *evt = (void *)buf->data; struct bt_hci_evt_le_conn_param_req *evt = (void *)buf->data;
struct bt_le_conn_param param;
struct bt_conn *conn; struct bt_conn *conn;
uint16_t handle, min, max, latency, timeout; uint16_t handle;
handle = sys_le16_to_cpu(evt->handle); handle = sys_le16_to_cpu(evt->handle);
min = sys_le16_to_cpu(evt->interval_min); param.interval_min = sys_le16_to_cpu(evt->interval_min);
max = sys_le16_to_cpu(evt->interval_max); param.interval_max = sys_le16_to_cpu(evt->interval_max);
latency = sys_le16_to_cpu(evt->latency); param.latency = sys_le16_to_cpu(evt->latency);
timeout = sys_le16_to_cpu(evt->timeout); param.timeout = sys_le16_to_cpu(evt->timeout);
conn = bt_conn_lookup_handle(handle); conn = bt_conn_lookup_handle(handle);
if (!conn) { if (!conn) {
@ -867,12 +871,12 @@ static int le_conn_param_req(struct net_buf *buf)
bt_conn_unref(conn); bt_conn_unref(conn);
if (!bt_le_conn_params_valid(min, max, latency, timeout)) { if (!bt_le_conn_params_valid(&param)) {
return le_conn_param_neg_reply(handle, return le_conn_param_neg_reply(handle,
BT_HCI_ERR_INVALID_LL_PARAMS); BT_HCI_ERR_INVALID_LL_PARAMS);
} }
return le_conn_param_req_reply(handle, min, max, latency, timeout); return le_conn_param_req_reply(handle, &param);
} }
static void le_conn_update_complete(struct net_buf *buf) static void le_conn_update_complete(struct net_buf *buf)

View file

@ -142,8 +142,7 @@ extern const struct bt_storage *bt_storage;
extern const struct bt_conn_auth_cb *bt_auth; extern const struct bt_conn_auth_cb *bt_auth;
#endif /* CONFIG_BLUETOOTH_SMP || CONFIG_BLUETOOTH_BREDR */ #endif /* CONFIG_BLUETOOTH_SMP || CONFIG_BLUETOOTH_BREDR */
bool bt_le_conn_params_valid(uint16_t min, uint16_t max, bool bt_le_conn_params_valid(const struct bt_le_conn_param *param);
uint16_t latency, uint16_t timeout);
struct net_buf *bt_hci_cmd_create(uint16_t opcode, uint8_t param_len); struct net_buf *bt_hci_cmd_create(uint16_t opcode, uint8_t param_len);
int bt_hci_cmd_send(uint16_t opcode, struct net_buf *buf); int bt_hci_cmd_send(uint16_t opcode, struct net_buf *buf);

View file

@ -28,6 +28,7 @@
#include <tinycrypt/ecc.h> #include <tinycrypt/ecc.h>
#include <tinycrypt/ecc_dh.h> #include <tinycrypt/ecc_dh.h>
#include <bluetooth/bluetooth.h> #include <bluetooth/bluetooth.h>
#include <bluetooth/conn.h>
#include <bluetooth/log.h> #include <bluetooth/log.h>
#include <bluetooth/hci.h> #include <bluetooth/hci.h>
#include <bluetooth/hci_driver.h> #include <bluetooth/hci_driver.h>

View file

@ -553,8 +553,7 @@ static void le_conn_param_update_req(struct bt_l2cap *l2cap, uint8_t ident,
struct net_buf *buf) struct net_buf *buf)
{ {
struct bt_conn *conn = l2cap->chan.chan.conn; struct bt_conn *conn = l2cap->chan.chan.conn;
const struct bt_le_conn_param *param; struct bt_le_conn_param param;
uint16_t min, max, latency, timeout;
bool params_valid; bool params_valid;
struct bt_l2cap_conn_param_rsp *rsp; struct bt_l2cap_conn_param_rsp *rsp;
struct bt_l2cap_conn_param_req *req = (void *)buf->data; struct bt_l2cap_conn_param_req *req = (void *)buf->data;
@ -570,14 +569,14 @@ static void le_conn_param_update_req(struct bt_l2cap *l2cap, uint8_t ident,
return; return;
} }
min = sys_le16_to_cpu(req->min_interval); param.interval_min = sys_le16_to_cpu(req->min_interval);
max = sys_le16_to_cpu(req->max_interval); param.interval_max = sys_le16_to_cpu(req->max_interval);
latency = sys_le16_to_cpu(req->latency); param.latency = sys_le16_to_cpu(req->latency);
timeout = sys_le16_to_cpu(req->timeout); param.timeout = sys_le16_to_cpu(req->timeout);
param = BT_LE_CONN_PARAM(min, max, latency, timeout);
BT_DBG("min 0x%04x max 0x%04x latency: 0x%04x timeout: 0x%04x", BT_DBG("min 0x%04x max 0x%04x latency: 0x%04x timeout: 0x%04x",
min, max, latency, timeout); param.interval_min, param.interval_max, param.latency,
param.timeout);
buf = l2cap_create_le_sig_pdu(BT_L2CAP_CONN_PARAM_RSP, ident, buf = l2cap_create_le_sig_pdu(BT_L2CAP_CONN_PARAM_RSP, ident,
sizeof(*rsp)); sizeof(*rsp));
@ -585,7 +584,7 @@ static void le_conn_param_update_req(struct bt_l2cap *l2cap, uint8_t ident,
return; return;
} }
params_valid = bt_le_conn_params_valid(min, max, latency, timeout); params_valid = bt_le_conn_params_valid(&param);
rsp = net_buf_add(buf, sizeof(*rsp)); rsp = net_buf_add(buf, sizeof(*rsp));
if (params_valid) { if (params_valid) {
@ -597,7 +596,7 @@ static void le_conn_param_update_req(struct bt_l2cap *l2cap, uint8_t ident,
bt_l2cap_send(conn, BT_L2CAP_CID_LE_SIG, buf); bt_l2cap_send(conn, BT_L2CAP_CID_LE_SIG, buf);
if (params_valid) { if (params_valid) {
bt_conn_le_conn_update(conn, param); bt_conn_le_conn_update(conn, &param);
} }
} }
#endif /* CONFIG_BLUETOOTH_CENTRAL */ #endif /* CONFIG_BLUETOOTH_CENTRAL */