Bluetooth: Add latency & timeout to LE conn param API

Change-Id: Icd6122b9056dd686d70a2d213a18dcab34f5e80a
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
This commit is contained in:
Johan Hedberg 2015-12-05 21:39:44 +02:00 committed by Anas Nashif
commit 9533fbcfe1
6 changed files with 87 additions and 37 deletions

View file

@ -99,33 +99,47 @@ typedef void bt_le_scan_cb_t(const bt_addr_le_t *addr, int8_t rssi,
uint8_t adv_type, const uint8_t *adv_data,
uint8_t len);
/** LE scan parameters */
struct bt_le_scan_param {
/** Scan type (BT_HCI_LE_SCAN_ACTIVE or BT_HCI_LE_SCAN_PASSIVE) */
uint8_t type;
/** Duplicate filtering (BT_HCI_LE_SCAN_FILTER_DUP_ENABLE or
* BT_HCI_LE_SCAN_FILTER_DUP_DISABLE)
*/
uint8_t filter_dup;
/** Scan interval (N * 0.625 ms) */
uint16_t interval;
/** Scan window (N * 0.625 ms) */
uint16_t window;
};
/** Helper to declare scan parameters inline
*
* @param _type Scan Type (BT_HCI_LE_SCAN_ACTIVE/BT_HCI_LE_SCAN_PASSIVE)
* @param _filter Filter Duplicates
* @param _interval Scan Interval (N * 0.625 ms)
* @param _window Scan Window (N * 0.625 ms)
*/
#define BT_LE_SCAN_PARAM(_type, _filter, _interval, _window) \
(&(struct bt_le_scan_param) { \
.type = (_type), \
.filter_dup = (_filter), \
.interval = (_interval), \
.window = (_window), \
})
/** Helper macro to enable active scanning to discover new devices.
*
* The interval and window are intentionally set to the same value to
* perform continuous scanning.
*/
#define BT_LE_SCAN_ACTIVE \
(&(struct bt_le_scan_param) { \
.type = BT_HCI_LE_SCAN_ACTIVE, \
.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE, \
.interval = BT_GAP_SCAN_FAST_INTERVAL, \
.window = BT_GAP_SCAN_FAST_INTERVAL, \
})
/** LE scan parameters */
struct bt_le_scan_param {
/** Type of scanning (active/passive) */
uint8_t type;
/** Enable duplicate filtering */
uint8_t filter_dup;
/** Scan interval */
uint16_t interval;
/** Scan window */
uint16_t window;
};
#define BT_LE_SCAN_ACTIVE BT_LE_SCAN_PARAM(BT_HCI_LE_SCAN_ACTIVE, \
BT_HCI_LE_SCAN_FILTER_DUP_ENABLE, \
BT_GAP_SCAN_FAST_INTERVAL, \
BT_GAP_SCAN_FAST_INTERVAL)
/** @brief Start (LE) scanning
*

View file

@ -32,12 +32,33 @@ struct bt_conn;
struct bt_le_conn_param {
uint16_t interval_min;
uint16_t interval_max;
uint16_t latency;
uint16_t timeout;
};
#define BT_LE_CONN_PARAM_DEFAULT (&(struct bt_le_conn_param) { \
.interval_min = BT_GAP_INIT_CONN_INT_MIN, \
.interval_max = BT_GAP_INIT_CONN_INT_MAX, \
})
/** Helper to declare connection parameters inline
*
* @param int_min Minimum Connection Interval (N * 1.25 ms)
* @param int_max Maximum Connection Interval (N * 1.25 ms)
* @param lat Connection Latency
* @param timeout Supervision Timeout (N * 10 ms)
*/
#define BT_LE_CONN_PARAM(int_min, int_max, lat, to) \
(&(struct bt_le_conn_param) { \
.interval_min = (int_min), \
.interval_max = (int_max), \
.latency = (lat), \
.timeout = (to), \
})
/** Default LE connection parameters:
* Connection Interval: 30-50 ms
* Latency: 0
* Timeout: 4 s
*/
#define BT_LE_CONN_PARAM_DEFAULT BT_LE_CONN_PARAM(BT_GAP_INIT_CONN_INT_MIN, \
BT_GAP_INIT_CONN_INT_MAX, \
0, 400)
/** @brief Increment a connection's reference count.
*

View file

@ -839,8 +839,7 @@ struct bt_conn *bt_conn_create_le(const bt_addr_le_t *peer,
if (conn) {
switch (conn->state) {
case BT_CONN_CONNECT_SCAN:
conn->le.interval_min = param->interval_min;
conn->le.interval_max = param->interval_max;
bt_conn_set_param_le(conn, param);
return conn;
case BT_CONN_CONNECT:
case BT_CONN_CONNECTED:
@ -856,8 +855,7 @@ struct bt_conn *bt_conn_create_le(const bt_addr_le_t *peer,
return NULL;
}
conn->le.interval_min = param->interval_min;
conn->le.interval_max = param->interval_max;
bt_conn_set_param_le(conn, param);
bt_conn_set_state(conn, BT_CONN_CONNECT_SCAN);

View file

@ -42,6 +42,9 @@ struct bt_conn_le {
uint16_t interval_min;
uint16_t interval_max;
uint16_t latency;
uint16_t timeout;
uint8_t features[8];
};
@ -123,6 +126,9 @@ struct bt_conn *bt_conn_lookup_state(const bt_addr_le_t *peer,
/* Set connection object in certain state and perform action related to state */
void bt_conn_set_state(struct bt_conn *conn, bt_conn_state_t state);
void bt_conn_set_param_le(struct bt_conn *conn,
const struct bt_le_conn_param *param);
int bt_conn_le_conn_update(struct bt_conn *conn, uint16_t min, uint16_t max,
uint16_t latency, uint16_t timeout);

