[PATCH 1/4] wiphy: add OweDisable driver quirk

James Prestwood
2024-10-23T17:23:09Z

Some drivers like brcmfmac don't support OWE but from userspace its
not possible to query this information. Rather than completely
blacklist brcmfmac we can allow the user to configure this and
disable OWE in IWD.
---
src/wiphy.c | 16 +++++++++++++++-
src/wiphy.h | 1 +
2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/wiphy.c b/src/wiphy.c
index cc0e6dd7..d57d657a 100644
--- a/src/wiphy.c
+++ b/src/wiphy.c
@@ -72,6 +72,7 @@ enum driver_flag {
DEFAULT_IF = 0x1,
FORCE_PAE = 0x2,
POWER_SAVE_DISABLE = 0x4,
+ OWE_DISABLE = 0x8,
};

struct driver_flag_name {
@@ -103,6 +104,7 @@ static const struct driver_flag_name driver_flag_names[] = {
{ "DefaultInterface", DEFAULT_IF },
{ "ForcePae", FORCE_PAE },
{ "PowerSaveDisable", POWER_SAVE_DISABLE },
+ { "OweDisable", OWE_DISABLE },
};

struct wiphy {
@@ -344,7 +346,8 @@ wpa2_personal:
if (info->akm_suites & IE_RSN_AKM_SUITE_PSK)
return IE_RSN_AKM_SUITE_PSK;
} else if (security == SECURITY_NONE) {
- if (info->akm_suites & IE_RSN_AKM_SUITE_OWE)
+ if (info->akm_suites & IE_RSN_AKM_SUITE_OWE &&
+ !wiphy_owe_disabled(wiphy))
return IE_RSN_AKM_SUITE_OWE;
}

@@ -721,6 +724,14 @@ bool wiphy_power_save_disabled(struct wiphy *wiphy)
return false;
}

+bool wiphy_owe_disabled(struct wiphy *wiphy)
+{
+ if (wiphy->driver_flags & OWE_DISABLE)
+ return true;
+
+ return false;
+}
+
const uint8_t *wiphy_get_extended_capabilities(struct wiphy *wiphy,
uint32_t iftype)
{
@@ -1355,6 +1366,9 @@ static void wiphy_print_basic_info(struct wiphy *wiphy)
if (wiphy->driver_flags & POWER_SAVE_DISABLE)
flags = l_strv_append(flags, "PowerSaveDisable");

+ if (wiphy->driver_flags & OWE_DISABLE)
+ flags = l_strv_append(flags, "OweDisable");
+
joined = l_strjoinv(flags, ' ');

l_info("\tDriver Flags: %s", joined);
diff --git a/src/wiphy.h b/src/wiphy.h
index fe7e9e49..a68e48c3 100644
--- a/src/wiphy.h
+++ b/src/wiphy.h
@@ -134,6 +134,7 @@ const char *wiphy_get_name(struct wiphy *wiphy);
bool wiphy_uses_default_if(struct wiphy *wiphy);
bool wiphy_control_port_enabled(struct wiphy *wiphy);
bool wiphy_power_save_disabled(struct wiphy *wiphy);
+bool wiphy_owe_disabled(struct wiphy *wiphy);
const uint8_t *wiphy_get_extended_capabilities(struct wiphy *wiphy,
uint32_t iftype);
const uint8_t *wiphy_get_rm_enabled_capabilities(struct wiphy *wiphy);
--
2.34.1