Added IEEE 802.11n HT capability configuration (ht_capab)
authorJouni Malinen <jouni.malinen@atheros.com>
Mon, 24 Nov 2008 13:44:25 +0000 (15:44 +0200)
committerJouni Malinen <j@w1.fi>
Mon, 24 Nov 2008 13:44:25 +0000 (15:44 +0200)
hostapd/ChangeLog
hostapd/config.c
hostapd/hostapd.conf
src/common/ieee802_11_defs.h

index 0cadf18..57b9b2e 100644 (file)
@@ -10,6 +10,7 @@ ChangeLog for hostapd
          the example configuration file); new hostapd_cli commands wps_pin and
          wps_pbc are used to configuration WPS negotiation; see README-WPS for
          more details
+       * added IEEE 802.11n HT capability configuration (ht_capab)
 
 2008-11-23 - v0.6.6
        * added a new configuration option, wpa_ptk_rekey, that can be used to
index ec5b0b6..86507f4 100644 (file)
@@ -258,11 +258,7 @@ static struct hostapd_config * hostapd_config_defaults(void)
        conf->wme_ac_params[3] = ac_vo;
 
 #ifdef CONFIG_IEEE80211N
-       SET_2BIT_LE16(&conf->ht_capab,
-                     HT_CAP_INFO_MIMO_PWR_SAVE_OFFSET,
-                     MIMO_PWR_NO_LIMIT_ON_MIMO_SEQS);
-
-       conf->ht_capab |= HT_CAP_INFO_GREEN_FIELD;
+       conf->ht_capab = HT_CAP_INFO_SMPS_DISABLED;
 #endif /* CONFIG_IEEE80211N */
 
        return conf;
@@ -1313,6 +1309,58 @@ static int add_r1kh(struct hostapd_bss_config *bss, char *value)
 #endif /* CONFIG_IEEE80211R */
 
 
