From: Denis Kenzior <denkenz@gmail.com>
To: James Prestwood <prestwoj@gmail.com>, iwd@lists.linux.dev
Subject: Re: [PATCH 2/6] station: move BasicServiceSet DBus management into station
Date: Mon, 19 Aug 2024 10:22:36 -0500 [thread overview]
Message-ID: <550276f1-69a3-434b-9863-ac89e0575e63@gmail.com> (raw)
In-Reply-To: <20240816125214.1162415-2-prestwoj@gmail.com>
Hi James,
On 8/16/24 7:52 AM, James Prestwood wrote:
> Due to an unnoticed bug after adding the BasicServiceSet object into
> network, it became clear that since station already owns the scan_bss
> objects it makes sense for it to manage the associated DBus objects
> as well. This way network doesn't have to jump through hoops to
> determine if the scan_bss object was remove, added, or updated. It
> can just manage its list as it did prior.
>
> From the station side this makes things very easy. When scan results
> come in we either update or add a new DBus object. And any time a
> scan_bss is freed we remove the DBus object.
> ---
> src/station.c | 89 +++++++++++++++++++++++++++++++++++++++++----------
> 1 file changed, 72 insertions(+), 17 deletions(-)
>
<snip>
> @@ -431,6 +429,65 @@ static void station_print_scan_bss(const struct scan_bss *bss)
> optional);
> }
>
> +static const char *station_get_bss_path(struct station *station,
> + struct scan_bss *bss)
> +{
> + enum security security;
> + char ssid[33];
> + const char *network_path;
> +
> + memcpy(ssid, bss->ssid, bss->ssid_len);
> + ssid[bss->ssid_len] = '\0';
> +
> + if (scan_bss_get_security(bss, &security) < 0)
> + return NULL;
> +
> + network_path = iwd_network_get_path(station, ssid, security);
> + if (!network_path)
> + return NULL;
> +
> + return __network_path_append_bss(network_path, bss);
> +}
> +
> +static bool station_unregister_bss(struct station *station,
> + struct scan_bss *bss)
> +{
> + const char *path = station_get_bss_path(station, bss);
> +
> + if (L_WARN_ON(!path))
> + return false;
> +
> + return l_dbus_unregister_object(dbus_get_bus(), path);
> +}
> +
> +static bool station_register_bss(struct station *station, struct scan_bss *bss)
> +{
> + struct scan_bss *old;
> + const char *path = station_get_bss_path(station, bss);
> +
> + if (L_WARN_ON(!path))
> + return false;
> +
> + /*
> + * If we find this path in the object tree update the data to the new
> + * scan_bss pointer, as this one will be freed soon.
> + */
> + old = l_dbus_object_get_data(dbus_get_bus(), path, IWD_BSS_INTERFACE);
> + if (old)
> + return l_dbus_object_set_data(dbus_get_bus(), path,
> + IWD_BSS_INTERFACE, bss);
> +
> + if (!l_dbus_object_add_interface(dbus_get_bus(), path,
> + IWD_BSS_INTERFACE, bss))
> + return false;
> +
> + if (!l_dbus_object_add_interface(dbus_get_bus(), path,
> + L_DBUS_INTERFACE_PROPERTIES, bss))
> + return false;
> +
> + return true;
> +}
> +
> /*
> * Returns the network object the BSS was added to or NULL if ignored.
> */
> @@ -518,6 +575,7 @@ static struct network *station_add_seen_bss(struct station *station,
> }
>
> network_bss_add(network, bss);
> + station_register_bss(station, bss);
Hmm, you have the network object right above? Can you utilize that somehow?
>
> return network;
> }
> @@ -540,7 +598,7 @@ struct bss_expiration_data {
> struct scan_bss *connected_bss;
> uint64_t now;
> const struct scan_freq_set *freqs;
> - struct l_queue *free_list;
> + struct station *station;
> };
>
> #define SCAN_RESULT_BSS_RETENTION_TIME (30 * 1000000)
> @@ -562,20 +620,21 @@ static bool bss_free_if_expired(void *data, void *user_data)
> bss->time_stamp + SCAN_RESULT_BSS_RETENTION_TIME))
> return false;
>
> - l_queue_push_head(expiration_data->free_list, bss);
> + station_unregister_bss(expiration_data->station, bss);
> +
> + scan_bss_free(bss);
>
> return true;
> }
>
> static void station_bss_list_remove_expired_bsses(struct station *station,
> - const struct scan_freq_set *freqs,
> - struct l_queue *free_list)
> + const struct scan_freq_set *freqs)
> {
> struct bss_expiration_data data = {
> .now = l_time_now(),
> .connected_bss = station->connected_bss,
> .freqs = freqs,
> - .free_list = free_list,
> + .station = station,
> };
>
> l_queue_foreach_remove(station->bss_list, bss_free_if_expired, &data);
> @@ -823,6 +882,7 @@ static bool station_owe_transition_results(int err, struct l_queue *bss_list,
>
> l_queue_push_tail(station->bss_list, bss);
> network_bss_add(network, bss);
> + station_register_bss(station, bss);
Same comment as above.
>
> continue;
>
> @@ -951,7 +1011,6 @@ void station_set_scan_results(struct station *station,
> const struct l_queue_entry *bss_entry;
> struct network *network;
> struct process_network_data data;
> - struct l_queue *free_list = l_queue_new();
>
> l_queue_foreach_remove(new_bss_list, bss_free_if_ssid_not_utf8, NULL);
>
> @@ -963,7 +1022,7 @@ void station_set_scan_results(struct station *station,
> l_queue_destroy(station->autoconnect_list, NULL);
> station->autoconnect_list = NULL;
>
> - station_bss_list_remove_expired_bsses(station, freqs, free_list);
> + station_bss_list_remove_expired_bsses(station, freqs);
>
> for (bss_entry = l_queue_get_entries(station->bss_list); bss_entry;
> bss_entry = bss_entry->next) {
> @@ -975,12 +1034,8 @@ void station_set_scan_results(struct station *station,
> if (old_bss == station->connected_bss)
> station->connected_bss = new_bss;
>
> - /*
> - * The network object is still holding a reference to
> - * the BSS. Until we tell network to replace the BSS
> - * with a new object, don't free it.
> - */
> - l_queue_push_head(free_list, old_bss);
> + station_register_bss(station, new_bss);
Why do this here? Can't you do this step in the loop below where we figure out
the network object?
> + scan_bss_free(old_bss);
>
> continue;
> }
> @@ -1017,8 +1072,6 @@ void station_set_scan_results(struct station *station,
>
> l_hashmap_foreach_remove(station->networks, process_network, &data);
>
> - l_queue_destroy(free_list, bss_free);
> -
> station->autoconnect_can_start = trigger_autoconnect;
> station_autoconnect_start(station);
> }
> @@ -2652,6 +2705,7 @@ static void station_update_roam_bss(struct station *station,
> l_queue_remove_if(station->bss_list, bss_match, bss);
>
> network_bss_update(network, bss);
> + station_register_bss(station, bss);
Same here, can we use the network object somehow?
> l_queue_push_tail(station->bss_list, bss);
>
> if (old)
> @@ -3160,6 +3214,7 @@ static void station_event_roamed(struct station *station, struct scan_bss *new)
> struct scan_bss *stale;
>
> network_bss_update(station->connected_network, new);
> + station_register_bss(station, new);
And here
>
> /* Remove new BSS if it exists in past scan results */
> stale = l_queue_remove_if(station->bss_list, bss_match, new);
Regards,
-Denis
next prev parent reply other threads:[~2024-08-19 15:22 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-16 12:52 [PATCH 1/6] network: add __network_path_append_bss James Prestwood
2024-08-16 12:52 ` [PATCH 2/6] station: move BasicServiceSet DBus management into station James Prestwood
2024-08-19 15:22 ` Denis Kenzior [this message]
2024-08-16 12:52 ` [PATCH 3/6] network: remove BasicServiceSet DBus registration code James Prestwood
2024-08-16 12:52 ` [PATCH 4/6] network: add back network_bss_list_clear James Prestwood
2024-08-16 12:52 ` [PATCH 5/6] auto-t: Add ExtendedServiceSet property James Prestwood
2024-08-16 12:52 ` [PATCH 6/6] auto-t: Add test for BasicServiceSets 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=550276f1-69a3-434b-9863-ac89e0575e63@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