This frees resources associated with duplicate filter timer when destroying management IO. --- mesh/mesh-io-mgmt.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mesh/mesh-io-mgmt.c b/mesh/mesh-io-mgmt.c index f1385edcc..5f51f3a1f 100644 --- a/mesh/mesh-io-mgmt.c +++ b/mesh/mesh-io-mgmt.c @@ -35,6 +35,7 @@ struct mesh_io_private { struct mesh_io *io; void *user_data; struct l_timeout *tx_timeout; + struct l_timeout *dup_timeout; struct l_queue *dup_filters; struct l_queue *rx_regs; struct l_queue *tx_pkts; @@ -146,6 +147,7 @@ static void filter_timeout(struct l_timeout *timeout, void *user_data) done: l_timeout_remove(timeout); + pvt->dup_timeout = NULL; } /* Ignore consequtive duplicate advertisements within timeout period */ @@ -179,7 +181,8 @@ static bool filter_dups(const uint8_t *addr, const uint8_t *adv, /* Start filter expiration timer */ if (!l_queue_length(pvt->dup_filters)) - l_timeout_create(1, filter_timeout, NULL, NULL); + pvt->dup_timeout = l_timeout_create(1, filter_timeout, NULL, + NULL); l_queue_push_head(pvt->dup_filters, filter); instant_delta = instant - filter->instant; @@ -474,6 +477,7 @@ static bool dev_destroy(struct mesh_io *io) mesh_mgmt_unregister(pvt->rx_id); mesh_mgmt_unregister(pvt->tx_id); l_timeout_remove(pvt->tx_timeout); + l_timeout_remove(pvt->dup_timeout); l_queue_destroy(pvt->dup_filters, l_free); l_queue_destroy(pvt->rx_regs, free_rx_reg); l_queue_destroy(pvt->tx_pkts, l_free); -- 2.39.2