mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-17 17:39:28 +01:00
scan: Add error code argument to scan results callback
Pass an additional parameter to the scan results notify functions to tell them whether the scan was successful. If it wasn't don't bother passing an empty bss_list queue, pass NULL as bss_list. This way the callbacks can tell whether the scan indicates there are no BSSes in range or simply was aborted and the old scan results should be kept.
This commit is contained in:
parent
dff92b9c76
commit
52ee3b0843
24
src/device.c
24
src/device.c
@ -316,14 +316,9 @@ void device_set_scan_results(struct device *device, struct l_queue *bss_list)
|
||||
struct network *network;
|
||||
const struct l_queue_entry *bss_entry;
|
||||
struct timespec now;
|
||||
struct l_dbus *dbus = dbus_get_bus();
|
||||
|
||||
clock_gettime(CLOCK_REALTIME, &now);
|
||||
|
||||
device->scanning = false;
|
||||
l_dbus_property_changed(dbus, device_get_path(device),
|
||||
IWD_DEVICE_INTERFACE, "Scanning");
|
||||
|
||||
device->old_bss_list = device->bss_list;
|
||||
device->bss_list = bss_list;
|
||||
|
||||
@ -367,12 +362,21 @@ void device_set_scan_results(struct device *device, struct l_queue *bss_list)
|
||||
device_autoconnect_next(device);
|
||||
}
|
||||
|
||||
static bool new_scan_results(uint32_t wiphy_id, uint32_t ifindex,
|
||||
static bool new_scan_results(uint32_t wiphy_id, uint32_t ifindex, int err,
|
||||
struct l_queue *bss_list, void *userdata)
|
||||
{
|
||||
struct device *device = userdata;
|
||||
struct l_dbus *dbus = dbus_get_bus();
|
||||
|
||||
device->scanning = false;
|
||||
l_dbus_property_changed(dbus, device_get_path(device),
|
||||
IWD_DEVICE_INTERFACE, "Scanning");
|
||||
|
||||
if (err)
|
||||
return false;
|
||||
|
||||
device_set_scan_results(device, bss_list);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -670,7 +674,7 @@ static void device_roam_scan_triggered(int err, void *user_data)
|
||||
}
|
||||
|
||||
static bool device_roam_scan_notify(uint32_t wiphy_id, uint32_t ifindex,
|
||||
struct l_queue *bss_list,
|
||||
int err, struct l_queue *bss_list,
|
||||
void *userdata)
|
||||
{
|
||||
struct device *device = userdata;
|
||||
@ -685,6 +689,12 @@ static bool device_roam_scan_notify(uint32_t wiphy_id, uint32_t ifindex,
|
||||
struct timespec now;
|
||||
bool seen = false;
|
||||
|
||||
if (err) {
|
||||
device_roam_failed(device);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Do not call device_set_scan_results because this may have been
|
||||
* a partial scan. We could at most update the current networks' BSS
|
||||
|
14
src/scan.c
14
src/scan.c
@ -982,7 +982,7 @@ static void get_scan_callback(struct l_genl_msg *msg, void *user_data)
|
||||
}
|
||||
|
||||
static void scan_finished(struct scan_context *sc, uint32_t wiphy,
|
||||
struct l_queue *bss_list)
|
||||
int err, struct l_queue *bss_list)
|
||||
{
|
||||
struct scan_request *sr;
|
||||
scan_notify_func_t callback = NULL;
|
||||
@ -1014,13 +1014,9 @@ static void scan_finished(struct scan_context *sc, uint32_t wiphy,
|
||||
sc->sp.triggered = false;
|
||||
}
|
||||
|
||||
if (callback) {
|
||||
if (!bss_list)
|
||||
bss_list = l_queue_new();
|
||||
|
||||
new_owner = callback(wiphy, sc->ifindex,
|
||||
if (callback)
|
||||
new_owner = callback(wiphy, sc->ifindex, err,
|
||||
bss_list, userdata);
|
||||
}
|
||||
|
||||
if (destroy)
|
||||
destroy(userdata);
|
||||
@ -1045,7 +1041,7 @@ static void get_scan_done(void *user)
|
||||
sc = l_queue_find(scan_contexts, scan_context_match,
|
||||
L_UINT_TO_PTR(results->ifindex));
|
||||
if (sc)
|
||||
scan_finished(sc, results->wiphy, results->bss_list);
|
||||
scan_finished(sc, results->wiphy, 0, results->bss_list);
|
||||
else
|
||||
l_queue_destroy(results->bss_list,
|
||||
(l_queue_destroy_func_t) scan_bss_free);
|
||||
@ -1173,7 +1169,7 @@ static void scan_notify(struct l_genl_msg *msg, void *user_data)
|
||||
break;
|
||||
|
||||
case NL80211_CMD_SCAN_ABORTED:
|
||||
scan_finished(sc, attr_wiphy, NULL);
|
||||
scan_finished(sc, attr_wiphy, -ECANCELED, NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -33,7 +33,7 @@ enum scan_state {
|
||||
|
||||
typedef void (*scan_func_t)(struct l_genl_msg *msg, void *user_data);
|
||||
typedef void (*scan_trigger_func_t)(int, void *);
|
||||
typedef bool (*scan_notify_func_t)(uint32_t wiphy, uint32_t ifindex,
|
||||
typedef bool (*scan_notify_func_t)(uint32_t wiphy, uint32_t ifindex, int err,
|
||||
struct l_queue *bss_list,
|
||||
void *userdata);
|
||||
typedef void (*scan_destroy_func_t)(void *userdata);
|
||||
|
21
src/wsc.c
21
src/wsc.c
@ -554,7 +554,8 @@ static void pin_timeout(struct l_timeout *timeout, void *user_data)
|
||||
}
|
||||
|
||||
static bool push_button_scan_results(uint32_t wiphy_id, uint32_t ifindex,
|
||||
struct l_queue *bss_list, void *userdata)
|
||||
int err, struct l_queue *bss_list,
|
||||
void *userdata)
|
||||
{
|
||||
struct wsc *wsc = userdata;
|
||||
struct scan_bss *bss_2g;
|
||||
@ -565,6 +566,14 @@ static bool push_button_scan_results(uint32_t wiphy_id, uint32_t ifindex,
|
||||
const struct l_queue_entry *bss_entry;
|
||||
struct wsc_probe_response probe_response;
|
||||
|
||||
if (err) {
|
||||
wsc_cancel_scan(wsc);
|
||||
dbus_pending_reply(&wsc->pending,
|
||||
dbus_error_failed(wsc->pending));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bss_2g = NULL;
|
||||
bss_5g = NULL;
|
||||
|
||||
@ -702,7 +711,7 @@ static bool authorized_macs_contains(const uint8_t *authorized_macs,
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool pin_scan_results(uint32_t wiphy_id, uint32_t ifindex,
|
||||
static bool pin_scan_results(uint32_t wiphy_id, uint32_t ifindex, int err,
|
||||
struct l_queue *bss_list, void *userdata)
|
||||
{
|
||||
static const uint8_t wildcard_address[] =
|
||||
@ -712,6 +721,14 @@ static bool pin_scan_results(uint32_t wiphy_id, uint32_t ifindex,
|
||||
const struct l_queue_entry *bss_entry;
|
||||
struct wsc_probe_response probe_response;
|
||||
|
||||
if (err) {
|
||||
wsc_cancel_scan(wsc);
|
||||
dbus_pending_reply(&wsc->pending,
|
||||
dbus_error_failed(wsc->pending));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
wsc->scan_id = 0;
|
||||
|
||||
for (bss_entry = l_queue_get_entries(bss_list); bss_entry;
|
||||
|
Loading…
Reference in New Issue
Block a user