Bluetooth: Add bt_gatt_exchange_mtu
bt_gatt_exchange_mtu can be used to exchange MTU used by GATT, the MTU is selected automatically based on the amount of data bt_buf can hold. Change-Id: Id49a506663d922132e81c0a753a983b93579ffd0 Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
parent
92477f7f65
commit
96fbd6636c
2 changed files with 55 additions and 0 deletions
|
@ -624,4 +624,23 @@ void bt_gatt_connected(struct bt_conn *conn);
|
||||||
*/
|
*/
|
||||||
void bt_gatt_disconnected(struct bt_conn *conn);
|
void bt_gatt_disconnected(struct bt_conn *conn);
|
||||||
|
|
||||||
|
/* Client API */
|
||||||
|
|
||||||
|
/*! @brief Response callback function
|
||||||
|
*
|
||||||
|
* @param conn Connection object.
|
||||||
|
* @param err Error code.
|
||||||
|
*/
|
||||||
|
typedef void (*bt_gatt_rsp_func_t)(struct bt_conn *conn, uint8_t err);
|
||||||
|
|
||||||
|
/*! @brief Exchange MTU
|
||||||
|
*
|
||||||
|
* This client procedure can be used to set the MTU to the maximum possible
|
||||||
|
* size the buffers can hold.
|
||||||
|
* NOTE: Shall only be used once per connection.
|
||||||
|
*
|
||||||
|
* @param conn Connection object.
|
||||||
|
*/
|
||||||
|
int bt_gatt_exchange_mtu(struct bt_conn *conn, bt_gatt_rsp_func_t func);
|
||||||
|
|
||||||
#endif /* __BT_GATT_H */
|
#endif /* __BT_GATT_H */
|
||||||
|
|
|
@ -461,3 +461,39 @@ void bt_gatt_disconnected(struct bt_conn *conn)
|
||||||
BT_DBG("conn %p\n", conn);
|
BT_DBG("conn %p\n", conn);
|
||||||
bt_gatt_foreach_attr(0x0001, 0xffff, disconnected_cb, conn);
|
bt_gatt_foreach_attr(0x0001, 0xffff, disconnected_cb, conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void gatt_mtu_rsp(struct bt_conn *conn, uint8_t err, const void *pdu,
|
||||||
|
uint16_t length, void *user_data)
|
||||||
|
{
|
||||||
|
bt_gatt_rsp_func_t func = user_data;
|
||||||
|
|
||||||
|
func(conn, err);
|
||||||
|
}
|
||||||
|
|
||||||
|
int bt_gatt_exchange_mtu(struct bt_conn *conn, bt_gatt_rsp_func_t func)
|
||||||
|
{
|
||||||
|
struct bt_att_exchange_mtu_req *req;
|
||||||
|
struct bt_buf *buf;
|
||||||
|
uint16_t mtu;
|
||||||
|
|
||||||
|
if (!conn || !func) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = bt_att_create_pdu(conn, BT_ATT_OP_MTU_REQ, sizeof(*req));
|
||||||
|
if (!buf) {
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Select MTU based on the amount of room we have in bt_buf including
|
||||||
|
* one extra byte for ATT header.
|
||||||
|
*/
|
||||||
|
mtu = bt_buf_tailroom(buf) + 1;
|
||||||
|
|
||||||
|
BT_DBG("Client MTU %u\n", mtu);
|
||||||
|
|
||||||
|
req = bt_buf_add(buf, sizeof(*req));
|
||||||
|
req->mtu = sys_cpu_to_le16(mtu);
|
||||||
|
|
||||||
|
return bt_att_send(conn, buf, gatt_mtu_rsp, func, NULL);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue