cfg80211: Add PMKSA wext compatibility handler
authorSamuel Ortiz <sameo@linux.intel.com>
Tue, 24 Nov 2009 23:01:01 +0000 (00:01 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Sat, 28 Nov 2009 20:05:06 +0000 (15:05 -0500)
With the addition of the *_pmksa cfg80211 ops, we can now add the
corresponding wireless extensions compatibility handler.

Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/wireless/wext-compat.c

index 29091ac..584eb48 100644 (file)
@@ -1401,6 +1401,47 @@ int cfg80211_wext_giwessid(struct net_device *dev,
 }
 EXPORT_SYMBOL_GPL(cfg80211_wext_giwessid);
 
+int cfg80211_wext_siwpmksa(struct net_device *dev,
+                          struct iw_request_info *info,
+                          struct iw_point *data, char *extra)
+{
+       struct wireless_dev *wdev = dev->ieee80211_ptr;
+       struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
+       struct cfg80211_pmksa cfg_pmksa;
+       struct iw_pmksa *pmksa = (struct iw_pmksa *)extra;
+
+       memset(&cfg_pmksa, 0, sizeof(struct cfg80211_pmksa));
+
+       if (wdev->iftype != NL80211_IFTYPE_STATION)
+               return -EINVAL;
+
+       cfg_pmksa.bssid = pmksa->bssid.sa_data;
+       cfg_pmksa.pmkid = pmksa->pmkid;
+
+       switch (pmksa->cmd) {
+       case IW_PMKSA_ADD:
+               if (!rdev->ops->set_pmksa)
+                       return -EOPNOTSUPP;
+
+               return rdev->ops->set_pmksa(&rdev->wiphy, dev, &cfg_pmksa);
+
+       case IW_PMKSA_REMOVE:
+               if (!rdev->ops->del_pmksa)
+                       return -EOPNOTSUPP;
+
+               return rdev->ops->del_pmksa(&rdev->wiphy, dev, &cfg_pmksa);
+
+       case IW_PMKSA_FLUSH:
+               if (!rdev->ops->flush_pmksa)
+                       return -EOPNOTSUPP;
+
+               return rdev->ops->flush_pmksa(&rdev->wiphy, dev);
+
+       default:
+               return -EOPNOTSUPP;
+       }
+}
+
 static const iw_handler cfg80211_handlers[] = {
        [IW_IOCTL_IDX(SIOCGIWNAME)]     = (iw_handler) cfg80211_wext_giwname,
        [IW_IOCTL_IDX(SIOCSIWFREQ)]     = (iw_handler) cfg80211_wext_siwfreq,
@@ -1433,6 +1474,7 @@ static const iw_handler cfg80211_handlers[] = {
        [IW_IOCTL_IDX(SIOCSIWAUTH)]     = (iw_handler) cfg80211_wext_siwauth,
        [IW_IOCTL_IDX(SIOCGIWAUTH)]     = (iw_handler) cfg80211_wext_giwauth,
        [IW_IOCTL_IDX(SIOCSIWENCODEEXT)]= (iw_handler) cfg80211_wext_siwencodeext,
+       [IW_IOCTL_IDX(SIOCSIWPMKSA)]    = (iw_handler) cfg80211_wext_siwpmksa,
 };
 
 const struct iw_handler_def cfg80211_wext_handler = {