public inbox for iwd@lists.linux.dev
 help / color / mirror / Atom feed
From: James Prestwood <prestwoj@gmail.com>
To: iwd@lists.linux.dev
Cc: James Prestwood <prestwoj@gmail.com>
Subject: [PATCH 01/14] network: add network_bss_list_prune
Date: Wed,  7 Aug 2024 11:14:14 -0700	[thread overview]
Message-ID: <20240807181427.170515-1-prestwoj@gmail.com> (raw)

This adds a new API meant to replace network_bss_list_clear. Instead
of clearing the entirely network->bss_list on each scan we can
instead just prune out entries that didn't show up in the scan.
The network_bss_add API was also updated to prepare for
network_bss_list_prune by removing existing entries, as now even
"new" entries may exist in the list still and need to be removed.
---
 src/network.c | 43 ++++++++++++++++++++++++++++++++++++-------
 src/network.h |  2 ++
 2 files changed, 38 insertions(+), 7 deletions(-)

diff --git a/src/network.c b/src/network.c
index 09099fac..6d7e5ec4 100644
--- a/src/network.c
+++ b/src/network.c
@@ -1129,8 +1129,17 @@ bool network_update_known_frequencies(struct network *network)
 	return true;
 }
 
+static bool match_addr(const void *a, const void *b)
+{
+	const struct scan_bss *bss = a;
+
+	return memcmp(bss->addr, b, 6) == 0;
+}
+
 bool network_bss_add(struct network *network, struct scan_bss *bss)
 {
+	l_queue_remove_if(network->bss_list, match_addr, bss->addr);
+
 	if (!l_queue_insert(network->bss_list, bss, scan_bss_rank_compare,
 									NULL))
 		return false;
@@ -1150,13 +1159,6 @@ bool network_bss_add(struct network *network, struct scan_bss *bss)
 	return true;
 }
 
-static bool match_addr(const void *a, const void *b)
-{
-	const struct scan_bss *bss = a;
-
-	return memcmp(bss->addr, b, 6) == 0;
-}
-
 /*
  * Replaces an old scan_bss (if exists) in the bss list with a new bss object.
  * Note this BSS is *not* freed and must be by the caller. scan_bss objects are
@@ -1188,6 +1190,33 @@ void network_bss_list_clear(struct network *network)
 	network->bss_list = l_queue_new();
 }
 
+struct network_prune_data {
+	struct network *network;
+	struct l_queue *new_list;
+};
+
+static bool scan_bss_prune_missing(void *a, void *user_data)
+{
+	struct scan_bss *bss = a;
+	struct network_prune_data *data = user_data;
+
+	if (!l_queue_find(data->new_list, match_addr, bss->addr))
+		return true;
+
+	return false;
+}
+
+void network_bss_list_prune(struct network *network, struct l_queue *new_list)
+{
+	struct network_prune_data data;
+
+	data.network = network;
+	data.new_list = new_list;
+
+	l_queue_foreach_remove(network->bss_list,
+				scan_bss_prune_missing, &data);
+}
+
 struct scan_bss *network_bss_list_pop(struct network *network)
 {
 	return l_queue_pop_head(network->bss_list);
diff --git a/src/network.h b/src/network.h
index 17dfcca8..be81c150 100644
--- a/src/network.h
+++ b/src/network.h
@@ -71,6 +71,8 @@ bool network_bss_add(struct network *network, struct scan_bss *bss);
 bool network_bss_update(struct network *network, struct scan_bss *bss);
 bool network_bss_list_isempty(struct network *network);
 void network_bss_list_clear(struct network *network);
+void network_bss_list_prune(struct network *network, struct l_queue *new_list);
+
 struct scan_bss *network_bss_list_pop(struct network *network);
 struct scan_bss *network_bss_find_by_addr(struct network *network,
 							const uint8_t *addr);
-- 
2.34.1


             reply	other threads:[~2024-08-07 18:14 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-07 18:14 James Prestwood [this message]
2024-08-07 18:14 ` [PATCH 02/14] station: use network_bss_list_prune James Prestwood
2024-08-08 14:29   ` Denis Kenzior
2024-08-08 14:44     ` James Prestwood
2024-08-07 18:14 ` [PATCH 03/14] network: remove network_bss_list_clear James Prestwood
2024-08-07 18:14 ` [PATCH 04/14] dbus: Add net.connman.iwd.BasicServiceSet interface James Prestwood
2024-08-07 18:14 ` [PATCH 05/14] network: implement net.connman.iwd.BasicServiceSet James Prestwood
2024-08-07 18:14 ` [PATCH 06/14] network: add BasicServiceSets property on the network object James Prestwood
2024-08-07 18:14 ` [PATCH 07/14] station: add ConnectedBss property James Prestwood
2024-08-07 18:14 ` [PATCH 08/14] doc: document BasicServiceSet API James Prestwood
2024-08-08 14:42   ` Denis Kenzior
2024-08-07 18:14 ` [PATCH 09/14] client: separate property header and values into two functions James Prestwood
2024-08-07 18:14 ` [PATCH 10/14] client: add net.connman.iwd.BasicServiceSet definition James Prestwood
2024-08-07 18:14 ` [PATCH 11/14] client: Add BasicServiceSets property to network James Prestwood
2024-08-07 18:14 ` [PATCH 12/14] client: add BasicServiceSet interface James Prestwood
2024-08-07 18:14 ` [PATCH 13/14] client: refactor cmd_connect() and add find_network() James Prestwood
2024-08-07 18:14 ` [PATCH 14/14] client: add station command "get-bsses" James Prestwood

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240807181427.170515-1-prestwoj@gmail.com \
    --to=prestwoj@gmail.com \
    --cc=iwd@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox