fix(bt/bluedroid): adjust L2CAP round robin msg send strategy

This commit is contained in:
xuzhekai
2024-12-11 11:35:45 +08:00
committed by chenjianhua
parent 100a0570e9
commit 2ccae5330e

View File

@@ -1077,7 +1077,7 @@ void l2c_link_check_send_pkts (tL2C_LCB *p_lcb, tL2C_CCB *p_ccb, BT_HDR *p_buf)
L2CAP_TRACE_ERROR("l2cab is_cong_cback_context");
return;
}
list_node_t* start_p_node = NULL;
/* If we are in a scenario where there are not enough buffers for each link to
** have at least 1, then do a round-robin for all the LCBs
*/
@@ -1092,16 +1092,18 @@ void l2c_link_check_send_pkts (tL2C_LCB *p_lcb, tL2C_CCB *p_ccb, BT_HDR *p_buf)
p_lcb_cur = list_node(p_node);
if (p_lcb_cur == p_lcb) {
p_node = list_next(p_node);
if (p_node) {
p_lcb = list_node(p_node);
}
start_p_node = p_node;
break;
}
}
}
/* Loop through, starting at the next */
for ( ; p_node; p_node = list_next(p_node)) {
do {
/* Check for wraparound */
if (p_node == list_end(l2cb.p_lcb_pool)) {
p_node = list_begin(l2cb.p_lcb_pool);
}
p_lcb = list_node(p_node);
#if (BLE_INCLUDED == TRUE)
L2CAP_TRACE_DEBUG("window = %d,robin_unacked = %d,robin_quota=%d",l2cb.controller_le_xmit_window,l2cb.ble_round_robin_unacked,l2cb.ble_round_robin_quota);
@@ -1118,20 +1120,22 @@ void l2c_link_check_send_pkts (tL2C_LCB *p_lcb, tL2C_CCB *p_ccb, BT_HDR *p_buf)
#else
))
#endif ///BLE_INCLUDED == TRUE
{
break;
}
/* Check for wraparound */
if (p_node == list_end(l2cb.p_lcb_pool)) {
p_node = list_begin(l2cb.p_lcb_pool);
p_lcb = list_node(p_node);
}
L2CAP_TRACE_DEBUG("in_use=%d,segment_being_sent=%d,link_state=%d,link_xmit_quota=%d",p_lcb->in_use,p_lcb->partial_segment_being_sent,p_lcb->link_state,p_lcb->link_xmit_quota);
if ( (!p_lcb->in_use)
|| (p_lcb->partial_segment_being_sent)
|| (p_lcb->link_state != LST_CONNECTED)
|| (p_lcb->link_xmit_quota != 0)
|| (L2C_LINK_CHECK_POWER_MODE (p_lcb)) ) {
p_node = list_next(p_node);
continue;
}
@@ -1148,7 +1152,8 @@ void l2c_link_check_send_pkts (tL2C_LCB *p_lcb, tL2C_CCB *p_ccb, BT_HDR *p_buf)
else if ((p_buf = l2cu_get_next_buffer_to_send (p_lcb)) != NULL) {
l2c_link_send_to_lower (p_lcb, p_buf);
}
}
p_node = list_next(p_node);
} while (p_node != start_p_node);
/* If we finished without using up our quota, no need for a safety check */
if ( (l2cb.controller_xmit_window > 0)