]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Introduce 60 GHz band
authorVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Tue, 18 Dec 2012 09:50:35 +0000 (11:50 +0200)
committerJouni Malinen <j@w1.fi>
Tue, 18 Dec 2012 09:50:35 +0000 (11:50 +0200)
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>

hostapd/config_file.c
hostapd/hostapd.conf
src/ap/hw_features.c
src/ap/ieee802_1x.c
src/common/defs.h
src/drivers/driver_nl80211.c
wpa_supplicant/ap.c
wpa_supplicant/config.c
wpa_supplicant/ctrl_iface.c

index 1b5c730aefa8cc75fc816fe8214a5c7382c74623..4c4d51b482a655ac3b26827c5774c318b0393488 100644 (file)
@@ -2313,6 +2313,8 @@ static int hostapd_config_fill(struct hostapd_config *conf,
                                conf->hw_mode = HOSTAPD_MODE_IEEE80211B;
                        else if (os_strcmp(pos, "g") == 0)
                                conf->hw_mode = HOSTAPD_MODE_IEEE80211G;
+                       else if (os_strcmp(pos, "ad") == 0)
+                               conf->hw_mode = HOSTAPD_MODE_IEEE80211AD;
                        else {
                                wpa_printf(MSG_ERROR, "Line %d: unknown "
                                           "hw_mode '%s'", line, pos);
index 58717acbacecfff93f1489e2d69622295c3ea099..5a3cdd3dfdfa50985b9f3375a0329fdabb13687d 100644 (file)
@@ -106,6 +106,8 @@ ssid=test
 #ieee80211d=1
 
 # 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
 hw_mode=g
 
index 97e1238e6fe6a882213e93aee62c88f099d5761e..923b698230701f86cd0c37544ce66392b90d53ac 100644 (file)
@@ -122,6 +122,8 @@ int hostapd_prepare_rates(struct hostapd_iface *iface,
        case HOSTAPD_MODE_IEEE80211G:
                basic_rates = basic_rates_g;
                break;
+       case HOSTAPD_MODE_IEEE80211AD:
+               return 0; /* No basic rates for 11ad */
        default:
                return -1;
        }
@@ -756,6 +758,8 @@ const char * hostapd_hw_mode_txt(int mode)
                return "IEEE 802.11b";
        case HOSTAPD_MODE_IEEE80211G:
                return "IEEE 802.11g";
+       case HOSTAPD_MODE_IEEE80211AD:
+               return "IEEE 802.11ad";
        default:
                return "UNKNOWN";
        }
index 7ac1d3e63f14c0eadb93a2711e07dd45f81ee0a7..5b011201c5b057ca7a103c55f9f3d11c357aca27 100644 (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)
 {
        switch (hapd->iface->conf->hw_mode) {
+       case HOSTAPD_MODE_IEEE80211AD:
+               return "802.11ad";
        case HOSTAPD_MODE_IEEE80211A:
                return "802.11a";
        case HOSTAPD_MODE_IEEE80211G:
index 85e99329ac1d0df6ecd0e679bb5dda6bdbc1e7d2..281dd8a5eb5c761796888ea9ba5d3ef4873e255c 100644 (file)
@@ -297,6 +297,7 @@ enum hostapd_hw_mode {
        HOSTAPD_MODE_IEEE80211B,
        HOSTAPD_MODE_IEEE80211G,
        HOSTAPD_MODE_IEEE80211A,
+       HOSTAPD_MODE_IEEE80211AD,
        NUM_HOSTAPD_MODES
 };
 
index b7244c29dcba313c4e192f60820c440f03fbceed..0a32025bed5bd2f5be042ae3ea4dbec01988d68a 100644 (file)
@@ -4974,19 +4974,35 @@ static int phy_info_handler(struct nl_msg *msg, void *arg)
                                /* crude heuristic */
                                if (mode->channels[idx].freq < 4000)
                                        mode->mode = HOSTAPD_MODE_IEEE80211B;
+                               else if (mode->channels[idx].freq > 50000)
+                                       mode->mode = HOSTAPD_MODE_IEEE80211AD;
                                else
                                        mode->mode = HOSTAPD_MODE_IEEE80211A;
                                mode_is_set = 1;
                        }
 
-                       /* crude heuristic */
-                       if (mode->channels[idx].freq < 4000)
+                       switch (mode->mode) {
+                       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)
                                        mode->channels[idx].chan = 14;
                                else
-                                       mode->channels[idx].chan = (mode->channels[idx].freq - 2407) / 5;
-                       else
-                               mode->channels[idx].chan = mode->channels[idx].freq/5 - 1000;
+                                       mode->channels[idx].chan =
+                                               (mode->channels[idx].freq -
+                                                2407) / 5;
+                               break;
+                       default:
+                               break;
+                       }
 
                        if (tb_freq[NL80211_FREQUENCY_ATTR_DISABLED])
                                mode->channels[idx].flag |=
index e261ef9d766c697fe65c0b5a9e7e39adf606a57e..3708bcc9fbebe6eafc4be6f97ec1f006adba9453 100644 (file)
@@ -63,6 +63,10 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
                   (ssid->frequency >= 5745 && ssid->frequency <= 5825)) {
                conf->hw_mode = HOSTAPD_MODE_IEEE80211A;
                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 {
                wpa_printf(MSG_ERROR, "Unsupported AP mode frequency: %d MHz",
                           ssid->frequency);
index 58e56ce9de5ff0416a770b8d4e68bcd989a7a90c..0b6fbb0beef1955ce2e5b4290c7377874ef5ff30 100644 (file)
@@ -1627,7 +1627,7 @@ static const struct parse_data ssid_fields[] = {
 #endif /* CONFIG_IEEE80211W */
        { INT_RANGE(peerkey, 0, 1) },
        { INT_RANGE(mixed_cell, 0, 1) },
-       { INT_RANGE(frequency, 0, 10000) },
+       { INT_RANGE(frequency, 0, 65000) },
        { INT(wpa_ptk_rekey) },
        { STR(bgscan) },
        { INT_RANGE(ignore_broadcast_ssid, 0, 2) },
index 904a12eaa8196079f2a2ef6aede8033e13766573..c5e5fd29580a6f49ab968f6fe23fa2b21b4c65ef 100644 (file)
@@ -2765,6 +2765,9 @@ static int ctrl_iface_get_capability_channels(struct wpa_supplicant *wpa_s,
                case HOSTAPD_MODE_IEEE80211A:
                        hmode = "A";
                        break;
+               case HOSTAPD_MODE_IEEE80211AD:
+                       hmode = "AD";
+                       break;
                default:
                        continue;
                }