Merge "hostapd: support for 60GHz SoftAP"
diff --git a/hostapd/hidl/1.3/hostapd.cpp b/hostapd/hidl/1.3/hostapd.cpp
index 5d64049..1a342e5 100644
--- a/hostapd/hidl/1.3/hostapd.cpp
+++ b/hostapd/hidl/1.3/hostapd.cpp
@@ -252,6 +252,20 @@
return 0;
}
+ if ((band & IHostapd::BandMask::BAND_60_GHZ) != 0) {
+ if (1 <= channel && channel <= 8) {
+ return 180;
+ } else if (9 <= channel && channel <= 15) {
+ return 181;
+ } else if (17 <= channel && channel <= 22) {
+ return 182;
+ } else if (25 <= channel && channel <= 29) {
+ return 183;
+ }
+ // Error
+ return 0;
+ }
+
return 0;
}
@@ -287,8 +301,9 @@
// Encryption config string
uint32_t band = 0;
- band |= channelParams.V1_2.bandMask;
+ band |= channelParams.bandMask;
bool is_6Ghz_band_only = band == static_cast<uint32_t>(IHostapd::BandMask::BAND_6_GHZ);
+ bool is_60Ghz_band_only = band == static_cast<uint32_t>(IHostapd::BandMask::BAND_60_GHZ);
std::string encryption_config_as_string;
switch (nw_params.V1_2.encryptionType) {
case IHostapd::EncryptionType::NONE:
@@ -305,8 +320,9 @@
}
encryption_config_as_string = StringPrintf(
"wpa=3\n"
- "wpa_pairwise=TKIP CCMP\n"
+ "wpa_pairwise=%s\n"
"wpa_passphrase=%s",
+ is_60Ghz_band_only ? "GCMP" : "TKIP CCMP",
nw_params.V1_2.passphrase.c_str());
break;
case IHostapd::EncryptionType::WPA2:
@@ -320,8 +336,9 @@
}
encryption_config_as_string = StringPrintf(
"wpa=2\n"
- "rsn_pairwise=CCMP\n"
+ "rsn_pairwise=%s\n"
"wpa_passphrase=%s",
+ is_60Ghz_band_only ? "GCMP" : "CCMP",
nw_params.V1_2.passphrase.c_str());
break;
case IHostapd::EncryptionType::WPA3_SAE_TRANSITION:
@@ -335,12 +352,13 @@
}
encryption_config_as_string = StringPrintf(
"wpa=2\n"
- "rsn_pairwise=CCMP\n"
+ "rsn_pairwise=%s\n"
"wpa_key_mgmt=WPA-PSK SAE\n"
"ieee80211w=1\n"
"sae_require_mfp=1\n"
"wpa_passphrase=%s\n"
"sae_password=%s",
+ is_60Ghz_band_only ? "GCMP" : "CCMP",
nw_params.V1_2.passphrase.c_str(),
nw_params.V1_2.passphrase.c_str());
break;
@@ -350,12 +368,13 @@
}
encryption_config_as_string = StringPrintf(
"wpa=2\n"
- "rsn_pairwise=CCMP\n"
+ "rsn_pairwise=%s\n"
"wpa_key_mgmt=SAE\n"
"ieee80211w=2\n"
"sae_require_mfp=2\n"
"sae_pwe=%d\n"
"sae_password=%s",
+ is_60Ghz_band_only ? "GCMP" : "CCMP",
is_6Ghz_band_only ? 1 : 2,
nw_params.V1_2.passphrase.c_str());
break;
@@ -402,8 +421,20 @@
std::string hw_mode_as_string;
std::string ht_cap_vht_oper_chwidth_as_string;
+ std::string enable_edmg_as_string;
+ std::string edmg_channel_as_string;
+ bool is_60Ghz_used = false;
- if ((band & IHostapd::BandMask::BAND_2_GHZ) != 0) {
+ if (((band & IHostapd::BandMask::BAND_60_GHZ) != 0)) {
+ hw_mode_as_string = "hw_mode=ad";
+ if (iface_params.hwModeParams.enableEdmg) {
+ enable_edmg_as_string = "enable_edmg=1";
+ edmg_channel_as_string = StringPrintf(
+ "edmg_channel=%d",
+ channelParams.channel);
+ }
+ is_60Ghz_used = true;
+ } else if ((band & IHostapd::BandMask::BAND_2_GHZ) != 0) {
if (((band & IHostapd::BandMask::BAND_5_GHZ) != 0)
|| ((band & IHostapd::BandMask::BAND_6_GHZ) != 0)) {
hw_mode_as_string = "hw_mode=any";
@@ -415,24 +446,22 @@
} else {
hw_mode_as_string = "hw_mode=g";
}
- } else {
- if (((band & IHostapd::BandMask::BAND_5_GHZ) != 0)
+ } else if (((band & IHostapd::BandMask::BAND_5_GHZ) != 0)
|| ((band & IHostapd::BandMask::BAND_6_GHZ) != 0)) {
hw_mode_as_string = "hw_mode=a";
- if (iface_params.V1_2.V1_1.V1_0.hwModeParams.enable80211AC) {
- ht_cap_vht_oper_chwidth_as_string =
- "ht_capab=[HT40+]\n"
- "vht_oper_chwidth=1";
- }
- } else {
- wpa_printf(MSG_ERROR, "Invalid band");
- return "";
+ if (iface_params.V1_2.V1_1.V1_0.hwModeParams.enable80211AC) {
+ ht_cap_vht_oper_chwidth_as_string =
+ "ht_capab=[HT40+]\n"
+ "vht_oper_chwidth=1";
}
+ } else {
+ wpa_printf(MSG_ERROR, "Invalid band");
+ return "";
}
std::string he_params_as_string;
#ifdef CONFIG_IEEE80211AX
- if (iface_params.V1_2.hwModeParams.enable80211AX) {
+ if (iface_params.V1_2.hwModeParams.enable80211AX && !is_60Ghz_used) {
he_params_as_string = StringPrintf(
"ieee80211ax=1\n"
"he_su_beamformer=%d\n"
@@ -485,6 +514,8 @@
"%s\n"
#endif /* CONFIG_INTERWORKING */
"%s\n"
+ "%s\n"
+ "%s\n"
"%s\n",
iface_params.V1_2.V1_1.V1_0.ifaceName.c_str(), ssid_as_string.c_str(),
channel_config_as_string.c_str(),
@@ -497,7 +528,9 @@
access_network_params_as_string.c_str(),
#endif /* CONFIG_INTERWORKING */
encryption_config_as_string.c_str(),
- bridge_as_string.c_str());
+ bridge_as_string.c_str(),
+ enable_edmg_as_string.c_str(),
+ edmg_channel_as_string.c_str());
}
Generation getGeneration(hostapd_hw_modes *current_mode)
@@ -514,6 +547,8 @@
case HOSTAPD_MODE_IEEE80211A:
return current_mode->vht_capab == 0 ?
Generation::WIFI_STANDARD_11N : Generation::WIFI_STANDARD_11AC;
+ case HOSTAPD_MODE_IEEE80211AD:
+ return Generation::WIFI_STANDARD_11AD;
// TODO: b/162484222 miss HOSTAPD_MODE_IEEE80211AX definition.
default:
return Generation::WIFI_STANDARD_UNKNOWN;
@@ -540,6 +575,14 @@
Bandwidth::WIFI_BANDWIDTH_40 : Bandwidth::WIFI_BANDWIDTH_20;
}
return Bandwidth::WIFI_BANDWIDTH_20_NOHT;
+ case CHANWIDTH_2160MHZ:
+ return Bandwidth::WIFI_BANDWIDTH_2160;
+ case CHANWIDTH_4320MHZ:
+ return Bandwidth::WIFI_BANDWIDTH_4320;
+ case CHANWIDTH_6480MHZ:
+ return Bandwidth::WIFI_BANDWIDTH_6480;
+ case CHANWIDTH_8640MHZ:
+ return Bandwidth::WIFI_BANDWIDTH_8640;
default:
return Bandwidth::WIFI_BANDWIDTH_INVALID;
}