mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-20 12:39:25 +01:00
03ccc454b7
We track mtime as the 'LastConnectedTime' of the network, and also sort the known network list according to the last connected time. Unfortunately we were never reacting to ATTRIB changes, and so were never updating the network_info->connected_time whenever a network was connected to. Rework the logic to address this. This also fixes a small bug where the connected_time was not set properly prior to removal / re-insertion of the network_info.
132 lines
4.8 KiB
C
132 lines
4.8 KiB
C
/*
|
|
*
|
|
* Wireless daemon for Linux
|
|
*
|
|
* Copyright (C) 2016-2019 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 security;
|
|
struct scan_freq_set;
|
|
struct network_info;
|
|
|
|
enum known_networks_event {
|
|
KNOWN_NETWORKS_EVENT_ADDED,
|
|
KNOWN_NETWORKS_EVENT_REMOVED,
|
|
};
|
|
|
|
struct network_info_ops {
|
|
struct l_settings *(*open)(struct network_info *info);
|
|
int (*touch)(struct network_info *info);
|
|
void (*sync)(struct network_info *info, struct l_settings *settings);
|
|
void (*remove)(struct network_info *info);
|
|
void (*free)(struct network_info *info);
|
|
const char *(*get_path)(const struct network_info *info);
|
|
const char *(*get_name)(const struct network_info *info);
|
|
const char *(*get_type)(const struct network_info *info);
|
|
const struct iovec *(*get_extra_ies)(const struct network_info *info,
|
|
struct scan_bss *bss,
|
|
size_t *num_elems);
|
|
char *(*get_file_path)(const struct network_info *info);
|
|
|
|
bool (*match_hessid)(const struct network_info *info,
|
|
const uint8_t *hessid);
|
|
const uint8_t *(*match_roaming_consortium)(
|
|
const struct network_info *info,
|
|
const uint8_t *rc_ie,
|
|
size_t rc_len,
|
|
size_t *rc_len_out);
|
|
bool (*match_nai_realms)(const struct network_info *info,
|
|
const char **nai_realms);
|
|
};
|
|
|
|
struct network_info {
|
|
const struct network_info_ops *ops;
|
|
char ssid[33];
|
|
enum security type;
|
|
struct l_queue *known_frequencies;
|
|
uint64_t connected_time; /* Time last connected */
|
|
int seen_count; /* Ref count for network.info */
|
|
uint8_t uuid[16];
|
|
bool is_hidden:1;
|
|
bool is_autoconnectable:1;
|
|
bool is_hotspot:1;
|
|
bool has_uuid:1;
|
|
};
|
|
|
|
typedef bool (*known_networks_foreach_func_t)(const struct network_info *info,
|
|
void *user_data);
|
|
|
|
typedef void (*known_networks_watch_func_t)(enum known_networks_event event,
|
|
const struct network_info *info,
|
|
void *user_data);
|
|
typedef void (*known_networks_destroy_func_t)(void *user_data);
|
|
|
|
struct known_frequency {
|
|
uint32_t frequency;
|
|
};
|
|
|
|
int known_network_offset(const struct network_info *target);
|
|
bool known_networks_foreach(known_networks_foreach_func_t function,
|
|
void *user_data);
|
|
bool known_networks_has_hidden(void);
|
|
struct network_info *known_networks_find(const char *ssid,
|
|
enum security security);
|
|
|
|
struct scan_freq_set *known_networks_get_recent_frequencies(
|
|
uint8_t num_networks_tosearch);
|
|
int known_network_add_frequency(struct network_info *info, uint32_t frequency);
|
|
void known_network_frequency_sync(struct network_info *info);
|
|
|
|
uint32_t known_networks_watch_add(known_networks_watch_func_t func,
|
|
void *user_data,
|
|
known_networks_destroy_func_t destroy);
|
|
void known_networks_watch_remove(uint32_t id);
|
|
|
|
struct l_settings *network_info_open_settings(struct network_info *info);
|
|
int network_info_touch(struct network_info *info);
|
|
const char *network_info_get_path(const struct network_info *info);
|
|
const char *network_info_get_name(const struct network_info *info);
|
|
const char *network_info_get_type(const struct network_info *info);
|
|
const struct iovec *network_info_get_extra_ies(const struct network_info *info,
|
|
struct scan_bss *bss,
|
|
size_t *num_elems);
|
|
/* Gets the UUID, or generates one if not yet created */
|
|
const uint8_t *network_info_get_uuid(struct network_info *info);
|
|
void network_info_set_uuid(struct network_info *info, const uint8_t *uuid);
|
|
struct scan_freq_set *network_info_get_roam_frequencies(
|
|
const struct network_info *info,
|
|
uint32_t current_freq,
|
|
uint8_t max);
|
|
|
|
bool network_info_match_hessid(const struct network_info *info,
|
|
const uint8_t *hessid);
|
|
const uint8_t *network_info_match_roaming_consortium(
|
|
const struct network_info *info,
|
|
const uint8_t *rc,
|
|
size_t rc_len,
|
|
size_t *rc_len_out);
|
|
bool network_info_match_nai_realm(const struct network_info *info,
|
|
const char **nai_realms);
|
|
|
|
void known_networks_add(struct network_info *info);
|
|
void known_network_update(struct network_info *info,
|
|
struct l_settings *settings);
|
|
void known_network_set_connected_time(struct network_info *network,
|
|
uint64_t connected_time);
|
|
void known_networks_remove(struct network_info *info);
|