Commit d73a0988 authored by Andrei Emeltchenko's avatar Andrei Emeltchenko Committed by Gustavo Padovan

Bluetooth: AMP: Handle complete frames in l2cap

Check flags type in switch statement and handle new frame
type ACL_COMPLETE used for High Speed data over AMP.
Signed-off-by: default avatarAndrei Emeltchenko <andrei.emeltchenko@intel.com>
Acked-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarGustavo Padovan <gustavo.padovan@collabora.co.uk>
parent 204a6e54
...@@ -198,6 +198,7 @@ enum { ...@@ -198,6 +198,7 @@ enum {
#define ACL_START_NO_FLUSH 0x00 #define ACL_START_NO_FLUSH 0x00
#define ACL_CONT 0x01 #define ACL_CONT 0x01
#define ACL_START 0x02 #define ACL_START 0x02
#define ACL_COMPLETE 0x03
#define ACL_ACTIVE_BCAST 0x04 #define ACL_ACTIVE_BCAST 0x04
#define ACL_PICO_BCAST 0x08 #define ACL_PICO_BCAST 0x08
......
...@@ -5568,6 +5568,8 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) ...@@ -5568,6 +5568,8 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags) int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
{ {
struct l2cap_conn *conn = hcon->l2cap_data; struct l2cap_conn *conn = hcon->l2cap_data;
struct l2cap_hdr *hdr;
int len;
if (!conn) if (!conn)
conn = l2cap_conn_add(hcon, 0); conn = l2cap_conn_add(hcon, 0);
...@@ -5577,10 +5579,10 @@ int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags) ...@@ -5577,10 +5579,10 @@ int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags); BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
if (!(flags & ACL_CONT)) { switch (flags) {
struct l2cap_hdr *hdr; case ACL_START:
int len; case ACL_START_NO_FLUSH:
case ACL_COMPLETE:
if (conn->rx_len) { if (conn->rx_len) {
BT_ERR("Unexpected start frame (len %d)", skb->len); BT_ERR("Unexpected start frame (len %d)", skb->len);
kfree_skb(conn->rx_skb); kfree_skb(conn->rx_skb);
...@@ -5622,7 +5624,9 @@ int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags) ...@@ -5622,7 +5624,9 @@ int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len), skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
skb->len); skb->len);
conn->rx_len = len - skb->len; conn->rx_len = len - skb->len;
} else { break;
case ACL_CONT:
BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len); BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
if (!conn->rx_len) { if (!conn->rx_len) {
...@@ -5650,6 +5654,7 @@ int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags) ...@@ -5650,6 +5654,7 @@ int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
l2cap_recv_frame(conn, conn->rx_skb); l2cap_recv_frame(conn, conn->rx_skb);
conn->rx_skb = NULL; conn->rx_skb = NULL;
} }
break;
} }
drop: drop:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment