]> Pileus Git - ~andy/linux/commitdiff
Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac802...
authorJohn W. Linville <linville@tuxdriver.com>
Wed, 28 Aug 2013 17:51:40 +0000 (13:51 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 28 Aug 2013 17:51:40 +0000 (13:51 -0400)
17 files changed:
drivers/net/wireless/ath/ath6kl/wmi.c
drivers/net/wireless/ath/wil6210/wmi.c
drivers/net/wireless/brcm80211/brcmfmac/p2p.c
drivers/net/wireless/mac80211_hwsim.c
drivers/net/wireless/mwifiex/util.c
drivers/net/wireless/ti/wlcore/main.c
include/net/cfg80211.h
include/uapi/linux/nl80211.h
net/mac80211/iface.c
net/mac80211/main.c
net/mac80211/mesh.c
net/mac80211/rc80211_minstrel_ht.c
net/mac80211/rx.c
net/mac80211/tx.c
net/wireless/mlme.c
net/wireless/nl80211.c
net/wireless/nl80211.h

index 87aefb4c4c23c5d8355df9e3c30ba08a6855278e..546d5da0b8947a2f8522c5f7b8893ee0a6f537d5 100644 (file)
@@ -568,8 +568,8 @@ static int ath6kl_wmi_rx_probe_req_event_rx(struct wmi *wmi, u8 *datap, int len,
                   dlen, freq, vif->probe_req_report);
 
        if (vif->probe_req_report || vif->nw_type == AP_NETWORK)
-               cfg80211_rx_mgmt(&vif->wdev, freq, 0,
-                                ev->data, dlen, GFP_ATOMIC);
+               cfg80211_rx_mgmt(&vif->wdev, freq, 0, ev->data, dlen, 0,
+                                GFP_ATOMIC);
 
        return 0;
 }
@@ -608,8 +608,7 @@ static int ath6kl_wmi_rx_action_event_rx(struct wmi *wmi, u8 *datap, int len,
                return -EINVAL;
        }
        ath6kl_dbg(ATH6KL_DBG_WMI, "rx_action: len=%u freq=%u\n", dlen, freq);
-       cfg80211_rx_mgmt(&vif->wdev, freq, 0,
-                        ev->data, dlen, GFP_ATOMIC);
+       cfg80211_rx_mgmt(&vif->wdev, freq, 0, ev->data, dlen, 0, GFP_ATOMIC);
 
        return 0;
 }
index 5220f158b8f5d77bdf9d07db5b9261d1780551d1..063963ee422a497ff3ec7dd1dce815f8411690b7 100644 (file)
@@ -339,7 +339,7 @@ static void wmi_evt_rx_mgmt(struct wil6210_priv *wil, int id, void *d, int len)
                }
        } else {
                cfg80211_rx_mgmt(wil->wdev, freq, signal,
-                                (void *)rx_mgmt_frame, d_len, GFP_KERNEL);
+                                (void *)rx_mgmt_frame, d_len, 0, GFP_KERNEL);
        }
 }
 
index 79555f006d53d170e6186a76f3111b6d16b299ee..d7a974532909136c44eec23520e50d209db5df4b 100644 (file)
@@ -1430,7 +1430,7 @@ int brcmf_p2p_notify_action_frame_rx(struct brcmf_if *ifp,
                                              IEEE80211_BAND_5GHZ);
 
        wdev = &ifp->vif->wdev;
