Bluetooth: host: extract sending of host num complete

The functionality is moved in preparation of the next commit which will
re-use this function from somewhere else.

Also add (default-on) asserts that we are able to allocate and send the
command. If that is not the case, we will leak buffers from the PoV of
the controller, leading to a stall in data transfer.

Depending on the error, we could probably recover using a disconnection.
For now, do the safe thing and stop the whole stack.

Signed-off-by: Jonathan Rico <jonathan.rico@nordicsemi.no>
This commit is contained in:
Jonathan Rico 2024-07-11 14:55:56 +02:00 committed by Anas Nashif
commit 32212bfb63

View file

@ -228,13 +228,39 @@ static void handle_vs_event(uint8_t event, struct net_buf *buf,
/* Other possible errors are handled by handle_event_common function */
}
void bt_send_one_host_num_completed_packets(uint16_t handle)
{
if (!IS_ENABLED(CONFIG_BT_HCI_ACL_FLOW_CONTROL)) {
ARG_UNUSED(handle);
return;
}
struct bt_hci_cp_host_num_completed_packets *cp;
struct bt_hci_handle_count *hc;
struct net_buf *buf;
int err;
LOG_DBG("Reporting completed packet for handle %u", handle);
buf = bt_hci_cmd_create(BT_HCI_OP_HOST_NUM_COMPLETED_PACKETS,
sizeof(*cp) + sizeof(*hc));
BT_ASSERT_MSG(buf, "Unable to alloc for Host NCP");
cp = net_buf_add(buf, sizeof(*cp));
cp->num_handles = sys_cpu_to_le16(1);
hc = net_buf_add(buf, sizeof(*hc));
hc->handle = sys_cpu_to_le16(handle);
hc->count = sys_cpu_to_le16(1);
err = bt_hci_cmd_send(BT_HCI_OP_HOST_NUM_COMPLETED_PACKETS, buf);
BT_ASSERT_MSG(err == 0, "Unable to send Host NCP (err %d)", err);
}
#if defined(CONFIG_BT_HCI_ACL_FLOW_CONTROL)
void bt_hci_host_num_completed_packets(struct net_buf *buf)
{
struct bt_hci_cp_host_num_completed_packets *cp;
uint16_t handle = acl(buf)->handle;
struct bt_hci_handle_count *hc;
struct bt_conn *conn;
uint8_t index = acl(buf)->index;
@ -260,23 +286,7 @@ void bt_hci_host_num_completed_packets(struct net_buf *buf)
bt_conn_unref(conn);
LOG_DBG("Reporting completed packet for handle %u", handle);
buf = bt_hci_cmd_create(BT_HCI_OP_HOST_NUM_COMPLETED_PACKETS,
sizeof(*cp) + sizeof(*hc));
if (!buf) {
LOG_ERR("Unable to allocate new HCI command");
return;
}
cp = net_buf_add(buf, sizeof(*cp));
cp->num_handles = sys_cpu_to_le16(1);
hc = net_buf_add(buf, sizeof(*hc));
hc->handle = sys_cpu_to_le16(handle);
hc->count = sys_cpu_to_le16(1);
bt_hci_cmd_send(BT_HCI_OP_HOST_NUM_COMPLETED_PACKETS, buf);
bt_send_one_host_num_completed_packets(handle);
}
#endif /* defined(CONFIG_BT_HCI_ACL_FLOW_CONTROL) */