mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2025-06-02 08:17:26 +02:00
device: React to netdev state changes
This commit is contained in:
parent
b6c22fc1b9
commit
6667176ec9
57
src/device.c
57
src/device.c
@ -186,6 +186,8 @@ static const char *iwd_network_get_path(struct device *device,
|
|||||||
static const char *device_state_to_string(enum device_state state)
|
static const char *device_state_to_string(enum device_state state)
|
||||||
{
|
{
|
||||||
switch (state) {
|
switch (state) {
|
||||||
|
case DEVICE_STATE_OFF:
|
||||||
|
return "off";
|
||||||
case DEVICE_STATE_DISCONNECTED:
|
case DEVICE_STATE_DISCONNECTED:
|
||||||
return "disconnected";
|
return "disconnected";
|
||||||
case DEVICE_STATE_AUTOCONNECT:
|
case DEVICE_STATE_AUTOCONNECT:
|
||||||
@ -443,7 +445,8 @@ const char *device_get_path(struct device *device)
|
|||||||
bool device_is_busy(struct device *device)
|
bool device_is_busy(struct device *device)
|
||||||
{
|
{
|
||||||
if (device->state != DEVICE_STATE_DISCONNECTED &&
|
if (device->state != DEVICE_STATE_DISCONNECTED &&
|
||||||
device->state != DEVICE_STATE_AUTOCONNECT)
|
device->state != DEVICE_STATE_AUTOCONNECT &&
|
||||||
|
device->state != DEVICE_STATE_OFF)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -471,6 +474,9 @@ void device_enter_state(struct device *device, enum device_state state)
|
|||||||
device_state_to_string(state));
|
device_state_to_string(state));
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
|
case DEVICE_STATE_OFF:
|
||||||
|
scan_periodic_stop(device->index);
|
||||||
|
break;
|
||||||
case DEVICE_STATE_AUTOCONNECT:
|
case DEVICE_STATE_AUTOCONNECT:
|
||||||
scan_periodic_start(device->index, new_scan_results, device);
|
scan_periodic_start(device->index, new_scan_results, device);
|
||||||
break;
|
break;
|
||||||
@ -856,6 +862,51 @@ static void setup_device_interface(struct l_dbus_interface *interface)
|
|||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool device_remove_network(const void *key, void *data, void *user_data)
|
||||||
|
{
|
||||||
|
struct network *network = data;
|
||||||
|
|
||||||
|
network_remove(network, -ESHUTDOWN);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void device_netdev_notify(struct netdev *netdev, bool up,
|
||||||
|
void *user_data)
|
||||||
|
{
|
||||||
|
struct device *device = user_data;
|
||||||
|
struct l_dbus *dbus = dbus_get_bus();
|
||||||
|
|
||||||
|
if (up)
|
||||||
|
device_enter_state(device, DEVICE_STATE_AUTOCONNECT);
|
||||||
|
else {
|
||||||
|
device_enter_state(device, DEVICE_STATE_OFF);
|
||||||
|
|
||||||
|
if (device->scan_pending)
|
||||||
|
dbus_pending_reply(&device->scan_pending,
|
||||||
|
dbus_error_aborted(device->scan_pending));
|
||||||
|
|
||||||
|
if (device->connect_pending)
|
||||||
|
dbus_pending_reply(&device->connect_pending,
|
||||||
|
dbus_error_aborted(device->connect_pending));
|
||||||
|
|
||||||
|
device->connected_bss = NULL;
|
||||||
|
device->connected_network = NULL;
|
||||||
|
|
||||||
|
l_hashmap_foreach_remove(device->networks,
|
||||||
|
device_remove_network, device);
|
||||||
|
|
||||||
|
l_queue_destroy(device->autoconnect_list, l_free);
|
||||||
|
device->autoconnect_list = l_queue_new();
|
||||||
|
|
||||||
|
l_queue_destroy(device->bss_list, bss_free);
|
||||||
|
device->bss_list = l_queue_new();
|
||||||
|
|
||||||
|
l_queue_destroy(device->networks_sorted, NULL);
|
||||||
|
device->networks_sorted = l_queue_new();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct device *device_create(struct wiphy *wiphy, struct netdev *netdev)
|
struct device *device_create(struct wiphy *wiphy, struct netdev *netdev)
|
||||||
{
|
{
|
||||||
struct device *device;
|
struct device *device;
|
||||||
@ -882,7 +933,9 @@ struct device *device_create(struct wiphy *wiphy, struct netdev *netdev)
|
|||||||
__device_watch_call_added(device);
|
__device_watch_call_added(device);
|
||||||
|
|
||||||
scan_ifindex_add(device->index);
|
scan_ifindex_add(device->index);
|
||||||
device_enter_state(device, DEVICE_STATE_AUTOCONNECT);
|
|
||||||
|
device_netdev_notify(netdev, netdev_get_is_up(netdev), device);
|
||||||
|
netdev_watch_add(netdev, device_netdev_notify, device);
|
||||||
|
|
||||||
return device;
|
return device;
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,8 @@ struct netdev;
|
|||||||
struct device;
|
struct device;
|
||||||
|
|
||||||
enum device_state {
|
enum device_state {
|
||||||
DEVICE_STATE_DISCONNECTED = 0, /* Disconnected, no auto-connect */
|
DEVICE_STATE_OFF = 0, /* Interface down */
|
||||||
|
DEVICE_STATE_DISCONNECTED, /* Disconnected, no auto-connect */
|
||||||
DEVICE_STATE_AUTOCONNECT, /* Disconnected, try auto-connect */
|
DEVICE_STATE_AUTOCONNECT, /* Disconnected, try auto-connect */
|
||||||
DEVICE_STATE_CONNECTING, /* Connecting */
|
DEVICE_STATE_CONNECTING, /* Connecting */
|
||||||
DEVICE_STATE_CONNECTED,
|
DEVICE_STATE_CONNECTED,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user