Bluetooth: Group the ack of I-frames into l2cap_data_channel_rrframe()
authorGustavo F. Padovan <padovan@profusion.mobi>
Sat, 1 May 2010 19:15:38 +0000 (16:15 -0300)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 10 May 2010 07:28:47 +0000 (09:28 +0200)
It also fix a bug: we weren't acknowledging I-frames when P=1.
Note that when F=1 we are acknowledging packets before setting
RemoteBusy to False. The spec says we should do that in the opposite
order, but acknowledment of packets doesn't care about RemoteBusy flag
so we can do that in the order we want.

Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
Reviewed-by: João Paulo Rechi Vita <jprvita@profusion.mobi>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/l2cap.c

index 8937a842347a25886c3061a077bb656e9683eab3..d096c7c11ab5533aab49dd277feb12bc89c18811 100644 (file)
@@ -3494,7 +3494,9 @@ expected:
 static inline void l2cap_data_channel_rrframe(struct sock *sk, u16 rx_control)
 {
        struct l2cap_pinfo *pi = l2cap_pi(sk);
-       u8 tx_seq = __get_reqseq(rx_control);
+
+       pi->expected_ack_seq = __get_reqseq(rx_control);
+       l2cap_drop_acked_frames(sk);
 
        if (rx_control & L2CAP_CTRL_POLL) {
                l2cap_send_i_or_rr_or_rnr(sk);
@@ -3502,8 +3504,6 @@ static inline void l2cap_data_channel_rrframe(struct sock *sk, u16 rx_control)
 
        } else if (rx_control & L2CAP_CTRL_FINAL) {
                pi->conn_state &= ~L2CAP_CONN_REMOTE_BUSY;
-               pi->expected_ack_seq = tx_seq;
-               l2cap_drop_acked_frames(sk);
 
                if (pi->conn_state & L2CAP_CONN_REJ_ACT)
                        pi->conn_state &= ~L2CAP_CONN_REJ_ACT;
@@ -3514,9 +3514,6 @@ static inline void l2cap_data_channel_rrframe(struct sock *sk, u16 rx_control)
                }
 
        } else {
-               pi->expected_ack_seq = tx_seq;
-               l2cap_drop_acked_frames(sk);
-
                if ((pi->conn_state & L2CAP_CONN_REMOTE_BUSY) &&
                                (pi->unacked_frames > 0))
                        __mod_retrans_timer();