Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9483f031 authored by Jean Tourrilhes's avatar Jean Tourrilhes Committed by David S. Miller
Browse files

[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: default avatarJean Tourrilhes <jt@hpl.hp.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent d21b31fd
Loading
Loading
Loading
Loading
+27 −93
Original line number Diff line number Diff line
@@ -21,52 +21,6 @@
#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
 *
@@ -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,
			 char *cwrq, char *extra)
{
	const char *cp;
	char comm[6] = { "COMM-" };
	char mrvl[6] = { "MRVL-" };
	int cnt;

	lbs_deb_enter(LBS_DEB_WEXT);

	strcpy(cwrq, mrvl);

	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';
	/* We could add support for 802.11n here as needed. Jean II */
	snprintf(cwrq, IFNAMSIZ, "IEEE 802.11b/g");

	lbs_deb_leave(LBS_DEB_WEXT);
	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,
			 struct iw_point *dwrq, char *extra)
{
	wlan_private *priv = dev->priv;
	wlan_adapter *adapter = priv->adapter;
	const char *cp;
	char comm[6] = { "COMM-" };
	char mrvl[6] = { "MRVL-" };
	int cnt;

	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);
	strncpy(extra, adapter->nodename, 16);
	mutex_unlock(&adapter->lock);
	strcpy(extra, mrvl);

	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;

	/*
	 * If none, we may want to get the one that was set
	 */
	cnt = strlen(mrvl);
	extra += cnt;
	while (cnt < 16 && (*cp != '-')) {
		*extra++ = toupper(*cp++);
		cnt++;
	}

	/*
	 * Push it out !
	 */
	dwrq->length = strlen(extra) + 1;
	dwrq->length = cnt;

	lbs_deb_leave(LBS_DEB_WEXT);
	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) {
		strncpy(extra, "Mesh", 12);
		extra[12] = '\0';
		dwrq->length = strlen(extra) + 1;
		dwrq->length = strlen(extra);
	}

	else {
		extra[0] = '\0';
		dwrq->length = 1 ;
		dwrq->length = 0;
	}

	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);

	/* 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) {
		dbm = (u16) mw_to_dbm(vwrq->value);
		return -EOPNOTSUPP;
	} else
		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
	 */

	/* To make the driver backward compatible with WPA supplicant v0.2.4 */
	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->length = adapter->curbssparams.ssid_len;

	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);

	/*
	 * 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 */
	if (in_ssid_len > IW_ESSID_MAX_SIZE) {
		ret = -E2BIG;