mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-22 14:49:24 +01:00
device: modify autoconnect behavior
In case Disconnect() is called for any reason, make sure autoconnect is off. Set autoconnect to true whenever we successfully connect.
This commit is contained in:
parent
a766823ffc
commit
d2ccc367ef
35
src/device.c
35
src/device.c
@ -77,6 +77,7 @@ struct device {
|
||||
struct netdev *netdev;
|
||||
|
||||
bool scanning : 1;
|
||||
bool autoconnect : 1;
|
||||
};
|
||||
|
||||
static struct watchlist device_watches;
|
||||
@ -598,6 +599,7 @@ static void device_connect_cb(struct netdev *netdev, enum netdev_result result,
|
||||
|
||||
network_connected(device->connected_network);
|
||||
device_enter_state(device, DEVICE_STATE_CONNECTED);
|
||||
device->autoconnect = true;
|
||||
}
|
||||
|
||||
static void device_netdev_event(struct netdev *netdev, enum netdev_event event,
|
||||
@ -631,6 +633,22 @@ static void device_netdev_event(struct netdev *netdev, enum netdev_event event,
|
||||
};
|
||||
}
|
||||
|
||||
bool device_set_autoconnect(struct device *device, bool autoconnect)
|
||||
{
|
||||
if (device->autoconnect == autoconnect)
|
||||
return true;
|
||||
|
||||
device->autoconnect = autoconnect;
|
||||
|
||||
if (device->state == DEVICE_STATE_DISCONNECTED && autoconnect)
|
||||
device_enter_state(device, DEVICE_STATE_AUTOCONNECT);
|
||||
|
||||
if (device->state == DEVICE_STATE_AUTOCONNECT && !autoconnect)
|
||||
device_enter_state(device, DEVICE_STATE_DISCONNECTED);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void device_connect_network(struct device *device, struct network *network,
|
||||
struct scan_bss *bss,
|
||||
struct l_dbus_message *message)
|
||||
@ -760,7 +778,6 @@ static void device_disconnect_cb(struct netdev *netdev, bool success,
|
||||
void *user_data)
|
||||
{
|
||||
struct device *device = user_data;
|
||||
bool trigger_autoconnect = true;
|
||||
|
||||
l_debug("%d, success: %d", device->index, success);
|
||||
|
||||
@ -777,17 +794,11 @@ static void device_disconnect_cb(struct netdev *netdev, bool success,
|
||||
|
||||
dbus_pending_reply(&device->disconnect_pending, reply);
|
||||
|
||||
/*
|
||||
* If the disconnect was triggered by the user, don't
|
||||
* autoconnect. Wait for user's explicit instructions to scan
|
||||
* and connect to the network
|
||||
*/
|
||||
trigger_autoconnect = false;
|
||||
}
|
||||
|
||||
device_enter_state(device, DEVICE_STATE_DISCONNECTED);
|
||||
|
||||
if (trigger_autoconnect)
|
||||
if (device->autoconnect)
|
||||
device_enter_state(device, DEVICE_STATE_AUTOCONNECT);
|
||||
}
|
||||
|
||||
@ -835,8 +846,13 @@ static struct l_dbus_message *device_dbus_disconnect(struct l_dbus *dbus,
|
||||
|
||||
l_debug("");
|
||||
|
||||
result = device_disconnect(device);
|
||||
/*
|
||||
* Disconnect was triggered by the user, don't autoconnect. Wait for
|
||||
* the user's explicit instructions to scan and connect to the network
|
||||
*/
|
||||
device_set_autoconnect(device, false);
|
||||
|
||||
result = device_disconnect(device);
|
||||
if (result == -EBUSY)
|
||||
return dbus_error_busy(message);
|
||||
|
||||
@ -1156,6 +1172,7 @@ struct device *device_create(struct wiphy *wiphy, struct netdev *netdev)
|
||||
device->index = ifindex;
|
||||
device->wiphy = wiphy;
|
||||
device->netdev = netdev;
|
||||
device->autoconnect = true;
|
||||
|
||||
l_queue_push_head(device_list, device);
|
||||
|
||||
|
@ -71,6 +71,7 @@ void device_set_scan_results(struct device *device, struct l_queue *bss_list);
|
||||
struct network *device_network_find(struct device *device, const char *ssid,
|
||||
enum security security);
|
||||
|
||||
bool device_set_autoconnect(struct device *device, bool autoconnect);
|
||||
void device_connect_network(struct device *device, struct network *network,
|
||||
struct scan_bss *bss,
|
||||
struct l_dbus_message *message);
|
||||
|
Loading…
Reference in New Issue
Block a user