mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2025-01-03 19:02:34 +01:00
manager: Run an interface dump on startup
Instead of handling NEW_WIPHY events and WIHPY_DUMP events in a similar fashion, split up the paths to optimize iwd startup time. There's fundamentally no reason to wait a second (and eat up file-descriptor resources for timers unnecessarily) when we can simply start an interface dump right after the wiphy dump. In case a new wiphy is added in the middle of a wiphy dump, we will likely get a new wiphy event anyway, in which case a setup_timeout will be created and we will ignore this phy during the interface dump processing. This also optimizes the case of iwd being re-started, in which case there are no interfaces present.
This commit is contained in:
parent
d99242846c
commit
02b3ab6793
@ -578,18 +578,54 @@ static void manager_config_notify(struct l_genl_msg *msg, void *user_data)
|
||||
}
|
||||
}
|
||||
|
||||
static void manager_interface_dump_callback(struct l_genl_msg *msg,
|
||||
void *user_data)
|
||||
{
|
||||
struct wiphy_setup_state *state;
|
||||
struct l_genl_attr attr;
|
||||
|
||||
l_debug("");
|
||||
|
||||
if (!l_genl_attr_init(&attr, msg))
|
||||
return;
|
||||
|
||||
state = manager_find_pending(manager_parse_wiphy_id(&attr));
|
||||
if (!state || state->setup_timeout)
|
||||
return;
|
||||
|
||||
manager_get_interface_cb(msg, state);
|
||||
}
|
||||
|
||||
static void manager_interface_dump_done(void *user_data)
|
||||
{
|
||||
const struct l_queue_entry *entry;
|
||||
|
||||
for (entry = l_queue_get_entries(pending_wiphys);
|
||||
entry; entry = entry->next) {
|
||||
struct wiphy_setup_state *state = entry->data;
|
||||
|
||||
/* phy might have been detected after the initial dump */
|
||||
if (state->setup_timeout || state->pending_cmd_count)
|
||||
continue;
|
||||
|
||||
/* If we are here, then there are no interfaces for this phy */
|
||||
manager_create_interfaces(state);
|
||||
}
|
||||
}
|
||||
|
||||
static void manager_wiphy_dump_callback(struct l_genl_msg *msg, void *user_data)
|
||||
{
|
||||
l_debug("");
|
||||
|
||||
manager_new_wiphy_event(msg);
|
||||
manager_rx_cmd_new_wiphy(msg);
|
||||
}
|
||||
|
||||
bool manager_init(struct l_genl_family *in,
|
||||
const char *if_whitelist, const char *if_blacklist)
|
||||
{
|
||||
struct l_genl_msg *msg;
|
||||
unsigned int id;
|
||||
unsigned int wiphy_dump;
|
||||
unsigned int interface_dump;
|
||||
|
||||
nl80211 = in;
|
||||
|
||||
@ -608,14 +644,27 @@ bool manager_init(struct l_genl_family *in,
|
||||
}
|
||||
|
||||
msg = l_genl_msg_new(NL80211_CMD_GET_WIPHY);
|
||||
id = l_genl_family_dump(nl80211, msg,
|
||||
manager_wiphy_dump_callback, NULL, NULL);
|
||||
if (!id) {
|
||||
wiphy_dump = l_genl_family_dump(nl80211, msg,
|
||||
manager_wiphy_dump_callback,
|
||||
NULL, NULL);
|
||||
if (!wiphy_dump) {
|
||||
l_error("Initial wiphy information dump failed");
|
||||
l_genl_msg_unref(msg);
|
||||
return false;
|
||||
}
|
||||
|
||||
msg = l_genl_msg_new(NL80211_CMD_GET_INTERFACE);
|
||||
interface_dump = l_genl_family_dump(nl80211, msg,
|
||||
manager_interface_dump_callback,
|
||||
NULL,
|
||||
manager_interface_dump_done);
|
||||
if (!interface_dump) {
|
||||
l_error("Initial interface information dump failed");
|
||||
l_genl_msg_unref(msg);
|
||||
l_genl_family_cancel(nl80211, wiphy_dump);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user