diff mbox series

[BlueZ] mesh: Add guard against wedging outbound queue

Message ID 20200729155234.547679-1-brian.gix@intel.com (mailing list archive)
State Accepted
Headers show
Series [BlueZ] mesh: Add guard against wedging outbound queue | expand

Commit Message

Brian Gix July 29, 2020, 3:52 p.m. UTC
When using HCI command chains, the first packet send that starts an
outbound sequence needs to still exist when command chain completes, or
the outbound queue will wedge.  The simplest solution is to send packets
at least twice on an empty queue, if there is a chance it could be canceled.
---
 mesh/mesh-io-generic.c | 8 ++++++++
 1 file changed, 8 insertions(+)

Comments

Brian Gix July 29, 2020, 7 p.m. UTC | #1
Applied
On Wed, 2020-07-29 at 08:52 -0700, Brian Gix wrote:
> When using HCI command chains, the first packet send that starts an
> outbound sequence needs to still exist when command chain completes, or
> the outbound queue will wedge.  The simplest solution is to send packets
> at least twice on an empty queue, if there is a chance it could be canceled.
> ---
>  mesh/mesh-io-generic.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/mesh/mesh-io-generic.c b/mesh/mesh-io-generic.c
> index 86952516e..4b26b1181 100644
> --- a/mesh/mesh-io-generic.c
> +++ b/mesh/mesh-io-generic.c
> @@ -714,6 +714,14 @@ static bool send_tx(struct mesh_io *io, struct mesh_io_send_info *info,
>  			sending = !l_queue_isempty(pvt->tx_pkts);
>  
>  		l_queue_push_tail(pvt->tx_pkts, tx);
> +
> +		/*
> +		 * If transmitter is idle, send packets at least twice to
> +		 * guard against in-line cancelation of HCI command chain.
> +		 */
> +		if (info->type == MESH_IO_TIMING_TYPE_GENERAL && !sending &&
> +							tx->info.u.gen.cnt == 1)
> +			tx->info.u.gen.cnt++;
>  	}
>  
>  	if (!sending) {
diff mbox series

Patch

diff --git a/mesh/mesh-io-generic.c b/mesh/mesh-io-generic.c
index 86952516e..4b26b1181 100644
--- a/mesh/mesh-io-generic.c
+++ b/mesh/mesh-io-generic.c
@@ -714,6 +714,14 @@  static bool send_tx(struct mesh_io *io, struct mesh_io_send_info *info,
 			sending = !l_queue_isempty(pvt->tx_pkts);
 
 		l_queue_push_tail(pvt->tx_pkts, tx);
+
+		/*
+		 * If transmitter is idle, send packets at least twice to
+		 * guard against in-line cancelation of HCI command chain.
+		 */
+		if (info->type == MESH_IO_TIMING_TYPE_GENERAL && !sending &&
+							tx->info.u.gen.cnt == 1)
+			tx->info.u.gen.cnt++;
 	}
 
 	if (!sending) {