mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2025-01-03 19:02:34 +01:00
wiphy: Add auto-connect logic
This commit is contained in:
parent
f055c22825
commit
94aba17968
78
src/wiphy.c
78
src/wiphy.c
@ -932,6 +932,81 @@ static bool netdev_match(const void *a, const void *b)
|
|||||||
return (netdev->index == index);
|
return (netdev->index == index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool netdev_try_autoconnect(struct netdev *netdev,
|
||||||
|
struct network *network,
|
||||||
|
struct scan_bss *bss)
|
||||||
|
{
|
||||||
|
struct wiphy *wiphy = netdev->wiphy;
|
||||||
|
|
||||||
|
switch (network->ssid_security) {
|
||||||
|
case SCAN_SSID_SECURITY_NONE:
|
||||||
|
break;
|
||||||
|
case SCAN_SSID_SECURITY_PSK:
|
||||||
|
{
|
||||||
|
uint16_t pairwise_ciphers, group_ciphers;
|
||||||
|
const char *psk;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
bss_get_supported_ciphers(bss,
|
||||||
|
&pairwise_ciphers, &group_ciphers);
|
||||||
|
|
||||||
|
if (!wiphy_select_cipher(wiphy, pairwise_ciphers) ||
|
||||||
|
!wiphy_select_cipher(wiphy, group_ciphers)) {
|
||||||
|
l_debug("Cipher mis-match");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (network->ask_psk)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
network->settings = storage_network_open("psk", network->ssid);
|
||||||
|
psk = l_settings_get_value(network->settings, "Security",
|
||||||
|
"PreSharedKey");
|
||||||
|
|
||||||
|
/* TODO: Blacklist the network from auto-connect */
|
||||||
|
if (!psk)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
l_free(network->psk);
|
||||||
|
network->psk = l_util_from_hexstring(psk, &len);
|
||||||
|
|
||||||
|
if (network->psk && len != 32) {
|
||||||
|
l_free(network->psk);
|
||||||
|
network->psk = NULL;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
mlme_authenticate_cmd(network, bss);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void netdev_autoconnect_next(struct netdev *netdev)
|
||||||
|
{
|
||||||
|
struct autoconnect_entry *entry;
|
||||||
|
bool r;
|
||||||
|
|
||||||
|
while ((entry = l_queue_pop_head(netdev->autoconnect_list))) {
|
||||||
|
l_debug("Considering autoconnecting to BSS '%s' with SSID: %s,"
|
||||||
|
" freq: %u, rank: %u, strength: %i",
|
||||||
|
bss_address_to_string(entry->bss),
|
||||||
|
entry->network->ssid,
|
||||||
|
entry->bss->frequency, entry->rank,
|
||||||
|
entry->bss->signal_strength);
|
||||||
|
|
||||||
|
r = netdev_try_autoconnect(netdev, entry->network, entry->bss);
|
||||||
|
l_free(entry);
|
||||||
|
|
||||||
|
if (r)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void wiphy_free(void *data)
|
static void wiphy_free(void *data)
|
||||||
{
|
{
|
||||||
struct wiphy *wiphy = data;
|
struct wiphy *wiphy = data;
|
||||||
@ -1725,6 +1800,9 @@ static bool new_scan_results(uint32_t wiphy_id, uint32_t ifindex,
|
|||||||
l_queue_destroy(netdev->old_bss_list, bss_free);
|
l_queue_destroy(netdev->old_bss_list, bss_free);
|
||||||
netdev->old_bss_list = NULL;
|
netdev->old_bss_list = NULL;
|
||||||
|
|
||||||
|
if (netdev->state == NETDEV_STATE_AUTOCONNECT)
|
||||||
|
netdev_autoconnect_next(netdev);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user