get_wireless_stats call re-written to use the mib interface.

still have the generic ioctl stuff to finish before all of the GPL-only
code is gone.
This commit is contained in:
solomon 2002-09-30 03:38:30 +00:00
parent 44e5da58d4
commit ec780a50ba
6 changed files with 213 additions and 105 deletions

View File

@ -46,7 +46,7 @@
you to have multiple profiles per network. Not finished yet. you to have multiple profiles per network. Not finished yet.
- hfa384x.h updates. - hfa384x.h updates.
- additions to the MIB. - additions to the MIB.
- Cleaned up wireless extension stuff a little bit. - Rewrote part of the existing wireless extension code.
- Add the Microsoft MN510 device ID. - Add the Microsoft MN510 device ID.
- Finally fix the 'crash on unload' problem for 2.2.x kernels with PCI. - Finally fix the 'crash on unload' problem for 2.2.x kernels with PCI.
Turns out the kcompat24 code wasn't quite complete. (Matthew Rush) Turns out the kcompat24 code wasn't quite complete. (Matthew Rush)

View File

@ -211,7 +211,6 @@ typedef struct wlandevice
#ifdef WIRELESS_EXT #ifdef WIRELESS_EXT
struct iw_statistics wstats; struct iw_statistics wstats;
struct iw_statistics* (*get_wireless_stats)(netdevice_t *dev);
int (*support_ioctl)(netdevice_t *dev, struct iwreq *iwr, int cmd); int (*support_ioctl)(netdevice_t *dev, struct iwreq *iwr, int cmd);
#endif #endif

View File

