Bluetooth: Check earlier for L2CAP ERTM frames to drop
authorMat Martineau <mathewm@codeaurora.org>
Wed, 29 Jun 2011 21:35:19 +0000 (14:35 -0700)
committerJaikumar Ganesh <jaikumar@google.com>
Mon, 11 Jul 2011 18:59:28 +0000 (11:59 -0700)
Even when the received tx_seq is expected, the frame still needs to be
dropped if the TX window is exceeded or the receiver is in the local
busy state.

Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
net/bluetooth/l2cap_core.c

index 45976899ce572c75b82ba22bf65b4b9dcc3f03d4..1160c5c9b6fe673b58a219d7218e2fbea07bc9cd 100644 (file)
@@ -3523,9 +3523,6 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont
        chan->expected_ack_seq = req_seq;
        l2cap_drop_acked_frames(chan);
 
-       if (tx_seq == chan->expected_tx_seq)
-               goto expected;
-
        tx_seq_offset = (tx_seq - chan->buffer_seq) % 64;
        if (tx_seq_offset < 0)
                tx_seq_offset += 64;
@@ -3539,6 +3536,9 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont
        if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
                goto drop;
 
+       if (tx_seq == chan->expected_tx_seq)
+               goto expected;
+
        if (test_bit(CONN_SREJ_SENT, &chan->conn_state)) {
                struct srej_list *first;