]> rtime.felk.cvut.cz Git - can-eth-gw-linux.git/commitdiff
Merge branch 'for-john' of git://git.sipsolutions.net/mac80211-next
authorJohn W. Linville <linville@tuxdriver.com>
Tue, 11 Dec 2012 21:04:03 +0000 (16:04 -0500)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 11 Dec 2012 21:04:03 +0000 (16:04 -0500)
18 files changed:
drivers/net/wireless/mac80211_hwsim.c
drivers/net/wireless/rt2x00/rt2800lib.c
drivers/net/wireless/rt2x00/rt2x00dev.c
include/linux/ieee80211.h
include/net/mac80211.h
net/mac80211/agg-tx.c
net/mac80211/debugfs_key.c
net/mac80211/ibss.c
net/mac80211/iface.c
net/mac80211/key.h
net/mac80211/mlme.c
net/mac80211/rc80211_minstrel.c
net/mac80211/rx.c
net/mac80211/scan.c
net/mac80211/status.c
net/mac80211/wpa.c
net/wireless/chan.c
net/wireless/wext-compat.c

index 8a61dbd320e6bd957678e6df4d5c2a3e3eece598..ff9085502beacba1f66990b93e225fea6d3d2fa0 100644 (file)
@@ -2223,7 +2223,7 @@ static int __init init_mac80211_hwsim(void)
                                IEEE80211_VHT_CAP_RXSTBC_2 |
                                IEEE80211_VHT_CAP_RXSTBC_3 |
                                IEEE80211_VHT_CAP_RXSTBC_4 |
