aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorMat Martineau <mathewm@codeaurora.org>2012-04-25 19:36:12 -0400
committerGustavo Padovan <gustavo@padovan.org>2012-05-09 00:40:46 -0400
commit5a364bd399d23fe6244de8f84c46f249b763c723 (patch)
tree5c271070d45e9edd8f7e641ea595a0537f172e69 /include
parent2a8ff6112df887f36b36a051dbe3d45c386d60ea (diff)
Bluetooth: Improve ERTM sequence number offset calculation
Instead of using modular division, the offset can be calculated using only addition and subtraction. The previous calculation did not work as intended and was more difficult to understand, involving unsigned integer underflow and a check for a negative value where one was not possible. Signed-off-by: Mat Martineau <mathewm@codeaurora.org> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Gustavo Padovan <gustavo@padovan.org>
Diffstat (limited to 'include')
-rw-r--r--include/net/bluetooth/l2cap.h11
1 files changed, 4 insertions, 7 deletions
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h
index 86bb83bc6a4f..084dec001bf2 100644
--- a/include/net/bluetooth/l2cap.h
+++ b/include/net/bluetooth/l2cap.h
@@ -724,13 +724,10 @@ static inline bool l2cap_clear_timer(struct l2cap_chan *chan,
724 724
725static inline int __seq_offset(struct l2cap_chan *chan, __u16 seq1, __u16 seq2) 725static inline int __seq_offset(struct l2cap_chan *chan, __u16 seq1, __u16 seq2)
726{ 726{
727 int offset; 727 if (seq1 >= seq2)
728 728 return seq1 - seq2;
729 offset = (seq1 - seq2) % (chan->tx_win_max + 1); 729 else
730 if (offset < 0) 730 return chan->tx_win_max + 1 - seq2 + seq1;
731 offset += (chan->tx_win_max + 1);
732
733 return offset;
734} 731}
735 732
736static inline __u16 __next_seq(struct l2cap_chan *chan, __u16 seq) 733static inline __u16 __next_seq(struct l2cap_chan *chan, __u16 seq)