From aedbdd01ae6294fd43979295bef1e9368f83330a Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Tue, 14 Jun 2016 11:19:05 -0500 Subject: [PATCH] device: Migrate authentication to netdev api This also moves device_connect_network to device.c where it belongs --- src/device.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/wiphy.c | 52 ----------------------------------------- 2 files changed, 65 insertions(+), 52 deletions(-) diff --git a/src/device.c b/src/device.c index d40d1f47..c8f97455 100644 --- a/src/device.c +++ b/src/device.c @@ -27,6 +27,7 @@ #include #include "src/common.h" +#include "src/netdev.h" #include "src/dbus.h" #include "src/network.h" #include "src/device.h" @@ -136,6 +137,70 @@ void device_disassociated(struct device *device) IWD_NETWORK_INTERFACE, "Connected"); } +static void device_connect_cb(struct netdev *netdev, enum netdev_result result, + void *user_data) +{ + struct device *device = user_data; + + if (result != NETDEV_RESULT_OK) { + if (device->connect_pending) + dbus_pending_reply(&device->connect_pending, + dbus_error_failed(device->connect_pending)); + + device_disassociated(device); + return; + } +} + +static void device_netdev_event(struct netdev *netdev, enum netdev_event event, + void *user_data) +{ + switch (event) { + case NETDEV_EVENT_AUTHENTICATING: + l_debug("Authenticating"); + break; + case NETDEV_EVENT_ASSOCIATING: + l_debug("Associating"); + break; + case NETDEV_EVENT_4WAY_HANDSHAKE: + l_debug("Handshaking"); + break; + case NETDEV_EVENT_SETTING_KEYS: + l_debug("Setting keys"); + break; + case NETDEV_EVENT_LOST_BEACON: + l_debug("Beacon lost"); + break; + }; +} + +void device_connect_network(struct device *device, struct network *network, + struct scan_bss *bss, + struct l_dbus_message *message) +{ + struct l_dbus *dbus = dbus_get_bus(); + + device->connect_pending = l_dbus_message_ref(message); + + if (netdev_connect(device->netdev, bss, NULL, + device_netdev_event, + device_connect_cb, device) < 0) { + dbus_pending_reply(&device->connect_pending, + dbus_error_failed(device->connect_pending)); + return; + } + + device->connected_bss = bss; + device->connected_network = network; + + device_enter_state(device, DEVICE_STATE_CONNECTING); + + l_dbus_property_changed(dbus, device_get_path(device), + IWD_DEVICE_INTERFACE, "ConnectedNetwork"); + l_dbus_property_changed(dbus, network_get_path(network), + IWD_NETWORK_INTERFACE, "Connected"); +} + bool device_init(void) { device_watches = l_queue_new(); diff --git a/src/wiphy.c b/src/wiphy.c index 8ac923c3..c2c1efed 100644 --- a/src/wiphy.c +++ b/src/wiphy.c @@ -193,19 +193,6 @@ static void device_lost_beacon(struct device *device) device_disassociated(device); } -static void genl_connect_cb(struct l_genl_msg *msg, void *user_data) -{ - struct device *device = user_data; - - if (l_genl_msg_get_error(msg) < 0) { - if (device->connect_pending) - dbus_pending_reply(&device->connect_pending, - dbus_error_failed(device->connect_pending)); - - device_disassociated(device); - } -} - enum ie_rsn_cipher_suite wiphy_select_cipher(struct wiphy *wiphy, uint16_t mask) { mask &= wiphy->pairwise_ciphers; @@ -220,45 +207,6 @@ enum ie_rsn_cipher_suite wiphy_select_cipher(struct wiphy *wiphy, uint16_t mask) return 0; } -static int mlme_authenticate_cmd(struct network *network, struct scan_bss *bss) -{ - struct device *device = network_get_device(network); - const char *ssid = network_get_ssid(network); - uint32_t auth_type = NL80211_AUTHTYPE_OPEN_SYSTEM; - struct l_genl_msg *msg; - - msg = l_genl_msg_new_sized(NL80211_CMD_AUTHENTICATE, 512); - msg_append_attr(msg, NL80211_ATTR_IFINDEX, 4, &device->index); - msg_append_attr(msg, NL80211_ATTR_WIPHY_FREQ, 4, &bss->frequency); - msg_append_attr(msg, NL80211_ATTR_MAC, ETH_ALEN, bss->addr); - msg_append_attr(msg, NL80211_ATTR_SSID, strlen(ssid), ssid); - msg_append_attr(msg, NL80211_ATTR_AUTH_TYPE, 4, &auth_type); - l_genl_family_send(nl80211, msg, genl_connect_cb, device, NULL); - - return 0; -} - -void device_connect_network(struct device *device, struct network *network, - struct scan_bss *bss, - struct l_dbus_message *message) -{ - struct l_dbus *dbus = dbus_get_bus(); - - device->connect_pending = l_dbus_message_ref(message); - - device->connected_bss = bss; - device->connected_network = network; - - device_enter_state(device, DEVICE_STATE_CONNECTING); - - mlme_authenticate_cmd(network, bss); - - l_dbus_property_changed(dbus, device_get_path(device), - IWD_DEVICE_INTERFACE, "ConnectedNetwork"); - l_dbus_property_changed(dbus, network_get_path(network), - IWD_NETWORK_INTERFACE, "Connected"); -} - static void bss_free(void *data) { struct scan_bss *bss = data;