Wireless Daemon for Linux
 help / color / mirror / Atom feed
From: Denis Kenzior <denkenz@gmail.com>
To: James Prestwood <prestwoj@gmail.com>, iwd@lists.linux.dev
Subject: Re: [PATCH 2/7] knownnetworks: add known_network_add_connected_frequency
Date: Fri, 22 Dec 2023 16:13:41 -0600	[thread overview]
Message-ID: <34a92d63-b37f-4f37-a29b-9e632bb94d5a@gmail.com> (raw)
In-Reply-To: <20231220131200.267489-3-prestwoj@gmail.com>

Hi James,

On 12/20/23 07:11, James Prestwood wrote:
> This should be called when BSS is connected/roamed to which will
> insert the frequency ahead of entries which were only seen in scan
> results.
> 
> Providing this and the 'seen' variant sets up the frequency list
> into two adjacent sections:
>    [Most recently used]...[Most recently seen]
> 

So why not just keep two lists?

> Doing this will allow scanning to be more optimized and limit the
> number of frequencies while prefering BSS's that have been connected
> to prior.
> 
> Note that this list format is not synced to the file system.
> Frequencies will be synced in the order of this list but not
> containing the 'connected' bit. When IWD restarts this information
> will be lost, but the list is still sorted on disk in a better state
> than it was prior.
> ---
>   src/knownnetworks.c | 59 ++++++++++++++++++++++++++++++++++++++++++++-
>   src/knownnetworks.h |  3 +++
>   2 files changed, 61 insertions(+), 1 deletion(-)
> 
> diff --git a/src/knownnetworks.c b/src/knownnetworks.c
> index eac6c66b..e44109fd 100644
> --- a/src/knownnetworks.c
> +++ b/src/knownnetworks.c
> @@ -562,15 +562,70 @@ static bool known_frequency_match(const void *a, const void *b)
>   	return known_freq->frequency == *frequency;
>   }
>   
> +static int known_frequency_compare(const void *a, const void *b,
> +					void *user_data)
> +{
> +	const struct known_frequency *ka = a;
> +
> +	/*
> +	 * Only meant to be used to insert 'seen' frequencies. Any existing
> +	 * entry that has 'connected' set should preceed an entry that was

precede?

> +	 * only seen.
> +	 */
> +	if (ka->connected)
> +		return -1; > +
> +	/*
> +	 * Otherwise, insert immediately after the last 'connected' entry,
> +	 * i.e. the most recently seen
> +	 */
> +	return 1;
> +}
> +
>   /*
>    * Adds a frequency to the 'known' set of frequencies that this network
> - * operates on.  The list is sorted according to most-recently seen
> + * operates on. Frequencies added here will follow frequencies which have been
> + * connected to and inserted according to most-recently seen
>    */
>   int known_network_add_seen_frequency(struct network_info *info,
>   					uint32_t frequency)
>   {
>   	struct known_frequency *known_freq;
>   
> +	if (!info->known_frequencies)
> +		info->known_frequencies = l_queue_new();
> +

I'm not thrilled about the implementation...

> +	known_freq = l_queue_find(info->known_frequencies,
> +					known_frequency_match, &frequency);

You walk the entire queue once, then walk it again to remove the known_freq 
object, then walk it one more time for the insert.

> +	/*
> +	 * If no match, create a new one.
> +	 * If connected to frequency before leave that entry in place
> +	 */
> +	if (!known_freq) {
> +		known_freq = l_new(struct known_frequency, 1);
> +		known_freq->frequency = frequency;
> +	} else if (known_freq->connected)
> +		return 0;

So 'seeing' a frequency that has been connected to before doesn't change its 
sort order?

> +
> +	l_queue_remove(info->known_frequencies, known_freq);
> +
> +	/* insert the entry immediately after the last 'connected' entry */
> +	l_queue_insert(info->known_frequencies, known_freq,
> +			known_frequency_compare, NULL);
> +
> +	return 0;
> +}
> +
> +/*
> + * Adds a frequency to the known set of frequencies that this network operates
> + * on. Frequencies added here are assumed to be most recently used and inserted
> + * at the head of the queue.
> + */
> +int known_network_add_connected_frequency(struct network_info *info,
> +						uint32_t frequency)
> +{
> +	struct known_frequency *known_freq;
> +
>   	if (!info->known_frequencies)
>   		info->known_frequencies = l_queue_new();
>   
> @@ -581,6 +636,8 @@ int known_network_add_seen_frequency(struct network_info *info,
>   		known_freq->frequency = frequency;
>   	}
>   
> +	known_freq->connected = true;
> +
>   	l_queue_push_head(info->known_frequencies, known_freq);
>   
>   	return 0;

Overall I'm getting the feeling that the linked-list is the wrong data structure 
for all this.  If the intent is to maintain a bounded shortlist of frequencies 
to scan for a given network, then that's what we should do instead.

Regards,
-Denis

  reply	other threads:[~2023-12-22 22:13 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-20 13:11 [PATCH 0/7] Reduce and optimize quick/roam scan frequencies James Prestwood
2023-12-20 13:11 ` [PATCH 1/7] known_network: rename known_network_add_frequency James Prestwood
2023-12-22 22:09   ` Denis Kenzior
2023-12-20 13:11 ` [PATCH 2/7] knownnetworks: add known_network_add_connected_frequency James Prestwood
2023-12-22 22:13   ` Denis Kenzior [this message]
2024-01-02 13:18     ` James Prestwood
2023-12-20 13:11 ` [PATCH 3/7] network: call network_connected with BSS James Prestwood
2023-12-20 13:11 ` [PATCH 4/7] network: add network_roamed James Prestwood
2023-12-20 13:11 ` [PATCH 5/7] station: use network_roamed James Prestwood
2023-12-20 13:11 ` [PATCH 6/7] auto-t: update known frequency test to check order James Prestwood
2023-12-20 13:12 ` [PATCH 7/7] knownnetworks: limit 5 recent frequencies per network 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=34a92d63-b37f-4f37-a29b-9e632bb94d5a@gmail.com \
    --to=denkenz@gmail.com \
    --cc=iwd@lists.linux.dev \
    --cc=prestwoj@gmail.com \
    /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