mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-25 17:59:25 +01:00
main: Don't init nl80211 until dbus name is owned
This commit is contained in:
parent
95896c10ff
commit
b181604c18
52
src/dbus.c
52
src/dbus.c
@ -39,13 +39,6 @@
|
|||||||
|
|
||||||
struct l_dbus *g_dbus = 0;
|
struct l_dbus *g_dbus = 0;
|
||||||
|
|
||||||
static void do_debug(const char *str, void *user_data)
|
|
||||||
{
|
|
||||||
const char *prefix = user_data;
|
|
||||||
|
|
||||||
l_info("%s%s", prefix, str);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *dbus_iftype_to_string(uint32_t iftype)
|
const char *dbus_iftype_to_string(uint32_t iftype)
|
||||||
{
|
{
|
||||||
switch (iftype) {
|
switch (iftype) {
|
||||||
@ -204,58 +197,21 @@ void dbus_pending_reply(struct l_dbus_message **msg,
|
|||||||
*msg = NULL;
|
*msg = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void request_name_callback(struct l_dbus *dbus, bool success,
|
|
||||||
bool queued, void *user_data)
|
|
||||||
{
|
|
||||||
if (!success)
|
|
||||||
l_error("Name request failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ready_callback(void *user_data)
|
|
||||||
{
|
|
||||||
l_dbus_name_acquire(g_dbus, "net.connman.iwd", false, false, true,
|
|
||||||
request_name_callback, NULL);
|
|
||||||
|
|
||||||
if (!l_dbus_object_manager_enable(g_dbus))
|
|
||||||
l_info("Unable to register the ObjectManager");
|
|
||||||
|
|
||||||
agent_init(g_dbus);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disconnect_callback(void *user_data)
|
|
||||||
{
|
|
||||||
l_info("D-Bus disconnected, quitting...");
|
|
||||||
iwd_shutdown();
|
|
||||||
}
|
|
||||||
|
|
||||||
struct l_dbus *dbus_get_bus(void)
|
struct l_dbus *dbus_get_bus(void)
|
||||||
{
|
{
|
||||||
return g_dbus;
|
return g_dbus;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dbus_init(bool enable_debug)
|
bool dbus_init(struct l_dbus *dbus)
|
||||||
{
|
{
|
||||||
g_dbus = l_dbus_new_default(L_DBUS_SYSTEM_BUS);
|
g_dbus = dbus;
|
||||||
if (!g_dbus)
|
return agent_init(dbus);
|
||||||
return false;
|
|
||||||
|
|
||||||
if (enable_debug)
|
|
||||||
l_dbus_set_debug(g_dbus, do_debug, "[DBUS] ", NULL);
|
|
||||||
|
|
||||||
l_dbus_set_ready_handler(g_dbus, ready_callback, g_dbus, NULL);
|
|
||||||
l_dbus_set_disconnect_handler(g_dbus, disconnect_callback, NULL, NULL);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dbus_exit(void)
|
void dbus_exit(void)
|
||||||
{
|
{
|
||||||
agent_exit(g_dbus);
|
agent_exit(g_dbus);
|
||||||
|
|
||||||
l_dbus_destroy(g_dbus);
|
|
||||||
g_dbus = NULL;
|
g_dbus = NULL;
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void dbus_shutdown(void)
|
void dbus_shutdown(void)
|
||||||
|
@ -69,6 +69,6 @@ struct l_dbus_message *dbus_error_not_hidden(struct l_dbus_message *msg);
|
|||||||
struct l_dbus_message *dbus_error_from_errno(int err,
|
struct l_dbus_message *dbus_error_from_errno(int err,
|
||||||
struct l_dbus_message *msg);
|
struct l_dbus_message *msg);
|
||||||
|
|
||||||
bool dbus_init(bool enable_debug);
|
bool dbus_init(struct l_dbus *dbus);
|
||||||
bool dbus_exit(void);
|
void dbus_exit(void);
|
||||||
void dbus_shutdown(void);
|
void dbus_shutdown(void);
|
||||||
|
@ -26,8 +26,6 @@ struct l_genl_family;
|
|||||||
|
|
||||||
const struct l_settings *iwd_get_config(void);
|
const struct l_settings *iwd_get_config(void);
|
||||||
|
|
||||||
void iwd_shutdown(void);
|
|
||||||
|
|
||||||
bool netdev_init(const char *whitelist, const char *blacklist);
|
bool netdev_init(const char *whitelist, const char *blacklist);
|
||||||
void netdev_exit(void);
|
void netdev_exit(void);
|
||||||
void netdev_set_nl80211(struct l_genl_family *nl80211);
|
void netdev_set_nl80211(struct l_genl_family *nl80211);
|
||||||
|
87
src/main.c
87
src/main.c
@ -47,6 +47,8 @@
|
|||||||
|
|
||||||
#include "src/backtrace.h"
|
#include "src/backtrace.h"
|
||||||
|
|
||||||
|
struct l_genl *genl;
|
||||||
|
struct l_genl_family *nl80211;
|
||||||
static struct l_settings *iwd_config;
|
static struct l_settings *iwd_config;
|
||||||
static struct l_timeout *timeout;
|
static struct l_timeout *timeout;
|
||||||
static const char *interfaces;
|
static const char *interfaces;
|
||||||
@ -64,13 +66,18 @@ static void main_loop_quit(struct l_timeout *timeout, void *user_data)
|
|||||||
l_main_quit();
|
l_main_quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void iwd_shutdown(void)
|
static void iwd_shutdown(void)
|
||||||
{
|
{
|
||||||
if (terminating)
|
if (terminating)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
terminating = true;
|
terminating = true;
|
||||||
|
|
||||||
|
if (!nl80211) {
|
||||||
|
l_main_quit();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
dbus_shutdown();
|
dbus_shutdown();
|
||||||
netdev_shutdown();
|
netdev_shutdown();
|
||||||
|
|
||||||
@ -163,6 +170,54 @@ static void nl80211_vanished(void *user_data)
|
|||||||
wiphy_exit();
|
wiphy_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void request_name_callback(struct l_dbus *dbus, bool success,
|
||||||
|
bool queued, void *user_data)
|
||||||
|
{
|
||||||
|
if (!success) {
|
||||||
|
l_error("Name request failed");
|
||||||
|
goto fail_exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!l_dbus_object_manager_enable(dbus))
|
||||||
|
l_warn("Unable to register the ObjectManager");
|
||||||
|
|
||||||
|
genl = l_genl_new_default();
|
||||||
|
if (!genl) {
|
||||||
|
l_error("Failed to open generic netlink socket");
|
||||||
|
goto fail_exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getenv("IWD_GENL_DEBUG"))
|
||||||
|
l_genl_set_debug(genl, do_debug, "[GENL] ", NULL);
|
||||||
|
|
||||||
|
nl80211 = l_genl_family_new(genl, NL80211_GENL_NAME);
|
||||||
|
if (!nl80211) {
|
||||||
|
l_error("Failed to open nl80211 interface");
|
||||||
|
goto fail_exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
l_genl_family_set_watches(nl80211, nl80211_appeared, nl80211_vanished,
|
||||||
|
nl80211, NULL);
|
||||||
|
return;
|
||||||
|
|
||||||
|
fail_exit:
|
||||||
|
l_main_quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dbus_ready(void *user_data)
|
||||||
|
{
|
||||||
|
struct l_dbus *dbus = user_data;
|
||||||
|
|
||||||
|
l_dbus_name_acquire(dbus, "net.connman.iwd", false, false, true,
|
||||||
|
request_name_callback, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dbus_disconnected(void *user_data)
|
||||||
|
{
|
||||||
|
l_info("D-Bus disconnected, quitting...");
|
||||||
|
iwd_shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
static void print_koption(const void *key, void *value, void *user_data)
|
static void print_koption(const void *key, void *value, void *user_data)
|
||||||
{
|
{
|
||||||
l_info("\t%s", (const char *) key);
|
l_info("\t%s", (const char *) key);
|
||||||
@ -297,8 +352,7 @@ int main(int argc, char *argv[])
|
|||||||
struct l_signal *signal;
|
struct l_signal *signal;
|
||||||
sigset_t mask;
|
sigset_t mask;
|
||||||
int exit_status;
|
int exit_status;
|
||||||
struct l_genl *genl;
|
struct l_dbus *dbus;
|
||||||
struct l_genl_family *nl80211;
|
|
||||||
char *config_path;
|
char *config_path;
|
||||||
uint32_t eap_mtu;
|
uint32_t eap_mtu;
|
||||||
|
|
||||||
@ -400,28 +454,18 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
exit_status = EXIT_FAILURE;
|
exit_status = EXIT_FAILURE;
|
||||||
|
|
||||||
if (!dbus_init(enable_dbus_debug)) {
|
dbus = l_dbus_new_default(L_DBUS_SYSTEM_BUS);
|
||||||
|
if (!dbus) {
|
||||||
l_error("Failed to initialize D-Bus");
|
l_error("Failed to initialize D-Bus");
|
||||||
goto fail_dbus;
|
goto fail_dbus;
|
||||||
}
|
}
|
||||||
|
|
||||||
genl = l_genl_new_default();
|
if (enable_dbus_debug)
|
||||||
if (!genl) {
|
l_dbus_set_debug(dbus, do_debug, "[DBUS] ", NULL);
|
||||||
l_error("Failed to open generic netlink socket");
|
|
||||||
goto fail_genl;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getenv("IWD_GENL_DEBUG"))
|
l_dbus_set_ready_handler(dbus, dbus_ready, dbus, NULL);
|
||||||
l_genl_set_debug(genl, do_debug, "[GENL] ", NULL);
|
l_dbus_set_disconnect_handler(dbus, dbus_disconnected, NULL, NULL);
|
||||||
|
dbus_init(dbus);
|
||||||
nl80211 = l_genl_family_new(genl, NL80211_GENL_NAME);
|
|
||||||
if (!nl80211) {
|
|
||||||
l_error("Failed to open nl80211 interface");
|
|
||||||
goto fail_nl80211;
|
|
||||||
}
|
|
||||||
|
|
||||||
l_genl_family_set_watches(nl80211, nl80211_appeared, nl80211_vanished,
|
|
||||||
nl80211, NULL);
|
|
||||||
|
|
||||||
eap_init(eap_mtu);
|
eap_init(eap_mtu);
|
||||||
eapol_init();
|
eapol_init();
|
||||||
@ -460,10 +504,9 @@ fail_netdev:
|
|||||||
eap_exit();
|
eap_exit();
|
||||||
|
|
||||||
l_genl_family_unref(nl80211);
|
l_genl_family_unref(nl80211);
|
||||||
fail_nl80211:
|
|
||||||
l_genl_unref(genl);
|
l_genl_unref(genl);
|
||||||
fail_genl:
|
|
||||||
dbus_exit();
|
dbus_exit();
|
||||||
|
l_dbus_destroy(dbus);
|
||||||
fail_dbus:
|
fail_dbus:
|
||||||
l_settings_free(iwd_config);
|
l_settings_free(iwd_config);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user