mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-06 03:59:22 +01:00
3f04bc427d
This adds the option [Settings].UseDefaultEccGroup which allows a network profile to specify the behavior when using an ECC-based protocol. If unset (default) IWD will learn the behavior of the network for the lifetime of its process. Many APs do not support group 20 which IWD tries first by default. This leads to an initial failure followed by a retry using group 19. This option will allow the user to configure IWD to use group 19 first or learn the network capabilities, if the authentication fails with group 20 IWD will always use group 19 for the process lifetime.
167 lines
5.9 KiB
C
167 lines
5.9 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
|
|
*
|
|
*/
|
|
|
|
#define SETTINGS "Settings"
|
|
#define NET_HIDDEN SETTINGS, "Hidden"
|
|
#define NET_AUTOCONNECT SETTINGS, "AutoConnect"
|
|
#define NET_ALWAYS_RANDOMIZE_ADDRESS SETTINGS, "AlwaysRandomizeAddress"
|
|
#define NET_ADDRESS_OVERRIDE SETTINGS, "AddressOverride"
|
|
#define NET_TRANSITION_DISABLE SETTINGS, "TransitionDisable"
|
|
#define NET_TRANSITION_DISABLE_MODES SETTINGS, "DisabledTransitionModes"
|
|
#define NET_USE_DEFAULT_ECC_GROUP SETTINGS, "UseDefaultEccGroup"
|
|
|
|
enum security;
|
|
struct scan_freq_set;
|
|
struct network_info;
|
|
|
|
enum known_networks_event {
|
|
KNOWN_NETWORKS_EVENT_ADDED,
|
|
KNOWN_NETWORKS_EVENT_REMOVED,
|
|
KNOWN_NETWORKS_EVENT_UPDATED,
|
|
};
|
|
|
|
enum known_network_ecc_group {
|
|
KNOWN_NETWORK_ECC_GROUP_AUTO = 0,
|
|
KNOWN_NETWORK_ECC_GROUP_DEFAULT,
|
|
KNOWN_NETWORK_ECC_GROUP_MOST_SECURE,
|
|
};
|
|
|
|
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_config {
|
|
uint64_t connected_time; /* Time last connected */
|
|
bool is_hidden:1;
|
|
bool is_autoconnectable:1;
|
|
bool override_addr:1;
|
|
bool always_random_addr:1;
|
|
uint8_t sta_addr[6];
|
|
bool have_transition_disable : 1;
|
|
uint8_t transition_disable;
|
|
enum known_network_ecc_group ecc_group;
|
|
};
|
|
|
|
struct network_info {
|
|
const struct network_info_ops *ops;
|
|
char ssid[33];
|
|
enum security type;
|
|
struct l_queue *known_frequencies;
|
|
int seen_count; /* Ref count for network.info */
|
|
uint8_t uuid[16];
|
|
bool is_hotspot:1;
|
|
bool has_uuid:1;
|
|
struct network_config config;
|
|
};
|
|
|
|
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;
|
|
};
|
|
|
|
void __network_config_parse(const struct l_settings *settings,
|
|
const char *path,
|
|
struct network_config *config);
|
|
void __network_info_init(struct network_info *info,
|
|
const char *ssid, enum security security,
|
|
struct network_config *config);
|
|
|
|
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,
|
|
uint8_t freqs_per_network);
|
|
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 network_config *new_config);
|
|
void known_network_set_connected_time(struct network_info *network,
|
|
uint64_t connected_time);
|
|
void known_networks_remove(struct network_info *info);
|