Introduce 60 GHz band

Basic support for the 60 GHz band. Neither P2P nor WPS are yet taken
care off. Allows to start AP with very simple config:

network={
        ssid="test"
        mode=2
        frequency=60480
        key_mgmt=NONE
}

Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Vladimir Kondratiev 2012-12-18 11:50:35 +02:00 committed by Jouni Malinen
parent 058da39cc9
commit 7829894c21
9 changed files with 40 additions and 6 deletions

View File

@ -2313,6 +2313,8 @@ static int hostapd_config_fill(struct hostapd_config *conf,
conf->hw_mode = HOSTAPD_MODE_IEEE80211B; conf->hw_mode = HOSTAPD_MODE_IEEE80211B;
else if (os_strcmp(pos, "g") == 0) else if (os_strcmp(pos, "g") == 0)
conf->hw_mode = HOSTAPD_MODE_IEEE80211G; conf->hw_mode = HOSTAPD_MODE_IEEE80211G;
else if (os_strcmp(pos, "ad") == 0)
conf->hw_mode = HOSTAPD_MODE_IEEE80211AD;
else { else {
wpa_printf(MSG_ERROR, "Line %d: unknown " wpa_printf(MSG_ERROR, "Line %d: unknown "
"hw_mode '%s'", line, pos); "hw_mode '%s'", line, pos);

View File

@ -106,6 +106,8 @@ ssid=test
#ieee80211d=1 #ieee80211d=1
# Operation mode (a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g, # Operation mode (a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g,
# ad = IEEE 802.11ad (60 GHz); a/g options are used with IEEE 802.11n, too, to
# specify band)
# Default: IEEE 802.11b # Default: IEEE 802.11b
hw_mode=g hw_mode=g

View File

@ -122,6 +122,8 @@ int hostapd_prepare_rates(struct hostapd_iface *iface,
case HOSTAPD_MODE_IEEE80211G: case HOSTAPD_MODE_IEEE80211G:
basic_rates = basic_rates_g; basic_rates = basic_rates_g;
break; break;
case HOSTAPD_MODE_IEEE80211AD:
return 0; /* No basic rates for 11ad */
default: default:
return -1; return -1;
} }
@ -756,6 +758,8 @@ const char * hostapd_hw_mode_txt(int mode)
return "IEEE 802.11b"; return "IEEE 802.11b";
case HOSTAPD_MODE_IEEE80211G: case HOSTAPD_MODE_IEEE80211G:
return "IEEE 802.11g"; return "IEEE 802.11g";
case HOSTAPD_MODE_IEEE80211AD:
return "IEEE 802.11ad";
default: default:
return "UNKNOWN"; return "UNKNOWN";
} }

View File

