diff --git a/src/accesspoint.h b/src/accesspoint.h --- a/src/accesspoint.h +++ b/src/accesspoint.h @@ -66,7 +66,7 @@ */ enum WpaFlag { PairWep40 = 0x1, PairWep104 = 0x2, PairTkip = 0x4, PairCcmp = 0x8, GroupWep40 = 0x10, GroupWep104 = 0x20, GroupTkip = 0x40, GroupCcmp = 0x80, - KeyMgmtPsk = 0x100, KeyMgmt8021x = 0x200 + KeyMgmtPsk = 0x100, KeyMgmt8021x = 0x200, KeyMgmtSAE = 0x400 }; Q_DECLARE_FLAGS(Capabilities, Capability) Q_FLAG(Capabilities) diff --git a/src/settings/wirelesssecuritysetting.h b/src/settings/wirelesssecuritysetting.h --- a/src/settings/wirelesssecuritysetting.h +++ b/src/settings/wirelesssecuritysetting.h @@ -39,7 +39,7 @@ public: typedef QSharedPointer Ptr; typedef QList List; - enum KeyMgmt {Unknown = -1, Wep, Ieee8021x, WpaNone, WpaPsk, WpaEap}; + enum KeyMgmt {Unknown = -1, Wep, Ieee8021x, WpaNone, WpaPsk, WpaEap, SAE}; enum AuthAlg {None, Open, Shared, Leap}; enum WpaProtocolVersion {Wpa, Rsn}; enum WpaEncryptionCapabilities {Wep40, Wep104, Tkip, Ccmp}; diff --git a/src/settings/wirelesssecuritysetting.cpp b/src/settings/wirelesssecuritysetting.cpp --- a/src/settings/wirelesssecuritysetting.cpp +++ b/src/settings/wirelesssecuritysetting.cpp @@ -405,7 +405,7 @@ } if (keyMgmt() == WpaNone || - keyMgmt() == WpaPsk) { + keyMgmt() == WpaPsk || keyMgmt() == SAE) { if (!pskFlags().testFlag(Setting::NotRequired)) { if (psk().isEmpty() || requestNew) { secrets << QLatin1String(NM_SETTING_WIRELESS_SECURITY_PSK); @@ -441,6 +441,8 @@ setKeyMgmt(WpaPsk); } else if (key == "wpa-eap") { setKeyMgmt(WpaEap); + } else if (key == "sae") { + setKeyMgmt(SAE); } } @@ -571,6 +573,8 @@ setting.insert(QLatin1String(NM_SETTING_WIRELESS_SECURITY_KEY_MGMT), "wpa-psk"); } else if (keyMgmt() == WpaEap) { setting.insert(QLatin1String(NM_SETTING_WIRELESS_SECURITY_KEY_MGMT), "wpa-eap"); + } else if (keyMgmt() == SAE) { + setting.insert(QLatin1String(NM_SETTING_WIRELESS_SECURITY_KEY_MGMT), "sae"); } if (wepTxKeyindex()) { diff --git a/src/utils.h b/src/utils.h --- a/src/utils.h +++ b/src/utils.h @@ -31,7 +31,7 @@ namespace NetworkManager { - enum WirelessSecurityType { UnknownSecurity = -1, NoneSecurity, StaticWep, DynamicWep, Leap, WpaPsk, WpaEap, Wpa2Psk, Wpa2Eap }; + enum WirelessSecurityType { UnknownSecurity = -1, NoneSecurity, StaticWep, DynamicWep, Leap, WpaPsk, WpaEap, Wpa2Psk, Wpa2Eap, SAE }; /** * @return QHostAddress representation of an ipv6 address diff --git a/src/utils.cpp b/src/utils.cpp --- a/src/utils.cpp +++ b/src/utils.cpp @@ -334,6 +334,31 @@ } } break; + case SAE: + if (!interfaceCaps.testFlag(NetworkManager::WirelessDevice::Rsn)) { + return false; + } + if (haveAp) { + if (!interfaceCaps.testFlag(NetworkManager::WirelessDevice::IBSSRsn)) { + return false; + } + if (apRsn.testFlag(NetworkManager::AccessPoint::PairCcmp) && + interfaceCaps.testFlag(NetworkManager::WirelessDevice::Ccmp)) { + return true; + } + } else { + if (apRsn.testFlag(NetworkManager::AccessPoint::KeyMgmtSAE)) { + if (apRsn.testFlag(NetworkManager::AccessPoint::PairTkip) && + interfaceCaps.testFlag(NetworkManager::WirelessDevice::Tkip)) { + return true; + } + if (apRsn.testFlag(NetworkManager::AccessPoint::PairCcmp) && + interfaceCaps.testFlag(NetworkManager::WirelessDevice::Ccmp)) { + return true; + } + } + return false; + } default: good = false; break; @@ -350,7 +375,7 @@ // Therefore static WEP is before LEAP and Dynamic WEP because there is no way to detect // if an AP is capable of Dynamic WEP and showing Dynamic WEP first would confuse // Static WEP users. - types << NetworkManager::Wpa2Eap << NetworkManager::Wpa2Psk << NetworkManager::WpaEap << NetworkManager::WpaPsk << NetworkManager::StaticWep << NetworkManager::DynamicWep << NetworkManager::Leap << NetworkManager::NoneSecurity; + types << NetworkManager::SAE << NetworkManager::Wpa2Eap << NetworkManager::Wpa2Psk << NetworkManager::WpaEap << NetworkManager::WpaPsk << NetworkManager::StaticWep << NetworkManager::DynamicWep << NetworkManager::Leap << NetworkManager::NoneSecurity; Q_FOREACH (NetworkManager::WirelessSecurityType type, types) { if (NetworkManager::securityIsValid(type, interfaceCaps, haveAp, adHoc, apCaps, apWpa, apRsn)) { diff --git a/src/wirelessdevice.h b/src/wirelessdevice.h --- a/src/wirelessdevice.h +++ b/src/wirelessdevice.h @@ -74,8 +74,9 @@ AdhocCap = 0x80, /**< The device supports Ad-Hoc mode. */ FreqValid = 0x100, /**< The device properly reports information about supported frequencies */ Freq2Ghz = 0x200, /**< The device supports 2.4Ghz frequencies */ - Freq5Ghz = 0x400 /**< The device supports 5Ghz frequencies */ - + Freq5Ghz = 0x400, /**< The device supports 5Ghz frequencies */ + Mesh = 0x1000, /**< The device supports acting as a mesh point */ + IBSSRsn = 0x2000 /**< device supports WPA2/RSN in an IBSS network */ }; Q_DECLARE_FLAGS(Capabilities, Capability) /**