[PATCH] softmac: add SIOCSIWMLME
Johannes Berg [Thu, 20 Apr 2006 18:02:02 +0000 (20:02 +0200)]
This patch adds the SIOCSIWMLME wext to softmac, this functionality
appears to be used by wpa_supplicant and is softmac-specific.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Cc: Jouni Malinen <jkm@devicescape.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

include/net/ieee80211softmac_wx.h
net/ieee80211/softmac/ieee80211softmac_assoc.c
net/ieee80211/softmac/ieee80211softmac_priv.h
net/ieee80211/softmac/ieee80211softmac_wx.c

index 3e0be45..4ee3ad5 100644 (file)
@@ -91,4 +91,9 @@ ieee80211softmac_wx_get_genie(struct net_device *dev,
                              struct iw_request_info *info,
                              union iwreq_data *wrqu,
                              char *extra);
+extern int
+ieee80211softmac_wx_set_mlme(struct net_device *dev,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu,
+                            char *extra);
 #endif /* _IEEE80211SOFTMAC_WX */
index fb79ce7..ea9f5aa 100644 (file)
@@ -82,7 +82,7 @@ ieee80211softmac_assoc_timeout(void *d)
 }
 
 /* Sends out a disassociation request to the desired AP */
-static void
+void
 ieee80211softmac_disassoc(struct ieee80211softmac_device *mac, u16 reason)
 {
        unsigned long flags;
index 65d9816..8c95b3a 100644 (file)
@@ -150,6 +150,7 @@ int ieee80211softmac_handle_disassoc(struct net_device * dev,
 int ieee80211softmac_handle_reassoc_req(struct net_device * dev,
                                        struct ieee80211_reassoc_request * reassoc);
 void ieee80211softmac_assoc_timeout(void *d);
+void ieee80211softmac_disassoc(struct ieee80211softmac_device *mac, u16 reason);
 
 /* some helper functions */
 static inline int ieee80211softmac_scan_handlers_check_self(struct ieee80211softmac_device *sm)
index 27edb2b..8d0c226 100644 (file)
@@ -431,3 +431,35 @@ ieee80211softmac_wx_get_genie(struct net_device *dev,
 }
 EXPORT_SYMBOL_GPL(ieee80211softmac_wx_get_genie);
 
+int
+ieee80211softmac_wx_set_mlme(struct net_device *dev,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu,
+                            char *extra)
+{
+       struct ieee80211softmac_device *mac = ieee80211_priv(dev);
+       struct iw_mlme *mlme = (struct iw_mlme *)extra;
+       u16 reason = cpu_to_le16(mlme->reason_code);
+       struct ieee80211softmac_network *net;
+
+       if (memcmp(mac->associnfo.bssid, mlme->addr.sa_data, ETH_ALEN)) {
+               printk(KERN_DEBUG PFX "wx_set_mlme: requested operation on net we don't use\n");
+               return -EINVAL;
+       }
+
+       switch (mlme->cmd) {
+       case IW_MLME_DEAUTH:
+               net = ieee80211softmac_get_network_by_bssid_locked(mac, mlme->addr.sa_data);
+               if (!net) {
+                       printk(KERN_DEBUG PFX "wx_set_mlme: we should know the net here...\n");
+                       return -EINVAL;
+               }
+               return ieee80211softmac_deauth_req(mac, net, reason);
+       case IW_MLME_DISASSOC:
+               ieee80211softmac_disassoc(mac, reason);
+               return 0;
+       default:
+               return -EOPNOTSUPP;
+       }
+}
+EXPORT_SYMBOL_GPL(ieee80211softmac_wx_set_mlme);