3
0
mirror of https://git.kernel.org/pub/scm/network/wireless/iwd.git synced 2024-10-04 02:18:49 +02:00

device: Migrate authentication to netdev api

This also moves device_connect_network to device.c where it belongs
This commit is contained in:
Denis Kenzior 2016-06-14 11:19:05 -05:00
parent 51f89e34e9
commit aedbdd01ae
2 changed files with 65 additions and 52 deletions

View File

@ -27,6 +27,7 @@
#include <ell/ell.h>
#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();

View File

@ -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;