set_recv_scan_enable, pvt, NULL);
}
+static bool simple_match(const void *a, const void *b)
+{
+ return a == b;
+}
+
+static bool find_by_ad_type(const void *a, const void *b)
+{
+ const struct tx_pkt *tx = a;
+ uint8_t ad_type = L_PTR_TO_UINT(b);
+
+ return !ad_type || ad_type == tx->pkt[0];
+}
+
+static bool find_by_pattern(const void *a, const void *b)
+{
+ const struct tx_pkt *tx = a;
+ const struct tx_pattern *pattern = b;
+
+ if (tx->len < pattern->len)
+ return false;
+
+ return (!memcmp(tx->pkt, pattern->data, pattern->len));
+}
+
static bool find_active(const void *a, const void *b)
{
const struct pvt_rx_reg *rx_reg = a;
&cmd, sizeof(cmd),
set_send_adv_enable, pvt, NULL);
done:
- if (tx->delete)
+ if (tx->delete) {
+ l_queue_remove_if(pvt->tx_pkts, simple_match, tx);
l_free(tx);
+ }
pvt->tx = NULL;
}
{
struct bt_hci_cmd_le_set_adv_enable cmd;
- if (pvt->tx && pvt->tx->delete)
+ /* Delete superseded packet in favor of new packet */
+ if (pvt->tx && pvt->tx != tx && pvt->tx->delete) {
+ l_queue_remove_if(pvt->tx_pkts, simple_match, pvt->tx);
l_free(pvt->tx);
+ }
pvt->tx = tx;
pvt->interval = interval;
return true;
}
-static bool find_by_ad_type(const void *a, const void *b)
-{
- const struct tx_pkt *tx = a;
- uint8_t ad_type = L_PTR_TO_UINT(b);
-
- return !ad_type || ad_type == tx->pkt[0];
-}
-
-static bool find_by_pattern(const void *a, const void *b)
-{
- const struct tx_pkt *tx = a;
- const struct tx_pattern *pattern = b;
-
- if (tx->len < pattern->len)
- return false;
-
- return (!memcmp(tx->pkt, pattern->data, pattern->len));
-}
-
static bool tx_cancel(struct mesh_io *io, const uint8_t *data, uint8_t len)
{
struct mesh_io_private *pvt = io->pvt;