diff options
Diffstat (limited to 'drivers/staging/rtl8192su/r8192U_wx.c')
-rw-r--r-- | drivers/staging/rtl8192su/r8192U_wx.c | 128 |
1 files changed, 97 insertions, 31 deletions
diff --git a/drivers/staging/rtl8192su/r8192U_wx.c b/drivers/staging/rtl8192su/r8192U_wx.c index a7cc6f9a4739..2005b811ebab 100644 --- a/drivers/staging/rtl8192su/r8192U_wx.c +++ b/drivers/staging/rtl8192su/r8192U_wx.c @@ -1,21 +1,23 @@ -/* - This file contains wireless extension handlers. +/****************************************************************************** + * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved. + * Linux device driver for RTL8192U + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * The full GNU General Public License is included in this distribution in the + * file called LICENSE. + * + * Contact Information: + * wlanfae <wlanfae@realtek.com> +******************************************************************************/ - This is part of rtl8180 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 <andreamrl@tiscali.it> - Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part - of the official realtek driver. - - Parts of this driver are based on the rtl8180 driver skeleton - from Patric Schenke & Andres Salomon. - - Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver. - - We want to tanks the Authors of those projects and the Ndiswrapper - project Authors. -*/ #include <linux/string.h> #include "r8192U.h" @@ -248,6 +250,7 @@ static int r8192_wx_get_ap_status(struct net_device *dev, struct r8192_priv *priv = ieee80211_priv(dev); struct ieee80211_device *ieee = priv->ieee80211; struct ieee80211_network *target; + struct ieee80211_network *latest = NULL; int name_len; down(&priv->wx_sem); @@ -259,13 +262,20 @@ static int r8192_wx_get_ap_status(struct net_device *dev, list_for_each_entry(target, &ieee->network_list, list) { if ( (target->ssid_len == name_len) && (strncmp(target->ssid, (char*)wrqu->data.pointer, name_len)==0)){ - if(target->wpa_ie_len>0 || target->rsn_ie_len>0 ) - //set flags=1 to indicate this ap is WPA - wrqu->data.flags = 1; - else wrqu->data.flags = 0; + if ((latest == NULL) ||(target->last_scanned > latest->last_scanned)) + latest = target; + + } + } + if(latest != NULL) + { + wrqu->data.length = latest->SignalStrength; - break; + if(latest->wpa_ie_len>0 || latest->rsn_ie_len>0 ) { + wrqu->data.flags = 1; + } else { + wrqu->data.flags = 0; } } @@ -460,14 +470,6 @@ static int rtl8180_wx_get_range(struct net_device *dev, range->we_version_compiled = WIRELESS_EXT; range->we_version_source = 16; -// range->retry_capa; /* What retry options are supported */ -// range->retry_flags; /* How to decode max/min retry limit */ -// range->r_time_flags; /* How to decode max/min retry life */ -// range->min_retry; /* Minimal number of retries */ -// range->max_retry; /* Maximal number of retries */ -// range->min_r_time; /* Minimal retry lifetime */ -// range->max_r_time; /* Maximal retry lifetime */ - for (i = 0, val = 0; i < 14; i++) { @@ -1011,6 +1013,70 @@ static int r8192_wx_set_mlme(struct net_device *dev, return ret; } +static int r8192_wx_set_pmkid(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int i; + struct r8192_priv *priv = ieee80211_priv(dev); + struct ieee80211_device* ieee = priv->ieee80211; + struct iw_pmksa* pPMK = (struct iw_pmksa*)extra; + int intReturn = false; + + switch (pPMK->cmd) + { + case IW_PMKSA_ADD: + for (i = 0; i < NUM_PMKID_CACHE; i++) + { + if (memcmp(ieee->PMKIDList[i].Bssid, pPMK->bssid.sa_data, ETH_ALEN) == 0) + { + memcpy(ieee->PMKIDList[i].PMKID, pPMK->pmkid, IW_PMKID_LEN); + memcpy(ieee->PMKIDList[i].Bssid, pPMK->bssid.sa_data, ETH_ALEN); + ieee->PMKIDList[i].bUsed = true; + intReturn = true; + goto __EXIT__; + } + } + + for (i = 0; i < NUM_PMKID_CACHE; i++) + { + if (ieee->PMKIDList[i].bUsed == false) + { + memcpy(ieee->PMKIDList[i].PMKID, pPMK->pmkid, IW_PMKID_LEN); + memcpy(ieee->PMKIDList[i].Bssid, pPMK->bssid.sa_data, ETH_ALEN); + ieee->PMKIDList[i].bUsed = true; + intReturn = true; + goto __EXIT__; + } + } + break; + + case IW_PMKSA_REMOVE: + for (i = 0; i < NUM_PMKID_CACHE; i++) + { + if (memcmp(ieee->PMKIDList[i].Bssid, pPMK->bssid.sa_data, ETH_ALEN) == true) + { + memset(&ieee->PMKIDList[i], 0x00, sizeof(RT_PMKID_LIST)); + intReturn = true; + break; + } + } + break; + + case IW_PMKSA_FLUSH: + memset(&ieee->PMKIDList[0], 0x00, (sizeof(RT_PMKID_LIST) * NUM_PMKID_CACHE)); + intReturn = true; + break; + + default: + break; + } + +__EXIT__: + return (intReturn); + +} + static int r8192_wx_set_gen_ie(struct net_device *dev, struct iw_request_info *info, union iwreq_data *data, char *extra) @@ -1093,7 +1159,7 @@ static iw_handler r8192_wx_handlers[] = NULL,//r8192_wx_get_auth,//NULL, /* SIOCSIWAUTH */ r8192_wx_set_enc_ext, /* SIOCSIWENCODEEXT */ NULL,//r8192_wx_get_enc_ext,//NULL, /* SIOCSIWENCODEEXT */ - NULL, /* SIOCSIWPMKSA */ + r8192_wx_set_pmkid, /* SIOCSIWPMKSA */ NULL, /*---hole---*/ }; |