2020-11-06 22:49:48

by Michael N. Moran

[permalink] [raw]
Subject: [PATCH BlueZ] mesh: Only deregister io for the last network detached

When multiple mesh networks are active and one is detached
using Leave(), the I/O to all networks is halted.

This patch prevents that by only deregistering the I/O
if all networks have been detached.

---
mesh/net.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/mesh/net.c b/mesh/net.c
index 01a475d74..9e0ea860f 100644
--- a/mesh/net.c
+++ b/mesh/net.c
@@ -2899,8 +2899,12 @@ struct mesh_io *mesh_net_detach(struct mesh_net *net)
io = net->io;

mesh_io_send_cancel(net->io, &type, 1);
- mesh_io_deregister_recv_cb(io, snb, sizeof(snb));
- mesh_io_deregister_recv_cb(io, pkt, sizeof(pkt));
+
+ /* Only deregister io if this is the last network detached.*/
+ if (l_queue_length(nets) < 2) {
+ mesh_io_deregister_recv_cb(io, snb, sizeof(snb));
+ mesh_io_deregister_recv_cb(io, pkt, sizeof(pkt));
+ }

net->io = NULL;
l_queue_remove(nets, net);
--
2.26.2


2020-11-10 18:29:38

by Gix, Brian

[permalink] [raw]
Subject: Re: [PATCH BlueZ] mesh: Only deregister io for the last network detached

Applied

On Fri, 2020-11-06 at 17:48 -0500, Michael N. Moran wrote:
> When multiple mesh networks are active and one is detached
> using Leave(), the I/O to all networks is halted.
>
> This patch prevents that by only deregistering the I/O
> if all networks have been detached.
>
> ---
> mesh/net.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/mesh/net.c b/mesh/net.c
> index 01a475d74..9e0ea860f 100644
> --- a/mesh/net.c
> +++ b/mesh/net.c
> @@ -2899,8 +2899,12 @@ struct mesh_io *mesh_net_detach(struct mesh_net *net)
> io = net->io;
>
> mesh_io_send_cancel(net->io, &type, 1);
> - mesh_io_deregister_recv_cb(io, snb, sizeof(snb));
> - mesh_io_deregister_recv_cb(io, pkt, sizeof(pkt));
> +
> + /* Only deregister io if this is the last network detached.*/
> + if (l_queue_length(nets) < 2) {
> + mesh_io_deregister_recv_cb(io, snb, sizeof(snb));
> + mesh_io_deregister_recv_cb(io, pkt, sizeof(pkt));
> + }
>
> net->io = NULL;
> l_queue_remove(nets, net);