3
0
mirror of https://git.kernel.org/pub/scm/network/wireless/iwd.git synced 2026-02-12 07:38:04 +01:00
iwd/src/scan.h
Andrew Zaborowski b3a395091d scan: Switch all uses of ifindex to wdev_id
The ifindex is used to index the netdevs in the system (wlan, ethernet,
etc.) but we can also do wifi scanning on interfaces that have no
corresponding netdev object, like the P2P-device virtual interfaces.
Use the wdev id's to reference interfaces, the nl80211 api doesn't care
whether we use a NL80211_ATTR_IFINDEX or NL80211_ATTR_WDEV.  Only
wireless interfaces have a wdev id.
2019-07-08 11:53:00 -05:00

141 lines
4.5 KiB
C

/*
*
* Wireless daemon for Linux
*
* Copyright (C) 2015 Intel Corporation. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
enum scan_band {
SCAN_BAND_2_4_GHZ = 0x1,
SCAN_BAND_5_GHZ = 0x2,
};
enum scan_state {
SCAN_STATE_NOT_RUNNING,
SCAN_STATE_PASSIVE,
SCAN_STATE_ACTIVE,
};
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)(int err, struct l_queue *bss_list,
void *userdata);
typedef void (*scan_destroy_func_t)(void *userdata);
typedef void (*scan_freq_set_func_t)(uint32_t freq, void *userdata);
struct scan_freq_set;
struct ie_rsn_info;
struct scan_bss {
uint8_t addr[6];
uint32_t frequency;
int32_t signal_strength;
uint16_t capability;
uint8_t *rsne;
uint8_t *wpa;
uint8_t *osen;
uint8_t *wsc; /* Concatenated WSC IEs */
ssize_t wsc_size; /* Size of Concatenated WSC IEs */
uint8_t mde[3];
uint8_t ssid[32];
uint8_t ssid_len;
uint8_t supp_rates_ie[10];
uint8_t *ext_supp_rates_ie;
uint8_t utilization;
uint8_t cc[3];
uint16_t rank;
uint8_t ht_ie[28];
uint8_t vht_ie[14];
uint64_t time_stamp;
uint8_t hessid[6];
bool mde_present : 1;
bool cc_present : 1;
bool cap_rm_neighbor_report : 1;
bool has_sup_rates : 1;
bool ht_capable : 1;
bool vht_capable : 1;
bool anqp_capable : 1;
bool hs20_capable : 1;
};
struct scan_parameters {
const uint8_t *extra_ie;
size_t extra_ie_size;
struct scan_freq_set *freqs;
bool flush : 1;
bool randomize_mac_addr_hint : 1;
const char *ssid; /* Used for direct probe request */
};
static inline int scan_bss_addr_cmp(const struct scan_bss *a1,
const struct scan_bss *a2)
{
return memcmp(a1->addr, a2->addr, sizeof(a1->addr));
}
static inline bool scan_bss_addr_eq(const struct scan_bss *a1,
const struct scan_bss *a2)
{
return !memcmp(a1->addr, a2->addr, sizeof(a1->addr));
}
uint32_t scan_passive(uint64_t wdev_id, struct scan_freq_set *freqs,
scan_trigger_func_t trigger, scan_notify_func_t notify,
void *userdata, scan_destroy_func_t destroy);
uint32_t scan_active(uint64_t wdev_id, uint8_t *extra_ie, size_t extra_ie_size,
scan_trigger_func_t trigger,
scan_notify_func_t notify, void *userdata,
scan_destroy_func_t destroy);
uint32_t scan_active_full(uint64_t wdev_id,
const struct scan_parameters *params,
scan_trigger_func_t trigger, scan_notify_func_t notify,
void *userdata, scan_destroy_func_t destroy);
bool scan_cancel(uint64_t wdev_id, uint32_t id);
void scan_periodic_start(uint64_t wdev_id, scan_trigger_func_t trigger,
scan_notify_func_t func, void *userdata);
bool scan_periodic_stop(uint64_t wdev_id);
void scan_bss_free(struct scan_bss *bss);
int scan_bss_rank_compare(const void *a, const void *b, void *user);
int scan_bss_get_rsn_info(const struct scan_bss *bss, struct ie_rsn_info *info);
uint8_t scan_freq_to_channel(uint32_t freq, enum scan_band *out_band);
uint32_t scan_channel_to_freq(uint8_t channel, enum scan_band band);
enum scan_band scan_oper_class_to_band(const uint8_t *country,
uint8_t oper_class);
struct scan_freq_set *scan_freq_set_new(void);
void scan_freq_set_free(struct scan_freq_set *freqs);
bool scan_freq_set_add(struct scan_freq_set *freqs, uint32_t freq);
bool scan_freq_set_contains(struct scan_freq_set *freqs, uint32_t freq);
uint32_t scan_freq_set_get_bands(struct scan_freq_set *freqs);
void scan_freq_set_foreach(const struct scan_freq_set *freqs,
scan_freq_set_func_t func, void *user_data);
void scan_freq_set_merge(struct scan_freq_set *to,
const struct scan_freq_set *from);
void scan_freq_set_constrain(struct scan_freq_set *set,
const struct scan_freq_set *constraint);
bool scan_wdev_add(uint64_t wdev_id);
bool scan_wdev_remove(uint64_t wdev_id);
bool scan_suspend(uint64_t wdev_id);
void scan_resume(uint64_t wdev_id);