mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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: Johan Hedberg <johan.hedberg@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
		
							parent
							
								
									1f435424ce
								
							
						
					
					
						commit
						b1c325c23d
					
				
					 1 changed files with 26 additions and 0 deletions
				
			
		| 
						 | 
					@ -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)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue