mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-12-22 04:32:37 +01:00
wiphy: Add wiphy state watch add / remove
This commit is contained in:
parent
9be982b460
commit
0dd8114970
28
src/wiphy.c
28
src/wiphy.c
@ -45,6 +45,7 @@
|
|||||||
#include "src/storage.h"
|
#include "src/storage.h"
|
||||||
#include "src/util.h"
|
#include "src/util.h"
|
||||||
#include "src/common.h"
|
#include "src/common.h"
|
||||||
|
#include "src/watchlist.h"
|
||||||
|
|
||||||
static struct l_genl_family *nl80211 = NULL;
|
static struct l_genl_family *nl80211 = NULL;
|
||||||
static struct l_hwdb *hwdb;
|
static struct l_hwdb *hwdb;
|
||||||
@ -62,6 +63,7 @@ struct wiphy {
|
|||||||
struct scan_freq_set *supported_freqs;
|
struct scan_freq_set *supported_freqs;
|
||||||
char *model_str;
|
char *model_str;
|
||||||
char *vendor_str;
|
char *vendor_str;
|
||||||
|
struct watchlist state_watches;
|
||||||
|
|
||||||
bool support_scheduled_scan:1;
|
bool support_scheduled_scan:1;
|
||||||
bool support_rekey_offload:1;
|
bool support_rekey_offload:1;
|
||||||
@ -154,6 +156,7 @@ static struct wiphy *wiphy_new(uint32_t id)
|
|||||||
|
|
||||||
wiphy->id = id;
|
wiphy->id = id;
|
||||||
wiphy->supported_freqs = scan_freq_set_new();
|
wiphy->supported_freqs = scan_freq_set_new();
|
||||||
|
watchlist_init(&wiphy->state_watches, NULL);
|
||||||
|
|
||||||
return wiphy;
|
return wiphy;
|
||||||
}
|
}
|
||||||
@ -165,6 +168,7 @@ static void wiphy_free(void *data)
|
|||||||
l_debug("Freeing wiphy %s[%u]", wiphy->name, wiphy->id);
|
l_debug("Freeing wiphy %s[%u]", wiphy->name, wiphy->id);
|
||||||
|
|
||||||
scan_freq_set_free(wiphy->supported_freqs);
|
scan_freq_set_free(wiphy->supported_freqs);
|
||||||
|
watchlist_destroy(&wiphy->state_watches);
|
||||||
l_free(wiphy->model_str);
|
l_free(wiphy->model_str);
|
||||||
l_free(wiphy->vendor_str);
|
l_free(wiphy->vendor_str);
|
||||||
l_free(wiphy);
|
l_free(wiphy);
|
||||||
@ -312,6 +316,18 @@ bool wiphy_supports_iftype(struct wiphy *wiphy, uint32_t iftype)
|
|||||||
return wiphy->supported_iftypes & (1 << (iftype - 1));
|
return wiphy->supported_iftypes & (1 << (iftype - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t wiphy_state_watch_add(struct wiphy *wiphy,
|
||||||
|
wiphy_state_watch_func_t func,
|
||||||
|
void *user_data, wiphy_destroy_func_t destroy)
|
||||||
|
{
|
||||||
|
return watchlist_add(&wiphy->state_watches, func, user_data, destroy);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wiphy_state_watch_remove(struct wiphy *wiphy, uint32_t id)
|
||||||
|
{
|
||||||
|
return watchlist_remove(&wiphy->state_watches, id);
|
||||||
|
}
|
||||||
|
|
||||||
static void wiphy_print_basic_info(struct wiphy *wiphy)
|
static void wiphy_print_basic_info(struct wiphy *wiphy)
|
||||||
{
|
{
|
||||||
uint32_t bands;
|
uint32_t bands;
|
||||||
@ -867,6 +883,7 @@ static void wiphy_rfkill_cb(unsigned int wiphy_id, bool soft, bool hard,
|
|||||||
struct wiphy *wiphy = wiphy_find(wiphy_id);
|
struct wiphy *wiphy = wiphy_find(wiphy_id);
|
||||||
struct l_dbus *dbus = dbus_get_bus();
|
struct l_dbus *dbus = dbus_get_bus();
|
||||||
bool old_powered, new_powered;
|
bool old_powered, new_powered;
|
||||||
|
enum wiphy_state_watch_event event;
|
||||||
|
|
||||||
if (!wiphy)
|
if (!wiphy)
|
||||||
return;
|
return;
|
||||||
@ -878,8 +895,15 @@ static void wiphy_rfkill_cb(unsigned int wiphy_id, bool soft, bool hard,
|
|||||||
|
|
||||||
new_powered = !wiphy->soft_rfkill && !wiphy->hard_rfkill;
|
new_powered = !wiphy->soft_rfkill && !wiphy->hard_rfkill;
|
||||||
|
|
||||||
if (old_powered != new_powered)
|
if (old_powered == new_powered)
|
||||||
l_dbus_property_changed(dbus, wiphy_get_path(wiphy),
|
return;
|
||||||
|
|
||||||
|
event = new_powered ? WIPHY_STATE_WATCH_EVENT_POWERED :
|
||||||
|
WIPHY_STATE_WATCH_EVENT_RFKILLED;
|
||||||
|
WATCHLIST_NOTIFY(&wiphy->state_watches, wiphy_state_watch_func_t,
|
||||||
|
wiphy, event);
|
||||||
|
|
||||||
|
l_dbus_property_changed(dbus, wiphy_get_path(wiphy),
|
||||||
IWD_WIPHY_INTERFACE, "Powered");
|
IWD_WIPHY_INTERFACE, "Powered");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
15
src/wiphy.h
15
src/wiphy.h
@ -26,6 +26,16 @@
|
|||||||
struct wiphy;
|
struct wiphy;
|
||||||
struct scan_bss;
|
struct scan_bss;
|
||||||
|
|
||||||
|
enum wiphy_state_watch_event {
|
||||||
|
WIPHY_STATE_WATCH_EVENT_POWERED,
|
||||||
|
WIPHY_STATE_WATCH_EVENT_RFKILLED,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef void (*wiphy_state_watch_func_t)(struct wiphy *wiphy,
|
||||||
|
enum wiphy_state_watch_event event,
|
||||||
|
void *user_data);
|
||||||
|
typedef void (*wiphy_destroy_func_t)(void *user_data);
|
||||||
|
|
||||||
enum ie_rsn_cipher_suite wiphy_select_cipher(struct wiphy *wiphy,
|
enum ie_rsn_cipher_suite wiphy_select_cipher(struct wiphy *wiphy,
|
||||||
uint16_t mask);
|
uint16_t mask);
|
||||||
enum ie_rsn_akm_suite wiphy_select_akm(struct wiphy *wiphy,
|
enum ie_rsn_akm_suite wiphy_select_akm(struct wiphy *wiphy,
|
||||||
@ -42,6 +52,11 @@ uint8_t wiphy_get_max_num_ssids_per_scan(struct wiphy *wiphy);
|
|||||||
bool wiphy_supports_iftype(struct wiphy *wiphy, uint32_t iftype);
|
bool wiphy_supports_iftype(struct wiphy *wiphy, uint32_t iftype);
|
||||||
bool wiphy_supports_adhoc_rsn(struct wiphy *wiphy);
|
bool wiphy_supports_adhoc_rsn(struct wiphy *wiphy);
|
||||||
|
|
||||||
|
uint32_t wiphy_state_watch_add(struct wiphy *wiphy,
|
||||||
|
wiphy_state_watch_func_t func, void *user_data,
|
||||||
|
wiphy_destroy_func_t destroy);
|
||||||
|
bool wiphy_state_watch_remove(struct wiphy *wiphy, uint32_t id);
|
||||||
|
|
||||||
bool wiphy_init(struct l_genl_family *in, const char *whitelist,
|
bool wiphy_init(struct l_genl_family *in, const char *whitelist,
|
||||||
const char *blacklist);
|
const char *blacklist);
|
||||||
bool wiphy_exit(void);
|
bool wiphy_exit(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user