mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-12-21 11:52:34 +01:00
netdev: Use CMD_CONNECT
This commit is contained in:
parent
e81af82313
commit
5c6024185d
160
src/netdev.c
160
src/netdev.c
@ -838,19 +838,38 @@ static void netdev_set_rekey_offload(uint32_t ifindex,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void netdev_associate_event(struct l_genl_msg *msg,
|
static void netdev_connect_event(struct l_genl_msg *msg,
|
||||||
struct netdev *netdev)
|
struct netdev *netdev)
|
||||||
{
|
{
|
||||||
int err;
|
struct l_genl_attr attr;
|
||||||
|
uint16_t type, len;
|
||||||
|
const void *data;
|
||||||
|
const uint16_t *status_code = NULL;
|
||||||
|
|
||||||
l_debug("");
|
l_debug("");
|
||||||
|
|
||||||
err = l_genl_msg_get_error(msg);
|
if (!l_genl_attr_init(&attr, msg)) {
|
||||||
if (err < 0) {
|
l_debug("attr init failed");
|
||||||
l_error("association failed %s (%d)", strerror(-err), err);
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while (l_genl_attr_next(&attr, &type, &len, &data)) {
|
||||||
|
switch (type) {
|
||||||
|
case NL80211_ATTR_TIMED_OUT:
|
||||||
|
l_warn("authentication timed out");
|
||||||
|
goto error;
|
||||||
|
case NL80211_ATTR_STATUS_CODE:
|
||||||
|
if (len == sizeof(uint16_t))
|
||||||
|
status_code = data;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* AP Rejected the authenticate / associate */
|
||||||
|
if (!status_code || *status_code != 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
if (netdev->sm) {
|
if (netdev->sm) {
|
||||||
eapol_sm_set_tx_user_data(netdev->sm,
|
eapol_sm_set_tx_user_data(netdev->sm,
|
||||||
L_INT_TO_PTR(l_io_get_fd(netdev->eapol_io)));
|
L_INT_TO_PTR(l_io_get_fd(netdev->eapol_io)));
|
||||||
@ -874,11 +893,23 @@ error:
|
|||||||
netdev->user_data);
|
netdev->user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void netdev_cmd_associate_cb(struct l_genl_msg *msg, void *user_data)
|
static void netdev_authenticate_event(struct l_genl_msg *msg,
|
||||||
|
struct netdev *netdev)
|
||||||
|
{
|
||||||
|
l_debug("");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void netdev_associate_event(struct l_genl_msg *msg,
|
||||||
|
struct netdev *netdev)
|
||||||
|
{
|
||||||
|
l_debug("");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void netdev_cmd_connect_cb(struct l_genl_msg *msg, void *user_data)
|
||||||
{
|
{
|
||||||
struct netdev *netdev = user_data;
|
struct netdev *netdev = user_data;
|
||||||
|
|
||||||
/* Wait for associate event */
|
/* Wait for connect event */
|
||||||
if (l_genl_msg_get_error(msg) >= 0) {
|
if (l_genl_msg_get_error(msg) >= 0) {
|
||||||
if (netdev->event_filter)
|
if (netdev->event_filter)
|
||||||
netdev->event_filter(netdev,
|
netdev->event_filter(netdev,
|
||||||
@ -893,19 +924,24 @@ static void netdev_cmd_associate_cb(struct l_genl_msg *msg, void *user_data)
|
|||||||
netdev->user_data);
|
netdev->user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct l_genl_msg *netdev_build_cmd_associate(struct netdev *netdev,
|
static struct l_genl_msg *netdev_build_cmd_connect(struct netdev *netdev,
|
||||||
struct scan_bss *bss,
|
struct scan_bss *bss,
|
||||||
struct eapol_sm *sm)
|
struct eapol_sm *sm)
|
||||||
{
|
{
|
||||||
|
uint32_t auth_type = NL80211_AUTHTYPE_OPEN_SYSTEM;
|
||||||
struct l_genl_msg *msg;
|
struct l_genl_msg *msg;
|
||||||
|
|
||||||
msg = l_genl_msg_new_sized(NL80211_CMD_ASSOCIATE, 512);
|
msg = l_genl_msg_new_sized(NL80211_CMD_CONNECT, 512);
|
||||||
l_genl_msg_append_attr(msg, NL80211_ATTR_IFINDEX, 4, &netdev->index);
|
l_genl_msg_append_attr(msg, NL80211_ATTR_IFINDEX, 4, &netdev->index);
|
||||||
l_genl_msg_append_attr(msg, NL80211_ATTR_WIPHY_FREQ,
|
l_genl_msg_append_attr(msg, NL80211_ATTR_WIPHY_FREQ,
|
||||||
4, &bss->frequency);
|
4, &bss->frequency);
|
||||||
l_genl_msg_append_attr(msg, NL80211_ATTR_MAC, ETH_ALEN, bss->addr);
|
l_genl_msg_append_attr(msg, NL80211_ATTR_MAC, ETH_ALEN, bss->addr);
|
||||||
l_genl_msg_append_attr(msg, NL80211_ATTR_SSID,
|
l_genl_msg_append_attr(msg, NL80211_ATTR_SSID,
|
||||||
bss->ssid_len, bss->ssid);
|
bss->ssid_len, bss->ssid);
|
||||||
|
l_genl_msg_append_attr(msg, NL80211_ATTR_AUTH_TYPE, 4, &auth_type);
|
||||||
|
|
||||||
|
if (bss->capability & IE_BSS_CAP_PRIVACY)
|
||||||
|
l_genl_msg_append_attr(msg, NL80211_ATTR_PRIVACY, 0, NULL);
|
||||||
|
|
||||||
if (sm) {
|
if (sm) {
|
||||||
uint32_t cipher;
|
uint32_t cipher;
|
||||||
@ -942,111 +978,21 @@ static struct l_genl_msg *netdev_build_cmd_associate(struct netdev *netdev,
|
|||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void netdev_authenticate_event(struct l_genl_msg *msg,
|
|
||||||
struct netdev *netdev)
|
|
||||||
{
|
|
||||||
struct l_genl_attr attr;
|
|
||||||
uint16_t type, len;
|
|
||||||
const void *data;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
l_debug("");
|
|
||||||
|
|
||||||
err = l_genl_msg_get_error(msg);
|
|
||||||
if (err < 0) {
|
|
||||||
l_error("authentication failed %s (%d)", strerror(-err), err);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!l_genl_attr_init(&attr, msg)) {
|
|
||||||
l_debug("attr init failed");
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (l_genl_attr_next(&attr, &type, &len, &data)) {
|
|
||||||
switch (type) {
|
|
||||||
case NL80211_ATTR_TIMED_OUT:
|
|
||||||
l_warn("authentication timed out");
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!netdev->associate_msg)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (l_genl_family_send(nl80211, netdev->associate_msg,
|
|
||||||
netdev_cmd_associate_cb, netdev, NULL) > 0) {
|
|
||||||
netdev->associate_msg = NULL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
l_genl_msg_unref(netdev->associate_msg);
|
|
||||||
netdev->associate_msg = NULL;
|
|
||||||
|
|
||||||
error:
|
|
||||||
if (netdev->connect_cb)
|
|
||||||
netdev->connect_cb(netdev, NETDEV_RESULT_AUTHENTICATION_FAILED,
|
|
||||||
netdev->user_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void netdev_cmd_authenticate_cb(struct l_genl_msg *msg, void *user_data)
|
|
||||||
{
|
|
||||||
struct netdev *netdev = user_data;
|
|
||||||
|
|
||||||
if (l_genl_msg_get_error(msg) >= 0) {
|
|
||||||
if (netdev->event_filter)
|
|
||||||
netdev->event_filter(netdev,
|
|
||||||
NETDEV_EVENT_AUTHENTICATING,
|
|
||||||
netdev->user_data);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (netdev->connect_cb)
|
|
||||||
netdev->connect_cb(netdev, NETDEV_RESULT_AUTHENTICATION_FAILED,
|
|
||||||
netdev->user_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct l_genl_msg *netdev_build_cmd_authenticate(struct netdev *netdev,
|
|
||||||
struct scan_bss *bss)
|
|
||||||
{
|
|
||||||
uint32_t auth_type = NL80211_AUTHTYPE_OPEN_SYSTEM;
|
|
||||||
struct l_genl_msg *msg;
|
|
||||||
|
|
||||||
msg = l_genl_msg_new_sized(NL80211_CMD_AUTHENTICATE, 512);
|
|
||||||
l_genl_msg_append_attr(msg, NL80211_ATTR_IFINDEX, 4, &netdev->index);
|
|
||||||
l_genl_msg_append_attr(msg, NL80211_ATTR_WIPHY_FREQ,
|
|
||||||
4, &bss->frequency);
|
|
||||||
l_genl_msg_append_attr(msg, NL80211_ATTR_MAC, ETH_ALEN, bss->addr);
|
|
||||||
l_genl_msg_append_attr(msg, NL80211_ATTR_SSID,
|
|
||||||
bss->ssid_len, bss->ssid);
|
|
||||||
l_genl_msg_append_attr(msg, NL80211_ATTR_AUTH_TYPE, 4, &auth_type);
|
|
||||||
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
int netdev_connect(struct netdev *netdev, struct scan_bss *bss,
|
int netdev_connect(struct netdev *netdev, struct scan_bss *bss,
|
||||||
struct eapol_sm *sm,
|
struct eapol_sm *sm,
|
||||||
netdev_event_func_t event_filter,
|
netdev_event_func_t event_filter,
|
||||||
netdev_connect_cb_t cb, void *user_data)
|
netdev_connect_cb_t cb, void *user_data)
|
||||||
{
|
{
|
||||||
struct l_genl_msg *authenticate;
|
struct l_genl_msg *cmd_connect;
|
||||||
struct l_genl_msg *associate;
|
|
||||||
|
|
||||||
authenticate = netdev_build_cmd_authenticate(netdev, bss);
|
cmd_connect = netdev_build_cmd_connect(netdev, bss, sm);
|
||||||
if (!authenticate)
|
if (!cmd_connect) {
|
||||||
return -EINVAL;
|
l_genl_msg_unref(cmd_connect);
|
||||||
|
|
||||||
associate = netdev_build_cmd_associate(netdev, bss, sm);
|
|
||||||
if (!associate) {
|
|
||||||
l_genl_msg_unref(authenticate);
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!l_genl_family_send(nl80211, authenticate,
|
if (!l_genl_family_send(nl80211, cmd_connect,
|
||||||
netdev_cmd_authenticate_cb, netdev, NULL)) {
|
netdev_cmd_connect_cb, netdev, NULL)) {
|
||||||
l_genl_msg_unref(associate);
|
|
||||||
l_genl_msg_unref(authenticate);
|
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1054,7 +1000,6 @@ int netdev_connect(struct netdev *netdev, struct scan_bss *bss,
|
|||||||
netdev->connect_cb = cb;
|
netdev->connect_cb = cb;
|
||||||
netdev->user_data = user_data;
|
netdev->user_data = user_data;
|
||||||
netdev->sm = sm;
|
netdev->sm = sm;
|
||||||
netdev->associate_msg = associate;
|
|
||||||
memcpy(netdev->remote_addr, bss->addr, ETH_ALEN);
|
memcpy(netdev->remote_addr, bss->addr, ETH_ALEN);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1124,6 +1069,9 @@ static void netdev_mlme_notify(struct l_genl_msg *msg, void *user_data)
|
|||||||
case NL80211_CMD_ASSOCIATE:
|
case NL80211_CMD_ASSOCIATE:
|
||||||
netdev_associate_event(msg, netdev);
|
netdev_associate_event(msg, netdev);
|
||||||
break;
|
break;
|
||||||
|
case NL80211_CMD_CONNECT:
|
||||||
|
netdev_connect_event(msg, netdev);
|
||||||
|
break;
|
||||||
case NL80211_CMD_DISCONNECT:
|
case NL80211_CMD_DISCONNECT:
|
||||||
netdev_disconnect_event(msg, netdev);
|
netdev_disconnect_event(msg, netdev);
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user