--- a/nl80211.h
+++ b/nl80211.h
-@@ -6,7 +6,7 @@
- * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
- * Copyright 2008 Michael Wu <flamingice@sourmilk.net>
- * Copyright 2008 Luis Carlos Cobo <luisca@cozybit.com>
-- * Copyright 2008 Michael Buesch <mb@bu3sch.de>
-+ * Copyright 2008 Michael Buesch <m@bues.ch>
- * Copyright 2008, 2009 Luis R. Rodriguez <lrodriguez@atheros.com>
- * Copyright 2008 Jouni Malinen <jouni.malinen@atheros.com>
- * Copyright 2008 Colin McCabe <colin@cozybit.com>
-@@ -161,6 +161,13 @@
- * @NL80211_CMD_SET_BEACON: set the beacon on an access point interface
- * using the %NL80211_ATTR_BEACON_INTERVAL, %NL80211_ATTR_DTIM_PERIOD,
- * %NL80211_ATTR_BEACON_HEAD and %NL80211_ATTR_BEACON_TAIL attributes.
-+ * Following attributes are provided for drivers that generate full Beacon
-+ * and Probe Response frames internally: %NL80211_ATTR_SSID,
-+ * %NL80211_ATTR_HIDDEN_SSID, %NL80211_ATTR_CIPHERS_PAIRWISE,
-+ * %NL80211_ATTR_CIPHER_GROUP, %NL80211_ATTR_WPA_VERSIONS,
-+ * %NL80211_ATTR_AKM_SUITES, %NL80211_ATTR_PRIVACY,
-+ * %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_IE, %NL80211_ATTR_IE_PROBE_RESP,
-+ * %NL80211_ATTR_IE_ASSOC_RESP.
- * @NL80211_CMD_NEW_BEACON: add a new beacon to an access point interface,
- * parameters are like for %NL80211_CMD_SET_BEACON.
- * @NL80211_CMD_DEL_BEACON: remove the beacon, stop sending it
-@@ -762,6 +769,8 @@ enum nl80211_commands {
- * that can be added to a scan request
- * @NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN: maximum length of information
- * elements that can be added to a scheduled scan request
-+ * @NL80211_ATTR_MAX_MATCH_SETS: maximum number of sets that can be
-+ * used with @NL80211_ATTR_SCHED_SCAN_MATCH, a wiphy attribute.
- *
- * @NL80211_ATTR_SCAN_FREQUENCIES: nested attribute with frequencies (in MHz)
- * @NL80211_ATTR_SCAN_SSIDS: nested attribute with SSIDs, leave out for passive
-@@ -842,18 +851,20 @@ enum nl80211_commands {
- * @NL80211_ATTR_STATUS_CODE: StatusCode for the %NL80211_CMD_CONNECT
- * event (u16)
- * @NL80211_ATTR_PRIVACY: Flag attribute, used with connect(), indicating
-- * that protected APs should be used.
-+ * that protected APs should be used. This is also used with NEW_BEACON to
-+ * indicate that the BSS is to use protection.
- *
-- * @NL80211_ATTR_CIPHERS_PAIRWISE: Used with CONNECT and ASSOCIATE to
-- * indicate which unicast key ciphers will be used with the connection
-+ * @NL80211_ATTR_CIPHERS_PAIRWISE: Used with CONNECT, ASSOCIATE, and NEW_BEACON
-+ * to indicate which unicast key ciphers will be used with the connection
- * (an array of u32).
-- * @NL80211_ATTR_CIPHER_GROUP: Used with CONNECT and ASSOCIATE to indicate
-- * which group key cipher will be used with the connection (a u32).
-- * @NL80211_ATTR_WPA_VERSIONS: Used with CONNECT and ASSOCIATE to indicate
-- * which WPA version(s) the AP we want to associate with is using
-+ * @NL80211_ATTR_CIPHER_GROUP: Used with CONNECT, ASSOCIATE, and NEW_BEACON to
-+ * indicate which group key cipher will be used with the connection (a
-+ * u32).
-+ * @NL80211_ATTR_WPA_VERSIONS: Used with CONNECT, ASSOCIATE, and NEW_BEACON to
-+ * indicate which WPA version(s) the AP we want to associate with is using
- * (a u32 with flags from &enum nl80211_wpa_versions).
-- * @NL80211_ATTR_AKM_SUITES: Used with CONNECT and ASSOCIATE to indicate
-- * which key management algorithm(s) to use (an array of u32).
-+ * @NL80211_ATTR_AKM_SUITES: Used with CONNECT, ASSOCIATE, and NEW_BEACON to
-+ * indicate which key management algorithm(s) to use (an array of u32).
- *
- * @NL80211_ATTR_REQ_IE: (Re)association request information elements as
- * sent out by the card, for ROAM and successful CONNECT events.
-@@ -1002,6 +1013,24 @@ enum nl80211_commands {
+@@ -1475,6 +1475,7 @@ enum nl80211_attrs {
+ #define NL80211_ATTR_FEATURE_FLAGS NL80211_ATTR_FEATURE_FLAGS
- * @NL80211_ATTR_SCHED_SCAN_INTERVAL: Interval between scheduled scan
- * cycles, in msecs.
-+
-+ * @NL80211_ATTR_SCHED_SCAN_MATCH: Nested attribute with one or more
-+ * sets of attributes to match during scheduled scans. Only BSSs
-+ * that match any of the sets will be reported. These are
-+ * pass-thru filter rules.
-+ * For a match to succeed, the BSS must match all attributes of a
-+ * set. Since not every hardware supports matching all types of
-+ * attributes, there is no guarantee that the reported BSSs are
-+ * fully complying with the match sets and userspace needs to be
-+ * able to ignore them by itself.
-+ * Thus, the implementation is somewhat hardware-dependent, but
-+ * this is only an optimization and the userspace application
-+ * needs to handle all the non-filtered results anyway.
-+ * If the match attributes don't make sense when combined with
-+ * the values passed in @NL80211_ATTR_SCAN_SSIDS (eg. if an SSID
-+ * is included in the probe request, but the match attributes
-+ * will never let it go through), -EINVAL may be returned.
-+ * If ommited, no filtering is done.
- *
- * @NL80211_ATTR_INTERFACE_COMBINATIONS: Nested attribute listing the supported
- * interface combinations. In each nested item, it contains attributes
-@@ -1014,6 +1043,33 @@ enum nl80211_commands {
- * @%NL80211_ATTR_REKEY_DATA: nested attribute containing the information
- * necessary for GTK rekeying in the device, see &enum nl80211_rekey_data.
- *
-+ * @NL80211_ATTR_SCAN_SUPP_RATES: rates per to be advertised as supported in scan,
-+ * nested array attribute containing an entry for each band, with the entry
-+ * being a list of supported rates as defined by IEEE 802.11 7.3.2.2 but
-+ * without the length restriction (at most %NL80211_MAX_SUPP_RATES).
-+ *
-+ * @NL80211_ATTR_HIDDEN_SSID: indicates whether SSID is to be hidden from Beacon
-+ * and Probe Response (when response to wildcard Probe Request); see
-+ * &enum nl80211_hidden_ssid, represented as a u32
-+ *
-+ * @NL80211_ATTR_IE_PROBE_RESP: Information element(s) for Probe Response frame.
-+ * This is used with %NL80211_CMD_NEW_BEACON and %NL80211_CMD_SET_BEACON to
-+ * provide extra IEs (e.g., WPS/P2P IE) into Probe Response frames when the
-+ * driver (or firmware) replies to Probe Request frames.
-+ * @NL80211_ATTR_IE_ASSOC_RESP: Information element(s) for (Re)Association
-+ * Response frames. This is used with %NL80211_CMD_NEW_BEACON and
-+ * %NL80211_CMD_SET_BEACON to provide extra IEs (e.g., WPS/P2P IE) into
-+ * (Re)Association Response frames when the driver (or firmware) replies to
-+ * (Re)Association Request frames.
-+ *
-+ * @NL80211_ATTR_STA_WME: Nested attribute containing the wme configuration
-+ * of the station, see &enum nl80211_sta_wme_attr.
-+ * @NL80211_ATTR_SUPPORT_AP_UAPSD: the device supports uapsd when working
-+ * as AP.
-+ *
-+ * @NL80211_ATTR_ROAM_SUPPORT: Indicates whether the firmware is capable of
-+ * roaming to another AP in the same ESS if the signal lever is low.
-+ *
- * @NL80211_ATTR_MAX: highest attribute number currently defined
- * @__NL80211_ATTR_AFTER_LAST: internal use
+ #define NL80211_MAX_SUPP_RATES 32
++#define NL80211_MAX_SUPP_HT_RATES 77
+ #define NL80211_MAX_SUPP_REG_RULES 32
+ #define NL80211_TKIP_DATA_OFFSET_ENCR_KEY 0
+ #define NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY 16
+@@ -1536,7 +1537,11 @@ enum nl80211_iftype {
+ * @NL80211_STA_FLAG_WME: station is WME/QoS capable
+ * @NL80211_STA_FLAG_MFP: station uses management frame protection
+ * @NL80211_STA_FLAG_AUTHENTICATED: station is authenticated
+- * @NL80211_STA_FLAG_TDLS_PEER: station is a TDLS peer
++ * @NL80211_STA_FLAG_TDLS_PEER: station is a TDLS peer -- this flag should
++ * only be used in managed mode (even in the flags mask). Note that the
++ * flag can't be changed, it is only valid while adding a station, and
++ * attempts to change it will silently be ignored (rather than rejected
++ * as errors.)
+ * @NL80211_STA_FLAG_MAX: highest station flag number currently defined
+ * @__NL80211_STA_FLAG_AFTER_LAST: internal use
*/
-@@ -1217,6 +1273,21 @@ enum nl80211_attrs {
- NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
- NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,
-
-+ NL80211_ATTR_SCAN_SUPP_RATES,
-+
-+ NL80211_ATTR_HIDDEN_SSID,
-+
-+ NL80211_ATTR_IE_PROBE_RESP,
-+ NL80211_ATTR_IE_ASSOC_RESP,
-+
-+ NL80211_ATTR_STA_WME,
-+ NL80211_ATTR_SUPPORT_AP_UAPSD,
-+
-+ NL80211_ATTR_ROAM_SUPPORT,
-+
-+ NL80211_ATTR_SCHED_SCAN_MATCH,
-+ NL80211_ATTR_MAX_MATCH_SETS,
-+
- /* add attributes here, update the policy in nl80211.c */
-
- __NL80211_ATTR_AFTER_LAST,
-@@ -1426,6 +1497,8 @@ enum nl80211_sta_bss_param {
- * @NL80211_STA_INFO_BSS_PARAM: current station's view of BSS, nested attribute
+@@ -1651,6 +1656,9 @@ enum nl80211_sta_bss_param {
* containing info as possible, see &enum nl80211_sta_bss_param
* @NL80211_STA_INFO_CONNECTED_TIME: time since the station is last connected
+ * @NL80211_STA_INFO_STA_FLAGS: Contains a struct nl80211_sta_flag_update.
++ * @NL80211_STA_INFO_BEACON_LOSS: count of times beacon loss was detected (u32)
+ * @NL80211_STA_INFO_CHAIN_SIGNAL: per-chain signal strength of last PPDU
+ * @NL80211_STA_INFO_CHAIN_SIGNAL_AVG: per-chain signal strength average
* @__NL80211_STA_INFO_AFTER_LAST: internal
* @NL80211_STA_INFO_MAX: highest possible station info attribute
*/
-@@ -1447,6 +1520,8 @@ enum nl80211_sta_info {
- NL80211_STA_INFO_RX_BITRATE,
+@@ -1673,6 +1681,9 @@ enum nl80211_sta_info {
NL80211_STA_INFO_BSS_PARAM,
NL80211_STA_INFO_CONNECTED_TIME,
+ NL80211_STA_INFO_STA_FLAGS,
++ NL80211_STA_INFO_BEACON_LOSS,
+ NL80211_STA_INFO_CHAIN_SIGNAL,
+ NL80211_STA_INFO_CHAIN_SIGNAL_AVG,
/* keep last */
__NL80211_STA_INFO_AFTER_LAST,
-@@ -1676,6 +1751,26 @@ enum nl80211_reg_rule_attr {
- };
-
- /**
-+ * enum nl80211_sched_scan_match_attr - scheduled scan match attributes
-+ * @__NL80211_SCHED_SCAN_MATCH_ATTR_INVALID: attribute number 0 is reserved
-+ * @NL80211_SCHED_SCAN_MATCH_ATTR_SSID: SSID to be used for matching,
-+ * only report BSS with matching SSID.
-+ * @NL80211_SCHED_SCAN_MATCH_ATTR_MAX: highest scheduled scan filter
-+ * attribute number currently defined
-+ * @__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST: internal use
-+ */
-+enum nl80211_sched_scan_match_attr {
-+ __NL80211_SCHED_SCAN_MATCH_ATTR_INVALID,
-+
-+ NL80211_ATTR_SCHED_SCAN_MATCH_SSID,
-+
-+ /* keep last */
-+ __NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST,
-+ NL80211_SCHED_SCAN_MATCH_ATTR_MAX =
-+ __NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST - 1
-+};
-+
-+/**
- * enum nl80211_reg_rule_flags - regulatory rule flags
+@@ -2098,6 +2109,9 @@ enum nl80211_mntr_flags {
+ * TUs) during which a mesh STA can send only one Action frame containing a
+ * PERR element.
*
- * @NL80211_RRF_NO_OFDM: OFDM modulation not allowed
-@@ -1826,6 +1921,13 @@ enum nl80211_mntr_flags {
- * @NL80211_MESHCONF_ELEMENT_TTL: specifies the value of TTL field set at a
- * source mesh point for path selection elements.
- *
-+ * @NL80211_MESHCONF_HWMP_RANN_INTERVAL: The interval of time (in TUs) between
-+ * root announcements are transmitted.
-+ *
-+ * @NL80211_MESHCONF_GATE_ANNOUNCEMENTS: Advertise that this mesh station has
-+ * access to a broader network beyond the MBSS. This is done via Root
-+ * Announcement frames.
++ * @NL80211_MESHCONF_FORWARDING: set Mesh STA as forwarding or non-forwarding
++ * or forwarding entity (default is TRUE - forwarding entity)
+ *
* @NL80211_MESHCONF_ATTR_MAX: highest possible mesh configuration attribute
*
* @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use
-@@ -1847,6 +1949,8 @@ enum nl80211_meshconf_params {
- NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
- NL80211_MESHCONF_HWMP_ROOTMODE,
- NL80211_MESHCONF_ELEMENT_TTL,
-+ NL80211_MESHCONF_HWMP_RANN_INTERVAL,
-+ NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
+@@ -2122,6 +2136,7 @@ enum nl80211_meshconf_params {
+ NL80211_MESHCONF_HWMP_RANN_INTERVAL,
+ NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
+ NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
++ NL80211_MESHCONF_FORWARDING,
/* keep last */
__NL80211_MESHCONF_ATTR_AFTER_LAST,
-@@ -2423,4 +2527,37 @@ enum nl80211_rekey_data {
- MAX_NL80211_REKEY_DATA = NUM_NL80211_REKEY_DATA - 1
- };
+@@ -2395,12 +2410,15 @@ enum nl80211_key_attributes {
+ * in an array of rates as defined in IEEE 802.11 7.3.2.2 (u8 values with
+ * 1 = 500 kbps) but without the IE length restriction (at most
+ * %NL80211_MAX_SUPP_RATES in a single array).
++ * @NL80211_TXRATE_MCS: HT (MCS) rates allowed for TX rate selection
++ * in an array of MCS numbers.
+ * @__NL80211_TXRATE_AFTER_LAST: internal
+ * @NL80211_TXRATE_MAX: highest TX rate attribute
+ */
+ enum nl80211_tx_rate_attributes {
+ __NL80211_TXRATE_INVALID,
+ NL80211_TXRATE_LEGACY,
++ NL80211_TXRATE_MCS,
-+/**
-+ * enum nl80211_hidden_ssid - values for %NL80211_ATTR_HIDDEN_SSID
-+ * @NL80211_HIDDEN_SSID_NOT_IN_USE: do not hide SSID (i.e., broadcast it in
-+ * Beacon frames)
-+ * @NL80211_HIDDEN_SSID_ZERO_LEN: hide SSID by using zero-length SSID element
-+ * in Beacon frames
-+ * @NL80211_HIDDEN_SSID_ZERO_CONTENTS: hide SSID by using correct length of SSID
-+ * element in Beacon frames but zero out each byte in the SSID
-+ */
-+enum nl80211_hidden_ssid {
-+ NL80211_HIDDEN_SSID_NOT_IN_USE,
-+ NL80211_HIDDEN_SSID_ZERO_LEN,
-+ NL80211_HIDDEN_SSID_ZERO_CONTENTS
-+};
-+
-+/**
-+ * enum nl80211_sta_wme_attr - station WME attributes
-+ * @__NL80211_STA_WME_INVALID: invalid number for nested attribute
-+ * @NL80211_STA_WME_QUEUES: bitmap of uapsd queues.
-+ * @NL80211_STA_WME_MAX_SP: max service period.
-+ * @__NL80211_STA_WME_AFTER_LAST: internal
-+ * @NL80211_STA_WME_MAX: highest station WME attribute
-+ */
-+enum nl80211_sta_wme_attr {
-+ __NL80211_STA_WME_INVALID,
-+ NL80211_STA_WME_UAPSD_QUEUES,
-+ NL80211_STA_WME_MAX_SP,
-+
-+ /* keep last */
-+ __NL80211_STA_WME_AFTER_LAST,
-+ NL80211_STA_WME_MAX = __NL80211_STA_WME_AFTER_LAST - 1
-+};
-+
- #endif /* __LINUX_NL80211_H */
+ /* keep last */
+ __NL80211_TXRATE_AFTER_LAST,
+++ /dev/null
---- a/ibss.c
-+++ b/ibss.c
-@@ -27,6 +27,7 @@ static int join_ibss(struct nl80211_stat
- char *value = NULL, *sptr = NULL;
- float rate;
- int bintval;
-+ unsigned int htval;
-
- if (argc < 2)
- return 1;
-@@ -44,6 +45,12 @@ static int join_ibss(struct nl80211_stat
- argv++;
- argc--;
-
-+ if (argc && parse_channel_type(argv[0], &htval)) {
-+ NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, htval);
-+ argv++;
-+ argc--;
-+ }
-+
- if (argc && strcmp(argv[0], "fixed-freq") == 0) {
- NLA_PUT_FLAG(msg, NL80211_ATTR_FREQ_FIXED);
- argv++;
-@@ -134,7 +141,7 @@ COMMAND(ibss, leave, NULL,
- NL80211_CMD_LEAVE_IBSS, 0, CIB_NETDEV, leave_ibss,
- "Leave the current IBSS cell.");
- COMMAND(ibss, join,
-- "<SSID> <freq in MHz> [fixed-freq] [<fixed bssid>] [beacon-interval <TU>]"
-+ "<SSID> <freq in MHz> [HT20|HT40+|HT40-] [fixed-freq] [<fixed bssid>] [beacon-interval <TU>]"
- " [basic-rates <rate in Mbps,rate2,...>] [mcast-rate <rate in Mbps>] "
- "[key d:0:abcde]",
- NL80211_CMD_JOIN_IBSS, 0, CIB_NETDEV, join_ibss,
---- a/iw.h
-+++ b/iw.h
-@@ -133,6 +133,7 @@ int parse_hex_mask(char *hexmask, unsign
- unsigned char *parse_hex(char *hex, size_t *outlen);
-
- int parse_keys(struct nl_msg *msg, char **argv, int argc);
-+int parse_channel_type(const char *str, unsigned int *htval);
-
- void print_ht_mcs(const __u8 *mcs);
- void print_ampdu_length(__u8 exponent);
---- a/phy.c
-+++ b/phy.c
-@@ -33,30 +33,14 @@ static int handle_freqchan(struct nl_msg
- int argc, char **argv)
- {
- char *end;
-- static const struct {
-- const char *name;
-- unsigned int val;
-- } htmap[] = {
-- { .name = "HT20", .val = NL80211_CHAN_HT20, },
-- { .name = "HT40+", .val = NL80211_CHAN_HT40PLUS, },
-- { .name = "HT40-", .val = NL80211_CHAN_HT40MINUS, },
-- };
- unsigned int htval = NL80211_CHAN_NO_HT;
- unsigned int freq;
-- int i;
-
- if (!argc || argc > 2)
- return 1;
-
-- if (argc == 2) {
-- for (i = 0; i < ARRAY_SIZE(htmap); i++) {
-- if (strcasecmp(htmap[i].name, argv[1]) == 0) {
-- htval = htmap[i].val;
-- break;
-- }
-- }
-- if (htval == NL80211_CHAN_NO_HT)
-- return 1;
-+ if (argc == 2 && !parse_channel_type(argv[1], &htval)) {
-+ return 1;
- }
-
- if (!*argv[0])
---- a/util.c
-+++ b/util.c
-@@ -382,6 +382,33 @@ int parse_keys(struct nl_msg *msg, char
- return 2;
- }
-
-+/*
-+ * Convert a string "HT20", "HT40+" or "HT40-" into nl80211
-+ * value. Conversion is case insensitive. Returns 1 on success, 0 on error.
-+ */
-+
-+int parse_channel_type(const char *str, unsigned int *htval)
-+{
-+ static const struct {
-+ const char *name;
-+ unsigned int val;
-+ } htmap[] = {
-+ { .name = "HT20", .val = NL80211_CHAN_HT20, },
-+ { .name = "HT40+", .val = NL80211_CHAN_HT40PLUS, },
-+ { .name = "HT40-", .val = NL80211_CHAN_HT40MINUS, },
-+ };
-+ int i;
-+
-+ for (i = 0; i < ARRAY_SIZE(htmap); i++) {
-+ if (strcasecmp(htmap[i].name, str) == 0) {
-+ *htval = htmap[i].val;
-+ return 1;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
- static void print_mcs_index(const __u8 *mcs)
- {
- unsigned int mcs_bit, prev_bit = -2, prev_cont = 0;