diff options
author | Gustavo F. Padovan <gustavo@las.ic.unicamp.br> | 2009-10-03 01:34:37 -0400 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-12-03 13:34:23 -0500 |
commit | 889a3ca466018ab68363c3168993793bc2d984f1 (patch) | |
tree | c3247c246d982546eb19328efff9253a8e2b5155 /net | |
parent | 0565c1c24af94130b891f989fa608faddfadc52c (diff) |
Bluetooth: Fix unset of SrejActioned flag
SrejActioned is a flag that when set prevents local side to retransmit a
I-frame(the data frame) already retransmitted. The local entity can
retransmit again only when it receives a SREJ frame with the F-bit set.
SREJ frame - Selective Reject frame - is sent when an entity wants the
retransmission of a specific I-frame that was lost or corrupted.
This bug can put ERTM in an unknown state once the entity can't
retransmit.
A frame with the Final bit set is expected when the local side sends a
frame with the Poll bit set due to a local busy condition or a
retransmission timer expired. (Receipt of P-bit shall always be replied by
a frame with the F-bit set).
pi->conn_state keeps informations about many ERTM flags including
SrejActioned.
Signed-off-by: Gustavo F. Padovan <gustavo@las.ic.unicamp.br>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net')
-rw-r--r-- | net/bluetooth/l2cap.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index dfd0327cf8da..2d5d37545b10 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
@@ -3443,7 +3443,7 @@ static inline int l2cap_data_channel_sframe(struct sock *sk, u16 rx_control, str | |||
3443 | } else if (rx_control & L2CAP_CTRL_FINAL) { | 3443 | } else if (rx_control & L2CAP_CTRL_FINAL) { |
3444 | if ((pi->conn_state & L2CAP_CONN_SREJ_ACT) && | 3444 | if ((pi->conn_state & L2CAP_CONN_SREJ_ACT) && |
3445 | pi->srej_save_reqseq == tx_seq) | 3445 | pi->srej_save_reqseq == tx_seq) |
3446 | pi->srej_save_reqseq &= ~L2CAP_CONN_SREJ_ACT; | 3446 | pi->conn_state &= ~L2CAP_CONN_SREJ_ACT; |
3447 | else | 3447 | else |
3448 | l2cap_retransmit_frame(sk, tx_seq); | 3448 | l2cap_retransmit_frame(sk, tx_seq); |
3449 | } | 3449 | } |