-       cfg80211_rx_mgmt(wdev, freq, 0, (u8 *)mgmt_frame, mgmt_frame_len,
+       cfg80211_rx_mgmt(wdev, freq, 0, (u8 *)mgmt_frame, mgmt_frame_len, 0,
                         GFP_ATOMIC);
 
        kfree(mgmt_frame);
@@ -1895,7 +1895,7 @@ s32 brcmf_p2p_notify_rx_mgmt_p2p_probereq(struct brcmf_if *ifp,
                                              IEEE80211_BAND_2GHZ :
                                              IEEE80211_BAND_5GHZ);
 
-       cfg80211_rx_mgmt(&vif->wdev, freq, 0, mgmt_frame, mgmt_frame_len,
+       cfg80211_rx_mgmt(&vif->wdev, freq, 0, mgmt_frame, mgmt_frame_len, 0,
                         GFP_ATOMIC);
 
        brcmf_dbg(INFO, "mgmt_frame_len (%d) , e->datalen (%d), chanspec (%04x), freq (%d)\n",
index a0d2aacd5e09c9634a37a8e3026ae867952efd57..2cd3f54e1efa14652e83691e3353290d17e76939 100644 (file)
@@ -2528,8 +2528,10 @@ static int __init init_mac80211_hwsim(void)
        }
 
        hwsim_mon = alloc_netdev(0, "hwsim%d", hwsim_mon_setup);
-       if (hwsim_mon == NULL)
+       if (hwsim_mon == NULL) {
+               err = -ENOMEM;
                goto failed;
+       }
 
        rtnl_lock();
 
index e57ac0dd3ab55177512aeac08482e54e926696cd..5d9e150f411147f572541cf5b06d913a873fb413 100644 (file)
@@ -171,8 +171,8 @@ mwifiex_process_mgmt_packet(struct mwifiex_private *priv,
        rx_pd->rx_pkt_length = cpu_to_le16(pkt_len);
 
        cfg80211_rx_mgmt(priv->wdev, priv->roc_cfg.chan.center_freq,
-                        CAL_RSSI(rx_pd->snr, rx_pd->nf),
-                        skb->data, pkt_len, GFP_ATOMIC);
+                        CAL_RSSI(rx_pd->snr, rx_pd->nf), skb->data, pkt_len,
+                        0, GFP_ATOMIC);
 
        return 0;
 }
index d1b19c38a907ddba1d5dfe4106e8caa2ce49315c..38995f90040dea19b50d9c46ea2d4c8b7dc1b41b 100644 (file)
@@ -5623,7 +5623,8 @@ static int wl1271_init_ieee80211(struct wl1271 *wl)
        wl->hw->wiphy->max_remain_on_channel_duration = 5000;
 
        wl->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD |
-                               WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
+                               WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL |
+                               WIPHY_FLAG_SUPPORTS_SCHED_SCAN;
 
        /* make sure all our channels fit in the scanned_ch bitmask */
        BUILD_BUG_ON(ARRAY_SIZE(wl1271_channels) +
index 9ab7a0690d934ea6b8e78129e3a912b5e92a1c82..d530c54a366286f2baccab70be91e68985ebebbb 100644 (file)
@@ -4056,6 +4056,7 @@ void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
  * @sig_dbm: signal strength in mBm, or 0 if unknown
  * @buf: Management frame (header + body)
  * @len: length of the frame data
+ * @flags: flags, as defined in enum nl80211_rxmgmt_flags
  * @gfp: context flags
  *
  * This function is called whenever an Action frame is received for a station
@@ -4067,7 +4068,7 @@ void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
  * driver is responsible for rejecting the frame.
  */
 bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_dbm,
-                     const u8 *buf, size_t len, gfp_t gfp);
+                     const u8 *buf, size_t len, u32 flags, gfp_t gfp);
 
 /**
  * cfg80211_mgmt_tx_status - notification of TX status for management frame
index 1f42bc3dcb9c544407eeb32968b41089c4a5917e..fde2c021b26dbe3be5e00a9c47de5dbdb7d60b80 100644 (file)
@@ -1493,6 +1493,9 @@ enum nl80211_commands {
  * @NL80211_ATTR_CSA_C_OFF_PRESP: Offset of the channel switch counter
  *     field in the probe response (%NL80211_ATTR_PROBE_RESP).
  *
+ * @NL80211_ATTR_RXMGMT_FLAGS: flags for nl80211_send_mgmt(), u32.
+ *     As specified in the &enum nl80211_rxmgmt_flags.
+ *
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
  */