-                               IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT;
+                               IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK;
                        sband->vht_cap.vht_mcs.rx_mcs_map =
                                cpu_to_le16(IEEE80211_VHT_MCS_SUPPORT_0_8 << 0 |
                                            IEEE80211_VHT_MCS_SUPPORT_0_8 << 2 |
index d4d0c3664eb2274935be59ee5f5faa25ab54f516..197b4466a5d2a44378f998fdefa2c221ae6124c6 100644 (file)
@@ -5090,7 +5090,8 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
            IEEE80211_HW_SUPPORTS_PS |
            IEEE80211_HW_PS_NULLFUNC_STACK |
            IEEE80211_HW_AMPDU_AGGREGATION |
-           IEEE80211_HW_REPORTS_TX_ACK_STATUS;
+           IEEE80211_HW_REPORTS_TX_ACK_STATUS |
+           IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL;
 
        /*
         * Don't set IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING for USB devices
index 3248b4224c4e61bc8b32803f31833717a19db034..4ffb6a584cd0c406509f8d8bf3ba1f32cf209ad2 100644 (file)
@@ -392,10 +392,9 @@ void rt2x00lib_txdone(struct queue_entry *entry,
                tx_info->flags |= IEEE80211_TX_STAT_AMPDU;
                tx_info->status.ampdu_len = 1;
                tx_info->status.ampdu_ack_len = success ? 1 : 0;
-               /*
-                * TODO: Need to tear down BA session here
-                * if not successful.
-                */
+
+               if (!success)
+                       tx_info->flags |= IEEE80211_TX_STAT_AMPDU_NO_BACK;
        }
 
        if (rate_flags & IEEE80211_TX_RC_USE_RTS_CTS) {
index 8f690e53dd898a8983e7c192664d6cba922ed536..f0859cc73861720a982c185a3422fe66efbe5415 100644 (file)
@@ -1251,32 +1251,34 @@ struct ieee80211_vht_operation {
 #define IEEE80211_VHT_MCS_NOT_SUPPORTED 3
 
 /* 802.11ac VHT Capabilities */
-#define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895                0x00000000
-#define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991                0x00000001
-#define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454               0x00000002
-#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ              0x00000004
-#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ     0x00000008
-#define IEEE80211_VHT_CAP_RXLDPC                              0x00000010
-#define IEEE80211_VHT_CAP_SHORT_GI_80                         0x00000020
-#define IEEE80211_VHT_CAP_SHORT_GI_160                        0x00000040
-#define IEEE80211_VHT_CAP_TXSTBC                              0x00000080
-#define IEEE80211_VHT_CAP_RXSTBC_1                            0x00000100
-#define IEEE80211_VHT_CAP_RXSTBC_2                            0x00000200
-#define IEEE80211_VHT_CAP_RXSTBC_3                            0x00000300
-#define IEEE80211_VHT_CAP_RXSTBC_4                            0x00000400
-#define IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE               0x00000800
-#define IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE               0x00001000
-#define IEEE80211_VHT_CAP_BEAMFORMER_ANTENNAS_MAX             0x00006000
-#define IEEE80211_VHT_CAP_SOUNDING_DIMENTION_MAX              0x00030000
-#define IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE               0x00080000
-#define IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE               0x00100000
-#define IEEE80211_VHT_CAP_VHT_TXOP_PS                         0x00200000
-#define IEEE80211_VHT_CAP_HTC_VHT                             0x00400000
-#define IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT          0x00800000
-#define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB   0x08000000
-#define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB     0x0c000000
-#define IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN                  0x10000000
-#define IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN                  0x20000000
+#define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895                 0x00000000
+#define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991                 0x00000001
+#define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454                        0x00000002
+#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ               0x00000004
+#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ      0x00000008
+#define IEEE80211_VHT_CAP_RXLDPC                               0x00000010
+#define IEEE80211_VHT_CAP_SHORT_GI_80                          0x00000020
+#define IEEE80211_VHT_CAP_SHORT_GI_160                         0x00000040
+#define IEEE80211_VHT_CAP_TXSTBC                               0x00000080
+#define IEEE80211_VHT_CAP_RXSTBC_1                             0x00000100
+#define IEEE80211_VHT_CAP_RXSTBC_2                             0x00000200
+#define IEEE80211_VHT_CAP_RXSTBC_3                             0x00000300
+#define IEEE80211_VHT_CAP_RXSTBC_4                             0x00000400
+#define IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE                        0x00000800
+#define IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE                        0x00001000
+#define IEEE80211_VHT_CAP_BEAMFORMER_ANTENNAS_MAX              0x00006000
+#define IEEE80211_VHT_CAP_SOUNDING_DIMENTION_MAX               0x00030000
+#define IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE                        0x00080000
+#define IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE                        0x00100000
+#define IEEE80211_VHT_CAP_VHT_TXOP_PS                          0x00200000
+#define IEEE80211_VHT_CAP_HTC_VHT                              0x00400000
+#define IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT     23
+#define IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK      \
+               (7 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT)
+#define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB    0x08000000
+#define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB      0x0c000000
+#define IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN                   0x10000000
+#define IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN                   0x20000000
 
 /* Authentication algorithms */
 #define WLAN_AUTH_OPEN 0
index 1c02fb3b38177be162257231c23b2f79a37b5443..ee50c5eba50c027aed710c7fded8616b9461b96a 100644 (file)
@@ -1369,6 +1369,10 @@ struct ieee80211_tx_control {
  * @IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF: Use the P2P Device address for any
  *     P2P Interface. This will be honoured even if more than one interface
  *     is supported.
+ *
+ * @IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL: On this hardware TX BA session
+ *     should be tear down once BAR frame will not be acked.
+ *
  */
 enum ieee80211_hw_flags {
        IEEE80211_HW_HAS_RATE_CONTROL                   = 1<<0,
@@ -1397,6 +1401,7 @@ enum ieee80211_hw_flags {
        IEEE80211_HW_TX_AMPDU_SETUP_IN_HW               = 1<<23,
        IEEE80211_HW_SCAN_WHILE_IDLE                    = 1<<24,
        IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF              = 1<<25,
+       IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL          = 1<<26,
 };
 
 /**
index 4152ed1034b8204ba3288470ac4fad890d65ed9c..eb9df22418f08106241c51e6646b3c3d25c2f128 100644 (file)
@@ -445,7 +445,7 @@ int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid,
 
        trace_api_start_tx_ba_session(pubsta, tid);
 
-       if (WARN_ON(!local->ops->ampdu_action))
+       if (WARN_ON_ONCE(!local->ops->ampdu_action))
                return -EINVAL;
 
        if ((tid >= IEEE80211_NUM_TIDS) ||
index 2d4235497f1be90e6a8f59229368c34716563aaf..c3a3082b72e5cde611b5fb89a63829c7fb4eee27 100644 (file)
@@ -199,6 +199,22 @@ static ssize_t key_icverrors_read(struct file *file, char __user *userbuf,
 }
 KEY_OPS(icverrors);
 
+static ssize_t key_mic_failures_read(struct file *file, char __user *userbuf,
+                                    size_t count, loff_t *ppos)
+{
+       struct ieee80211_key *key = file->private_data;
+       char buf[20];
+       int len;
+
+       if (key->conf.cipher != WLAN_CIPHER_SUITE_TKIP)
+               return -EINVAL;
+
+       len = scnprintf(buf, sizeof(buf), "%u\n", key->u.tkip.mic_failures);
+
+       return simple_read_from_buffer(userbuf, count, ppos, buf, len);
+}
+KEY_OPS(mic_failures);
+
 static ssize_t key_key_read(struct file *file, char __user *userbuf,
                            size_t count, loff_t *ppos)
 {
@@ -260,6 +276,7 @@ void ieee80211_debugfs_key_add(struct ieee80211_key *key)
        DEBUGFS_ADD(rx_spec);
        DEBUGFS_ADD(replays);
        DEBUGFS_ADD(icverrors);
+       DEBUGFS_ADD(mic_failures);
        DEBUGFS_ADD(key);
        DEBUGFS_ADD(ifindex);
 };
index fa862b24a7e017a946a4f9260a62651117c25b3e..8881fc77fb1324c50d79ca6dcc2dd5423d7a18c9 100644 (file)
@@ -201,6 +201,20 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
        bss_change |= BSS_CHANGED_BASIC_RATES;
        bss_change |= BSS_CHANGED_HT;
        bss_change |= BSS_CHANGED_IBSS;
+
+       /*
+        * In 5 GHz/802.11a, we can always use short slot time.
+        * (IEEE 802.11-2012 18.3.8.7)
+        *
+        * In 2.4GHz, we must always use long slots in IBSS for compatibility
+        * reasons.
+        * (IEEE 802.11-2012 19.4.5)
+        *
+        * HT follows these specifications (IEEE 802.11-2012 20.3.18)
+        */
+       sdata->vif.bss_conf.use_short_slot = chan->band == IEEE80211_BAND_5GHZ;
+       bss_change |= BSS_CHANGED_ERP_SLOT;
+
        sdata->vif.bss_conf.ibss_joined = true;
        sdata->vif.bss_conf.ibss_creator = creator;
        ieee80211_bss_info_change_notify(sdata, bss_change);
index 40c36d5d73775f348c53bc7f350d0ae92cf813db..09a80b55cf5a1ffaf06fdbe892ac469f6790b2bf 100644 (file)
@@ -862,7 +862,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
                rcu_assign_pointer(local->p2p_sdata, NULL);
                /* fall through */
        default:
-               flush_work(&sdata->work);
+               cancel_work_sync(&sdata->work);
                /*
                 * When we get here, the interface is marked down.
                 * Call rcu_barrier() to wait both for the RX path
index 7cff0d3a519c081b586b6a3cc93fc5d69ea39f3b..382dc44ed330a9921764431bc88345728b0eab49 100644 (file)
@@ -81,6 +81,9 @@ struct ieee80211_key {
 
                        /* last received RSC */
                        struct tkip_ctx rx[IEEE80211_NUM_TIDS];
+
+                       /* number of mic failures */
+                       u32 mic_failures;
                } tkip;
                struct {
                        atomic64_t tx_pn;
index 09556303c7e191ebda9a19b78147752cc6838d64..7753a9ca98a6c67870f68bd40b22f3af453a3945 100644 (file)
@@ -2360,9 +2360,9 @@ ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
 
        return RX_MGMT_CFG80211_RX_ASSOC;
 }
+
 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
-                                 struct ieee80211_mgmt *mgmt,
-                                 size_t len,
+                                 struct ieee80211_mgmt *mgmt, size_t len,
                                  struct ieee80211_rx_status *rx_status,
                                  struct ieee802_11_elems *elems,
                                  bool beacon)
index 79633ae06fd6720c1a8d7a2f21f69c7594a41c16..8c5acdc06226a47d84e6ba593509a5e0111f126a 100644 (file)
@@ -154,6 +154,7 @@ minstrel_tx_status(void *priv, struct ieee80211_supported_band *sband,
                    struct ieee80211_sta *sta, void *priv_sta,
                   struct sk_buff *skb)
 {
+       struct minstrel_priv *mp = priv;
        struct minstrel_sta_info *mi = priv_sta;
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        struct ieee80211_tx_rate *ar = info->status.rates;
@@ -181,6 +182,10 @@ minstrel_tx_status(void *priv, struct ieee80211_supported_band *sband,
 
        if (mi->sample_deferred > 0)
                mi->sample_deferred--;
+
+       if (time_after(jiffies, mi->stats_update +
+                               (mp->update_interval * HZ) / 1000))
+               minstrel_update_stats(mp, mi);
 }
 
 
@@ -235,10 +240,6 @@ minstrel_get_rate(void *priv, struct ieee80211_sta *sta,
 
        mrr = mp->has_mrr && !txrc->rts && !txrc->bss_conf->use_cts_prot;
 
-       if (time_after(jiffies, mi->stats_update + (mp->update_interval *
-                       HZ) / 1000))
-               minstrel_update_stats(mp, mi);
-
        ndx = mi->max_tp_rate;
 
        if (mrr)
index db343fa8033cad55cbadbbb4296e3e566b8229e3..580704eba8b8495e0bdbf2268dfdc197b9983797 100644 (file)
@@ -378,9 +378,6 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb,
         * the SKB because it has a bad FCS/PLCP checksum.
         */
 
-       /* room for the radiotap header based on driver features */
-       needed_headroom = ieee80211_rx_radiotap_space(local, status);
-
        if (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS)
                present_fcs_len = FCS_LEN;
 
@@ -399,6 +396,9 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb,
                return remove_monitor_info(local, origskb);
        }
 
+       /* room for the radiotap header based on driver features */
+       needed_headroom = ieee80211_rx_radiotap_space(local, status);
+
        if (should_drop_frame(origskb, present_fcs_len)) {
                /* only need to expand headroom if necessary */
                skb = origskb;
@@ -2333,7 +2333,8 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
        if (len < IEEE80211_MIN_ACTION_SIZE)
                return RX_DROP_UNUSABLE;
 
-       if (!rx->sta && mgmt->u.action.category != WLAN_CATEGORY_PUBLIC)
+       if (!rx->sta && mgmt->u.action.category != WLAN_CATEGORY_PUBLIC &&
+           mgmt->u.action.category != WLAN_CATEGORY_SELF_PROTECTED)
                return RX_DROP_UNUSABLE;
 
        if (!(status->rx_flags & IEEE80211_RX_RA_MATCH))
index f7176ac5a535a711d8e4bdca4e1170fa8ac90e17..8ed83dcc149fc7f38ca9beaf83a2c67a82c336ec 100644 (file)
@@ -118,7 +118,7 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
                struct ieee80211_tim_ie *tim_ie = elems->tim;
                bss->dtim_period = tim_ie->dtim_period;
                if (!elems->parse_error)
-                               bss->valid_data |= IEEE80211_BSS_VALID_DTIM;
+                       bss->valid_data |= IEEE80211_BSS_VALID_DTIM;
        }
 
        /* If the beacon had no TIM IE, or it was invalid, use 1 */
index ab50285fcbab4fb5206660eaf494875a3e2a026c..07d99578a2b1406aecd72e38934a05ea82d09d9e 100644 (file)
@@ -502,7 +502,11 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
                                       IEEE80211_BAR_CTRL_TID_INFO_MASK) >>
                                      IEEE80211_BAR_CTRL_TID_INFO_SHIFT;
 
-                               ieee80211_set_bar_pending(sta, tid, ssn);
+                               if (local->hw.flags &
+                                   IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL)
+                                       ieee80211_stop_tx_ba_session(&sta->sta, tid);
+                               else
+                                       ieee80211_set_bar_pending(sta, tid, ssn);
                        }
                }
 