@ -354,6 +354,8 @@ void ieee802_1x_tx_key(struct hostapd_data *hapd, struct sta_info *sta)
const char *radius_mode_txt(struct hostapd_data *hapd) const char *radius_mode_txt(struct hostapd_data *hapd)
{ {
switch (hapd->iface->conf->hw_mode) { switch (hapd->iface->conf->hw_mode) {
case HOSTAPD_MODE_IEEE80211AD:
return "802.11ad";
case HOSTAPD_MODE_IEEE80211A: case HOSTAPD_MODE_IEEE80211A:
return "802.11a"; return "802.11a";
case HOSTAPD_MODE_IEEE80211G: case HOSTAPD_MODE_IEEE80211G:

View File

@ -297,6 +297,7 @@ enum hostapd_hw_mode {
HOSTAPD_MODE_IEEE80211B, HOSTAPD_MODE_IEEE80211B,
HOSTAPD_MODE_IEEE80211G, HOSTAPD_MODE_IEEE80211G,
HOSTAPD_MODE_IEEE80211A, HOSTAPD_MODE_IEEE80211A,
HOSTAPD_MODE_IEEE80211AD,
NUM_HOSTAPD_MODES NUM_HOSTAPD_MODES
}; };

View File

@ -4974,19 +4974,35 @@ static int phy_info_handler(struct nl_msg *msg, void *arg)
/* crude heuristic */ /* crude heuristic */
if (mode->channels[idx].freq < 4000) if (mode->channels[idx].freq < 4000)
mode->mode = HOSTAPD_MODE_IEEE80211B; mode->mode = HOSTAPD_MODE_IEEE80211B;
else if (mode->channels[idx].freq > 50000)
mode->mode = HOSTAPD_MODE_IEEE80211AD;
else else
mode->mode = HOSTAPD_MODE_IEEE80211A; mode->mode = HOSTAPD_MODE_IEEE80211A;
mode_is_set = 1; mode_is_set = 1;
} }
/* crude heuristic */ switch (mode->mode) {
if (mode->channels[idx].freq < 4000) case HOSTAPD_MODE_IEEE80211AD:
mode->channels[idx].chan =
(mode->channels[idx].freq - 56160) /
2160;
break;
case HOSTAPD_MODE_IEEE80211A:
mode->channels[idx].chan =
mode->channels[idx].freq / 5 - 1000;
break;
case HOSTAPD_MODE_IEEE80211B:
case HOSTAPD_MODE_IEEE80211G:
if (mode->channels[idx].freq == 2484) if (mode->channels[idx].freq == 2484)
mode->channels[idx].chan = 14; mode->channels[idx].chan = 14;
else else
mode->channels[idx].chan = (mode->channels[idx].freq - 2407) / 5; mode->channels[idx].chan =
else (mode->channels[idx].freq -
mode->channels[idx].chan = mode->channels[idx].freq/5 - 1000; 2407) / 5;
break;
default:
break;
}
if (tb_freq[NL80211_FREQUENCY_ATTR_DISABLED]) if (tb_freq[NL80211_FREQUENCY_ATTR_DISABLED])
mode->channels[idx].flag |= mode->channels[idx].flag |=

View File

@ -63,6 +63,10 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
(ssid->frequency >= 5745 && ssid->frequency <= 5825)) { (ssid->frequency >= 5745 && ssid->frequency <= 5825)) {
conf->hw_mode = HOSTAPD_MODE_IEEE80211A; conf->hw_mode = HOSTAPD_MODE_IEEE80211A;
conf->channel = (ssid->frequency - 5000) / 5; conf->channel = (ssid->frequency - 5000) / 5;
} else if (ssid->frequency >= 56160 + 2160 * 1 &&
ssid->frequency <= 56160 + 2160 * 4) {
conf->hw_mode = HOSTAPD_MODE_IEEE80211AD;
conf->channel = (ssid->frequency - 56160) / 2160;
} else { } else {
wpa_printf(MSG_ERROR, "Unsupported AP mode frequency: %d MHz", wpa_printf(MSG_ERROR, "Unsupported AP mode frequency: %d MHz",
ssid->frequency); ssid->frequency);

View File

@ -1627,7 +1627,7 @@ static const struct parse_data ssid_fields[] = {
#endif /* CONFIG_IEEE80211W */ #endif /* CONFIG_IEEE80211W */
{ INT_RANGE(peerkey, 0, 1) }, { INT_RANGE(peerkey, 0, 1) },
{ INT_RANGE(mixed_cell, 0, 1) }, { INT_RANGE(mixed_cell, 0, 1) },
{ INT_RANGE(frequency, 0, 10000) }, { INT_RANGE(frequency, 0, 65000) },
{ INT(wpa_ptk_rekey) }, { INT(wpa_ptk_rekey) },
{ STR(bgscan) }, { STR(bgscan) },
{ INT_RANGE(ignore_broadcast_ssid, 0, 2) }, { INT_RANGE(ignore_broadcast_ssid, 0, 2) },

View File

@ -2765,6 +2765,9 @@ static int ctrl_iface_get_capability_channels(struct wpa_supplicant *wpa_s,
case HOSTAPD_MODE_IEEE80211A: case HOSTAPD_MODE_IEEE80211A:
hmode = "A"; hmode = "A";
break; break;
case HOSTAPD_MODE_IEEE80211AD:
hmode = "AD";
break;
default: default:
continue; continue;
} }