From bcb2ef3e4032754eb218cc6df61bf6e0c3dccdd4 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Mon, 16 May 2016 12:05:28 -0500 Subject: [PATCH] network: Rework connect logic --- src/agent.c | 25 +++++++++++++++++++++++-- src/agent.h | 2 ++ src/wiphy.c | 30 +++++++++++------------------- 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/src/agent.c b/src/agent.c index b169da27..3b7fb4d3 100644 --- a/src/agent.c +++ b/src/agent.c @@ -38,6 +38,7 @@ struct agent_request { unsigned int id; void *user_data; void *user_callback; + struct l_dbus_message *trigger; }; struct agent { @@ -95,6 +96,10 @@ static void agent_request_free(void *user_data) l_dbus_message_unref(request->message); + if (request->trigger) + dbus_pending_reply(&request->trigger, + dbus_error_aborted(request->trigger)); + l_free(request); } @@ -115,7 +120,7 @@ static void passphrase_reply(struct l_dbus_message *reply, result = AGENT_RESULT_OK; done: - user_callback(result, passphrase, request->user_data); + user_callback(result, passphrase, request->trigger, request->user_data); } static void agent_finalize_pending(struct agent *agent, @@ -132,6 +137,11 @@ static void agent_finalize_pending(struct agent *agent, passphrase_reply(reply, pending); + if (pending->trigger) { + l_dbus_message_unref(pending->trigger); + pending->trigger = NULL; + } + agent_request_free(pending); } @@ -214,7 +224,8 @@ static void agent_send_next_request(struct agent *agent) static unsigned int agent_queue_request(struct agent *agent, struct l_dbus_message *message, int timeout, - void *callback, void *user_data) + void *callback, struct l_dbus_message *trigger, + void *user_data) { struct agent_request *request; @@ -224,6 +235,7 @@ static unsigned int agent_queue_request(struct agent *agent, request->id = ++next_request_id; request->user_data = user_data; request->user_callback = callback; + request->trigger = l_dbus_message_ref(trigger); agent->timeout_secs = timeout; @@ -239,13 +251,21 @@ static unsigned int agent_queue_request(struct agent *agent, * agent_request_passphrase: * @path: object path related to this request (like network object path) * @callback: user callback called when the request is ready + * @trigger: Message associated with (e.g. that triggered) this request * @user_data: user defined data * * Called when a passphrase information is needed from the user. Returns an * id that can be used to cancel the request. + * + * If @trigger is not NULL, then a reference is taken automatically. If + * agent_cancel_request is called subsequently, a dbus_aborted error is + * automatically generated for @trigger. Otherwise, after @callback is + * called, the reference to @trigger is dropped. It is assumed that the + * caller will take ownership of @trigger in the callback if needed. */ unsigned int agent_request_passphrase(const char *path, agent_request_passphrase_func_t callback, + struct l_dbus_message *trigger, void *user_data) { struct l_dbus_message *message; @@ -269,6 +289,7 @@ unsigned int agent_request_passphrase(const char *path, return agent_queue_request(agent, message, agent_timeout_input_request(), callback, + trigger, user_data); } diff --git a/src/agent.h b/src/agent.h index 011aae85..87381151 100644 --- a/src/agent.h +++ b/src/agent.h @@ -29,6 +29,7 @@ enum agent_result { typedef void (*agent_request_passphrase_func_t) (enum agent_result result, const char *passphrase, + struct l_dbus_message *message, void *user_data); bool agent_init(void); @@ -37,5 +38,6 @@ bool agent_setup(struct l_dbus_interface *interface); unsigned int agent_request_passphrase(const char *path, agent_request_passphrase_func_t callback, + struct l_dbus_message *message, void *user_data); bool agent_request_cancel(unsigned int req_id); diff --git a/src/wiphy.c b/src/wiphy.c index 302205af..0bb56625 100644 --- a/src/wiphy.c +++ b/src/wiphy.c @@ -311,10 +311,6 @@ static int mlme_authenticate_cmd(struct network *network, struct scan_bss *bss) msg_append_attr(msg, NL80211_ATTR_AUTH_TYPE, 4, &auth_type); l_genl_family_send(nl80211, msg, genl_connect_cb, netdev, NULL); - netdev->connected_bss = bss; - netdev->connected_network = network; - netdev_enter_state(netdev, DEVICE_STATE_CONNECTING); - return 0; } @@ -333,7 +329,9 @@ void device_connect_network(struct netdev *device, struct network *network, } static void passphrase_callback(enum agent_result result, - const char *passphrase, void *user_data) + const char *passphrase, + struct l_dbus_message *message, + void *user_data) { struct network *network = user_data; struct netdev *netdev = network->netdev; @@ -345,8 +343,7 @@ static void passphrase_callback(enum agent_result result, network->agent_request = 0; if (result != AGENT_RESULT_OK) { - dbus_pending_reply(&netdev->connect_pending, - dbus_error_aborted(netdev->connect_pending)); + dbus_pending_reply(&message, dbus_error_aborted(message)); goto err; } @@ -354,8 +351,7 @@ static void passphrase_callback(enum agent_result result, /* Did all good BSSes go away while we waited */ if (!bss) { - dbus_pending_reply(&netdev->connect_pending, - dbus_error_failed(netdev->connect_pending)); + dbus_pending_reply(&message, dbus_error_failed(message)); goto err; } @@ -367,8 +363,7 @@ static void passphrase_callback(enum agent_result result, network->psk) < 0) { l_error("PMK generation failed. " "Ensure Crypto Engine is properly configured"); - dbus_pending_reply(&netdev->connect_pending, - dbus_error_failed(netdev->connect_pending)); + dbus_pending_reply(&message, dbus_error_failed(message)); goto err; } @@ -380,7 +375,7 @@ static void passphrase_callback(enum agent_result result, */ network->update_psk = true; - mlme_authenticate_cmd(network, bss); + device_connect_network(network->netdev, network, bss, message); return; err: @@ -429,14 +424,14 @@ static struct l_dbus_message *network_connect_psk(struct network *network, network->agent_request = agent_request_passphrase(network->object_path, passphrase_callback, + message, network); if (!network->agent_request) return dbus_error_no_agent(message); } else - mlme_authenticate_cmd(network, bss); + device_connect_network(netdev, network, bss, message); - netdev->connect_pending = l_dbus_message_ref(message); return NULL; } @@ -469,14 +464,11 @@ static struct l_dbus_message *network_connect(struct l_dbus *dbus, case SECURITY_PSK: return network_connect_psk(network, bss, message); case SECURITY_NONE: - mlme_authenticate_cmd(network, bss); - netdev->connect_pending = l_dbus_message_ref(message); + device_connect_network(netdev, network, bss, message); return NULL; case SECURITY_8021X: network_settings_load(network); - - mlme_authenticate_cmd(network, bss); - netdev->connect_pending = l_dbus_message_ref(message); + device_connect_network(netdev, network, bss, message); return NULL; default: return dbus_error_not_supported(message);