2015-10-05 13:53:03 +03:00
|
|
|
/** @file
|
|
|
|
* @brief Internal APIs for Bluetooth L2CAP handling.
|
|
|
|
*/
|
2015-04-28 10:39:50 +03:00
|
|
|
|
|
|
|
/*
|
2016-06-10 12:10:18 +03:00
|
|
|
* Copyright (c) 2015-2016 Intel Corporation
|
2015-04-28 10:39:50 +03:00
|
|
|
*
|
2017-01-18 17:01:01 -08:00
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
2015-04-28 10:39:50 +03:00
|
|
|
*/
|
|
|
|
|
2015-10-02 16:21:18 +03:00
|
|
|
#include <bluetooth/l2cap.h>
|
|
|
|
|
2016-08-02 16:57:59 +02:00
|
|
|
enum l2cap_conn_list_action {
|
|
|
|
BT_L2CAP_CHAN_LOOKUP,
|
|
|
|
BT_L2CAP_CHAN_DETACH,
|
|
|
|
};
|
|
|
|
|
2016-04-07 13:00:16 +02:00
|
|
|
#define BT_L2CAP_CID_BR_SIG 0x0001
|
2015-04-28 10:39:50 +03:00
|
|
|
#define BT_L2CAP_CID_ATT 0x0004
|
|
|
|
#define BT_L2CAP_CID_LE_SIG 0x0005
|
2015-05-06 12:16:45 +03:00
|
|
|
#define BT_L2CAP_CID_SMP 0x0006
|
2016-09-07 15:14:20 +02:00
|
|
|
#define BT_L2CAP_CID_BR_SMP 0x0007
|
2015-04-28 10:39:50 +03:00
|
|
|
|
2016-08-17 23:25:09 +05:30
|
|
|
#define BT_L2CAP_PSM_RFCOMM 0x0003
|
|
|
|
|
2015-04-28 10:39:50 +03:00
|
|
|
struct bt_l2cap_hdr {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t len;
|
|
|
|
u16_t cid;
|
2015-06-04 11:20:48 +07:00
|
|
|
} __packed;
|
2015-04-28 10:39:50 +03:00
|
|
|
|
|
|
|
struct bt_l2cap_sig_hdr {
|
2017-04-20 12:00:29 -05:00
|
|
|
u8_t code;
|
|
|
|
u8_t ident;
|
|
|
|
u16_t len;
|
2015-06-04 11:20:48 +07:00
|
|
|
} __packed;
|
2015-04-28 10:43:14 +03:00
|
|
|
|
|
|
|
#define BT_L2CAP_REJ_NOT_UNDERSTOOD 0x0000
|
|
|
|
#define BT_L2CAP_REJ_MTU_EXCEEDED 0x0001
|
|
|
|
#define BT_L2CAP_REJ_INVALID_CID 0x0002
|
|
|
|
|
|
|
|
#define BT_L2CAP_CMD_REJECT 0x01
|
|
|
|
struct bt_l2cap_cmd_reject {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t reason;
|
|
|
|
u8_t data[0];
|
2015-06-04 11:20:48 +07:00
|
|
|
} __packed;
|
2015-04-28 10:43:14 +03:00
|
|
|
|
2016-06-06 09:23:20 +02:00
|
|
|
struct bt_l2cap_cmd_reject_cid_data {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t scid;
|
|
|
|
u16_t dcid;
|
2016-06-06 09:23:20 +02:00
|
|
|
} __packed;
|
|
|
|
|
2016-05-12 14:21:56 +02:00
|
|
|
#define BT_L2CAP_CONN_REQ 0x02
|
|
|
|
struct bt_l2cap_conn_req {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t psm;
|
|
|
|
u16_t scid;
|
2016-05-12 14:21:56 +02:00
|
|
|
} __packed;
|
|
|
|
|
2016-07-08 16:30:31 +02:00
|
|
|
/* command statuses in reposnse */
|
|
|
|
#define BT_L2CAP_CS_NO_INFO 0x0000
|
|
|
|
#define BT_L2CAP_CS_AUTHEN_PEND 0x0001
|
|
|
|
|
2016-10-06 12:08:10 +02:00
|
|
|
/* valid results in conn response on BR/EDR */
|
|
|
|
#define BT_L2CAP_BR_SUCCESS 0x0000
|
|
|
|
#define BT_L2CAP_BR_PENDING 0x0001
|
|
|
|
#define BT_L2CAP_BR_ERR_PSM_NOT_SUPP 0x0002
|
|
|
|
#define BT_L2CAP_BR_ERR_SEC_BLOCK 0x0003
|
|
|
|
#define BT_L2CAP_BR_ERR_NO_RESOURCES 0x0004
|
|
|
|
#define BT_L2CAP_BR_ERR_INVALID_SCID 0x0006
|
|
|
|
#define BT_L2CAP_BR_ERR_SCID_IN_USE 0x0007
|
|
|
|
|
2016-05-12 14:21:56 +02:00
|
|
|
#define BT_L2CAP_CONN_RSP 0x03
|
|
|
|
struct bt_l2cap_conn_rsp {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t dcid;
|
|
|
|
u16_t scid;
|
|
|
|
u16_t result;
|
|
|
|
u16_t status;
|
2016-05-12 14:21:56 +02:00
|
|
|
} __packed;
|
|
|
|
|
2016-06-21 13:57:48 +02:00
|
|
|
#define BT_L2CAP_CONF_SUCCESS 0x0000
|
2016-06-21 14:02:30 +02:00
|
|
|
#define BT_L2CAP_CONF_UNACCEPT 0x0001
|
|
|
|
#define BT_L2CAP_CONF_REJECT 0x0002
|
2016-06-21 13:57:48 +02:00
|
|
|
|
2016-06-21 13:36:39 +02:00
|
|
|
#define BT_L2CAP_CONF_REQ 0x04
|
|
|
|
struct bt_l2cap_conf_req {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t dcid;
|
|
|
|
u16_t flags;
|
|
|
|
u8_t data[0];
|
2016-06-21 13:36:39 +02:00
|
|
|
} __packed;
|
|
|
|
|
2016-06-21 13:57:48 +02:00
|
|
|
#define BT_L2CAP_CONF_RSP 0x05
|
|
|
|
struct bt_l2cap_conf_rsp {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t scid;
|
|
|
|
u16_t flags;
|
|
|
|
u16_t result;
|
|
|
|
u8_t data[0];
|
2016-06-21 13:57:48 +02:00
|
|
|
} __packed;
|
|
|
|
|
2016-06-21 13:36:39 +02:00
|
|
|
/* Option type used by MTU config request data */
|
|
|
|
#define BT_L2CAP_CONF_OPT_MTU 0x01
|
2016-06-21 14:02:30 +02:00
|
|
|
/* Options bits selecting most significant bit (hint) in type field */
|
|
|
|
#define BT_L2CAP_CONF_HINT 0x80
|
|
|
|
#define BT_L2CAP_CONF_MASK 0x7f
|
2016-06-21 13:36:39 +02:00
|
|
|
|
|
|
|
struct bt_l2cap_conf_opt {
|
2017-04-20 12:00:29 -05:00
|
|
|
u8_t type;
|
|
|
|
u8_t len;
|
|
|
|
u8_t data[0];
|
2016-06-21 13:36:39 +02:00
|
|
|
} __packed;
|
|
|
|
|
2015-10-28 15:35:53 +02:00
|
|
|
#define BT_L2CAP_DISCONN_REQ 0x06
|
|
|
|
struct bt_l2cap_disconn_req {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t dcid;
|
|
|
|
u16_t scid;
|
2015-10-28 15:35:53 +02:00
|
|
|
} __packed;
|
|
|
|
|
|
|
|
#define BT_L2CAP_DISCONN_RSP 0x07
|
|
|
|
struct bt_l2cap_disconn_rsp {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t dcid;
|
|
|
|
u16_t scid;
|
2015-10-28 15:35:53 +02:00
|
|
|
} __packed;
|
|
|
|
|
2016-05-06 10:25:40 +02:00
|
|
|
#define BT_L2CAP_INFO_FEAT_MASK 0x0002
|
|
|
|
#define BT_L2CAP_INFO_FIXED_CHAN 0x0003
|
|
|
|
|
|
|
|
#define BT_L2CAP_INFO_REQ 0x0a
|
|
|
|
struct bt_l2cap_info_req {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t type;
|
2016-05-06 10:25:40 +02:00
|
|
|
} __packed;
|
|
|
|
|
|
|
|
/* info result */
|
|
|
|
#define BT_L2CAP_INFO_SUCCESS 0x0000
|
|
|
|
#define BT_L2CAP_INFO_NOTSUPP 0x0001
|
|
|
|
|
|
|
|
#define BT_L2CAP_INFO_RSP 0x0b
|
|
|
|
struct bt_l2cap_info_rsp {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t type;
|
|
|
|
u16_t result;
|
|
|
|
u8_t data[0];
|
2016-05-06 10:25:40 +02:00
|
|
|
} __packed;
|
|
|
|
|
2015-04-28 10:43:14 +03:00
|
|
|
#define BT_L2CAP_CONN_PARAM_REQ 0x12
|
|
|
|
struct bt_l2cap_conn_param_req {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t min_interval;
|
|
|
|
u16_t max_interval;
|
|
|
|
u16_t latency;
|
|
|
|
u16_t timeout;
|
2015-06-04 11:20:48 +07:00
|
|
|
} __packed;
|
2015-04-28 10:43:14 +03:00
|
|
|
|
2015-07-29 13:45:33 +03:00
|
|
|
#define BT_L2CAP_CONN_PARAM_ACCEPTED 0x0000
|
|
|
|
#define BT_L2CAP_CONN_PARAM_REJECTED 0x0001
|
|
|
|
|
2015-04-28 10:43:14 +03:00
|
|
|
#define BT_L2CAP_CONN_PARAM_RSP 0x13
|
|
|
|
struct bt_l2cap_conn_param_rsp {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t result;
|
2015-06-04 11:20:48 +07:00
|
|
|
} __packed;
|
2015-04-28 10:43:14 +03:00
|
|
|
|
2015-09-30 14:49:25 +03:00
|
|
|
#define BT_L2CAP_LE_CONN_REQ 0x14
|
|
|
|
struct bt_l2cap_le_conn_req {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t psm;
|
|
|
|
u16_t scid;
|
|
|
|
u16_t mtu;
|
|
|
|
u16_t mps;
|
|
|
|
u16_t credits;
|
2015-09-30 14:49:25 +03:00
|
|
|
} __packed;
|
|
|
|
|
2018-03-20 17:15:48 +01:00
|
|
|
/* valid results in conn response on LE */
|
2018-10-23 09:51:20 +02:00
|
|
|
#define BT_L2CAP_LE_SUCCESS 0x0000
|
|
|
|
#define BT_L2CAP_LE_ERR_PSM_NOT_SUPP 0x0002
|
|
|
|
#define BT_L2CAP_LE_ERR_NO_RESOURCES 0x0004
|
|
|
|
#define BT_L2CAP_LE_ERR_AUTHENTICATION 0x0005
|
|
|
|
#define BT_L2CAP_LE_ERR_AUTHORIZATION 0x0006
|
|
|
|
#define BT_L2CAP_LE_ERR_KEY_SIZE 0x0007
|
|
|
|
#define BT_L2CAP_LE_ERR_ENCRYPTION 0x0008
|
|
|
|
#define BT_L2CAP_LE_ERR_INVALID_SCID 0x0009
|
|
|
|
#define BT_L2CAP_LE_ERR_SCID_IN_USE 0x000A
|
|
|
|
#define BT_L2CAP_LE_ERR_UNACCEPT_PARAMS 0x000B
|
2015-09-30 14:49:25 +03:00
|
|
|
|
|
|
|
#define BT_L2CAP_LE_CONN_RSP 0x15
|
|
|
|
struct bt_l2cap_le_conn_rsp {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t dcid;
|
|
|
|
u16_t mtu;
|
|
|
|
u16_t mps;
|
|
|
|
u16_t credits;
|
|
|
|
u16_t result;
|
2015-09-30 14:49:25 +03:00
|
|
|
};
|
|
|
|
|
2015-10-29 11:14:33 +02:00
|
|
|
#define BT_L2CAP_LE_CREDITS 0x16
|
|
|
|
struct bt_l2cap_le_credits {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t cid;
|
|
|
|
u16_t credits;
|
2015-10-29 11:14:33 +02:00
|
|
|
} __packed;
|
|
|
|
|
2016-01-28 17:09:12 -05:00
|
|
|
#define BT_L2CAP_SDU_HDR_LEN 2
|
|
|
|
|
2017-08-09 09:21:11 +03:00
|
|
|
#if defined(CONFIG_BT_HCI_ACL_FLOW_CONTROL)
|
|
|
|
#define BT_L2CAP_RX_MTU CONFIG_BT_L2CAP_RX_MTU
|
2017-05-04 14:09:10 +03:00
|
|
|
#else
|
2017-08-09 09:21:11 +03:00
|
|
|
#define BT_L2CAP_RX_MTU (CONFIG_BT_RX_BUF_LEN - \
|
2017-02-01 12:49:57 +02:00
|
|
|
BT_HCI_ACL_HDR_SIZE - BT_L2CAP_HDR_SIZE)
|
2017-05-04 14:09:10 +03:00
|
|
|
#endif
|
2017-01-07 17:05:58 +02:00
|
|
|
|
2015-10-02 16:21:18 +03:00
|
|
|
struct bt_l2cap_fixed_chan {
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t cid;
|
2015-09-30 12:36:24 +03:00
|
|
|
int (*accept)(struct bt_conn *conn, struct bt_l2cap_chan **chan);
|
2020-01-28 09:51:44 +01:00
|
|
|
bt_l2cap_chan_destroy_t destroy;
|
2015-09-30 12:36:24 +03:00
|
|
|
};
|
|
|
|
|
2020-01-28 09:51:44 +01:00
|
|
|
#define BT_L2CAP_CHANNEL_DEFINE(_name, _cid, _accept, _destroy) \
|
2019-07-01 18:06:04 +03:00
|
|
|
const Z_STRUCT_SECTION_ITERABLE(bt_l2cap_fixed_chan, _name) = { \
|
2020-01-28 09:51:44 +01:00
|
|
|
.cid = _cid, \
|
|
|
|
.accept = _accept, \
|
|
|
|
.destroy = _destroy, \
|
2019-07-01 18:06:04 +03:00
|
|
|
}
|
|
|
|
|
2019-07-04 12:03:20 -04:00
|
|
|
/* Need a name different than bt_l2cap_fixed_chan for a different section */
|
|
|
|
struct bt_l2cap_br_fixed_chan {
|
|
|
|
u16_t cid;
|
|
|
|
int (*accept)(struct bt_conn *conn, struct bt_l2cap_chan **chan);
|
|
|
|
};
|
2019-07-01 18:06:04 +03:00
|
|
|
|
|
|
|
#define BT_L2CAP_BR_CHANNEL_DEFINE(_name, _cid, _accept) \
|
|
|
|
const Z_STRUCT_SECTION_ITERABLE(bt_l2cap_br_fixed_chan, _name) = { \
|
2019-05-20 15:11:39 +03:00
|
|
|
.cid = _cid, \
|
|
|
|
.accept = _accept, \
|
|
|
|
}
|
2015-09-30 12:36:24 +03:00
|
|
|
|
2015-05-21 19:03:17 +03:00
|
|
|
/* Notify L2CAP channels of a new connection */
|
|
|
|
void bt_l2cap_connected(struct bt_conn *conn);
|
|
|
|
|
|
|
|
/* Notify L2CAP channels of a disconnect event */
|
|
|
|
void bt_l2cap_disconnected(struct bt_conn *conn);
|
|
|
|
|
2016-07-11 13:21:41 +03:00
|
|
|
/* Add channel to the connection */
|
|
|
|
void bt_l2cap_chan_add(struct bt_conn *conn, struct bt_l2cap_chan *chan,
|
|
|
|
bt_l2cap_chan_destroy_t destroy);
|
|
|
|
|
2017-03-21 15:48:03 +02:00
|
|
|
/* Remove channel from the connection */
|
|
|
|
void bt_l2cap_chan_remove(struct bt_conn *conn, struct bt_l2cap_chan *chan);
|
|
|
|
|
2016-07-11 13:21:41 +03:00
|
|
|
/* Delete channel */
|
|
|
|
void bt_l2cap_chan_del(struct bt_l2cap_chan *chan);
|
|
|
|
|
2016-11-03 14:48:07 +02:00
|
|
|
const char *bt_l2cap_chan_state_str(bt_l2cap_chan_state_t state);
|
2017-01-17 11:01:47 +02:00
|
|
|
|
2017-08-09 09:21:11 +03:00
|
|
|
#if defined(CONFIG_BT_DEBUG_L2CAP)
|
2016-11-03 14:48:07 +02:00
|
|
|
void bt_l2cap_chan_set_state_debug(struct bt_l2cap_chan *chan,
|
|
|
|
bt_l2cap_chan_state_t state,
|
|
|
|
const char *func, int line);
|
|
|
|
#define bt_l2cap_chan_set_state(_chan, _state) \
|
|
|
|
bt_l2cap_chan_set_state_debug(_chan, _state, __func__, __LINE__)
|
|
|
|
#else
|
|
|
|
void bt_l2cap_chan_set_state(struct bt_l2cap_chan *chan,
|
|
|
|
bt_l2cap_chan_state_t state);
|
2017-08-09 09:21:11 +03:00
|
|
|
#endif /* CONFIG_BT_DEBUG_L2CAP */
|
2016-11-03 14:48:07 +02:00
|
|
|
|
2016-09-13 09:38:10 +02:00
|
|
|
/*
|
|
|
|
* Notify L2CAP channels of a change in encryption state passing additionally
|
|
|
|
* HCI status of performed security procedure.
|
|
|
|
*/
|
2017-04-20 12:00:29 -05:00
|
|
|
void bt_l2cap_encrypt_change(struct bt_conn *conn, u8_t hci_status);
|
2015-05-21 19:03:17 +03:00
|
|
|
|
2015-04-28 10:43:14 +03:00
|
|
|
/* Prepare an L2CAP PDU to be sent over a connection */
|
2019-08-27 14:23:54 +03:00
|
|
|
struct net_buf *bt_l2cap_create_pdu_timeout(struct net_buf_pool *pool,
|
2020-04-06 13:33:41 +02:00
|
|
|
size_t reserve,
|
|
|
|
k_timeout_t timeout);
|
2019-08-27 14:23:54 +03:00
|
|
|
|
|
|
|
#define bt_l2cap_create_pdu(_pool, _reserve) \
|
|
|
|
bt_l2cap_create_pdu_timeout(_pool, _reserve, K_FOREVER)
|
2015-05-20 14:58:18 +03:00
|
|
|
|
2017-04-04 15:18:18 +03:00
|
|
|
/* Prepare a L2CAP Response PDU to be sent over a connection */
|
|
|
|
struct net_buf *bt_l2cap_create_rsp(struct net_buf *buf, size_t reserve);
|
|
|
|
|
2019-12-02 15:46:00 +02:00
|
|
|
/* Send L2CAP PDU over a connection
|
|
|
|
*
|
|
|
|
* Buffer ownership is transferred to stack so either in case of success
|
|
|
|
* or error the buffer will be unref internally.
|
|
|
|
*
|
|
|
|
* Calling this from RX thread is assumed to never fail so the return can be
|
|
|
|
* ignored.
|
|
|
|
*/
|
|
|
|
int bt_l2cap_send_cb(struct bt_conn *conn, u16_t cid, struct net_buf *buf,
|
|
|
|
bt_conn_tx_cb_t cb, void *user_data);
|
2017-03-17 08:02:57 +02:00
|
|
|
|
2017-04-20 12:00:29 -05:00
|
|
|
static inline void bt_l2cap_send(struct bt_conn *conn, u16_t cid,
|
2017-03-17 08:02:57 +02:00
|
|
|
struct net_buf *buf)
|
|
|
|
{
|
2019-05-21 14:52:16 +03:00
|
|
|
bt_l2cap_send_cb(conn, cid, buf, NULL, NULL);
|
2017-03-17 08:02:57 +02:00
|
|
|
}
|
2015-04-28 10:43:14 +03:00
|
|
|
|
|
|
|
/* Receive a new L2CAP PDU from a connection */
|
2015-10-28 10:41:10 +02:00
|
|
|
void bt_l2cap_recv(struct bt_conn *conn, struct net_buf *buf);
|
2015-04-28 10:43:14 +03:00
|
|
|
|
|
|
|
/* Perform connection parameter update request */
|
2016-02-02 12:48:42 +01:00
|
|
|
int bt_l2cap_update_conn_param(struct bt_conn *conn,
|
|
|
|
const struct bt_le_conn_param *param);
|
2015-05-21 18:53:13 +03:00
|
|
|
|
|
|
|
/* Initialize L2CAP and supported channels */
|
2015-11-03 17:15:40 +02:00
|
|
|
void bt_l2cap_init(void);
|
2015-10-02 16:21:18 +03:00
|
|
|
|
|
|
|
/* Lookup channel by Transmission CID */
|
2016-05-26 14:03:04 +02:00
|
|
|
struct bt_l2cap_chan *bt_l2cap_le_lookup_tx_cid(struct bt_conn *conn,
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t cid);
|
2015-10-02 16:21:18 +03:00
|
|
|
|
|
|
|
/* Lookup channel by Receiver CID */
|
2016-05-26 14:03:04 +02:00
|
|
|
struct bt_l2cap_chan *bt_l2cap_le_lookup_rx_cid(struct bt_conn *conn,
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t cid);
|
2016-04-08 16:00:58 +02:00
|
|
|
|
2016-05-09 22:23:10 +02:00
|
|
|
/* Initialize BR/EDR L2CAP signal layer */
|
|
|
|
void bt_l2cap_br_init(void);
|
2016-05-10 17:26:21 +02:00
|
|
|
|
2016-08-17 14:37:27 +02:00
|
|
|
/* Register fixed channel */
|
|
|
|
void bt_l2cap_br_fixed_chan_register(struct bt_l2cap_fixed_chan *chan);
|
|
|
|
|
2016-05-10 17:26:21 +02:00
|
|
|
/* Notify BR/EDR L2CAP channels about established new ACL connection */
|
|
|
|
void bt_l2cap_br_connected(struct bt_conn *conn);
|
2016-05-26 14:03:04 +02:00
|
|
|
|
|
|
|
/* Lookup BR/EDR L2CAP channel by Receiver CID */
|
|
|
|
struct bt_l2cap_chan *bt_l2cap_br_lookup_rx_cid(struct bt_conn *conn,
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t cid);
|
2016-05-26 14:03:04 +02:00
|
|
|
|
|
|
|
/* Disconnects dynamic channel */
|
|
|
|
int bt_l2cap_br_chan_disconnect(struct bt_l2cap_chan *chan);
|
|
|
|
|
|
|
|
/* Make connection to peer psm server */
|
|
|
|
int bt_l2cap_br_chan_connect(struct bt_conn *conn, struct bt_l2cap_chan *chan,
|
2017-04-20 12:00:29 -05:00
|
|
|
u16_t psm);
|
2016-05-26 14:03:04 +02:00
|
|
|
|
|
|
|
/* Send packet data to connected peer */
|
|
|
|
int bt_l2cap_br_chan_send(struct bt_l2cap_chan *chan, struct net_buf *buf);
|
2016-07-08 16:05:58 +02:00
|
|
|
|
2016-09-13 09:38:10 +02:00
|
|
|
/*
|
|
|
|
* Handle security level changed on link passing HCI status of performed
|
|
|
|
* security procedure.
|
|
|
|
*/
|
2017-04-20 12:00:29 -05:00
|
|
|
void l2cap_br_encrypt_change(struct bt_conn *conn, u8_t hci_status);
|
2016-09-28 16:59:34 +02:00
|
|
|
|
|
|
|
/* Handle received data */
|
|
|
|
void bt_l2cap_br_recv(struct bt_conn *conn, struct net_buf *buf);
|