@ -1,22 +1,38 @@
/* p80211wext.c -*- linux-c -*- /* src/p80211/p80211wext.c
* *
* original author: Reyk Floeter <reyk@synack.de> * Glue code to make linux-wlan-ng a happy wireless extension camper.
* *
* This application is free software; you can redistribute it and/or * original author: Reyk Floeter <reyk@synack.de>
* modify it under the terms of the GNU General Public * Completely re-written by Solomon Peachy <solomon@linux-wlan.com>
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. * Copyright (C) 2002 AbsoluteValue Systems, Inc. All Rights Reserved.
* * --------------------------------------------------------------------
* This application is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of * linux-wlan
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Library General Public License for more details. * The contents of this file are subject to the Mozilla Public
* * License Version 1.1 (the "License"); you may not use this file
* You should have received a copy of the GNU General Public * except in compliance with the License. You may obtain a copy of
* License along with this library; if not, write to the Free * the License at http://www.mozilla.org/MPL/
* Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA *
* 02111 USA. * Software distributed under the License is distributed on an "AS
*/ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* Alternatively, the contents of this file may be used under the
* terms of the GNU Public License version 2 (the "GPL"), in which
* case the provisions of the GPL are applicable instead of the
* above. If you wish to allow the use of your version of this file
* only under the terms of the GPL and not to allow others to use
* your version of this file under the MPL, indicate your decision
* by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL. If you do not delete
* the provisions above, a recipient may use your version of this
* file under either the MPL or the GPL.
*
* --------------------------------------------------------------------
*/
/*================================================================*/ /*================================================================*/
/* System Includes */ /* System Includes */
@ -47,6 +63,8 @@
#include <wlan/p80211conv.h> #include <wlan/p80211conv.h>
#include <wlan/p80211mgmt.h> #include <wlan/p80211mgmt.h>
#include <wlan/p80211msg.h> #include <wlan/p80211msg.h>
#include <wlan/p80211metastruct.h>
#include <wlan/p80211metadef.h>
#include <wlan/p80211netdev.h> #include <wlan/p80211netdev.h>
#include <wlan/p80211ioctl.h> #include <wlan/p80211ioctl.h>
#include <wlan/p80211req.h> #include <wlan/p80211req.h>
@ -59,8 +77,10 @@
/* called by /proc/net/wireless */ /* called by /proc/net/wireless */
struct iw_statistics* p80211wext_get_wireless_stats (netdevice_t *dev) struct iw_statistics* p80211wext_get_wireless_stats (netdevice_t *dev)
{ {
p80211msg_lnxreq_commsquality_t quality;
wlandevice_t *wlandev = (wlandevice_t*)dev->priv; wlandevice_t *wlandev = (wlandevice_t*)dev->priv;
struct iw_statistics* wstats = NULL; struct iw_statistics* wstats = &wlandev->wstats;
int retval;
DBFENTER; DBFENTER;
@ -71,26 +91,31 @@ struct iw_statistics* p80211wext_get_wireless_stats (netdevice_t *dev)
if ( wlandev->msdstate != WLAN_MSD_RUNNING ) if ( wlandev->msdstate != WLAN_MSD_RUNNING )
return NULL; return NULL;
/* iface /* XXX Only valid in station mode */
status wstats->status = 0;
link_qual
link_level
link_noise
disc_nwid
disc_crypt
disc_frag
disc_retry
disc_misc
missed_beacon
*/
/* forward the request to a hardware- dependent function. /* build request message */
* FIX: should it be possible to do abstract MIB- requests (ie. for quality.msgcode = DIDmsg_lnxreq_commsquality;
* getting the link quality) on the p80211- level?! quality.dbm.data = P80211ENUM_truth_false;
* ANSWER: [MSM] Yes, it should. It just isn't done yet. quality.dbm.status = P80211ENUM_msgitem_status_data_ok;
*/
if (wlandev->get_wireless_stats) /* send message to nsd */
wstats = (*(wlandev->get_wireless_stats))(dev); if ( wlandev->mlmerequest == NULL )
return NULL;
retval = (*(wlandev->mlmerequest))(wlandev, (p80211msg_t*) &quality);
wstats->qual.qual = quality.link.data; /* overall link quality */
wstats->qual.level = quality.level.data; /* instant signal level */
wstats->qual.noise = quality.noise.data; /* instant noise level */
wstats->qual.updated = 7; // XXX magic number. don't know.
wstats->discard.code = wlandev->rx.decrypt_err;
wstats->discard.nwid = 0;
wstats->discard.fragment = 0;
wstats->discard.retries = 0;
wstats->discard.misc = 0;
wstats->miss.beacon = 0;
DBFEXIT; DBFEXIT;

View File

@ -958,9 +958,15 @@ int prism2sta_txframe(wlandevice_t *wlandev, struct sk_buff *skb, p80211_hdr_t *
----------------------------------------------------------------*/ ----------------------------------------------------------------*/
int prism2sta_mlmerequest(wlandevice_t *wlandev, p80211msg_t *msg) int prism2sta_mlmerequest(wlandevice_t *wlandev, p80211msg_t *msg)
{ {
prism2sta_priv_t *priv;
hfa384x_t *hw;
int result = 0; int result = 0;
DBFENTER; DBFENTER;
priv = (prism2sta_priv_t*)wlandev->priv;
hw = priv->hw;
switch( msg->msgcode ) switch( msg->msgcode )
{ {
case DIDmsg_dot11req_mibget : case DIDmsg_dot11req_mibget :
@ -1115,6 +1121,36 @@ int prism2sta_mlmerequest(wlandevice_t *wlandev, p80211msg_t *msg)
WLAN_LOG_DEBUG0(2,"Received mlme enable request\n"); WLAN_LOG_DEBUG0(2,"Received mlme enable request\n");
result = prism2mgmt_enable(wlandev, msg); result = prism2mgmt_enable(wlandev, msg);
break; break;
case DIDmsg_lnxreq_commsquality: {
UINT8 bytebuf[HFA384x_CMD_ALLOC_LEN_MAX];
p80211msg_lnxreq_commsquality_t *qualmsg;
hfa384x_commsquality_t *qual = (hfa384x_commsquality_t*)bytebuf;
WLAN_LOG_DEBUG0(2,"Received commsquality request\n");
qualmsg = (p80211msg_lnxreq_commsquality_t*) msg;
memset(qual, 0, sizeof(hfa384x_commsquality_t));
result = hfa384x_drvr_getconfig(hw,
HFA384x_RID_COMMSQUALITY,
qual,
HFA384x_RID_COMMSQUALITY_LEN);
if (result != 0) {
WLAN_LOG_ERROR2("Failed to read %s statistics: error=%d\n",
wlandev->name, result);
break;
}
if (qualmsg->dbm.data == P80211ENUM_truth_true) {
qualmsg->link.data = qual->CQ_currBSS;
qualmsg->level.data = (qual->ASL_currBSS + 0x100 - 100);
qualmsg->noise.data = (qual->ANL_currFC + 0x100 - 100);
} else {
qualmsg->link.data = qual->CQ_currBSS;
qualmsg->level.data = qual->ASL_currBSS;
qualmsg->noise.data = qual->ANL_currFC;
}
break;
}
default: default:
WLAN_LOG_WARNING1("Unknown mgmt request message 0x%08lx", msg->msgcode); WLAN_LOG_WARNING1("Unknown mgmt request message 0x%08lx", msg->msgcode);
break; break;
@ -4342,7 +4378,6 @@ static wlandevice_t *create_wlan(void)
wlandev->mlmerequest = &prism2sta_mlmerequest; wlandev->mlmerequest = &prism2sta_mlmerequest;
wlandev->hwremovedfn = &prism2sta_hwremoved; wlandev->hwremovedfn = &prism2sta_hwremoved;
#if WIRELESS_EXT > 10 #if WIRELESS_EXT > 10
wlandev->get_wireless_stats = &prism2wext_get_wireless_stats;
wlandev->support_ioctl = &prism2wext_support_ioctl; wlandev->support_ioctl = &prism2wext_support_ioctl;
#endif #endif

View File

@ -102,69 +102,6 @@ static int prism2wext_getrate(hfa384x_t* hw, struct iw_param *rrq);
static int prism2wext_get_channel(struct iw_freq *iwf); static int prism2wext_get_channel(struct iw_freq *iwf);
/* called by p80211wstats_get_wireless_stats for /proc/net/wireless */
struct iw_statistics* prism2wext_get_wireless_stats(netdevice_t *dev)
{
wlandevice_t *wlandev = (wlandevice_t*)dev->priv;
prism2sta_priv_t *priv = (prism2sta_priv_t*)wlandev->priv;
hfa384x_t *hw = priv->hw;
hfa384x_CommTallies32_t tallies = priv->tallies;
struct iw_statistics* wstats;
int result = 0;
UINT8 bytebuf[HFA384x_CMD_ALLOC_LEN_MAX];
hfa384x_commsquality_t *qual = (hfa384x_commsquality_t*)bytebuf;
DBFENTER;
if (wlandev == (wlandevice_t*) NULL)
return NULL;
wstats = &wlandev->wstats;
memset(&wstats->qual, 0, sizeof(hfa384x_commsquality_t));
/* get the qualitity settings from the RID and return them
* into a struct...
*/
result = hfa384x_drvr_getconfig(hw,
HFA384x_RID_COMMSQUALITY,
qual,
HFA384x_RID_COMMSQUALITY_LEN);
if (result != 0) {
printk(KERN_ERR "Failed to read %s statistics: error=%d\n",
dev->name, result);
goto _done;
}
/* set stats for the wireless- stats struct.
* we can't return any link quality, if we are in ap (accesspoint) -
* mode!
*/
wstats->status = priv->ap;
wstats->qual.qual = priv->ap ? 0L : qual->CQ_currBSS;
#ifdef WEXT_IN_DB
/* Intersil says : dBm = RSSI - 100 - remember that 0x100 == 0x0 */
/* Important : Wavelan/Orinoco driver do it differently, but I suspect
* that they are broken. Somebody need to check that iwconfig
* report the proper values before we enable that - Jean II */
wstats->qual.level = priv->ap ? 0L : (qual->ASL_currBSS + 0x100 - 100);
wstats->qual.noise = priv->ap ? 0L : (qual->ANL_currFC + 0x100 - 100);
#else /* WEXT_IN_DB */
wstats->qual.level = priv->ap ? 0L : qual->ASL_currBSS;
wstats->qual.noise = priv->ap ? 0L : qual->ANL_currFC;
#endif /* WEXT_IN_DB */
wstats->qual.updated = 7;
wstats->discard.nwid = 0L; /* tallies.txdiscardswrongsa is wrong! */
wstats->discard.code = tallies.rxdiscardswepundecr; /* am i wrong?! */
wstats->discard.misc = tallies.txdiscards; /* am i wrong?! */
_done:
DBFEXIT;
return &wlandev->wstats;
}
/* wireless extensions' ioctls */
int prism2wext_support_ioctl(netdevice_t *dev, struct iwreq *iwr, int cmd) int prism2wext_support_ioctl(netdevice_t *dev, struct iwreq *iwr, int cmd)
{ {
wlandevice_t *wlandev = (wlandevice_t*)dev->priv; wlandevice_t *wlandev = (wlandevice_t*)dev->priv;

View File

@ -2476,6 +2476,100 @@ p80211meta_t MKREQMETANAME(lnxreq_ifstate)[] = {
UINT32 MKREQMETASIZE(lnxreq_ifstate) = UINT32 MKREQMETASIZE(lnxreq_ifstate) =
sizeof(MKREQMETANAME(lnxreq_ifstate))/sizeof(p80211meta_t); sizeof(MKREQMETANAME(lnxreq_ifstate))/sizeof(p80211meta_t);
/*--------------------------------------------------------------------*/
/* metadata for the commsquality request message arguments */
extern UINT32 MKREQMETASIZE(lnxreq_commsquality);
p80211meta_t MKREQMETANAME(lnxreq_commsquality)[] = {
{
/* name */ (char *)&(MKREQMETASIZE(lnxreq_commsquality)),
/* did */ 0,
/* flags */ 0,
/* min */ 0,
/* max */ 0,
/* maxlen */ 0,
/* minlen */ 0,
/* enumptr */ NULL,
/* collptr */ NULL,
/* totextptr */ NULL,
/* fromtextptr */ NULL,
/* validfunptr */ NULL
},
{
/* name */ MKITEMNAME("resultcode"),
/* did */ 0,
/* flags */ P80211ITEM_SETFLAGS(ISREQUIRED, 0UL, ISCONFIRM),
/* min */ 0,
/* max */ 0,
/* maxlen */ 0,
/* minlen */ 0,
/* enumptr */ &MKENUMNAME(resultcode),
/* collptr */ NULL,
/* totextptr */ p80211_totext_enumint,
/* fromtextptr */ p80211_fromtext_enumint,
/* validfunptr */ p80211_isvalid_enumint
},
{
/* name */ MKITEMNAME("dbm"),
/* did */ 0,
/* flags */ P80211ITEM_SETFLAGS(ISREQUIRED, 0UL, ISCONFIRM),
/* min */ 0,
/* max */ 0,
/* maxlen */ 0,
/* minlen */ 0,
/* enumptr */ &MKENUMNAME(truth),
/* collptr */ NULL,
/* totextptr */ p80211_totext_enumint,
/* fromtextptr */ p80211_fromtext_enumint,
/* validfunptr */ p80211_isvalid_enumint
},
{
/* name */ MKITEMNAME("link"),
/* did */ 0,
/* flags */ P80211ITEM_SETFLAGS(ISREQUIRED, ISREQUEST, 0UL),
/* min */ 0,
/* max */ 0,
/* maxlen */ 0,
/* minlen */ 0,
/* enumptr */ NULL,
/* collptr */ NULL,
/* totextptr */ p80211_totext_boundedint,
/* fromtextptr */ p80211_fromtext_boundedint,
/* validfunptr */ p80211_isvalid_boundedint
},
{
/* name */ MKITEMNAME("level"),
/* did */ 0,
/* flags */ P80211ITEM_SETFLAGS(ISREQUIRED, ISREQUEST, 0UL),
/* min */ 0,
/* max */ 0,
/* maxlen */ 0,
/* minlen */ 0,
/* enumptr */ NULL,
/* collptr */ NULL,
/* totextptr */ p80211_totext_boundedint,
/* fromtextptr */ p80211_fromtext_boundedint,
/* validfunptr */ p80211_isvalid_boundedint
},
{
/* name */ MKITEMNAME("noise"),
/* did */ 0,
/* flags */ P80211ITEM_SETFLAGS(ISREQUIRED, ISREQUEST, 0UL),
/* min */ 0,
/* max */ 0,
/* maxlen */ 0,
/* minlen */ 0,
/* enumptr */ NULL,
/* collptr */ NULL,
/* totextptr */ p80211_totext_boundedint,
/* fromtextptr */ p80211_fromtext_boundedint,
/* validfunptr */ p80211_isvalid_boundedint
},
}; /* end of lnxreq_commsquality list */
UINT32 MKREQMETASIZE(lnxreq_commsquality) =
sizeof(MKREQMETANAME(lnxreq_commsquality))/sizeof(p80211meta_t);
/*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
/* metadata for the hostwep request message arguments */ /* metadata for the hostwep request message arguments */
extern UINT32 MKREQMETASIZE(lnxreq_hostwep); extern UINT32 MKREQMETASIZE(lnxreq_hostwep);
@ -2495,6 +2589,20 @@ p80211meta_t MKREQMETANAME(lnxreq_hostwep)[] = {
/* fromtextptr */ NULL, /* fromtextptr */ NULL,
/* validfunptr */ NULL /* validfunptr */ NULL
}, },
{
/* name */ MKITEMNAME("resultcode"),
/* did */ 0,
/* flags */ P80211ITEM_SETFLAGS(ISREQUIRED, 0UL, ISCONFIRM),
/* min */ 0,
/* max */ 0,
/* maxlen */ 0,
/* minlen */ 0,
/* enumptr */ &MKENUMNAME(resultcode),
/* collptr */ NULL,
/* totextptr */ p80211_totext_enumint,
/* fromtextptr */ p80211_fromtext_enumint,
/* validfunptr */ p80211_isvalid_enumint
},
{ {
/* name */ MKITEMNAME("decrypt"), /* name */ MKITEMNAME("decrypt"),
/* did */ 0, /* did */ 0,
@ -4662,6 +4770,10 @@ grplistitem_t MKGRPMETANAME(lnxreq)[] = {
"lnxreq_hostwep", "lnxreq_hostwep",
MKREQMETANAME(lnxreq_hostwep) MKREQMETANAME(lnxreq_hostwep)
}, },
{
"lnxreq_commsquality",
MKREQMETANAME(lnxreq_commsquality)
},
{ {
"lnxreq_autojoin", "lnxreq_autojoin",
MKREQMETANAME(lnxreq_autojoin) MKREQMETANAME(lnxreq_autojoin)