Bluetooth: Stop ack_timer if ERTM enters in Local Busy or SREJ_SENT
authorGustavo F. Padovan <padovan@profusion.mobi>
Wed, 12 May 2010 21:32:04 +0000 (18:32 -0300)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 21 Jul 2010 17:39:06 +0000 (10:39 -0700)
The ack_timer is implemation specific, disabling it in such situation
avoids some potencial errors in the ERTM protocol.

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 c2fb26d9286cad2f779fede33cc9bee4a57d9217..40cf67c11d2026fedd71ed79fd26efcb6ce7b543 100644 (file)
@@ -3665,6 +3665,8 @@ static int l2cap_push_rx_skb(struct sock *sk, struct sk_buff *skb, u16 control)
 
        pi->conn_state |= L2CAP_CONN_RNR_SENT;
 
+       del_timer(&pi->ack_timer);
+
        queue_work(_busy_wq, &pi->busy_work);
 
        return err;
@@ -3914,6 +3916,8 @@ static inline int l2cap_data_channel_iframe(struct sock *sk, u16 rx_control, str
                pi->conn_state |= L2CAP_CONN_SEND_PBIT;
 
                l2cap_send_srejframe(sk, tx_seq);
+
+               del_timer(&pi->ack_timer);
        }
        return 0;