Commit b1c325c2 authored by Johan Hedberg's avatar Johan Hedberg Committed by Marcel Holtmann

Bluetooth: Implement returning of LE L2CAP credits

We should return credits to the remote side whenever they fall below a
certain level (in our case under half of the initially given amount).
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 1f435424
...@@ -6610,6 +6610,32 @@ static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) ...@@ -6610,6 +6610,32 @@ static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
return 0; return 0;
} }
static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
{
struct l2cap_conn *conn = chan->conn;
struct l2cap_le_credits pkt;
u16 return_credits;
/* We return more credits to the sender only after the amount of
* credits falls below half of the initial amount.
*/
if (chan->rx_credits >= (L2CAP_LE_MAX_CREDITS + 1) / 2)
return;
return_credits = L2CAP_LE_MAX_CREDITS - chan->rx_credits;
BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
chan->rx_credits += return_credits;
pkt.cid = cpu_to_le16(chan->scid);
pkt.credits = cpu_to_le16(return_credits);
chan->ident = l2cap_get_ident(conn);
l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
}
static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid, static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
struct sk_buff *skb) struct sk_buff *skb)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment