mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-10-03 05:37:23 +00:00
btshell: Add better handling on stalled CoC
This commit is contained in:
@@ -72,6 +72,7 @@ SLIST_HEAD(btshell_svc_list, btshell_svc);
|
|||||||
struct btshell_l2cap_coc {
|
struct btshell_l2cap_coc {
|
||||||
SLIST_ENTRY(btshell_l2cap_coc) next;
|
SLIST_ENTRY(btshell_l2cap_coc) next;
|
||||||
struct ble_l2cap_chan *chan;
|
struct ble_l2cap_chan *chan;
|
||||||
|
bool stalled;
|
||||||
};
|
};
|
||||||
|
|
||||||
SLIST_HEAD(btshell_l2cap_coc_list, btshell_l2cap_coc);
|
SLIST_HEAD(btshell_l2cap_coc_list, btshell_l2cap_coc);
|
||||||
|
|||||||
+37
-1
@@ -2209,6 +2209,31 @@ btshell_l2cap_coc_accept(uint16_t conn_handle, uint16_t peer_mtu,
|
|||||||
return ble_l2cap_recv_ready(chan, sdu_rx);
|
return ble_l2cap_recv_ready(chan, sdu_rx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
btshell_l2cap_coc_unstalled(uint16_t conn_handle, struct ble_l2cap_chan *chan)
|
||||||
|
{
|
||||||
|
struct btshell_conn *conn;
|
||||||
|
struct btshell_l2cap_coc *coc;
|
||||||
|
struct btshell_l2cap_coc *cur;
|
||||||
|
|
||||||
|
conn = btshell_conn_find(conn_handle);
|
||||||
|
assert(conn != NULL);
|
||||||
|
|
||||||
|
coc = NULL;
|
||||||
|
SLIST_FOREACH(cur, &conn->coc_list, next) {
|
||||||
|
if (cur->chan == chan) {
|
||||||
|
coc = cur;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!coc) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
coc->stalled = false;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
btshell_l2cap_event(struct ble_l2cap_event *event, void *arg)
|
btshell_l2cap_event(struct ble_l2cap_event *event, void *arg)
|
||||||
{
|
{
|
||||||
@@ -2290,6 +2315,7 @@ btshell_l2cap_event(struct ble_l2cap_event *event, void *arg)
|
|||||||
case BLE_L2CAP_EVENT_COC_TX_UNSTALLED:
|
case BLE_L2CAP_EVENT_COC_TX_UNSTALLED:
|
||||||
console_printf("L2CAP CoC channel %p unstalled, last sdu sent with err=0x%02x\n",
|
console_printf("L2CAP CoC channel %p unstalled, last sdu sent with err=0x%02x\n",
|
||||||
event->tx_unstalled.chan, event->tx_unstalled.status);
|
event->tx_unstalled.chan, event->tx_unstalled.status);
|
||||||
|
btshell_l2cap_coc_unstalled(event->tx_unstalled.conn_handle, event->tx_unstalled.chan);
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
@@ -2457,6 +2483,11 @@ btshell_l2cap_send(uint16_t conn_handle, uint16_t idx, uint16_t bytes)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (coc->stalled) {
|
||||||
|
console_printf("Channel is stalled, wait ...\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
sdu_tx = os_mbuf_get_pkthdr(&sdu_os_mbuf_pool, 0);
|
sdu_tx = os_mbuf_get_pkthdr(&sdu_os_mbuf_pool, 0);
|
||||||
if (sdu_tx == NULL) {
|
if (sdu_tx == NULL) {
|
||||||
console_printf("No memory in the test sdu pool\n");
|
console_printf("No memory in the test sdu pool\n");
|
||||||
@@ -2486,7 +2517,12 @@ btshell_l2cap_send(uint16_t conn_handle, uint16_t idx, uint16_t bytes)
|
|||||||
|
|
||||||
rc = ble_l2cap_send(coc->chan, sdu_tx);
|
rc = ble_l2cap_send(coc->chan, sdu_tx);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
console_printf("Could not send data rc=%d\n", rc);
|
if (rc == BLE_HS_ESTALLED) {
|
||||||
|
console_printf("CoC module is stalled with data. Wait for unstalled \n");
|
||||||
|
coc->stalled = true;
|
||||||
|
} else {
|
||||||
|
console_printf("Could not send data rc=%d\n", rc);
|
||||||
|
}
|
||||||
os_mbuf_free_chain(sdu_tx);
|
os_mbuf_free_chain(sdu_tx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user