[PATCH 1/3] test-runner: add support for PCI passthrough
by James Prestwood
Adding back in PCI passthrough support
---
tools/test-runner | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/tools/test-runner b/tools/test-runner
index 156b36cc..6c7a7e45 100755
--- a/tools/test-runner
+++ b/tools/test-runner
@@ -1649,6 +1649,7 @@ class Main:
def start(self):
usb_adapters = None
+ pci_adapters = None
qemu_table = [
'qemu-system-x86_64',
@@ -1691,7 +1692,7 @@ class Main:
if self.args.hw:
hw_conf = ConfigParser()
hw_conf.read(self.args.hw)
- # TODO: Parse PCI adapters
+
if hw_conf.has_section('USBAdapters'):
# The actual key name of the adapter
# doesn't matter since all we need is the
@@ -1699,6 +1700,9 @@ class Main:
# anyways once in the VM.
usb_adapters = [v for v in hw_conf['USBAdapters'].values()]
+ if hw_conf.has_section('PCIAdapters'):
+ pci_adapters = [v for v in hw_conf['PCIAdapters'].values()]
+
#
# Additional arguments not provided to test-runner which are
# needed once booted into the kernel.
@@ -1828,6 +1832,11 @@ class Main:
'-device',
'usb-host,hostbus=%s,hostaddr=%s' % \
(bus, addr)])
+ if pci_adapters:
+ qemu_cmdline.extend(['-enable-kvm'])
+ for addr in pci_adapters:
+ qemu_cmdline.extend(['-device', 'vfio-pci,host=%s' % addr])
+
if self.args.log:
#
# Creates a virtfs device that can be mounted. This mount
--
2.31.1
6 months, 3 weeks
[PATCH] test-runner: allow wpa_supplicant to be used in --hw mode
by James Prestwood
This lets test-runner's physical adapter pass-through to be used with
wpa_supplicant.
---
tools/test-runner | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/tools/test-runner b/tools/test-runner
index a1967173..156b36cc 100755
--- a/tools/test-runner
+++ b/tools/test-runner
@@ -927,12 +927,32 @@ class TestContext(Namespace):
return frequencies
def start_wpas_interfaces(self):
+
if 'WPA_SUPPLICANT' not in self.hw_config:
return
settings = self.hw_config['WPA_SUPPLICANT']
- wpas_radios = [rad for rad in self.radios if rad.name in settings]
- self.wpas_interfaces = [rad.create_interface(settings[rad.name], 'wpas') for rad in wpas_radios]
+
+ if self.args.hw:
+ nradios = len(settings.items())
+
+ wpas_radios = self.radios[:nradios]
+ self.wpas_interfaces = []
+
+ #
+ # Physical radios most likely will use a different name
+ # than 'rad#' but the config file is referenced by these
+ # 'rad#' names. Iterate through both the settings and
+ # physical radios to create interfaces associated with
+ # each config file.
+ #
+ for vrad, hwrad in zip(settings.items(), wpas_radios):
+ self.wpas_interfaces.append(hwrad.create_interface(vrad[1], 'wpas'))
+
+ else:
+ wpas_radios = [rad for rad in self.radios if rad.name in settings]
+ self.wpas_interfaces = [rad.create_interface('wpa_supplicant.conf', 'wpas') \
+ for rad in wpas_radios]
def start_ofono(self):
sim_keys = self.hw_config['SETUP'].get('sim_keys', None)
--
2.31.1
6 months, 3 weeks
[PATCH] netdev: add SA Query delay with OCV enabled
by James Prestwood
The way a SA Query was done following a channel switch was slightly
incorrect. One because it is only needed when OCVC is set, and two
because IWD was not waiting a random delay between 0 and 5000us as
lined out by the spec. This patch fixes both these issues.
---
src/netdev.c | 32 +++++++++++++++++++++++++++++++-
1 file changed, 31 insertions(+), 1 deletion(-)
diff --git a/src/netdev.c b/src/netdev.c
index c6618546..96e473a9 100644
--- a/src/netdev.c
+++ b/src/netdev.c
@@ -142,6 +142,7 @@ struct netdev {
uint16_t last_code; /* reason or status, depending on result */
struct l_timeout *neighbor_report_timeout;
struct l_timeout *sa_query_timeout;
+ struct l_timeout *sa_query_delay;
struct l_timeout *group_handshake_timeout;
uint16_t sa_query_id;
uint8_t prev_snonce[32];
@@ -797,6 +798,11 @@ static void netdev_connect_free(struct netdev *netdev)
netdev->sa_query_timeout = NULL;
}
+ if (netdev->sa_query_delay) {
+ l_timeout_remove(netdev->sa_query_delay);
+ netdev->sa_query_delay = NULL;
+ }
+
if (netdev->group_handshake_timeout) {
l_timeout_remove(netdev->group_handshake_timeout);
netdev->group_handshake_timeout = NULL;
@@ -5351,6 +5357,17 @@ failed:
}
+static void netdev_send_sa_query_delay(struct l_timeout *timeout,
+ void *user_data)
+{
+ struct netdev *netdev = user_data;
+
+ netdev_send_sa_query_request(netdev);
+
+ l_timeout_remove(netdev->sa_query_delay);
+ netdev->sa_query_delay = NULL;
+}
+
static void netdev_channel_switch_event(struct l_genl_msg *msg,
struct netdev *netdev)
{
@@ -5368,7 +5385,20 @@ static void netdev_channel_switch_event(struct l_genl_msg *msg,
handshake_state_set_chandef(netdev->handshake, l_steal_ptr(chandef));
- netdev_send_sa_query_request(netdev);
+ /*
+ * IEEE 802.11-2020 11.9.3.2
+ * "If the STA chooses to perform the specified switch and
+ * dot11RSNAOperatingChannelValidationActivated is true and the AP has
+ * indicated OCVC capability, after switching to the new channel the STA
+ * shall wait a random delay uniformly-distributed in the range between
+ * zero and 5000us, and then initiate the SA query procedure"
+ */
+ if (netdev->handshake->supplicant_ocvc &&
+ netdev->handshake->authenticator_ocvc)
+ netdev->sa_query_delay = l_timeout_create_ms(
+ l_getrandom_uint32() % 5,
+ netdev_send_sa_query_delay,
+ netdev, NULL);
if (!netdev->event_filter)
return;
--
2.31.1
6 months, 3 weeks
[RFC PATCH V2] ap: Expose connected stations property
by Michael Trimarchi
Add a way to be notified about the connected stations in access
point mode. This can be used in order to ask from Diagnostic
interface the properties for each station or to just use them
from other services like connman or network manager to report
the number of clients
Signed-off-by: Michael Trimarchi <michael(a)amarulasolutions.com>
---
Changes V1->V2:
typo in message dbus type
---
src/ap.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/src/ap.c b/src/ap.c
index 46a7a6a8..e88be99c 100644
--- a/src/ap.c
+++ b/src/ap.c
@@ -98,6 +98,7 @@ struct ap_state {
uint8_t netconfig_gateway4_mac[6];
uint8_t netconfig_dns4_mac[6];
+ uint16_t connected_stations;
bool started : 1;
bool gtk_set : 1;
bool netconfig_set_addr4 : 1;
@@ -347,6 +348,7 @@ static void ap_new_rsna(struct sta_state *sta)
event_data.assoc_ies_len = sta->assoc_ies_len;
ap->ops->handle_event(AP_EVENT_STATION_ADDED, &event_data,
ap->user_data);
+ ap->connected_stations++;
}
}
@@ -385,6 +387,7 @@ static void ap_drop_rsna(struct sta_state *sta)
event_data.mac = sta->addr;
ap->ops->handle_event(AP_EVENT_STATION_REMOVED, &event_data,
ap->user_data);
+ ap->connected_stations++;
}
}
@@ -3495,6 +3498,10 @@ static void ap_if_event_func(enum ap_event_type type, const void *event_data,
case AP_EVENT_STATION_ADDED:
case AP_EVENT_STATION_REMOVED:
+ l_dbus_property_changed(dbus_get_bus(),
+ netdev_get_path(ap_if->netdev),
+ IWD_AP_INTERFACE, "ConnectedStations");
+ break;
case AP_EVENT_REGISTRATION_START:
case AP_EVENT_REGISTRATION_SUCCESS:
case AP_EVENT_PBC_MODE_EXIT:
@@ -3626,6 +3633,19 @@ error:
return dbus_error_from_errno(err, message);
}
+static bool ap_dbus_property_connected_stations(struct l_dbus *dbus,
+ struct l_dbus_message *message,
+ struct l_dbus_message_builder *builder,
+ void *user_data)
+{
+ struct ap_if_data *ap_if = user_data;
+ uint16_t stations = ap_if->ap ? ap_if->ap->connected_stations : 0;
+
+ l_dbus_message_builder_append_basic(builder, 'q', &stations);
+
+ return true;
+}
+
static bool ap_dbus_property_get_started(struct l_dbus *dbus,
struct l_dbus_message *message,
struct l_dbus_message_builder *builder,
@@ -3668,6 +3688,9 @@ static void ap_setup_interface(struct l_dbus_interface *interface)
ap_dbus_property_get_started, NULL);
l_dbus_interface_property(interface, "Name", 0, "s",
ap_dbus_property_get_name, NULL);
+
+ l_dbus_interface_property(interface, "ConnectedStations", 0, "q",
+ ap_dbus_property_connected_stations, NULL);
}
static void ap_destroy_interface(void *user_data)
--
2.25.1
6 months, 4 weeks
[RFC PATCH] ap: Expose connected stations property
by Michael Trimarchi
Add a way to be notified about the connected stations in access
point mode. This can be used in order to ask from Diagnostic
interface the properties for each station or to just use them
from other services like connman or network manager to report
the number of clients
Signed-off-by: Michael Trimarchi <michael(a)amarulasolutions.com>
---
src/ap.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/src/ap.c b/src/ap.c
index 46a7a6a8..e88be99c 100644
--- a/src/ap.c
+++ b/src/ap.c
@@ -98,6 +98,7 @@ struct ap_state {
uint8_t netconfig_gateway4_mac[6];
uint8_t netconfig_dns4_mac[6];
+ uint16_t connected_stations;
bool started : 1;
bool gtk_set : 1;
bool netconfig_set_addr4 : 1;
@@ -347,6 +348,7 @@ static void ap_new_rsna(struct sta_state *sta)
event_data.assoc_ies_len = sta->assoc_ies_len;
ap->ops->handle_event(AP_EVENT_STATION_ADDED, &event_data,
ap->user_data);
+ ap->connected_stations++;
}
}
@@ -385,6 +387,7 @@ static void ap_drop_rsna(struct sta_state *sta)
event_data.mac = sta->addr;
ap->ops->handle_event(AP_EVENT_STATION_REMOVED, &event_data,
ap->user_data);
+ ap->connected_stations++;
}
}
@@ -3495,6 +3498,10 @@ static void ap_if_event_func(enum ap_event_type type, const void *event_data,
case AP_EVENT_STATION_ADDED:
case AP_EVENT_STATION_REMOVED:
+ l_dbus_property_changed(dbus_get_bus(),
+ netdev_get_path(ap_if->netdev),
+ IWD_AP_INTERFACE, "ConnectedStations");
+ break;
case AP_EVENT_REGISTRATION_START:
case AP_EVENT_REGISTRATION_SUCCESS:
case AP_EVENT_PBC_MODE_EXIT:
@@ -3626,6 +3633,19 @@ error:
return dbus_error_from_errno(err, message);
}
+static bool ap_dbus_property_connected_stations(struct l_dbus *dbus,
+ struct l_dbus_message *message,
+ struct l_dbus_message_builder *builder,
+ void *user_data)
+{
+ struct ap_if_data *ap_if = user_data;
+ uint16_t stations = ap_if->ap ? ap_if->ap->connected_stations : 0;
+
+ l_dbus_message_builder_append_basic(builder, 'q', &stations);
+
+ return true;
+}
+
static bool ap_dbus_property_get_started(struct l_dbus *dbus,
struct l_dbus_message *message,
struct l_dbus_message_builder *builder,
@@ -3668,6 +3688,9 @@ static void ap_setup_interface(struct l_dbus_interface *interface)
ap_dbus_property_get_started, NULL);
l_dbus_interface_property(interface, "Name", 0, "s",
ap_dbus_property_get_name, NULL);
+
+ l_dbus_interface_property(interface, "ConnectedStations", 0, "i",
+ ap_dbus_property_connected_stations, NULL);
}
static void ap_destroy_interface(void *user_data)
--
2.25.1
7 months
Signal on ap clients connected
by Michael Nazzareno Trimarchi
Hi all
I have seen where I can write the call when a client is connected to
ap mode. I will like
to have a property of number of station connected on IWD_AP_INTERFACE.
The diagnostic
can be used to get all the details for each station. Is that a good idea?
Michael
--
Michael Nazzareno Trimarchi
Co-Founder & Chief Executive Officer
M. +39 347 913 2170
michael(a)amarulasolutions.com
__________________________________
Amarula Solutions BV
Joop Geesinkweg 125, 1114 AB, Amsterdam, NL
T. +31 (0)85 111 9172
info(a)amarulasolutions.com
www.amarulasolutions.com
7 months
[PATCH 01/12] treewide: Parse EnableNetworkConfiguration in one place
by Andrew Zaborowski
Add netconfig_get_enabled() and use that in all places that want to know
whether network configuration is enabled. Drop the enable_network_config
deprecated setting, which was only being handled in one of these 5 or so
places.
---
src/ap.c | 11 +++--------
src/ip-pool.c | 11 ++---------
src/main.c | 8 ++------
src/netconfig.c | 9 +++++++++
src/netconfig.h | 2 ++
src/resolve.c | 12 ++----------
src/station.c | 10 ++--------
7 files changed, 22 insertions(+), 41 deletions(-)
diff --git a/src/ap.c b/src/ap.c
index 45e647b8..4b26e9ff 100644
--- a/src/ap.c
+++ b/src/ap.c
@@ -53,6 +53,7 @@
#include "src/wscutil.h"
#include "src/eap-wsc.h"
#include "src/ip-pool.h"
+#include "src/netconfig.h"
#include "src/ap.h"
#include "src/storage.h"
#include "src/diagnostic.h"
@@ -132,7 +133,6 @@ struct ap_wsc_pbc_probe_record {
uint64_t timestamp;
};
-static bool netconfig_enabled;
static char **global_addr4_strs;
static uint32_t netdev_watch;
static struct l_netlink *rtnl;
@@ -2826,7 +2826,7 @@ static int ap_load_ipv4(struct ap_state *ap, const struct l_settings *config)
unsigned int lease_time = 0;
struct in_addr ia;
- if (!l_settings_has_group(config, "IPv4") || !netconfig_enabled)
+ if (!l_settings_has_group(config, "IPv4") || !netconfig_get_enabled())
return 0;
if (l_settings_has_key(config, "IPv4", "Address")) {
@@ -3829,12 +3829,7 @@ static int ap_init(void)
* Enable network configuration and DHCP only if
* [General].EnableNetworkConfiguration is true.
*/
- if (!l_settings_get_bool(settings, "General",
- "EnableNetworkConfiguration",
- &netconfig_enabled))
- netconfig_enabled = false;
-
- if (netconfig_enabled) {
+ if (netconfig_get_enabled()) {
if (l_settings_get_value(settings, "IPv4", "APAddressPool")) {
global_addr4_strs = l_settings_get_string_list(settings,
"IPv4",
diff --git a/src/ip-pool.c b/src/ip-pool.c
index 82f5216e..0c84394c 100644
--- a/src/ip-pool.c
+++ b/src/ip-pool.c
@@ -34,6 +34,7 @@
#include "src/iwd.h"
#include "src/module.h"
#include "src/netdev.h"
+#include "src/netconfig.h"
#include "src/ip-pool.h"
struct ip_pool_addr4_record {
@@ -357,15 +358,7 @@ static void ip_pool_addr4_dump_cb(int error,
static int ip_pool_init(void)
{
- const struct l_settings *settings = iwd_get_config();
- bool netconfig_enabled;
-
- if (!l_settings_get_bool(settings, "General",
- "EnableNetworkConfiguration",
- &netconfig_enabled))
- netconfig_enabled = false;
-
- if (!netconfig_enabled)
+ if (!netconfig_get_enabled())
return 0;
rtnl = iwd_get_rtnl();
diff --git a/src/main.c b/src/main.c
index b67c74d9..f5095ecc 100644
--- a/src/main.c
+++ b/src/main.c
@@ -42,6 +42,7 @@
#include "src/rfkill.h"
#include "src/storage.h"
#include "src/anqp.h"
+#include "src/netconfig.h"
#include "src/backtrace.h"
@@ -217,12 +218,7 @@ static struct l_dbus_message *iwd_dbus_get_info(struct l_dbus *dbus,
struct l_dbus_message *reply;
struct l_dbus_message_builder *builder;
L_AUTO_FREE_VAR(char *, storage_dir) = storage_get_path(NULL);
- bool netconfig_enabled;
-
- if (!l_settings_get_bool(iwd_config, "General",
- "EnableNetworkConfiguration",
- &netconfig_enabled))
- netconfig_enabled = false;
+ bool netconfig_enabled = netconfig_get_enabled();
reply = l_dbus_message_new_method_return(message);
builder = l_dbus_message_builder_new(reply);
diff --git a/src/netconfig.c b/src/netconfig.c
index 2ffc5ab1..833fd3ab 100644
--- a/src/netconfig.c
+++ b/src/netconfig.c
@@ -1581,6 +1581,15 @@ void netconfig_destroy(struct netconfig *netconfig)
netconfig_free(netconfig);
}
+bool netconfig_get_enabled(void)
+{
+ bool enabled;
+
+ return l_settings_get_bool(iwd_get_config(), "General",
+ "EnableNetworkConfiguration",
+ &enabled) && enabled;
+}
+
static int netconfig_init(void)
{
uint32_t r;
diff --git a/src/netconfig.h b/src/netconfig.h
index 3c4e7641..9d5887e9 100644
--- a/src/netconfig.h
+++ b/src/netconfig.h
@@ -46,3 +46,5 @@ void netconfig_handle_fils_ip_resp(struct netconfig *netconfig,
struct netconfig *netconfig_new(uint32_t ifindex);
void netconfig_destroy(struct netconfig *netconfig);
+
+bool netconfig_get_enabled(void);
diff --git a/src/resolve.c b/src/resolve.c
index 9b724392..59b29ec2 100644
--- a/src/resolve.c
+++ b/src/resolve.c
@@ -35,6 +35,7 @@
#include "src/iwd.h"
#include "src/module.h"
#include "src/dbus.h"
+#include "src/netconfig.h"
#include "src/resolve.h"
struct resolve_ops {
@@ -579,18 +580,9 @@ static const struct {
static int resolve_init(void)
{
const char *method_name;
- bool enabled;
uint8_t i;
- if (!l_settings_get_bool(iwd_get_config(), "General",
- "EnableNetworkConfiguration",
- &enabled)) {
- if (!l_settings_get_bool(iwd_get_config(), "General",
- "enable_network_config", &enabled))
- enabled = false;
- }
-
- if (!enabled)
+ if (!netconfig_get_enabled())
return 0;
method_name = l_settings_get_value(iwd_get_config(), "Network",
diff --git a/src/station.c b/src/station.c
index c73db634..d3767203 100644
--- a/src/station.c
+++ b/src/station.c
@@ -63,7 +63,6 @@ static uint32_t netdev_watch;
static uint32_t mfp_setting;
static uint32_t roam_retry_interval;
static bool anqp_disabled;
-static bool netconfig_enabled;
static struct watchlist event_watches;
struct station {
@@ -3859,7 +3858,7 @@ static struct station *station_create(struct netdev *netdev)
l_dbus_object_add_interface(dbus, netdev_get_path(netdev),
IWD_STATION_INTERFACE, station);
- if (netconfig_enabled)
+ if (netconfig_get_enabled())
station->netconfig = netconfig_new(netdev_get_ifindex(netdev));
station->anqp_pending = l_queue_new();
@@ -4442,12 +4441,7 @@ static int station_init(void)
&anqp_disabled))
anqp_disabled = true;
- if (!l_settings_get_bool(iwd_get_config(), "General",
- "EnableNetworkConfiguration",
- &netconfig_enabled))
- netconfig_enabled = false;
-
- if (!netconfig_enabled)
+ if (!netconfig_get_enabled())
l_info("station: Network configuration is disabled.");
watchlist_init(&event_watches, NULL);
--
2.32.0
7 months
[PATCH] netconfig: Don't start ACD with FILS IP Assignment
by Andrew Zaborowski
Restore the older behaviour where ACD was started only with static
addressing. There are various arguments for saving setup time by not
doing ACD when a wifi network has IP addresses managed centrally (and
some arguments against), for now just restore the behaviour from before
FILS IP Assignment was added.
---
This applies on top of the netconfig agent patchset.
src/netconfig.c | 34 ++++++++++++++++++++--------------
1 file changed, 20 insertions(+), 14 deletions(-)
diff --git a/src/netconfig.c b/src/netconfig.c
index a17e06bb..73a621c5 100644
--- a/src/netconfig.c
+++ b/src/netconfig.c
@@ -1653,22 +1653,28 @@ static bool netconfig_ipv4_select_and_install(struct netconfig *netconfig)
ip)))
return false;
- netconfig->acd = l_acd_new(netconfig->ifindex);
- l_acd_set_event_handler(netconfig->acd,
- netconfig_ipv4_acd_event, netconfig,
- NULL);
- if (getenv("IWD_ACD_DEBUG"))
- l_acd_set_debug(netconfig->acd, do_debug,
- "[ACD] ", NULL);
-
- if (!l_acd_start(netconfig->acd, ip)) {
- l_error("failed to start ACD, continuing anyways");
- l_acd_destroy(netconfig->acd);
- netconfig->acd = NULL;
+ if (netconfig->rtm_protocol == RTPROT_STATIC) {
+ netconfig->acd = l_acd_new(netconfig->ifindex);
+ l_acd_set_event_handler(netconfig->acd,
+ netconfig_ipv4_acd_event,
+ netconfig, NULL);
- netconfig_set(netconfig, AF_INET, changed);
- } else
+ if (getenv("IWD_ACD_DEBUG"))
+ l_acd_set_debug(netconfig->acd, do_debug,
+ "[ACD] ", NULL);
+
+ if (!l_acd_start(netconfig->acd, ip)) {
+ l_error("failed to start ACD, continuing "
+ "anyways");
+ l_acd_destroy(netconfig->acd);
+ netconfig->acd = NULL;
+ }
+ }
+
+ if (netconfig->acd)
netconfig->pending_v4_set |= changed;
+ else
+ netconfig_set(netconfig, AF_INET, changed);
return true;
}
--
2.32.0
7 months
[PATCH 1/4] auto-t: update blacklist test to use 'enable' on rules
by James Prestwood
---
autotests/testBSSBlacklist/connection_test.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/autotests/testBSSBlacklist/connection_test.py b/autotests/testBSSBlacklist/connection_test.py
index bfcf0523..6a12174d 100644
--- a/autotests/testBSSBlacklist/connection_test.py
+++ b/autotests/testBSSBlacklist/connection_test.py
@@ -110,8 +110,11 @@ class Test(unittest.TestCase):
# Have both APs drop all packets, both should get blacklisted
rule0.drop = True
+ rule0.enable = True
rule1.drop = True
+ rule1.enable = True
rule2.drop = True
+ rule2.enable = True
with self.assertRaises(iwd.FailedEx):
ordered_network.network_object.connect()
--
2.31.1
7 months
[PATCH v2 1/2] wiphy: add wiphy_can_offload
by James Prestwood
This is a convenience method for detecting any supported offload
extended features (4way/1x/SAE).
---
src/wiphy.c | 11 +++++++++++
src/wiphy.h | 1 +
2 files changed, 12 insertions(+)
diff --git a/src/wiphy.c b/src/wiphy.c
index 1a333aad..4d740ba3 100644
--- a/src/wiphy.c
+++ b/src/wiphy.c
@@ -459,6 +459,17 @@ bool wiphy_can_transition_disable(struct wiphy *wiphy)
return true;
}
+/* Catch all for the offload features */
+bool wiphy_can_offload(struct wiphy *wiphy)
+{
+ return wiphy_has_ext_feature(wiphy,
+ NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK) ||
+ wiphy_has_ext_feature(wiphy,
+ NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X) ||
+ wiphy_has_ext_feature(wiphy,
+ NL80211_EXT_FEATURE_SAE_OFFLOAD);
+}
+
bool wiphy_supports_ext_key_id(struct wiphy *wiphy)
{
return wiphy_has_ext_feature(wiphy, NL80211_EXT_FEATURE_EXT_KEY_ID);
diff --git a/src/wiphy.h b/src/wiphy.h
index f7b6e1c4..9f0d6d07 100644
--- a/src/wiphy.h
+++ b/src/wiphy.h
@@ -83,6 +83,7 @@ uint32_t wiphy_get_supported_bands(struct wiphy *wiphy);
const struct scan_freq_set *wiphy_get_supported_freqs(
const struct wiphy *wiphy);
bool wiphy_can_transition_disable(struct wiphy *wiphy);
+bool wiphy_can_offload(struct wiphy *wiphy);
bool wiphy_supports_cmds_auth_assoc(struct wiphy *wiphy);
bool wiphy_can_randomize_mac_addr(struct wiphy *wiphy);
bool wiphy_rrm_capable(struct wiphy *wiphy);
--
2.31.1
7 months