]> Pileus Git - ~andy/linux/blobdiff - net/bluetooth/l2cap.c
Bluetooth: Acknowledge L2CAP packets when receiving RR-frames (F-bit=1)
[~andy/linux] / net / bluetooth / l2cap.c
index efac637525f1942a94dd1e071776dd8e413acae0..0a36c61c011fc7c1d4c774053f5a0696b89a215c 100644 (file)
@@ -2924,7 +2924,7 @@ static inline int l2cap_information_req(struct l2cap_conn *conn, struct l2cap_cm
                if (enable_ertm)
                        feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
                                                         | L2CAP_FEAT_FCS;
-               put_unaligned(cpu_to_le32(feat_mask), (__le32 *) rsp->data);
+               put_unaligned_le32(feat_mask, rsp->data);
                l2cap_send_cmd(conn, cmd->ident,
                                        L2CAP_INFO_RSP, sizeof(buf), buf);
        } else if (type == L2CAP_IT_FIXED_CHAN) {
@@ -3348,9 +3348,13 @@ static inline int l2cap_data_channel_sframe(struct sock *sk, u16 rx_control, str
        case L2CAP_SUPER_RCV_READY:
                if (rx_control & L2CAP_CTRL_POLL) {
                        u16 control = L2CAP_CTRL_FINAL;
-                       control |= L2CAP_SUPER_RCV_READY;
+                       control |= L2CAP_SUPER_RCV_READY |
+                               (pi->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT);
                        l2cap_send_sframe(l2cap_pi(sk), control);
                } else if (rx_control & L2CAP_CTRL_FINAL) {
+                       pi->expected_ack_seq = tx_seq;
+                       l2cap_drop_acked_frames(sk);
+
                        if (!(pi->conn_state & L2CAP_CONN_WAIT_F))
                                break;
 
@@ -3572,7 +3576,7 @@ static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
                break;
 
        case L2CAP_CID_CONN_LESS:
-               psm = get_unaligned((__le16 *) skb->data);
+               psm = get_unaligned_le16(skb->data);
                skb_pull(skb, 2);
                l2cap_conless_channel(conn, psm, skb);
                break;