[PATCH] libertas: fix a few wext abuses...
o SIOCGIWNAME is not designed to return the version number of the driver. On the other hand, you are free to abuse SIOCGIWNICKN for that purpose. o Don't attempt to fix the WE19/WE20 transition in the driver, because your fixes are bogus, and redundant with the code in the kernel (you may endup with +2, you can't read 32 char ESSID...). o In SIOCSIWTXPOW, if you specified in iwrange that you want dBm, you should only get dBm, which allow to reduce code bloat. Signed-off-by: Jean Tourrilhes <jt@hpl.hp.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
David S. Miller
parent
d21b31fd53
commit
9483f03150
@@ -21,52 +21,6 @@
|
|||||||
#include "assoc.h"
|
#include "assoc.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Convert mw value to dbm value
|
|
||||||
*
|
|
||||||
* @param mw the value of mw
|
|
||||||
* @return the value of dbm
|
|
||||||
*/
|
|
||||||
static int mw_to_dbm(int mw)
|
|
||||||
{
|
|
||||||
if (mw < 2)
|
|
||||||
return 0;
|
|
||||||
else if (mw < 3)
|
|
||||||
return 3;
|
|
||||||
else if (mw < 4)
|
|
||||||
return 5;
|
|
||||||
else if (mw < 6)
|
|
||||||
return 7;
|
|
||||||
else if (mw < 7)
|
|
||||||
return 8;
|
|
||||||
else if (mw < 8)
|
|
||||||
return 9;
|
|
||||||
else if (mw < 10)
|
|
||||||
return 10;
|
|
||||||
else if (mw < 13)
|
|
||||||
return 11;
|
|
||||||
else if (mw < 16)
|
|
||||||
return 12;
|
|
||||||
else if (mw < 20)
|
|
||||||
return 13;
|
|
||||||
else if (mw < 25)
|
|
||||||
return 14;
|
|
||||||
else if (mw < 32)
|
|
||||||
return 15;
|
|
||||||
else if (mw < 40)
|
|
||||||
return 16;
|
|
||||||
else if (mw < 50)
|
|
||||||
return 17;
|
|
||||||
else if (mw < 63)
|
|
||||||
return 18;
|
|
||||||
else if (mw < 79)
|
|
||||||
return 19;
|
|
||||||
else if (mw < 100)
|
|
||||||
return 20;
|
|
||||||
else
|
|
||||||
return 21;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Find the channel frequency power info with specific channel
|
* @brief Find the channel frequency power info with specific channel
|
||||||
*
|
*
|
||||||
@@ -199,28 +153,11 @@ static void copy_active_data_rates(wlan_adapter * adapter, u8 * rates)
|
|||||||
static int wlan_get_name(struct net_device *dev, struct iw_request_info *info,
|
static int wlan_get_name(struct net_device *dev, struct iw_request_info *info,
|
||||||
char *cwrq, char *extra)
|
char *cwrq, char *extra)
|
||||||
{
|
{
|
||||||
const char *cp;
|
|
||||||
char comm[6] = { "COMM-" };
|
|
||||||
char mrvl[6] = { "MRVL-" };
|
|
||||||
int cnt;
|
|
||||||
|
|
||||||
lbs_deb_enter(LBS_DEB_WEXT);
|
lbs_deb_enter(LBS_DEB_WEXT);
|
||||||
|
|
||||||
strcpy(cwrq, mrvl);
|
/* We could add support for 802.11n here as needed. Jean II */
|
||||||
|
snprintf(cwrq, IFNAMSIZ, "IEEE 802.11b/g");
|
||||||
cp = strstr(libertas_driver_version, comm);
|
|
||||||
if (cp == libertas_driver_version) //skip leading "COMM-"
|
|
||||||
cp = libertas_driver_version + strlen(comm);
|
|
||||||
else
|
|
||||||
cp = libertas_driver_version;
|
|
||||||
|
|
||||||
cnt = strlen(mrvl);
|
|
||||||
cwrq += cnt;
|
|
||||||
while (cnt < 16 && (*cp != '-')) {
|
|
||||||
*cwrq++ = toupper(*cp++);
|
|
||||||
cnt++;
|
|
||||||
}
|
|
||||||
*cwrq = '\0';
|
|
||||||
|
|
||||||
lbs_deb_leave(LBS_DEB_WEXT);
|
lbs_deb_leave(LBS_DEB_WEXT);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -300,29 +237,37 @@ static int wlan_set_nick(struct net_device *dev, struct iw_request_info *info,
|
|||||||
static int wlan_get_nick(struct net_device *dev, struct iw_request_info *info,
|
static int wlan_get_nick(struct net_device *dev, struct iw_request_info *info,
|
||||||
struct iw_point *dwrq, char *extra)
|
struct iw_point *dwrq, char *extra)
|
||||||
{
|
{
|
||||||
wlan_private *priv = dev->priv;
|
const char *cp;
|
||||||
wlan_adapter *adapter = priv->adapter;
|
char comm[6] = { "COMM-" };
|
||||||
|
char mrvl[6] = { "MRVL-" };
|
||||||
|
int cnt;
|
||||||
|
|
||||||
lbs_deb_enter(LBS_DEB_WEXT);
|
lbs_deb_enter(LBS_DEB_WEXT);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the Nick Name saved
|
* Nick Name is not used internally in this mode,
|
||||||
|
* therefore return something useful instead. Jean II
|
||||||
*/
|
*/
|
||||||
|
|
||||||
mutex_lock(&adapter->lock);
|
strcpy(extra, mrvl);
|
||||||
strncpy(extra, adapter->nodename, 16);
|
|
||||||
mutex_unlock(&adapter->lock);
|
|
||||||
|
|
||||||
extra[16] = '\0';
|
cp = strstr(libertas_driver_version, comm);
|
||||||
|
if (cp == libertas_driver_version) //skip leading "COMM-"
|
||||||
|
cp = libertas_driver_version + strlen(comm);
|
||||||
|
else
|
||||||
|
cp = libertas_driver_version;
|
||||||
|
|
||||||
/*
|
cnt = strlen(mrvl);
|
||||||
* If none, we may want to get the one that was set
|
extra += cnt;
|
||||||
*/
|
while (cnt < 16 && (*cp != '-')) {
|
||||||
|
*extra++ = toupper(*cp++);
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Push it out !
|
* Push it out !
|
||||||
*/
|
*/
|
||||||
dwrq->length = strlen(extra) + 1;
|
dwrq->length = cnt;
|
||||||
|
|
||||||
lbs_deb_leave(LBS_DEB_WEXT);
|
lbs_deb_leave(LBS_DEB_WEXT);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -341,12 +286,12 @@ static int mesh_get_nick(struct net_device *dev, struct iw_request_info *info,
|
|||||||
if (adapter->connect_status == LIBERTAS_CONNECTED) {
|
if (adapter->connect_status == LIBERTAS_CONNECTED) {
|
||||||
strncpy(extra, "Mesh", 12);
|
strncpy(extra, "Mesh", 12);
|
||||||
extra[12] = '\0';
|
extra[12] = '\0';
|
||||||
dwrq->length = strlen(extra) + 1;
|
dwrq->length = strlen(extra);
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
extra[0] = '\0';
|
extra[0] = '\0';
|
||||||
dwrq->length = 1 ;
|
dwrq->length = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
lbs_deb_leave(LBS_DEB_WEXT);
|
lbs_deb_leave(LBS_DEB_WEXT);
|
||||||
@@ -1897,8 +1842,10 @@ static int wlan_set_txpow(struct net_device *dev, struct iw_request_info *info,
|
|||||||
|
|
||||||
wlan_radio_ioctl(priv, RADIO_ON);
|
wlan_radio_ioctl(priv, RADIO_ON);
|
||||||
|
|
||||||
|
/* Userspace check in iwrange if it should use dBm or mW,
|
||||||
|
* therefore this should never happen... Jean II */
|
||||||
if ((vwrq->flags & IW_TXPOW_TYPE) == IW_TXPOW_MWATT) {
|
if ((vwrq->flags & IW_TXPOW_TYPE) == IW_TXPOW_MWATT) {
|
||||||
dbm = (u16) mw_to_dbm(vwrq->value);
|
return -EOPNOTSUPP;
|
||||||
} else
|
} else
|
||||||
dbm = (u16) vwrq->value;
|
dbm = (u16) vwrq->value;
|
||||||
|
|
||||||
@@ -1946,12 +1893,7 @@ static int wlan_get_essid(struct net_device *dev, struct iw_request_info *info,
|
|||||||
* If none, we may want to get the one that was set
|
* If none, we may want to get the one that was set
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* To make the driver backward compatible with WPA supplicant v0.2.4 */
|
dwrq->length = adapter->curbssparams.ssid_len;
|
||||||
if (dwrq->length == 32) /* check with WPA supplicant buffer size */
|
|
||||||
dwrq->length = min_t(size_t, adapter->curbssparams.ssid_len,
|
|
||||||
IW_ESSID_MAX_SIZE);
|
|
||||||
else
|
|
||||||
dwrq->length = adapter->curbssparams.ssid_len + 1;
|
|
||||||
|
|
||||||
dwrq->flags = 1; /* active */
|
dwrq->flags = 1; /* active */
|
||||||
|
|
||||||
@@ -1972,14 +1914,6 @@ static int wlan_set_essid(struct net_device *dev, struct iw_request_info *info,
|
|||||||
|
|
||||||
lbs_deb_enter(LBS_DEB_WEXT);
|
lbs_deb_enter(LBS_DEB_WEXT);
|
||||||
|
|
||||||
/*
|
|
||||||
* WE-20 and earlier NULL pad the end of the SSID and increment
|
|
||||||
* SSID length so it can be used like a string. WE-21 and later don't,
|
|
||||||
* but some userspace tools aren't able to cope with the change.
|
|
||||||
*/
|
|
||||||
if ((in_ssid_len > 0) && (extra[in_ssid_len - 1] == '\0'))
|
|
||||||
in_ssid_len--;
|
|
||||||
|
|
||||||
/* Check the size of the string */
|
/* Check the size of the string */
|
||||||
if (in_ssid_len > IW_ESSID_MAX_SIZE) {
|
if (in_ssid_len > IW_ESSID_MAX_SIZE) {
|
||||||
ret = -E2BIG;
|
ret = -E2BIG;
|
||||||
|
Reference in New Issue
Block a user