Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion include/bluetooth/hci.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,15 @@ struct bt_hci_evt_hdr {
#define BT_ACL_START_NO_FLUSH 0x00
#define BT_ACL_CONT 0x01
#define BT_ACL_START 0x02
#define BT_ACL_COMPLETE 0x03

#define bt_acl_handle(h) ((h) & 0x0fff)
#define BT_ACL_POINT_TO_POINT 0x00
#define BT_ACL_BROADCAST 0x01

#define bt_acl_handle(h) ((h) & BIT_MASK(12))
#define bt_acl_flags(h) ((h) >> 12)
#define bt_acl_flags_pb(f) ((f) & BIT_MASK(2))
#define bt_acl_flags_bc(f) ((f) >> 2)
#define bt_acl_handle_pack(h, f) ((h) | ((f) << 12))

struct bt_hci_acl_hdr {
Expand Down
17 changes: 15 additions & 2 deletions subsys/bluetooth/controller/hci/hci.c
Original file line number Diff line number Diff line change
Expand Up @@ -2336,11 +2336,24 @@ int hci_acl_handle(struct net_buf *buf, struct net_buf **evt)

pdu_data = (void *)node_tx->pdu;

if (flags == BT_ACL_START_NO_FLUSH || flags == BT_ACL_START) {
if (bt_acl_flags_bc(flags) != BT_ACL_POINT_TO_POINT) {
return -EINVAL;
}

switch (bt_acl_flags_pb(flags)) {
case BT_ACL_START_NO_FLUSH:
pdu_data->ll_id = PDU_DATA_LLID_DATA_START;
} else {
break;
case BT_ACL_CONT:
pdu_data->ll_id = PDU_DATA_LLID_DATA_CONTINUE;
break;
default:
/* BT_ACL_START and BT_ACL_COMPLETE not allowed on LE-U
* from Host to Controller
*/
return -EINVAL;
}

pdu_data->len = len;
memcpy(&pdu_data->lldata[0], buf->data, len);

Expand Down
4 changes: 4 additions & 0 deletions subsys/bluetooth/host/conn.c
Original file line number Diff line number Diff line change
Expand Up @@ -1168,6 +1168,10 @@ void bt_conn_recv(struct bt_conn *conn, struct net_buf *buf, u8_t flags)

break;
default:
/* BT_ACL_START_NO_FLUSH and BT_ACL_COMPLETE are not allowed on
* LE-U from Controller to Host.
* Only BT_ACL_POINT_TO_POINT is supported.
*/
BT_ERR("Unexpected ACL flags (0x%02x)", flags);
bt_conn_reset_rx_state(conn);
net_buf_unref(buf);
Expand Down