View file

@ -412,7 +412,8 @@ static int hci_le_create_conn(const struct bt_conn *conn)
bt_addr_le_copy(&cp->peer_addr, &conn->le.resp_addr);
cp->conn_interval_min = sys_cpu_to_le16(conn->le.interval_min);
cp->conn_interval_max = sys_cpu_to_le16(conn->le.interval_max);
cp->supervision_timeout = sys_cpu_to_le16(0x07D0);
cp->conn_latency = sys_cpu_to_le16(conn->le.latency);
cp->supervision_timeout = sys_cpu_to_le16(conn->le.timeout);
return bt_hci_cmd_send_sync(BT_HCI_OP_LE_CREATE_CONN, buf, NULL);
}
@ -503,8 +504,8 @@ static int update_conn_params(struct bt_conn *conn)
(bt_dev.le.features[0] & BT_HCI_LE_CONN_PARAM_REQ_PROC)) {
return bt_conn_le_conn_update(conn, conn->le.interval_min,
conn->le.interval_max,
LE_CONN_LATENCY,
LE_CONN_TIMEOUT);
conn->le.latency,
conn->le.timeout);
}
return -EBUSY;
@ -557,6 +558,8 @@ static void le_conn_complete(struct net_buf *buf)
conn->handle = handle;
bt_addr_le_copy(&conn->le.dst, id_addr);
conn->le.interval = sys_le16_to_cpu(evt->interval);
conn->le.latency = sys_le16_to_cpu(evt->latency);
conn->le.timeout = sys_le16_to_cpu(evt->supv_timeout);
conn->role = evt->role;
src.type = BT_ADDR_LE_PUBLIC;
@ -777,6 +780,15 @@ static int set_flow_control(void)
*enable = 0x01;
return bt_hci_cmd_send_sync(BT_HCI_OP_SET_CTL_TO_HOST_FLOW, buf, NULL);
}
void bt_conn_set_param_le(struct bt_conn *conn,
const struct bt_le_conn_param *param)
{
conn->le.interval_min = param->interval_min;
conn->le.interval_max = param->interval_max;
conn->le.latency = param->latency;
conn->le.timeout = param->timeout;
}
#endif /* CONFIG_BLUETOOTH_CONN */
#if defined(CONFIG_BLUETOOTH_SMP)
@ -1231,8 +1243,7 @@ int bt_le_set_auto_conn(bt_addr_le_t *addr,
}
if (param) {
conn->le.interval_min = param->interval_min;
conn->le.interval_max = param->interval_max;
bt_conn_set_param_le(conn, param);
if (!atomic_test_and_set_bit(conn->flags,
BT_CONN_AUTO_CONNECT)) {

View file

@ -976,8 +976,8 @@ int bt_l2cap_update_conn_param(struct bt_conn *conn)
req = net_buf_add(buf, sizeof(*req));
req->min_interval = sys_cpu_to_le16(conn->le.interval_min);
req->max_interval = sys_cpu_to_le16(conn->le.interval_max);
req->latency = sys_cpu_to_le16(LE_CONN_LATENCY);
req->timeout = sys_cpu_to_le16(LE_CONN_TIMEOUT);
req->latency = sys_cpu_to_le16(conn->le.latency);
req->timeout = sys_cpu_to_le16(conn->le.timeout);
bt_l2cap_send(conn, BT_L2CAP_CID_LE_SIG, buf);