@@ -1801,6 +1804,8 @@ enum nl80211_attrs {
        NL80211_ATTR_CSA_C_OFF_BEACON,
        NL80211_ATTR_CSA_C_OFF_PRESP,
 
+       NL80211_ATTR_RXMGMT_FLAGS,
+
        /* add attributes here, update the policy in nl80211.c */
 
        __NL80211_ATTR_AFTER_LAST,
@@ -3901,4 +3906,15 @@ enum nl80211_crit_proto_id {
 /* maximum duration for critical protocol measures */
 #define NL80211_CRIT_PROTO_MAX_DURATION                5000 /* msec */
 
+/**
+ * enum nl80211_rxmgmt_flags - flags for received management frame.
+ *
+ * Used by cfg80211_rx_mgmt()
+ *
+ * @NL80211_RXMGMT_FLAG_ANSWERED: frame was answered by device/driver.
+ */
+enum nl80211_rxmgmt_flags {
+       NL80211_RXMGMT_FLAG_ANSWERED = 1 << 0,
+};
+
 #endif /* __LINUX_NL80211_H */
index 7ca534bf4ceaef6d3125a6204d66bf29ced020ab..fcecd633514e2185b0a31235cac345ab08df9433 100644 (file)
@@ -308,12 +308,13 @@ static int ieee80211_check_concurrent_iface(struct ieee80211_sub_if_data *sdata,
        return 0;
 }
 
-static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata)
+static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata,
+                                 enum nl80211_iftype iftype)
 {
        int n_queues = sdata->local->hw.queues;
        int i;
 
-       if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) {
+       if (iftype != NL80211_IFTYPE_P2P_DEVICE) {
                for (i = 0; i < IEEE80211_NUM_ACS; i++) {
                        if (WARN_ON_ONCE(sdata->vif.hw_queue[i] ==
                                         IEEE80211_INVAL_HW_QUEUE))
@@ -324,8 +325,9 @@ static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata)
                }
        }
 
-       if ((sdata->vif.type != NL80211_IFTYPE_AP &&
-            sdata->vif.type != NL80211_IFTYPE_MESH_POINT) ||
+       if ((iftype != NL80211_IFTYPE_AP &&
+            iftype != NL80211_IFTYPE_P2P_GO &&
+            iftype != NL80211_IFTYPE_MESH_POINT) ||
            !(sdata->local->hw.flags & IEEE80211_HW_QUEUE_CONTROL)) {
                sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE;
                return 0;
@@ -408,7 +410,7 @@ int ieee80211_add_virtual_monitor(struct ieee80211_local *local)
                return ret;
        }
 
-       ret = ieee80211_check_queues(sdata);
+       ret = ieee80211_check_queues(sdata, NL80211_IFTYPE_MONITOR);
        if (ret) {
                kfree(sdata);
                return ret;
@@ -592,7 +594,8 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
                        res = drv_add_interface(local, sdata);
                        if (res)
                                goto err_stop;
-                       res = ieee80211_check_queues(sdata);
+                       res = ieee80211_check_queues(sdata,
+                               ieee80211_vif_type_p2p(&sdata->vif));
                        if (res)
                                goto err_del_interface;
                }
@@ -1389,14 +1392,14 @@ static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata,
 
        ret = drv_change_interface(local, sdata, internal_type, p2p);
        if (ret)
-               type = sdata->vif.type;
+               type = ieee80211_vif_type_p2p(&sdata->vif);
 
        /*
         * Ignore return value here, there's not much we can do since
         * the driver changed the interface type internally already.
         * The warnings will hopefully make driver authors fix it :-)
         */
-       ieee80211_check_queues(sdata);
+       ieee80211_check_queues(sdata, type);
 
        ieee80211_setup_sdata(sdata, type);
 
index 25eb35b01938e9e91d5dfd75adcee8acb030036c..21d5d44444d04c82fc73c9fd6dee3f58ab56e512 100644 (file)
@@ -892,9 +892,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
        if (!local->ops->remain_on_channel)
                local->hw.wiphy->max_remain_on_channel_duration = 5000;
 
-       if (local->ops->sched_scan_start)
-               local->hw.wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN;
-
        /* mac80211 based drivers don't support internal TDLS setup */
        if (local->hw.wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS)
                local->hw.wiphy->flags |= WIPHY_FLAG_TDLS_EXTERNAL_SETUP;
index 885a5f6e2c219b5c4e17b6574bd32e4231ed39b1..707ac61d63e51a8a1528c8c65204c92c94400768 100644 (file)
@@ -832,6 +832,9 @@ ieee80211_mesh_rx_probe_req(struct ieee80211_sub_if_data *sdata,
 
        ieee802_11_parse_elems(pos, len - baselen, false, &elems);
 
+       if (!elems.mesh_id)
+               return;
+
        /* 802.11-2012 10.1.4.3.2 */
        if ((!ether_addr_equal(mgmt->da, sdata->vif.addr) &&
             !is_broadcast_ether_addr(mgmt->da)) ||
index 339a6b8b107a808d49c4dde8e9a882a18e363f2b..7c323f27ba230a91599f34a6877caa8c17ff8605 100644 (file)
@@ -439,13 +439,12 @@ minstrel_aggr_check(struct ieee80211_sta *pubsta, struct sk_buff *skb)
 {
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
        struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
-       struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        u16 tid;
 
        if (unlikely(!ieee80211_is_data_qos(hdr->frame_control)))
                return;
 
-       if (unlikely(info->control.flags & IEEE80211_TX_CTRL_PORT_CTRL_PROTO))
+       if (unlikely(skb->protocol == cpu_to_be16(ETH_P_PAE)))
                return;
 
        tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK;
index a84f319c11adcc3122f12d9a679e294aa29277d2..54395d7583ba70e31111b08092c88d2901be7815 100644 (file)
@@ -2684,8 +2684,7 @@ ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_data *rx)
                sig = status->signal;
 
        if (cfg80211_rx_mgmt(&rx->sdata->wdev, status->freq, sig,
-                            rx->skb->data, rx->skb->len,
-                            GFP_ATOMIC)) {
+                            rx->skb->data, rx->skb->len, 0, GFP_ATOMIC)) {
                if (rx->sta)
                        rx->sta->rx_packets++;
                dev_kfree_skb(rx->skb);
index 098ae854ad3c31cb4984236d801bc468ab3763fa..3456c0486b482bfb44a6f797ebaff5d70bde4940 100644 (file)
@@ -781,9 +781,11 @@ ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx)
        /*
         * Anything but QoS data that has a sequence number field
         * (is long enough) gets a sequence number from the global
-        * counter.
+        * counter.  QoS data frames with a multicast destination
+        * also use the global counter (802.11-2012 9.3.2.10).
         */
-       if (!ieee80211_is_data_qos(hdr->frame_control)) {
+       if (!ieee80211_is_data_qos(hdr->frame_control) ||
+           is_multicast_ether_addr(hdr->addr1)) {
                /* driver should assign sequence number */
                info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ;
                /* for pure STA mode without beacons, we can do it */
index bfac5e186f579f8b6d526de5d100a77083e45696..8d49c1ce3deacbbb7ec9fe534e081ef7953607f5 100644 (file)
@@ -621,7 +621,7 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
 }
 
 bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
-                     const u8 *buf, size_t len, gfp_t gfp)
+                     const u8 *buf, size_t len, u32 flags, gfp_t gfp)
 {
        struct wiphy *wiphy = wdev->wiphy;
        struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
@@ -664,7 +664,7 @@ bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
                /* Indicate the received Action frame to user space */
                if (nl80211_send_mgmt(rdev, wdev, reg->nlportid,
                                      freq, sig_mbm,
-                                     buf, len, gfp))
+                                     buf, len, flags, gfp))
                        continue;
 
                result = true;