+#ifdef CONFIG_IEEE80211N
+static int hostapd_config_ht_capab(struct hostapd_config *conf,
+                                  const char *capab)
+{
+       if (os_strstr(capab, "[LDPC]"))
+               conf->ht_capab |= HT_CAP_INFO_LDPC_CODING_CAP;
+       if (os_strstr(capab, "[40HT]"))
+               conf->ht_capab |= HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET;
+       if (os_strstr(capab, "[SMPS-STATIC]")) {
+               conf->ht_capab &= ~HT_CAP_INFO_SMPS_MASK;
+               conf->ht_capab |= HT_CAP_INFO_SMPS_STATIC;
+       }
+       if (os_strstr(capab, "[SMPS-DYNAMIC]")) {
+               conf->ht_capab &= ~HT_CAP_INFO_SMPS_MASK;
+               conf->ht_capab |= HT_CAP_INFO_SMPS_DYNAMIC;
+       }
+       if (os_strstr(capab, "[GF]"))
+               conf->ht_capab |= HT_CAP_INFO_GREEN_FIELD;
+       if (os_strstr(capab, "[SHORT-GI-20]"))
+               conf->ht_capab |= HT_CAP_INFO_SHORT_GI20MHZ;
+       if (os_strstr(capab, "[SHORT-GI-40]"))
+               conf->ht_capab |= HT_CAP_INFO_SHORT_GI40MHZ;
+       if (os_strstr(capab, "[TX-STBC]"))
+               conf->ht_capab |= HT_CAP_INFO_TX_STBC;
+       if (os_strstr(capab, "[RX-STBC1]")) {
+               conf->ht_capab &= ~HT_CAP_INFO_RX_STBC_MASK;
+               conf->ht_capab |= HT_CAP_INFO_RX_STBC_1;
+       }
+       if (os_strstr(capab, "[RX-STBC12]")) {
+               conf->ht_capab &= ~HT_CAP_INFO_RX_STBC_MASK;
+               conf->ht_capab |= HT_CAP_INFO_RX_STBC_12;
+       }
+       if (os_strstr(capab, "[RX-STBC123]")) {
+               conf->ht_capab &= ~HT_CAP_INFO_RX_STBC_MASK;
+               conf->ht_capab |= HT_CAP_INFO_RX_STBC_123;
+       }
+       if (os_strstr(capab, "[DELAYED-BA]"))
+               conf->ht_capab |= HT_CAP_INFO_DELAYED_BA;
+       if (os_strstr(capab, "[MAX-AMSDU-7935]"))
+               conf->ht_capab |= HT_CAP_INFO_MAX_AMSDU_SIZE;
+       if (os_strstr(capab, "[DSSS_CCK-40]"))
+               conf->ht_capab |= HT_CAP_INFO_DSSS_CCK40MHZ;
+       if (os_strstr(capab, "[PSMP]"))
+               conf->ht_capab |= HT_CAP_INFO_PSMP_SUPP;
+       if (os_strstr(capab, "[LSIG-TXOP-PROT]"))
+               conf->ht_capab |= HT_CAP_INFO_LSIG_TXOP_PROTECT_SUPPORT;
+
+       return 0;
+}
+#endif /* CONFIG_IEEE80211N */
+
+
 struct hostapd_config * hostapd_config_read(const char *fname)
 {
        struct hostapd_config *conf;
@@ -2019,6 +2067,11 @@ struct hostapd_config * hostapd_config_read(const char *fname)
 #ifdef CONFIG_IEEE80211N
                } else if (os_strcmp(buf, "ieee80211n") == 0) {
                        conf->ieee80211n = atoi(pos);
+               } else if (os_strcmp(buf, "ht_capab") == 0) {
+                       if (hostapd_config_ht_capab(conf, pos) < 0) {
+                               printf("Line %d: invalid ht_capab\n", line);
+                               errors++;
+                       }
 #endif /* CONFIG_IEEE80211N */
                } else if (os_strcmp(buf, "max_listen_interval") == 0) {
                        bss->max_listen_interval = atoi(pos);
index 2a875cf..2f8f056 100644 (file)
@@ -378,6 +378,27 @@ wme_ac_vo_acm=0
 # 1 = enabled
 #ieee80211n=1
 
+# ht_capab: HT capabilities (list of flags)
+# LDPC coding capability: [LDPC] = supported
+# Supported channel width set: [40HT] = both 20 MHz and 40 MHz
+#      (20 MHz only if not set)
+# Spatial Multiplexing (SM) Power Save: [SMPS-STATIC] or [SMPS-DYNAMIC]
+#      (SMPS disabled if neither is set)
+# HT-greenfield: [GF] (disabled if not set)
+# Short GI for 20 MHz: [SHORT-GI-20] (disabled if not set)
+# Short GI for 40 MHz: [SHORT-GI-40] (disabled if not set)
+# Tx STBC: [TX-STBC] (disabled if not set)
+# Rx STBC: [RX-STBC1] (one spatial stream), [RX-STBC12] (one or two spatial
+#      streams), or [RX-STBC123] (one, two, or three spatial streams); Rx STBC
+#      disabled if none of these set
+# HT-delayed Block Ack: [DELAYED-BA] (disabled if not set)
+# Maximum A-MSDU length: [MAX-AMSDU-7935] for 7935 octets (3839 octets if not
+#      set)
+# DSSS/CCK Mode in 40 MHz: [DSSS_CCK-40] = allowed (not allowed if not set)
+# PSMP support: [PSMP] (disabled if not set)
+# L-SIG TXOP protection support: [LSIG-TXOP-PROT] (disabled if not set)
+#ht_capab=[40HT][SHORT-GI-20][SHORT-GI-40]
+
 ##### IEEE 802.1X-2004 related configuration ##################################
 
 # Require IEEE 802.1X authorization
index 5723f0c..b92c6ff 100644 (file)
@@ -345,10 +345,6 @@ struct ieee80211_mgmt {
 
 /* HT Capability element */
 
-#define MIMO_PWR_DONT_SEND_MIMO_SEQS            0
-#define MIMO_PWR_NEED2PRECEDE_MIMO_SEQS_BY_RTS  1
-#define MIMO_PWR_NO_LIMIT_ON_MIMO_SEQS          3
-
 enum {
        MAX_RX_AMPDU_FACTOR_8KB = 0,
        MAX_RX_AMPDU_FACTOR_16KB,
@@ -433,12 +429,18 @@ struct ieee80211_ht_operation {
 
 #define HT_CAP_INFO_LDPC_CODING_CAP            ((u16) BIT(0))
 #define HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET     ((u16) BIT(1))
-#define HT_CAP_INFO_MIMO_PWR_SAVE_OFFSET       2
+#define HT_CAP_INFO_SMPS_MASK                  ((u16) (BIT(2) | BIT(3)))
+#define HT_CAP_INFO_SMPS_STATIC                        ((u16) 0)
+#define HT_CAP_INFO_SMPS_DYNAMIC               ((u16) BIT(2))
+#define HT_CAP_INFO_SMPS_DISABLED              ((u16) (BIT(2) | BIT(3)))
 #define HT_CAP_INFO_GREEN_FIELD                        ((u16) BIT(4))
 #define HT_CAP_INFO_SHORT_GI20MHZ              ((u16) BIT(5))
 #define HT_CAP_INFO_SHORT_GI40MHZ              ((u16) BIT(6))
 #define HT_CAP_INFO_TX_STBC                    ((u16) BIT(7))
-#define HT_CAP_INFO_RX_STBC_OFFSET             8
+#define HT_CAP_INFO_RX_STBC_MASK               ((u16) (BIT(8) | BIT(9)))
+#define HT_CAP_INFO_RX_STBC_1                  ((u16) BIT(8))
+#define HT_CAP_INFO_RX_STBC_12                 ((u16) BIT(9))
+#define HT_CAP_INFO_RX_STBC_123                        ((u16) (BIT(8) | BIT(9)))
 #define HT_CAP_INFO_DELAYED_BA                 ((u16) BIT(10))
 #define HT_CAP_INFO_MAX_AMSDU_SIZE             ((u16) BIT(11))
 #define HT_CAP_INFO_DSSS_CCK40MHZ              ((u16) BIT(12))