]> Pileus Git - ~andy/linux/blobdiff - drivers/net/wireless/rndis_wlan.c
rndis_wlan: disable IWEVPMKIDCAND wireless event
[~andy/linux] / drivers / net / wireless / rndis_wlan.c
index 351affe793c4958068b99d75d380b71bb5bfd000..9d9750dbec84e2ec91cc9717e6463abaacd10b85 100644 (file)
@@ -440,7 +440,7 @@ struct rndis_wlan_private {
        struct cfg80211_scan_request *scan_request;
 
        struct workqueue_struct *workqueue;
-       struct delayed_work stats_work;
+       struct delayed_work dev_poller_work;
        struct delayed_work scan_work;
        struct work_struct work;
        struct mutex command_lock;
@@ -2179,13 +2179,6 @@ static int rndis_dump_station(struct wiphy *wiphy, struct net_device *dev,
  * wireless extension handlers
  */
 
-static int rndis_iw_commit(struct net_device *dev,
-    struct iw_request_info *info, union iwreq_data *wrqu, char *extra)
-{
-       /* dummy op */
-       return 0;
-}
-
 #if 0
 /* Commented code out instead of removing to have more sane patch for review.
  * Will be removed later in the set.
@@ -2558,7 +2551,6 @@ static struct iw_statistics *rndis_get_wireless_stats(struct net_device *dev)
 #define IW_IOCTL(x) [(x) - SIOCSIWCOMMIT]
 static const iw_handler rndis_iw_handler[] =
 {
-       IW_IOCTL(SIOCSIWCOMMIT)    = rndis_iw_commit,
        IW_IOCTL(SIOCGIWNAME)      = (iw_handler) cfg80211_wext_giwname,
        IW_IOCTL(SIOCSIWFREQ)      = (iw_handler) cfg80211_wext_siwfreq,
        IW_IOCTL(SIOCGIWFREQ)      = (iw_handler) cfg80211_wext_giwfreq,
@@ -2728,9 +2720,10 @@ static void rndis_wlan_auth_indication(struct usbnet *usbdev,
 {
        u8 *buf;
        const char *type;
-       int flags, buflen;
+       int flags, buflen, key_id;
        bool pairwise_error, group_error;
        struct ndis_80211_auth_request *auth_req;
+       enum nl80211_key_type key_type;
 
        /* must have at least one array entry */
        if (len < offsetof(struct ndis_80211_status_indication, u) +
@@ -2766,23 +2759,24 @@ static void rndis_wlan_auth_indication(struct usbnet *usbdev,
                devinfo(usbdev, "authentication indication: %s (0x%08x)", type,
                                le32_to_cpu(auth_req->flags));
 
-               if (pairwise_error || group_error) {
-                       union iwreq_data wrqu;
-                       struct iw_michaelmicfailure micfailure;
+               if (pairwise_error) {
+                       key_type = NL80211_KEYTYPE_PAIRWISE;
+                       key_id = -1;
 
-                       memset(&micfailure, 0, sizeof(micfailure));
-                       if (pairwise_error)
-                               micfailure.flags |= IW_MICFAILURE_PAIRWISE;
-                       if (group_error)
-                               micfailure.flags |= IW_MICFAILURE_GROUP;
+                       cfg80211_michael_mic_failure(usbdev->net,
+                                                       auth_req->bssid,
+                                                       key_type, key_id, NULL,
+                                                       GFP_KERNEL);
+               }
 
-                       memcpy(micfailure.src_addr.sa_data, auth_req->bssid,
-                               ETH_ALEN);
+               if (group_error) {
+                       key_type = NL80211_KEYTYPE_GROUP;
+                       key_id = -1;
 
-                       memset(&wrqu, 0, sizeof(wrqu));
-                       wrqu.data.length = sizeof(micfailure);
-                       wireless_send_event(usbdev->net, IWEVMICHAELMICFAILURE,
-                                               &wrqu, (u8 *)&micfailure);
+                       cfg80211_michael_mic_failure(usbdev->net,
+                                                       auth_req->bssid,
+                                                       key_type, key_id, NULL,
+                                                       GFP_KERNEL);
                }
 
                buflen -= le32_to_cpu(auth_req->length);
@@ -2827,14 +2821,16 @@ static void rndis_wlan_pmkid_cand_list_indication(struct usbnet *usbdev,
                return;
 
        for (i = 0; i < le32_to_cpu(cand_list->num_candidates); i++) {
-               struct iw_pmkid_cand pcand;
-               union iwreq_data wrqu;
                struct ndis_80211_pmkid_candidate *cand =
                                                &cand_list->candidate_list[i];
 
                devdbg(usbdev, "cand[%i]: flags: 0x%08x, bssid: %pM",
                                i, le32_to_cpu(cand->flags), cand->bssid);
 
+#if 0
+               struct iw_pmkid_cand pcand;
+               union iwreq_data wrqu;
+
                memset(&pcand, 0, sizeof(pcand));
                if (le32_to_cpu(cand->flags) & 0x01)
                        pcand.flags |= IW_PMKID_CAND_PREAUTH;
@@ -2845,6 +2841,7 @@ static void rndis_wlan_pmkid_cand_list_indication(struct usbnet *usbdev,
                wrqu.data.length = sizeof(pcand);
                wireless_send_event(usbdev->net, IWEVPMKIDCAND, &wrqu,
                                                                (u8 *)&pcand);
+#endif
        }
 }
 
@@ -2984,15 +2981,16 @@ static int rndis_wlan_get_caps(struct usbnet *usbdev)
 }
 
 
-#define STATS_UPDATE_JIFFIES (HZ)
-static void rndis_update_wireless_stats(struct work_struct *work)
+#define DEVICE_POLLER_JIFFIES (HZ)
+static void rndis_device_poller(struct work_struct *work)
 {
        struct rndis_wlan_private *priv =
-               container_of(work, struct rndis_wlan_private, stats_work.work);
+               container_of(work, struct rndis_wlan_private,
+                                                       dev_poller_work.work);
        struct usbnet *usbdev = priv->usbdev;
        __le32 rssi, tmp;
        int len, ret, j;
-       int update_jiffies = STATS_UPDATE_JIFFIES;
+       int update_jiffies = DEVICE_POLLER_JIFFIES;
        void *buf;
 
        /* Only check/do workaround when connected. Calling is_associated()
@@ -3007,8 +3005,8 @@ static void rndis_update_wireless_stats(struct work_struct *work)
        if (ret == 0)
                priv->last_qual = level_to_qual(le32_to_cpu(rssi));
 
-       devdbg(usbdev, "stats: OID_802_11_RSSI -> %d, rssi:%d", ret,
-                                                       le32_to_cpu(rssi));
+       devdbg(usbdev, "dev-poller: OID_802_11_RSSI -> %d, rssi:%d, qual: %d",
+               ret, le32_to_cpu(rssi), level_to_qual(le32_to_cpu(rssi)));
 
        /* Workaround transfer stalls on poor quality links.
         * TODO: find right way to fix these stalls (as stalls do not happen
@@ -3019,8 +3017,8 @@ static void rndis_update_wireless_stats(struct work_struct *work)
                 * Slower doesn't catch stalls fast enough.
                 */
                j = msecs_to_jiffies(priv->param_workaround_interval);
-               if (j > STATS_UPDATE_JIFFIES)
-                       j = STATS_UPDATE_JIFFIES;
+               if (j > DEVICE_POLLER_JIFFIES)
+                       j = DEVICE_POLLER_JIFFIES;
                else if (j <= 0)
                        j = 1;
                update_jiffies = j;
@@ -3040,8 +3038,8 @@ static void rndis_update_wireless_stats(struct work_struct *work)
                rndis_query_oid(usbdev, OID_802_11_BSSID_LIST, buf, &len);
                kfree(buf);
        }
-end:
 
+end:
        if (update_jiffies >= HZ)
                update_jiffies = round_jiffies_relative(update_jiffies);
        else {
@@ -3050,7 +3048,8 @@ end:
                        update_jiffies = j;
        }
 
-       queue_delayed_work(priv->workqueue, &priv->stats_work, update_jiffies);
+       queue_delayed_work(priv->workqueue, &priv->dev_poller_work,
+                                                               update_jiffies);
 }
 
 
@@ -3175,7 +3174,7 @@ static int rndis_wlan_bind(struct usbnet *usbdev, struct usb_interface *intf)
        /* because rndis_command() sleeps we need to use workqueue */
        priv->workqueue = create_singlethread_workqueue("rndis_wlan");
        INIT_WORK(&priv->work, rndis_wlan_worker);
-       INIT_DELAYED_WORK(&priv->stats_work, rndis_update_wireless_stats);
+       INIT_DELAYED_WORK(&priv->dev_poller_work, rndis_device_poller);
        INIT_DELAYED_WORK(&priv->scan_work, rndis_get_scan_results);
 
        /* try bind rndis_host */
@@ -3252,7 +3251,7 @@ static int rndis_wlan_bind(struct usbnet *usbdev, struct usb_interface *intf)
        return 0;
 
 fail:
-       cancel_delayed_work_sync(&priv->stats_work);
+       cancel_delayed_work_sync(&priv->dev_poller_work);
        cancel_delayed_work_sync(&priv->scan_work);
        cancel_work_sync(&priv->work);
        flush_workqueue(priv->workqueue);
@@ -3270,7 +3269,7 @@ static void rndis_wlan_unbind(struct usbnet *usbdev, struct usb_interface *intf)
        /* turn radio off */
        disassociate(usbdev, 0);
 
-       cancel_delayed_work_sync(&priv->stats_work);
+       cancel_delayed_work_sync(&priv->dev_poller_work);
        cancel_delayed_work_sync(&priv->scan_work);
        cancel_work_sync(&priv->work);
        flush_workqueue(priv->workqueue);
@@ -3301,8 +3300,8 @@ static int rndis_wlan_reset(struct usbnet *usbdev)
           (set_multicast_list() also turns on current packet filter) */
        set_multicast_list(usbdev);
 
-       queue_delayed_work(priv->workqueue, &priv->stats_work,
-               round_jiffies_relative(STATS_UPDATE_JIFFIES));
+       queue_delayed_work(priv->workqueue, &priv->dev_poller_work,
+               round_jiffies_relative(DEVICE_POLLER_JIFFIES));
 
        return deauthenticate(usbdev);
 }
@@ -3319,7 +3318,7 @@ static int rndis_wlan_stop(struct usbnet *usbdev)
        retval = disassociate(usbdev, 0);
 
        priv->work_pending = 0;
-       cancel_delayed_work_sync(&priv->stats_work);
+       cancel_delayed_work_sync(&priv->dev_poller_work);
        cancel_delayed_work_sync(&priv->scan_work);
        cancel_work_sync(&priv->work);
        flush_workqueue(priv->workqueue);