index 741368c31270d0066c5adbd8f744a3d9b5b61ff8..af8d84a4a5b2a05fab2de732722e6535c8e699d0 100644 (file)
@@ -10450,7 +10450,7 @@ EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame);
 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
                      struct wireless_dev *wdev, u32 nlportid,
                      int freq, int sig_dbm,
-                     const u8 *buf, size_t len, gfp_t gfp)
+                     const u8 *buf, size_t len, u32 flags, gfp_t gfp)
 {
        struct net_device *netdev = wdev->netdev;
        struct sk_buff *msg;
@@ -10473,7 +10473,9 @@ int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
            nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||
            (sig_dbm &&
             nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
-           nla_put(msg, NL80211_ATTR_FRAME, len, buf))
+           nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
+           (flags &&
+            nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags)))
                goto nla_put_failure;
 
        genlmsg_end(msg, hdr);
index 44341bf53cfc98767f41899dd73479557fdc26aa..2c0f2b3c07cba7e4c2f50b17895d498c79d08dfb 100644 (file)
@@ -66,7 +66,7 @@ void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
                      struct wireless_dev *wdev, u32 nlpid,
                      int freq, int sig_dbm,
-                     const u8 *buf, size_t len, gfp_t gfp);
+                     const u8 *buf, size_t len, u32 flags, gfp_t gfp);
 
 void
 nl80211_radar_notify(struct cfg80211_registered_device *rdev,