index 8bd2f5c6a56edfa26193de6da2560c88d5ac75ce..c175ee866ff4ab8eb70b72a6b281ddcffc591ff1 100644 (file)
@@ -104,7 +104,7 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx)
         */
        if (status->flag & (RX_FLAG_MMIC_STRIPPED | RX_FLAG_IV_STRIPPED)) {
                if (status->flag & RX_FLAG_MMIC_ERROR)
-                       goto mic_fail;
+                       goto mic_fail_no_key;
 
                if (!(status->flag & RX_FLAG_IV_STRIPPED) && rx->key &&
                    rx->key->conf.cipher == WLAN_CIPHER_SUITE_TKIP)
@@ -161,6 +161,9 @@ update_iv:
        return RX_CONTINUE;
 
 mic_fail:
+       rx->key->u.tkip.mic_failures++;
+
+mic_fail_no_key:
        /*
         * In some cases the key can be unset - e.g. a multicast packet, in
         * a driver that supports HW encryption. Send up the key idx only if
index b5f69831e31848ec2af3fb46d4bf594ee17e9319..a7990bb165295bcefbd88c6396026e2db8b7fa38 100644 (file)
@@ -265,6 +265,9 @@ bool cfg80211_chandef_usable(struct wiphy *wiphy,
 
        /* TODO: missing regulatory check on 80/160 bandwidth */
 
+       if (width > 20)
+               prohibited_flags |= IEEE80211_CHAN_NO_OFDM;
+
        if (!cfg80211_secondary_chans_ok(wiphy, chandef->center_freq1,
                                         width, prohibited_flags))
                return false;
index f9680c9cf9b3d26fc828671054e8b2c1e1bff551..d997d0f0c54a683fb0aee287d44fc79d4b15230d 100644 (file)
@@ -176,7 +176,7 @@ int cfg80211_wext_giwrange(struct net_device *dev,
        case CFG80211_SIGNAL_TYPE_NONE:
                break;
        case CFG80211_SIGNAL_TYPE_MBM:
-               range->max_qual.level = -110;
+               range->max_qual.level = (u8)-110;
                range->max_qual.qual = 70;
                range->avg_qual.qual = 35;
                range->max_qual.updated |= IW_QUAL_DBM;