mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-22 14:49:24 +01:00
wsc/device: Use station_set_autoconnect
This commit is contained in:
parent
b49ec9461b
commit
f8b724d3ba
82
src/device.c
82
src/device.c
@ -59,7 +59,6 @@ struct device {
|
|||||||
struct station *station;
|
struct station *station;
|
||||||
|
|
||||||
bool powered : 1;
|
bool powered : 1;
|
||||||
bool autoconnect : 1;
|
|
||||||
|
|
||||||
uint32_t ap_roam_watch;
|
uint32_t ap_roam_watch;
|
||||||
};
|
};
|
||||||
@ -84,26 +83,6 @@ static bool device_is_busy(struct device *device)
|
|||||||
return station_is_busy(device->station);
|
return station_is_busy(device->station);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void device_enter_state(struct device *device, enum station_state state)
|
|
||||||
{
|
|
||||||
struct station *station = device->station;
|
|
||||||
struct l_dbus *dbus = dbus_get_bus();
|
|
||||||
bool disconnected;
|
|
||||||
|
|
||||||
l_debug("Old State: %s, new state: %s",
|
|
||||||
station_state_to_string(station->state),
|
|
||||||
station_state_to_string(state));
|
|
||||||
|
|
||||||
disconnected = station->state <= STATION_STATE_AUTOCONNECT;
|
|
||||||
|
|
||||||
if ((disconnected && state > STATION_STATE_AUTOCONNECT) ||
|
|
||||||
(!disconnected && state != station->state))
|
|
||||||
l_dbus_property_changed(dbus, netdev_get_path(device->netdev),
|
|
||||||
IWD_DEVICE_INTERFACE, "State");
|
|
||||||
|
|
||||||
station_enter_state(station, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void device_reset_connection_state(struct device *device)
|
static void device_reset_connection_state(struct device *device)
|
||||||
{
|
{
|
||||||
struct station *station = device->station;
|
struct station *station = device->station;
|
||||||
@ -131,14 +110,16 @@ static void device_reset_connection_state(struct device *device)
|
|||||||
|
|
||||||
void device_disassociated(struct device *device)
|
void device_disassociated(struct device *device)
|
||||||
{
|
{
|
||||||
|
struct station *station = device->station;
|
||||||
|
|
||||||
l_debug("%d", device->index);
|
l_debug("%d", device->index);
|
||||||
|
|
||||||
device_reset_connection_state(device);
|
device_reset_connection_state(device);
|
||||||
|
|
||||||
device_enter_state(device, STATION_STATE_DISCONNECTED);
|
station_enter_state(station, STATION_STATE_DISCONNECTED);
|
||||||
|
|
||||||
if (device->autoconnect)
|
if (station->autoconnect)
|
||||||
device_enter_state(device, STATION_STATE_AUTOCONNECT);
|
station_enter_state(station, STATION_STATE_AUTOCONNECT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void device_disconnect_event(struct device *device)
|
static void device_disconnect_event(struct device *device)
|
||||||
@ -173,7 +154,7 @@ static void device_reassociate_cb(struct netdev *netdev,
|
|||||||
|
|
||||||
if (result == NETDEV_RESULT_OK) {
|
if (result == NETDEV_RESULT_OK) {
|
||||||
station_roamed(station);
|
station_roamed(station);
|
||||||
device_enter_state(device, STATION_STATE_CONNECTED);
|
station_enter_state(station, STATION_STATE_CONNECTED);
|
||||||
} else
|
} else
|
||||||
station_roam_failed(station);
|
station_roam_failed(station);
|
||||||
}
|
}
|
||||||
@ -192,7 +173,7 @@ static void device_fast_transition_cb(struct netdev *netdev,
|
|||||||
|
|
||||||
if (result == NETDEV_RESULT_OK) {
|
if (result == NETDEV_RESULT_OK) {
|
||||||
station_roamed(station);
|
station_roamed(station);
|
||||||
device_enter_state(device, STATION_STATE_CONNECTED);
|
station_enter_state(station, STATION_STATE_CONNECTED);
|
||||||
} else
|
} else
|
||||||
station_roam_failed(station);
|
station_roam_failed(station);
|
||||||
}
|
}
|
||||||
@ -213,7 +194,7 @@ static void device_transition_reassociate(struct device *device,
|
|||||||
|
|
||||||
station->connected_bss = bss;
|
station->connected_bss = bss;
|
||||||
station->preparing_roam = false;
|
station->preparing_roam = false;
|
||||||
device_enter_state(device, STATION_STATE_ROAMING);
|
station_enter_state(station, STATION_STATE_ROAMING);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool bss_match_bssid(const void *a, const void *b)
|
static bool bss_match_bssid(const void *a, const void *b)
|
||||||
@ -329,7 +310,7 @@ void device_transition_start(struct device *device, struct scan_bss *bss)
|
|||||||
|
|
||||||
station->connected_bss = bss;
|
station->connected_bss = bss;
|
||||||
station->preparing_roam = false;
|
station->preparing_roam = false;
|
||||||
device_enter_state(device, STATION_STATE_ROAMING);
|
station_enter_state(station, STATION_STATE_ROAMING);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -425,7 +406,7 @@ static void device_connect_cb(struct netdev *netdev, enum netdev_result result,
|
|||||||
}
|
}
|
||||||
|
|
||||||
network_connected(station->connected_network);
|
network_connected(station->connected_network);
|
||||||
device_enter_state(device, STATION_STATE_CONNECTED);
|
station_enter_state(station, STATION_STATE_CONNECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void device_signal_agent_notify(struct signal_agent *agent,
|
static void device_signal_agent_notify(struct signal_agent *agent,
|
||||||
@ -495,24 +476,6 @@ static void device_netdev_event(struct netdev *netdev, enum netdev_event event,
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool device_set_autoconnect(struct device *device, bool autoconnect)
|
|
||||||
{
|
|
||||||
struct station *station = device->station;
|
|
||||||
|
|
||||||
if (device->autoconnect == autoconnect)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
device->autoconnect = autoconnect;
|
|
||||||
|
|
||||||
if (station->state == STATION_STATE_DISCONNECTED && autoconnect)
|
|
||||||
device_enter_state(device, STATION_STATE_AUTOCONNECT);
|
|
||||||
|
|
||||||
if (station->state == STATION_STATE_AUTOCONNECT && !autoconnect)
|
|
||||||
device_enter_state(device, STATION_STATE_DISCONNECTED);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int __device_connect_network(struct device *device, struct network *network,
|
int __device_connect_network(struct device *device, struct network *network,
|
||||||
struct scan_bss *bss)
|
struct scan_bss *bss)
|
||||||
{
|
{
|
||||||
@ -539,7 +502,7 @@ int __device_connect_network(struct device *device, struct network *network,
|
|||||||
station->connected_bss = bss;
|
station->connected_bss = bss;
|
||||||
station->connected_network = network;
|
station->connected_network = network;
|
||||||
|
|
||||||
device_enter_state(device, STATION_STATE_CONNECTING);
|
station_enter_state(station, STATION_STATE_CONNECTING);
|
||||||
|
|
||||||
l_dbus_property_changed(dbus, netdev_get_path(netdev),
|
l_dbus_property_changed(dbus, netdev_get_path(netdev),
|
||||||
IWD_DEVICE_INTERFACE, "ConnectedNetwork");
|
IWD_DEVICE_INTERFACE, "ConnectedNetwork");
|
||||||
@ -563,7 +526,7 @@ void device_connect_network(struct device *device, struct network *network,
|
|||||||
}
|
}
|
||||||
|
|
||||||
device->connect_pending = l_dbus_message_ref(message);
|
device->connect_pending = l_dbus_message_ref(message);
|
||||||
device->autoconnect = true;
|
device->station->autoconnect = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct l_dbus_message *device_scan(struct l_dbus *dbus,
|
static struct l_dbus_message *device_scan(struct l_dbus *dbus,
|
||||||
@ -587,6 +550,7 @@ static void device_disconnect_cb(struct netdev *netdev, bool success,
|
|||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
struct device *device = user_data;
|
struct device *device = user_data;
|
||||||
|
struct station *station = device->station;
|
||||||
|
|
||||||
l_debug("%d, success: %d", device->index, success);
|
l_debug("%d, success: %d", device->index, success);
|
||||||
|
|
||||||
@ -605,10 +569,10 @@ static void device_disconnect_cb(struct netdev *netdev, bool success,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
device_enter_state(device, STATION_STATE_DISCONNECTED);
|
station_enter_state(station, STATION_STATE_DISCONNECTED);
|
||||||
|
|
||||||
if (device->autoconnect)
|
if (station->autoconnect)
|
||||||
device_enter_state(device, STATION_STATE_AUTOCONNECT);
|
station_enter_state(station, STATION_STATE_AUTOCONNECT);
|
||||||
}
|
}
|
||||||
|
|
||||||
int device_disconnect(struct device *device)
|
int device_disconnect(struct device *device)
|
||||||
@ -631,7 +595,7 @@ int device_disconnect(struct device *device)
|
|||||||
*/
|
*/
|
||||||
device_reset_connection_state(device);
|
device_reset_connection_state(device);
|
||||||
|
|
||||||
device_enter_state(device, STATION_STATE_DISCONNECTING);
|
station_enter_state(station, STATION_STATE_DISCONNECTING);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -650,7 +614,7 @@ static struct l_dbus_message *device_dbus_disconnect(struct l_dbus *dbus,
|
|||||||
* Disconnect was triggered by the user, don't autoconnect. Wait for
|
* Disconnect was triggered by the user, don't autoconnect. Wait for
|
||||||
* the user's explicit instructions to scan and connect to the network
|
* the user's explicit instructions to scan and connect to the network
|
||||||
*/
|
*/
|
||||||
device_set_autoconnect(device, false);
|
station_set_autoconnect(station, false);
|
||||||
|
|
||||||
if (station->state == STATION_STATE_AUTOCONNECT ||
|
if (station->state == STATION_STATE_AUTOCONNECT ||
|
||||||
station->state == STATION_STATE_DISCONNECTED)
|
station->state == STATION_STATE_DISCONNECTED)
|
||||||
@ -1338,11 +1302,6 @@ static void device_netdev_notify(struct netdev *netdev,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
device->station = station_create(device->wiphy, device->netdev);
|
device->station = station_create(device->wiphy, device->netdev);
|
||||||
|
|
||||||
if (device->autoconnect)
|
|
||||||
device_enter_state(device, STATION_STATE_AUTOCONNECT);
|
|
||||||
else
|
|
||||||
device_enter_state(device, STATION_STATE_DISCONNECTED);
|
|
||||||
break;
|
break;
|
||||||
case NETDEV_WATCH_EVENT_DOWN:
|
case NETDEV_WATCH_EVENT_DOWN:
|
||||||
if (device->station) {
|
if (device->station) {
|
||||||
@ -1385,7 +1344,6 @@ struct device *device_create(struct wiphy *wiphy, struct netdev *netdev)
|
|||||||
device->index = ifindex;
|
device->index = ifindex;
|
||||||
device->wiphy = wiphy;
|
device->wiphy = wiphy;
|
||||||
device->netdev = netdev;
|
device->netdev = netdev;
|
||||||
device->autoconnect = true;
|
|
||||||
|
|
||||||
if (!l_dbus_object_add_interface(dbus, netdev_get_path(device->netdev),
|
if (!l_dbus_object_add_interface(dbus, netdev_get_path(device->netdev),
|
||||||
IWD_DEVICE_INTERFACE, device))
|
IWD_DEVICE_INTERFACE, device))
|
||||||
@ -1408,10 +1366,8 @@ struct device *device_create(struct wiphy *wiphy, struct netdev *netdev)
|
|||||||
device->powered = netdev_get_is_up(netdev);
|
device->powered = netdev_get_is_up(netdev);
|
||||||
|
|
||||||
if (device->powered &&
|
if (device->powered &&
|
||||||
netdev_get_iftype(netdev) == NETDEV_IFTYPE_STATION) {
|
netdev_get_iftype(netdev) == NETDEV_IFTYPE_STATION)
|
||||||
device->station = station_create(device->wiphy, device->netdev);
|
device->station = station_create(device->wiphy, device->netdev);
|
||||||
device_enter_state(device, STATION_STATE_AUTOCONNECT);
|
|
||||||
}
|
|
||||||
|
|
||||||
return device;
|
return device;
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,6 @@ struct device;
|
|||||||
void device_disassociated(struct device *device);
|
void device_disassociated(struct device *device);
|
||||||
void device_transition_start(struct device *device, struct scan_bss *bss);
|
void device_transition_start(struct device *device, struct scan_bss *bss);
|
||||||
|
|
||||||
bool device_set_autoconnect(struct device *device, bool autoconnect);
|
|
||||||
int __device_connect_network(struct device *device, struct network *network,
|
int __device_connect_network(struct device *device, struct network *network,
|
||||||
struct scan_bss *bss);
|
struct scan_bss *bss);
|
||||||
void device_connect_network(struct device *device, struct network *network,
|
void device_connect_network(struct device *device, struct network *network,
|
||||||
|
@ -599,6 +599,19 @@ const char *station_state_to_string(enum station_state state)
|
|||||||
void station_enter_state(struct station *station, enum station_state state)
|
void station_enter_state(struct station *station, enum station_state state)
|
||||||
{
|
{
|
||||||
uint32_t index = netdev_get_ifindex(station->netdev);
|
uint32_t index = netdev_get_ifindex(station->netdev);
|
||||||
|
struct l_dbus *dbus = dbus_get_bus();
|
||||||
|
bool disconnected;
|
||||||
|
|
||||||
|
l_debug("Old State: %s, new state: %s",
|
||||||
|
station_state_to_string(station->state),
|
||||||
|
station_state_to_string(state));
|
||||||
|
|
||||||
|
disconnected = station->state <= STATION_STATE_AUTOCONNECT;
|
||||||
|
|
||||||
|
if ((disconnected && state > STATION_STATE_AUTOCONNECT) ||
|
||||||
|
(!disconnected && state != station->state))
|
||||||
|
l_dbus_property_changed(dbus, netdev_get_path(station->netdev),
|
||||||
|
IWD_DEVICE_INTERFACE, "State");
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case STATION_STATE_AUTOCONNECT:
|
case STATION_STATE_AUTOCONNECT:
|
||||||
@ -639,6 +652,22 @@ bool station_remove_state_watch(struct station *station, uint32_t id)
|
|||||||
return watchlist_remove(&station->state_watches, id);
|
return watchlist_remove(&station->state_watches, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool station_set_autoconnect(struct station *station, bool autoconnect)
|
||||||
|
{
|
||||||
|
if (station->autoconnect == autoconnect)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
station->autoconnect = autoconnect;
|
||||||
|
|
||||||
|
if (station->state == STATION_STATE_DISCONNECTED && autoconnect)
|
||||||
|
station_enter_state(station, STATION_STATE_AUTOCONNECT);
|
||||||
|
|
||||||
|
if (station->state == STATION_STATE_AUTOCONNECT && !autoconnect)
|
||||||
|
station_enter_state(station, STATION_STATE_DISCONNECTED);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void station_roam_state_clear(struct station *station)
|
void station_roam_state_clear(struct station *station)
|
||||||
{
|
{
|
||||||
l_timeout_remove(station->roam_trigger_timeout);
|
l_timeout_remove(station->roam_trigger_timeout);
|
||||||
@ -1316,6 +1345,8 @@ struct station *station_create(struct wiphy *wiphy, struct netdev *netdev)
|
|||||||
|
|
||||||
l_queue_push_head(station_list, station);
|
l_queue_push_head(station_list, station);
|
||||||
|
|
||||||
|
station_set_autoconnect(station, true);
|
||||||
|
|
||||||
return station;
|
return station;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,6 +67,7 @@ struct station {
|
|||||||
bool roam_no_orig_ap : 1;
|
bool roam_no_orig_ap : 1;
|
||||||
bool ap_directed_roaming : 1;
|
bool ap_directed_roaming : 1;
|
||||||
bool scanning : 1;
|
bool scanning : 1;
|
||||||
|
bool autoconnect : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct wiphy *station_get_wiphy(struct station *station);
|
struct wiphy *station_get_wiphy(struct station *station);
|
||||||
@ -96,6 +97,8 @@ uint32_t station_add_state_watch(struct station *station,
|
|||||||
station_destroy_func_t destroy);
|
station_destroy_func_t destroy);
|
||||||
bool station_remove_state_watch(struct station *station, uint32_t id);
|
bool station_remove_state_watch(struct station *station, uint32_t id);
|
||||||
|
|
||||||
|
bool station_set_autoconnect(struct station *station, bool autoconnect);
|
||||||
|
|
||||||
void station_roam_state_clear(struct station *station);
|
void station_roam_state_clear(struct station *station);
|
||||||
void station_roam_failed(struct station *station);
|
void station_roam_failed(struct station *station);
|
||||||
void station_roamed(struct station *station);
|
void station_roamed(struct station *station);
|
||||||
|
10
src/wsc.c
10
src/wsc.c
@ -147,7 +147,7 @@ static void wsc_try_credentials(struct wsc *wsc)
|
|||||||
|
|
||||||
dbus_pending_reply(&wsc->pending,
|
dbus_pending_reply(&wsc->pending,
|
||||||
wsc_error_not_reachable(wsc->pending));
|
wsc_error_not_reachable(wsc->pending));
|
||||||
device_set_autoconnect(device, true);
|
station_set_autoconnect(wsc->station, true);
|
||||||
done:
|
done:
|
||||||
memset(wsc->creds, 0, sizeof(wsc->creds));
|
memset(wsc->creds, 0, sizeof(wsc->creds));
|
||||||
wsc->n_creds = 0;
|
wsc->n_creds = 0;
|
||||||
@ -192,7 +192,6 @@ static void wsc_disconnect_cb(struct netdev *netdev, bool success,
|
|||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
struct wsc *wsc = user_data;
|
struct wsc *wsc = user_data;
|
||||||
struct device *device = netdev_get_device(wsc->netdev);
|
|
||||||
struct l_dbus_message *reply;
|
struct l_dbus_message *reply;
|
||||||
|
|
||||||
l_debug("%p, success: %d", wsc, success);
|
l_debug("%p, success: %d", wsc, success);
|
||||||
@ -203,14 +202,13 @@ static void wsc_disconnect_cb(struct netdev *netdev, bool success,
|
|||||||
l_dbus_message_set_arguments(reply, "");
|
l_dbus_message_set_arguments(reply, "");
|
||||||
dbus_pending_reply(&wsc->pending_cancel, reply);
|
dbus_pending_reply(&wsc->pending_cancel, reply);
|
||||||
|
|
||||||
device_set_autoconnect(device, true);
|
station_set_autoconnect(wsc->station, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wsc_connect_cb(struct netdev *netdev, enum netdev_result result,
|
static void wsc_connect_cb(struct netdev *netdev, enum netdev_result result,
|
||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
struct wsc *wsc = user_data;
|
struct wsc *wsc = user_data;
|
||||||
struct device *device = netdev_get_device(wsc->netdev);
|
|
||||||
|
|
||||||
l_debug("%d, result: %d", netdev_get_ifindex(wsc->netdev), result);
|
l_debug("%d, result: %d", netdev_get_ifindex(wsc->netdev), result);
|
||||||
|
|
||||||
@ -240,7 +238,7 @@ static void wsc_connect_cb(struct netdev *netdev, enum netdev_result result,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
device_set_autoconnect(device, true);
|
station_set_autoconnect(wsc->station, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wsc_credential_obtained(struct wsc *wsc,
|
static void wsc_credential_obtained(struct wsc *wsc,
|
||||||
@ -499,7 +497,7 @@ static void wsc_check_can_connect(struct wsc *wsc, struct scan_bss *target)
|
|||||||
* be triggering any more scans while disconnecting / connecting
|
* be triggering any more scans while disconnecting / connecting
|
||||||
*/
|
*/
|
||||||
wsc->target = target;
|
wsc->target = target;
|
||||||
device_set_autoconnect(device, false);
|
station_set_autoconnect(wsc->station, false);
|
||||||
|
|
||||||
switch (station_get_state(wsc->station)) {
|
switch (station_get_state(wsc->station)) {
|
||||||
case STATION_STATE_DISCONNECTED:
|
case STATION_STATE_DISCONNECTED:
|
||||||
|
Loading…
Reference in New Issue
Block a user