| From e76a8b550df6ccca4a248f02383d3e5e9635962d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 4 Sep 2018 13:39:22 +0300 |
| Subject: Bluetooth: L2CAP: Detect if remote is not able to use the whole MPS |
| |
| From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> |
| |
| [ Upstream commit a5c3021bb62b970713550db3f7fd08aa70665d7e ] |
| |
| If the remote is not able to fully utilize the MPS choosen recalculate |
| the credits based on the actual amount it is sending that way it can |
| still send packets of MTU size without credits dropping to 0. |
| |
| Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> |
| Signed-off-by: Marcel Holtmann <marcel@holtmann.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/bluetooth/l2cap_core.c | 10 ++++++++++ |
| 1 file changed, 10 insertions(+) |
| |
| diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c |
| index 260ef5426e0ca..974c1b8a689c1 100644 |
| --- a/net/bluetooth/l2cap_core.c |
| +++ b/net/bluetooth/l2cap_core.c |
| @@ -6819,6 +6819,16 @@ static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) |
| chan->sdu_len = sdu_len; |
| chan->sdu_last_frag = skb; |
| |
| + /* Detect if remote is not able to use the selected MPS */ |
| + if (skb->len + L2CAP_SDULEN_SIZE < chan->mps) { |
| + u16 mps_len = skb->len + L2CAP_SDULEN_SIZE; |
| + |
| + /* Adjust the number of credits */ |
| + BT_DBG("chan->mps %u -> %u", chan->mps, mps_len); |
| + chan->mps = mps_len; |
| + l2cap_chan_le_send_credits(chan); |
| + } |
| + |
| return 0; |
| } |
| |
| -- |
| 2.20.1 |
| |