scan: Support freq_set in scan_parameters
This way we can tell the kernel to only scan on particular frequencies
This commit is contained in:
parent
ed1538d5bb
commit
b0f51a2527
42
src/scan.c
42
src/scan.c
|
@ -249,13 +249,50 @@ static void scan_done(struct l_genl_msg *msg, void *userdata)
|
||||||
sr->trigger(0, sr->userdata);
|
sr->trigger(0, sr->userdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct scan_freq_append_data {
|
||||||
|
struct l_genl_msg *msg;
|
||||||
|
int count;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void scan_freq_append(uint32_t freq, void *user_data)
|
||||||
|
{
|
||||||
|
struct scan_freq_append_data *data = user_data;
|
||||||
|
|
||||||
|
l_genl_msg_append_attr(data->msg, data->count++, 4, &freq);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void scan_build_attr_scan_frequencies(struct l_genl_msg *msg,
|
||||||
|
struct scan_freq_set *freqs)
|
||||||
|
{
|
||||||
|
struct scan_freq_append_data append_data = { msg, 0 };
|
||||||
|
|
||||||
|
l_genl_msg_enter_nested(msg, NL80211_ATTR_SCAN_FREQUENCIES);
|
||||||
|
|
||||||
|
scan_freq_set_foreach(freqs, scan_freq_append, &append_data);
|
||||||
|
|
||||||
|
l_genl_msg_leave_nested(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void scan_freq_count(uint32_t freq, void *user_data)
|
||||||
|
{
|
||||||
|
int *count = user_data;
|
||||||
|
|
||||||
|
*count += 1;
|
||||||
|
}
|
||||||
|
|
||||||
static struct l_genl_msg *scan_build_cmd(uint32_t ifindex, bool passive,
|
static struct l_genl_msg *scan_build_cmd(uint32_t ifindex, bool passive,
|
||||||
const struct scan_parameters *params)
|
const struct scan_parameters *params)
|
||||||
{
|
{
|
||||||
struct l_genl_msg *msg;
|
struct l_genl_msg *msg;
|
||||||
|
int n_channels = 0;
|
||||||
|
|
||||||
|
if (params->freqs)
|
||||||
|
scan_freq_set_foreach(params->freqs, scan_freq_count,
|
||||||
|
&n_channels);
|
||||||
|
|
||||||
msg = l_genl_msg_new_sized(NL80211_CMD_TRIGGER_SCAN,
|
msg = l_genl_msg_new_sized(NL80211_CMD_TRIGGER_SCAN,
|
||||||
32 + params->extra_ie_size);
|
32 + params->extra_ie_size +
|
||||||
|
4 * n_channels);
|
||||||
l_genl_msg_append_attr(msg, NL80211_ATTR_IFINDEX, 4, &ifindex);
|
l_genl_msg_append_attr(msg, NL80211_ATTR_IFINDEX, 4, &ifindex);
|
||||||
|
|
||||||
if (!passive) {
|
if (!passive) {
|
||||||
|
@ -269,6 +306,9 @@ static struct l_genl_msg *scan_build_cmd(uint32_t ifindex, bool passive,
|
||||||
params->extra_ie_size,
|
params->extra_ie_size,
|
||||||
params->extra_ie);
|
params->extra_ie);
|
||||||
|
|
||||||
|
if (params->freqs)
|
||||||
|
scan_build_attr_scan_frequencies(msg, params->freqs);
|
||||||
|
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,7 @@ struct scan_bss {
|
||||||
struct scan_parameters {
|
struct scan_parameters {
|
||||||
const uint8_t *extra_ie;
|
const uint8_t *extra_ie;
|
||||||
size_t extra_ie_size;
|
size_t extra_ie_size;
|
||||||
|
struct scan_freq_set *freqs;
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32_t scan_passive(uint32_t ifindex, scan_trigger_func_t trigger,
|
uint32_t scan_passive(uint32_t ifindex, scan_trigger_func_t trigger,
|
||||||
|
|
Loading…
Reference in New Issue