wiphy: Allow connecting to 8021X networks
This commit is contained in:
parent
14020b2aa6
commit
02eeb82c53
29
src/wiphy.c
29
src/wiphy.c
|
@ -318,6 +318,7 @@ static struct scan_bss *network_select_bss(struct wiphy *wiphy,
|
||||||
return l_queue_peek_head(bss_list);
|
return l_queue_peek_head(bss_list);
|
||||||
|
|
||||||
case SCAN_SSID_SECURITY_PSK:
|
case SCAN_SSID_SECURITY_PSK:
|
||||||
|
case SCAN_SSID_SECURITY_8021X:
|
||||||
/* Pick the first bss that advertises any cipher we support. */
|
/* Pick the first bss that advertises any cipher we support. */
|
||||||
for (bss_entry = l_queue_get_entries(bss_list); bss_entry;
|
for (bss_entry = l_queue_get_entries(bss_list); bss_entry;
|
||||||
bss_entry = bss_entry->next) {
|
bss_entry = bss_entry->next) {
|
||||||
|
@ -499,6 +500,13 @@ static struct l_dbus_message *network_connect(struct l_dbus *dbus,
|
||||||
case SCAN_SSID_SECURITY_PSK:
|
case SCAN_SSID_SECURITY_PSK:
|
||||||
return network_connect_psk(network, bss, message);
|
return network_connect_psk(network, bss, message);
|
||||||
case SCAN_SSID_SECURITY_NONE:
|
case SCAN_SSID_SECURITY_NONE:
|
||||||
|
mlme_authenticate_cmd(network, bss);
|
||||||
|
netdev->connect_pending = l_dbus_message_ref(message);
|
||||||
|
return NULL;
|
||||||
|
case SCAN_SSID_SECURITY_8021X:
|
||||||
|
network->settings = storage_network_open("8021x",
|
||||||
|
network->ssid);
|
||||||
|
|
||||||
mlme_authenticate_cmd(network, bss);
|
mlme_authenticate_cmd(network, bss);
|
||||||
netdev->connect_pending = l_dbus_message_ref(message);
|
netdev->connect_pending = l_dbus_message_ref(message);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -828,7 +836,9 @@ static struct l_dbus_message *device_disconnect(struct l_dbus *dbus,
|
||||||
return dbus_error_not_connected(message);
|
return dbus_error_not_connected(message);
|
||||||
|
|
||||||
if (netdev->connected_network->ssid_security ==
|
if (netdev->connected_network->ssid_security ==
|
||||||
SCAN_SSID_SECURITY_PSK)
|
SCAN_SSID_SECURITY_PSK ||
|
||||||
|
netdev->connected_network->ssid_security ==
|
||||||
|
SCAN_SSID_SECURITY_8021X)
|
||||||
eapol_cancel(netdev->index);
|
eapol_cancel(netdev->index);
|
||||||
|
|
||||||
msg = l_genl_msg_new_sized(NL80211_CMD_DEAUTHENTICATE, 512);
|
msg = l_genl_msg_new_sized(NL80211_CMD_DEAUTHENTICATE, 512);
|
||||||
|
@ -970,6 +980,11 @@ static bool netdev_try_autoconnect(struct netdev *netdev,
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case SCAN_SSID_SECURITY_8021X:
|
||||||
|
network->settings = storage_network_open("8021x",
|
||||||
|
network->ssid);
|
||||||
|
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1419,7 +1434,8 @@ static void mlme_associate_cmd(struct netdev *netdev)
|
||||||
msg_append_attr(msg, NL80211_ATTR_SSID, strlen(network->ssid),
|
msg_append_attr(msg, NL80211_ATTR_SSID, strlen(network->ssid),
|
||||||
network->ssid);
|
network->ssid);
|
||||||
|
|
||||||
if (network->ssid_security == SCAN_SSID_SECURITY_PSK) {
|
if (network->ssid_security == SCAN_SSID_SECURITY_PSK ||
|
||||||
|
network->ssid_security == SCAN_SSID_SECURITY_8021X) {
|
||||||
uint16_t pairwise_ciphers, group_ciphers;
|
uint16_t pairwise_ciphers, group_ciphers;
|
||||||
uint32_t pairwise_cipher_attr;
|
uint32_t pairwise_cipher_attr;
|
||||||
uint32_t group_cipher_attr;
|
uint32_t group_cipher_attr;
|
||||||
|
@ -1428,7 +1444,10 @@ static void mlme_associate_cmd(struct netdev *netdev)
|
||||||
struct eapol_sm *sm = eapol_sm_new();
|
struct eapol_sm *sm = eapol_sm_new();
|
||||||
|
|
||||||
memset(&info, 0, sizeof(info));
|
memset(&info, 0, sizeof(info));
|
||||||
info.akm_suites = IE_RSN_AKM_SUITE_PSK;
|
info.akm_suites =
|
||||||
|
(network->ssid_security == SCAN_SSID_SECURITY_PSK) ?
|
||||||
|
IE_RSN_AKM_SUITE_PSK :
|
||||||
|
IE_RSN_AKM_SUITE_8021X;
|
||||||
|
|
||||||
bss_get_supported_ciphers(bss, &pairwise_ciphers,
|
bss_get_supported_ciphers(bss, &pairwise_ciphers,
|
||||||
&group_ciphers);
|
&group_ciphers);
|
||||||
|
@ -1457,7 +1476,11 @@ static void mlme_associate_cmd(struct netdev *netdev)
|
||||||
eapol_sm_set_own_wpa(sm, rsne_buf, rsne_buf[1] + 2);
|
eapol_sm_set_own_wpa(sm, rsne_buf, rsne_buf[1] + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (network->ssid_security == SCAN_SSID_SECURITY_PSK)
|
||||||
eapol_sm_set_pmk(sm, network->psk);
|
eapol_sm_set_pmk(sm, network->psk);
|
||||||
|
else
|
||||||
|
eapol_sm_set_8021x_config(sm, network->settings);
|
||||||
|
|
||||||
eapol_sm_set_authenticator_address(sm, bss->addr);
|
eapol_sm_set_authenticator_address(sm, bss->addr);
|
||||||
eapol_sm_set_supplicant_address(sm, netdev->addr);
|
eapol_sm_set_supplicant_address(sm, netdev->addr);
|
||||||
eapol_sm_set_user_data(sm, netdev);
|
eapol_sm_set_user_data(sm, netdev);
|
||||||
|
|
Loading…
Reference in New Issue