cfg80211: off by one in nl80211_trigger_scan()
[firefly-linux-kernel-4.4.55.git] / net / wireless / mlme.c
index 16881fea4ce6e1917ea36b39b83dfb6ca6916278..832f6574e4ed7dab26d949154d0aefe04303e98b 100644 (file)
@@ -170,7 +170,9 @@ void __cfg80211_send_deauth(struct net_device *dev,
                        break;
                }
                if (wdev->authtry_bsses[i] &&
-                   memcmp(wdev->authtry_bsses[i]->pub.bssid, bssid, ETH_ALEN) == 0) {
+                   memcmp(wdev->authtry_bsses[i]->pub.bssid, bssid,
+                          ETH_ALEN) == 0 &&
+                   memcmp(mgmt->sa, dev->dev_addr, ETH_ALEN) == 0) {
                        cfg80211_unhold_bss(wdev->authtry_bsses[i]);
                        cfg80211_put_bss(&wdev->authtry_bsses[i]->pub);
                        wdev->authtry_bsses[i] = NULL;
@@ -963,6 +965,16 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
                        if (memcmp(mgmt->bssid, dev->dev_addr, ETH_ALEN))
                                err = -EINVAL;
                        break;
+               case NL80211_IFTYPE_MESH_POINT:
+                       if (memcmp(mgmt->sa, mgmt->bssid, ETH_ALEN)) {
+                               err = -EINVAL;
+                               break;
+                       }
+                       /*
+                        * check for mesh DA must be done by driver as
+                        * cfg80211 doesn't track the stations
+                        */
+                       break;
                default:
                        err = -EOPNOTSUPP;
                        break;
@@ -1072,3 +1084,14 @@ void cfg80211_cqm_pktloss_notify(struct net_device *dev,
        nl80211_send_cqm_pktloss_notify(rdev, dev, peer, num_packets, gfp);
 }
 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify);
+
+void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
+                              const u8 *replay_ctr, gfp_t gfp)
+{
+       struct wireless_dev *wdev = dev->ieee80211_ptr;
+       struct wiphy *wiphy = wdev->wiphy;
+       struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
+
+       nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp);
+}
+EXPORT_SYMBOL(cfg80211_gtk_rekey_notify);