mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-09 11:00:52 +00:00
Merge branch 'upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
This commit is contained in:
commit
0b310f36d7
@ -6,7 +6,8 @@ menu "Wireless LAN (non-hamradio)"
|
||||
depends on NETDEVICES
|
||||
|
||||
config NET_RADIO
|
||||
bool "Wireless LAN drivers (non-hamradio) & Wireless Extensions"
|
||||
bool "Wireless LAN drivers (non-hamradio)"
|
||||
select WIRELESS_EXT
|
||||
---help---
|
||||
Support for wireless LANs and everything having to do with radio,
|
||||
but not with amateur radio or FM broadcasting.
|
||||
@ -239,7 +240,8 @@ config IPW2200_DEBUG
|
||||
|
||||
config AIRO
|
||||
tristate "Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards"
|
||||
depends on NET_RADIO && ISA_DMA_API && CRYPTO && (PCI || BROKEN)
|
||||
depends on NET_RADIO && ISA_DMA_API && (PCI || BROKEN)
|
||||
select CRYPTO
|
||||
---help---
|
||||
This is the standard Linux driver to support Cisco/Aironet ISA and
|
||||
PCI 802.11 wireless cards.
|
||||
@ -387,6 +389,7 @@ config PCMCIA_SPECTRUM
|
||||
config AIRO_CS
|
||||
tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards"
|
||||
depends on NET_RADIO && PCMCIA && (BROKEN || !M32R)
|
||||
select CRYPTO
|
||||
---help---
|
||||
This is the standard Linux driver to support Cisco/Aironet PCMCIA
|
||||
802.11 wireless cards. This driver is the same as the Aironet
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include <linux/in.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/crypto.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
@ -87,14 +88,6 @@ static struct pci_driver airo_driver = {
|
||||
#include <linux/delay.h>
|
||||
#endif
|
||||
|
||||
/* Support Cisco MIC feature */
|
||||
#define MICSUPPORT
|
||||
|
||||
#if defined(MICSUPPORT) && !defined(CONFIG_CRYPTO)
|
||||
#warning MIC support requires Crypto API
|
||||
#undef MICSUPPORT
|
||||
#endif
|
||||
|
||||
/* Hack to do some power saving */
|
||||
#define POWER_ON_DOWN
|
||||
|
||||
@ -1118,7 +1111,6 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp);
|
||||
static int writerids(struct net_device *dev, aironet_ioctl *comp);
|
||||
static int flashcard(struct net_device *dev, aironet_ioctl *comp);
|
||||
#endif /* CISCO_EXT */
|
||||
#ifdef MICSUPPORT
|
||||
static void micinit(struct airo_info *ai);
|
||||
static int micsetup(struct airo_info *ai);
|
||||
static int encapsulate(struct airo_info *ai, etherHead *pPacket, MICBuffer *buffer, int len);
|
||||
@ -1127,9 +1119,6 @@ static int decapsulate(struct airo_info *ai, MICBuffer *mic, etherHead *pPacket,
|
||||
static u8 airo_rssi_to_dbm (tdsRssiEntry *rssi_rid, u8 rssi);
|
||||
static u8 airo_dbm_to_pct (tdsRssiEntry *rssi_rid, u8 dbm);
|
||||
|
||||
#include <linux/crypto.h>
|
||||
#endif
|
||||
|
||||
struct airo_info {
|
||||
struct net_device_stats stats;
|
||||
struct net_device *dev;
|
||||
@ -1190,12 +1179,10 @@ struct airo_info {
|
||||
unsigned long scan_timestamp; /* Time started to scan */
|
||||
struct iw_spy_data spy_data;
|
||||
struct iw_public_data wireless_data;
|
||||
#ifdef MICSUPPORT
|
||||
/* MIC stuff */
|
||||
struct crypto_tfm *tfm;
|
||||
mic_module mod[2];
|
||||
mic_statistics micstats;
|
||||
#endif
|
||||
HostRxDesc rxfids[MPI_MAX_FIDS]; // rx/tx/config MPI350 descriptors
|
||||
HostTxDesc txfids[MPI_MAX_FIDS];
|
||||
HostRidDesc config_desc;
|
||||
@ -1229,7 +1216,6 @@ static int flashgchar(struct airo_info *ai,int matchbyte,int dwelltime);
|
||||
static int flashputbuf(struct airo_info *ai);
|
||||
static int flashrestart(struct airo_info *ai,struct net_device *dev);
|
||||
|
||||
#ifdef MICSUPPORT
|
||||
/***********************************************************************
|
||||
* MIC ROUTINES *
|
||||
***********************************************************************
|
||||
@ -1686,7 +1672,6 @@ static void emmh32_final(emmh32_context *context, u8 digest[4])
|
||||
digest[2] = (val>>8) & 0xFF;
|
||||
digest[3] = val & 0xFF;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int readBSSListRid(struct airo_info *ai, int first,
|
||||
BSSListRid *list) {
|
||||
@ -2005,7 +1990,6 @@ static int mpi_send_packet (struct net_device *dev)
|
||||
* Firmware automaticly puts 802 header on so
|
||||
* we don't need to account for it in the length
|
||||
*/
|
||||
#ifdef MICSUPPORT
|
||||
if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled &&
|
||||
(ntohs(((u16 *)buffer)[6]) != 0x888E)) {
|
||||
MICBuffer pMic;
|
||||
@ -2022,9 +2006,7 @@ static int mpi_send_packet (struct net_device *dev)
|
||||
memcpy (sendbuf, &pMic, sizeof(pMic));
|
||||
sendbuf += sizeof(pMic);
|
||||
memcpy (sendbuf, buffer, len - sizeof(etherHead));
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
} else {
|
||||
*payloadLen = cpu_to_le16(len - sizeof(etherHead));
|
||||
|
||||
dev->trans_start = jiffies;
|
||||
@ -2400,9 +2382,7 @@ void stop_airo_card( struct net_device *dev, int freeres )
|
||||
ai->shared, ai->shared_dma);
|
||||
}
|
||||
}
|
||||
#ifdef MICSUPPORT
|
||||
crypto_free_tfm(ai->tfm);
|
||||
#endif
|
||||
del_airo_dev( dev );
|
||||
free_netdev( dev );
|
||||
}
|
||||
@ -2726,9 +2706,7 @@ static struct net_device *_init_airo_card( unsigned short irq, int port,
|
||||
ai->thr_pid = kernel_thread(airo_thread, dev, CLONE_FS | CLONE_FILES);
|
||||
if (ai->thr_pid < 0)
|
||||
goto err_out_free;
|
||||
#ifdef MICSUPPORT
|
||||
ai->tfm = NULL;
|
||||
#endif
|
||||
rc = add_airo_dev( dev );
|
||||
if (rc)
|
||||
goto err_out_thr;
|
||||
@ -2969,10 +2947,8 @@ static int airo_thread(void *data) {
|
||||
airo_read_wireless_stats(ai);
|
||||
else if (test_bit(JOB_PROMISC, &ai->flags))
|
||||
airo_set_promisc(ai);
|
||||
#ifdef MICSUPPORT
|
||||
else if (test_bit(JOB_MIC, &ai->flags))
|
||||
micinit(ai);
|
||||
#endif
|
||||
else if (test_bit(JOB_EVENT, &ai->flags))
|
||||
airo_send_event(dev);
|
||||
else if (test_bit(JOB_AUTOWEP, &ai->flags))
|
||||
@ -3010,12 +2986,10 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs)
|
||||
|
||||
if ( status & EV_MIC ) {
|
||||
OUT4500( apriv, EVACK, EV_MIC );
|
||||
#ifdef MICSUPPORT
|
||||
if (test_bit(FLAG_MIC_CAPABLE, &apriv->flags)) {
|
||||
set_bit(JOB_MIC, &apriv->flags);
|
||||
wake_up_interruptible(&apriv->thr_wait);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
if ( status & EV_LINK ) {
|
||||
union iwreq_data wrqu;
|
||||
@ -3194,11 +3168,8 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs)
|
||||
}
|
||||
bap_read (apriv, buffer + hdrlen/2, len, BAP0);
|
||||
} else {
|
||||
#ifdef MICSUPPORT
|
||||
MICBuffer micbuf;
|
||||
#endif
|
||||
bap_read (apriv, buffer, ETH_ALEN*2, BAP0);
|
||||
#ifdef MICSUPPORT
|
||||
if (apriv->micstats.enabled) {
|
||||
bap_read (apriv,(u16*)&micbuf,sizeof(micbuf),BAP0);
|
||||
if (ntohs(micbuf.typelen) > 0x05DC)
|
||||
@ -3211,15 +3182,10 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs)
|
||||
skb_trim (skb, len + hdrlen);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
bap_read(apriv,buffer+ETH_ALEN,len,BAP0);
|
||||
#ifdef MICSUPPORT
|
||||
if (decapsulate(apriv,&micbuf,(etherHead*)buffer,len)) {
|
||||
badmic:
|
||||
dev_kfree_skb_irq (skb);
|
||||
#else
|
||||
if (0) {
|
||||
#endif
|
||||
badrx:
|
||||
OUT4500( apriv, EVACK, EV_RX);
|
||||
goto exitrx;
|
||||
@ -3430,10 +3396,8 @@ static void mpi_receive_802_3(struct airo_info *ai)
|
||||
int len = 0;
|
||||
struct sk_buff *skb;
|
||||
char *buffer;
|
||||
#ifdef MICSUPPORT
|
||||
int off = 0;
|
||||
MICBuffer micbuf;
|
||||
#endif
|
||||
|
||||
memcpy_fromio(&rxd, ai->rxfids[0].card_ram_off, sizeof(rxd));
|
||||
/* Make sure we got something */
|
||||
@ -3448,7 +3412,6 @@ static void mpi_receive_802_3(struct airo_info *ai)
|
||||
goto badrx;
|
||||
}
|
||||
buffer = skb_put(skb,len);
|
||||
#ifdef MICSUPPORT
|
||||
memcpy(buffer, ai->rxfids[0].virtual_host_addr, ETH_ALEN * 2);
|
||||
if (ai->micstats.enabled) {
|
||||
memcpy(&micbuf,
|
||||
@ -3470,9 +3433,6 @@ badmic:
|
||||
dev_kfree_skb_irq (skb);
|
||||
goto badrx;
|
||||
}
|
||||
#else
|
||||
memcpy(buffer, ai->rxfids[0].virtual_host_addr, len);
|
||||
#endif
|
||||
#ifdef WIRELESS_SPY
|
||||
if (ai->spy_data.spy_number > 0) {
|
||||
char *sa;
|
||||
@ -3689,13 +3649,11 @@ static u16 setup_card(struct airo_info *ai, u8 *mac, int lock)
|
||||
ai->config.authType = AUTH_OPEN;
|
||||
ai->config.modulation = MOD_CCK;
|
||||
|
||||
#ifdef MICSUPPORT
|
||||
if ((cap_rid.len>=sizeof(cap_rid)) && (cap_rid.extSoftCap&1) &&
|
||||
(micsetup(ai) == SUCCESS)) {
|
||||
ai->config.opmode |= MODE_MIC;
|
||||
set_bit(FLAG_MIC_CAPABLE, &ai->flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Save off the MAC */
|
||||
for( i = 0; i < ETH_ALEN; i++ ) {
|
||||
@ -4170,15 +4128,12 @@ static int transmit_802_3_packet(struct airo_info *ai, int len, char *pPacket)
|
||||
}
|
||||
len -= ETH_ALEN * 2;
|
||||
|
||||
#ifdef MICSUPPORT
|
||||
if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled &&
|
||||
(ntohs(((u16 *)pPacket)[6]) != 0x888E)) {
|
||||
if (encapsulate(ai,(etherHead *)pPacket,&pMic,len) != SUCCESS)
|
||||
return ERROR;
|
||||
miclen = sizeof(pMic);
|
||||
}
|
||||
#endif
|
||||
|
||||
// packet is destination[6], source[6], payload[len-12]
|
||||
// write the payload length and dst/src/payload
|
||||
if (bap_setup(ai, txFid, 0x0036, BAP1) != SUCCESS) return ERROR;
|
||||
@ -5801,11 +5756,13 @@ static int airo_set_wap(struct net_device *dev,
|
||||
Cmd cmd;
|
||||
Resp rsp;
|
||||
APListRid APList_rid;
|
||||
static const unsigned char bcast[ETH_ALEN] = { 255, 255, 255, 255, 255, 255 };
|
||||
static const u8 any[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
|
||||
static const u8 off[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
|
||||
if (awrq->sa_family != ARPHRD_ETHER)
|
||||
return -EINVAL;
|
||||
else if (!memcmp(bcast, awrq->sa_data, ETH_ALEN)) {
|
||||
else if (!memcmp(any, awrq->sa_data, ETH_ALEN) ||
|
||||
!memcmp(off, awrq->sa_data, ETH_ALEN)) {
|
||||
memset(&cmd, 0, sizeof(cmd));
|
||||
cmd.cmd=CMD_LOSE_SYNC;
|
||||
if (down_interruptible(&local->sem))
|
||||
@ -6294,6 +6251,267 @@ static int airo_get_encode(struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/*
|
||||
* Wireless Handler : set extended Encryption parameters
|
||||
*/
|
||||
static int airo_set_encodeext(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct airo_info *local = dev->priv;
|
||||
struct iw_point *encoding = &wrqu->encoding;
|
||||
struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
|
||||
CapabilityRid cap_rid; /* Card capability info */
|
||||
int perm = ( encoding->flags & IW_ENCODE_TEMP ? 0 : 1 );
|
||||
u16 currentAuthType = local->config.authType;
|
||||
int idx, key_len, alg = ext->alg; /* Check encryption mode */
|
||||
wep_key_t key;
|
||||
|
||||
/* Is WEP supported ? */
|
||||
readCapabilityRid(local, &cap_rid, 1);
|
||||
/* Older firmware doesn't support this...
|
||||
if(!(cap_rid.softCap & 2)) {
|
||||
return -EOPNOTSUPP;
|
||||
} */
|
||||
readConfigRid(local, 1);
|
||||
|
||||
/* Determine and validate the key index */
|
||||
idx = encoding->flags & IW_ENCODE_INDEX;
|
||||
if (idx) {
|
||||
if (idx < 1 || idx > ((cap_rid.softCap & 0x80) ? 4:1))
|
||||
return -EINVAL;
|
||||
idx--;
|
||||
} else
|
||||
idx = get_wep_key(local, 0xffff);
|
||||
|
||||
if (encoding->flags & IW_ENCODE_DISABLED)
|
||||
alg = IW_ENCODE_ALG_NONE;
|
||||
|
||||
/* Just setting the transmit key? */
|
||||
if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
|
||||
set_wep_key(local, idx, NULL, 0, perm, 1);
|
||||
} else {
|
||||
/* Set the requested key first */
|
||||
memset(key.key, 0, MAX_KEY_SIZE);
|
||||
switch (alg) {
|
||||
case IW_ENCODE_ALG_NONE:
|
||||
key.len = 0;
|
||||
break;
|
||||
case IW_ENCODE_ALG_WEP:
|
||||
if (ext->key_len > MIN_KEY_SIZE) {
|
||||
key.len = MAX_KEY_SIZE;
|
||||
} else if (ext->key_len > 0) {
|
||||
key.len = MIN_KEY_SIZE;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
key_len = min (ext->key_len, key.len);
|
||||
memcpy(key.key, ext->key, key_len);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
/* Send the key to the card */
|
||||
set_wep_key(local, idx, key.key, key.len, perm, 1);
|
||||
}
|
||||
|
||||
/* Read the flags */
|
||||
if(encoding->flags & IW_ENCODE_DISABLED)
|
||||
local->config.authType = AUTH_OPEN; // disable encryption
|
||||
if(encoding->flags & IW_ENCODE_RESTRICTED)
|
||||
local->config.authType = AUTH_SHAREDKEY; // Only Both
|
||||
if(encoding->flags & IW_ENCODE_OPEN)
|
||||
local->config.authType = AUTH_ENCRYPT; // Only Wep
|
||||
/* Commit the changes to flags if needed */
|
||||
if (local->config.authType != currentAuthType)
|
||||
set_bit (FLAG_COMMIT, &local->flags);
|
||||
|
||||
return -EINPROGRESS;
|
||||
}
|
||||
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/*
|
||||
* Wireless Handler : get extended Encryption parameters
|
||||
*/
|
||||
static int airo_get_encodeext(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct airo_info *local = dev->priv;
|
||||
struct iw_point *encoding = &wrqu->encoding;
|
||||
struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
|
||||
CapabilityRid cap_rid; /* Card capability info */
|
||||
int idx, max_key_len;
|
||||
|
||||
/* Is it supported ? */
|
||||
readCapabilityRid(local, &cap_rid, 1);
|
||||
if(!(cap_rid.softCap & 2)) {
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
readConfigRid(local, 1);
|
||||
|
||||
max_key_len = encoding->length - sizeof(*ext);
|
||||
if (max_key_len < 0)
|
||||
return -EINVAL;
|
||||
|
||||
idx = encoding->flags & IW_ENCODE_INDEX;
|
||||
if (idx) {
|
||||
if (idx < 1 || idx > ((cap_rid.softCap & 0x80) ? 4:1))
|
||||
return -EINVAL;
|
||||
idx--;
|
||||
} else
|
||||
idx = get_wep_key(local, 0xffff);
|
||||
|
||||
encoding->flags = idx + 1;
|
||||
memset(ext, 0, sizeof(*ext));
|
||||
|
||||
/* Check encryption mode */
|
||||
switch(local->config.authType) {
|
||||
case AUTH_ENCRYPT:
|
||||
encoding->flags = IW_ENCODE_ALG_WEP | IW_ENCODE_ENABLED;
|
||||
break;
|
||||
case AUTH_SHAREDKEY:
|
||||
encoding->flags = IW_ENCODE_ALG_WEP | IW_ENCODE_ENABLED;
|
||||
break;
|
||||
default:
|
||||
case AUTH_OPEN:
|
||||
encoding->flags = IW_ENCODE_ALG_NONE | IW_ENCODE_DISABLED;
|
||||
break;
|
||||
}
|
||||
/* We can't return the key, so set the proper flag and return zero */
|
||||
encoding->flags |= IW_ENCODE_NOKEY;
|
||||
memset(extra, 0, 16);
|
||||
|
||||
/* Copy the key to the user buffer */
|
||||
ext->key_len = get_wep_key(local, idx);
|
||||
if (ext->key_len > 16) {
|
||||
ext->key_len=0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/*
|
||||
* Wireless Handler : set extended authentication parameters
|
||||
*/
|
||||
static int airo_set_auth(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
struct airo_info *local = dev->priv;
|
||||
struct iw_param *param = &wrqu->param;
|
||||
u16 currentAuthType = local->config.authType;
|
||||
|
||||
switch (param->flags & IW_AUTH_INDEX) {
|
||||
case IW_AUTH_WPA_VERSION:
|
||||
case IW_AUTH_CIPHER_PAIRWISE:
|
||||
case IW_AUTH_CIPHER_GROUP:
|
||||
case IW_AUTH_KEY_MGMT:
|
||||
case IW_AUTH_RX_UNENCRYPTED_EAPOL:
|
||||
case IW_AUTH_PRIVACY_INVOKED:
|
||||
/*
|
||||
* airo does not use these parameters
|
||||
*/
|
||||
break;
|
||||
|
||||
case IW_AUTH_DROP_UNENCRYPTED:
|
||||
if (param->value) {
|
||||
/* Only change auth type if unencrypted */
|
||||
if (currentAuthType == AUTH_OPEN)
|
||||
local->config.authType = AUTH_ENCRYPT;
|
||||
} else {
|
||||
local->config.authType = AUTH_OPEN;
|
||||
}
|
||||
|
||||
/* Commit the changes to flags if needed */
|
||||
if (local->config.authType != currentAuthType)
|
||||
set_bit (FLAG_COMMIT, &local->flags);
|
||||
break;
|
||||
|
||||
case IW_AUTH_80211_AUTH_ALG: {
|
||||
/* FIXME: What about AUTH_OPEN? This API seems to
|
||||
* disallow setting our auth to AUTH_OPEN.
|
||||
*/
|
||||
if (param->value & IW_AUTH_ALG_SHARED_KEY) {
|
||||
local->config.authType = AUTH_SHAREDKEY;
|
||||
} else if (param->value & IW_AUTH_ALG_OPEN_SYSTEM) {
|
||||
local->config.authType = AUTH_ENCRYPT;
|
||||
} else
|
||||
return -EINVAL;
|
||||
break;
|
||||
|
||||
/* Commit the changes to flags if needed */
|
||||
if (local->config.authType != currentAuthType)
|
||||
set_bit (FLAG_COMMIT, &local->flags);
|
||||
}
|
||||
|
||||
case IW_AUTH_WPA_ENABLED:
|
||||
/* Silently accept disable of WPA */
|
||||
if (param->value > 0)
|
||||
return -EOPNOTSUPP;
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
return -EINPROGRESS;
|
||||
}
|
||||
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/*
|
||||
* Wireless Handler : get extended authentication parameters
|
||||
*/
|
||||
static int airo_get_auth(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
struct airo_info *local = dev->priv;
|
||||
struct iw_param *param = &wrqu->param;
|
||||
u16 currentAuthType = local->config.authType;
|
||||
|
||||
switch (param->flags & IW_AUTH_INDEX) {
|
||||
case IW_AUTH_DROP_UNENCRYPTED:
|
||||
switch (currentAuthType) {
|
||||
case AUTH_SHAREDKEY:
|
||||
case AUTH_ENCRYPT:
|
||||
param->value = 1;
|
||||
break;
|
||||
default:
|
||||
param->value = 0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case IW_AUTH_80211_AUTH_ALG:
|
||||
switch (currentAuthType) {
|
||||
case AUTH_SHAREDKEY:
|
||||
param->value = IW_AUTH_ALG_SHARED_KEY;
|
||||
break;
|
||||
case AUTH_ENCRYPT:
|
||||
default:
|
||||
param->value = IW_AUTH_ALG_OPEN_SYSTEM;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case IW_AUTH_WPA_ENABLED:
|
||||
param->value = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/*
|
||||
* Wireless Handler : set Tx-Power
|
||||
@ -7050,6 +7268,15 @@ static const iw_handler airo_handler[] =
|
||||
(iw_handler) airo_get_encode, /* SIOCGIWENCODE */
|
||||
(iw_handler) airo_set_power, /* SIOCSIWPOWER */
|
||||
(iw_handler) airo_get_power, /* SIOCGIWPOWER */
|
||||
(iw_handler) NULL, /* -- hole -- */
|
||||
(iw_handler) NULL, /* -- hole -- */
|
||||
(iw_handler) NULL, /* SIOCSIWGENIE */
|
||||
(iw_handler) NULL, /* SIOCGIWGENIE */
|
||||
(iw_handler) airo_set_auth, /* SIOCSIWAUTH */
|
||||
(iw_handler) airo_get_auth, /* SIOCGIWAUTH */
|
||||
(iw_handler) airo_set_encodeext, /* SIOCSIWENCODEEXT */
|
||||
(iw_handler) airo_get_encodeext, /* SIOCGIWENCODEEXT */
|
||||
(iw_handler) NULL, /* SIOCSIWPMKSA */
|
||||
};
|
||||
|
||||
/* Note : don't describe AIROIDIFC and AIROOLDIDIFC in here.
|
||||
@ -7270,13 +7497,11 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) {
|
||||
case AIROGSTAT: ridcode = RID_STATUS; break;
|
||||
case AIROGSTATSD32: ridcode = RID_STATSDELTA; break;
|
||||
case AIROGSTATSC32: ridcode = RID_STATS; break;
|
||||
#ifdef MICSUPPORT
|
||||
case AIROGMICSTATS:
|
||||
if (copy_to_user(comp->data, &ai->micstats,
|
||||
min((int)comp->len,(int)sizeof(ai->micstats))))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
#endif
|
||||
case AIRORRID: ridcode = comp->ridnum; break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
@ -7308,9 +7533,7 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) {
|
||||
static int writerids(struct net_device *dev, aironet_ioctl *comp) {
|
||||
struct airo_info *ai = dev->priv;
|
||||
int ridcode;
|
||||
#ifdef MICSUPPORT
|
||||
int enabled;
|
||||
#endif
|
||||
Resp rsp;
|
||||
static int (* writer)(struct airo_info *, u16 rid, const void *, int, int);
|
||||
unsigned char *iobuf;
|
||||
@ -7367,11 +7590,9 @@ static int writerids(struct net_device *dev, aironet_ioctl *comp) {
|
||||
|
||||
PC4500_readrid(ai,RID_STATSDELTACLEAR,iobuf,RIDSIZE, 1);
|
||||
|
||||
#ifdef MICSUPPORT
|
||||
enabled = ai->micstats.enabled;
|
||||
memset(&ai->micstats,0,sizeof(ai->micstats));
|
||||
ai->micstats.enabled = enabled;
|
||||
#endif
|
||||
|
||||
if (copy_to_user(comp->data, iobuf,
|
||||
min((int)comp->len, (int)RIDSIZE))) {
|
||||
|
@ -167,7 +167,7 @@ that only one external action is invoked at a time.
|
||||
|
||||
#include "ipw2100.h"
|
||||
|
||||
#define IPW2100_VERSION "1.1.3"
|
||||
#define IPW2100_VERSION "git-1.1.4"
|
||||
|
||||
#define DRV_NAME "ipw2100"
|
||||
#define DRV_VERSION IPW2100_VERSION
|
||||
@ -1672,6 +1672,18 @@ static int ipw2100_start_scan(struct ipw2100_priv *priv)
|
||||
return err;
|
||||
}
|
||||
|
||||
static const struct ieee80211_geo ipw_geos[] = {
|
||||
{ /* Restricted */
|
||||
"---",
|
||||
.bg_channels = 14,
|
||||
.bg = {{2412, 1}, {2417, 2}, {2422, 3},
|
||||
{2427, 4}, {2432, 5}, {2437, 6},
|
||||
{2442, 7}, {2447, 8}, {2452, 9},
|
||||
{2457, 10}, {2462, 11}, {2467, 12},
|
||||
{2472, 13}, {2484, 14}},
|
||||
},
|
||||
};
|
||||
|
||||
static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
|
||||
{
|
||||
unsigned long flags;
|
||||
@ -1727,6 +1739,13 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* Initialize the geo */
|
||||
if (ieee80211_set_geo(priv->ieee, &ipw_geos[0])) {
|
||||
printk(KERN_WARNING DRV_NAME "Could not set geo\n");
|
||||
return 0;
|
||||
}
|
||||
priv->ieee->freq_band = IEEE80211_24GHZ_BAND;
|
||||
|
||||
lock = LOCK_NONE;
|
||||
if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) {
|
||||
printk(KERN_ERR DRV_NAME
|
||||
@ -3750,7 +3769,7 @@ static ssize_t store_memory(struct device *d, struct device_attribute *attr,
|
||||
struct net_device *dev = priv->net_dev;
|
||||
const char *p = buf;
|
||||
|
||||
(void) dev; /* kill unused-var warning for debug-only code */
|
||||
(void)dev; /* kill unused-var warning for debug-only code */
|
||||
|
||||
if (count < 1)
|
||||
return count;
|
||||
@ -4070,7 +4089,7 @@ static ssize_t store_scan_age(struct device *d, struct device_attribute *attr,
|
||||
unsigned long val;
|
||||
char *p = buffer;
|
||||
|
||||
(void) dev; /* kill unused-var warning for debug-only code */
|
||||
(void)dev; /* kill unused-var warning for debug-only code */
|
||||
|
||||
IPW_DEBUG_INFO("enter\n");
|
||||
|
||||
@ -5107,12 +5126,13 @@ static int ipw2100_set_tx_power(struct ipw2100_priv *priv, u32 tx_power)
|
||||
.host_command_length = 4
|
||||
};
|
||||
int err = 0;
|
||||
u32 tmp = tx_power;
|
||||
|
||||
if (tx_power != IPW_TX_POWER_DEFAULT)
|
||||
tx_power = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 /
|
||||
(IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM);
|
||||
tmp = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 /
|
||||
(IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM);
|
||||
|
||||
cmd.host_command_parameters[0] = tx_power;
|
||||
cmd.host_command_parameters[0] = tmp;
|
||||
|
||||
if (priv->ieee->iw_mode == IW_MODE_ADHOC)
|
||||
err = ipw2100_hw_send_command(priv, &cmd);
|
||||
@ -5365,9 +5385,12 @@ static int ipw2100_configure_security(struct ipw2100_priv *priv, int batch_mode)
|
||||
SEC_LEVEL_0, 0, 1);
|
||||
} else {
|
||||
auth_mode = IPW_AUTH_OPEN;
|
||||
if ((priv->ieee->sec.flags & SEC_AUTH_MODE) &&
|
||||
(priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY))
|
||||
auth_mode = IPW_AUTH_SHARED;
|
||||
if (priv->ieee->sec.flags & SEC_AUTH_MODE) {
|
||||
if (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)
|
||||
auth_mode = IPW_AUTH_SHARED;
|
||||
else if (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP)
|
||||
auth_mode = IPW_AUTH_LEAP_CISCO_ID;
|
||||
}
|
||||
|
||||
sec_level = SEC_LEVEL_0;
|
||||
if (priv->ieee->sec.flags & SEC_LEVEL)
|
||||
@ -5760,6 +5783,9 @@ static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value)
|
||||
} else if (value & IW_AUTH_ALG_OPEN_SYSTEM) {
|
||||
sec.auth_mode = WLAN_AUTH_OPEN;
|
||||
ieee->open_wep = 1;
|
||||
} else if (value & IW_AUTH_ALG_LEAP) {
|
||||
sec.auth_mode = WLAN_AUTH_LEAP;
|
||||
ieee->open_wep = 1;
|
||||
} else
|
||||
return -EINVAL;
|
||||
|
||||
@ -5771,8 +5797,8 @@ static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv,
|
||||
char *wpa_ie, int wpa_ie_len)
|
||||
static void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv,
|
||||
char *wpa_ie, int wpa_ie_len)
|
||||
{
|
||||
|
||||
struct ipw2100_wpa_assoc_frame frame;
|
||||
|
@ -392,8 +392,10 @@ struct ipw2100_notification {
|
||||
#define IPW_WEP104_CIPHER (1<<5)
|
||||
#define IPW_CKIP_CIPHER (1<<6)
|
||||
|
||||
#define IPW_AUTH_OPEN 0
|
||||
#define IPW_AUTH_SHARED 1
|
||||
#define IPW_AUTH_OPEN 0
|
||||
#define IPW_AUTH_SHARED 1
|
||||
#define IPW_AUTH_LEAP 2
|
||||
#define IPW_AUTH_LEAP_CISCO_ID 0x80
|
||||
|
||||
struct statistic {
|
||||
int value;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -33,6 +33,7 @@
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/netdevice.h>
|
||||
@ -46,6 +47,7 @@
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/wireless.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <net/ieee80211.h>
|
||||
@ -852,7 +854,7 @@ struct ipw_scan_request_ext {
|
||||
u16 dwell_time[IPW_SCAN_TYPES];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
extern inline u8 ipw_get_scan_type(struct ipw_scan_request_ext *scan, u8 index)
|
||||
static inline u8 ipw_get_scan_type(struct ipw_scan_request_ext *scan, u8 index)
|
||||
{
|
||||
if (index % 2)
|
||||
return scan->scan_type[index / 2] & 0x0F;
|
||||
@ -860,7 +862,7 @@ extern inline u8 ipw_get_scan_type(struct ipw_scan_request_ext *scan, u8 index)
|
||||
return (scan->scan_type[index / 2] & 0xF0) >> 4;
|
||||
}
|
||||
|
||||
extern inline void ipw_set_scan_type(struct ipw_scan_request_ext *scan,
|
||||
static inline void ipw_set_scan_type(struct ipw_scan_request_ext *scan,
|
||||
u8 index, u8 scan_type)
|
||||
{
|
||||
if (index % 2)
|
||||
@ -1120,7 +1122,7 @@ struct ipw_priv {
|
||||
struct ieee80211_device *ieee;
|
||||
|
||||
spinlock_t lock;
|
||||
struct semaphore sem;
|
||||
struct mutex mutex;
|
||||
|
||||
/* basic pci-network driver stuff */
|
||||
struct pci_dev *pci_dev;
|
||||
@ -1406,13 +1408,6 @@ do { if (ipw_debug_level & (level)) \
|
||||
* Register bit definitions
|
||||
*/
|
||||
|
||||
/* Dino control registers bits */
|
||||
|
||||
#define DINO_ENABLE_SYSTEM 0x80
|
||||
#define DINO_ENABLE_CS 0x40
|
||||
#define DINO_RXFIFO_DATA 0x01
|
||||
#define DINO_CONTROL_REG 0x00200000
|
||||
|
||||
#define IPW_INTA_RW 0x00000008
|
||||
#define IPW_INTA_MASK_R 0x0000000C
|
||||
#define IPW_INDIRECT_ADDR 0x00000010
|
||||
@ -1459,6 +1454,11 @@ do { if (ipw_debug_level & (level)) \
|
||||
#define IPW_DOMAIN_0_END 0x1000
|
||||
#define CLX_MEM_BAR_SIZE 0x1000
|
||||
|
||||
/* Dino/baseband control registers bits */
|
||||
|
||||
#define DINO_ENABLE_SYSTEM 0x80 /* 1 = baseband processor on, 0 = reset */
|
||||
#define DINO_ENABLE_CS 0x40 /* 1 = enable ucode load */
|
||||
#define DINO_RXFIFO_DATA 0x01 /* 1 = data available */
|
||||
#define IPW_BASEBAND_CONTROL_STATUS 0X00200000
|
||||
#define IPW_BASEBAND_TX_FIFO_WRITE 0X00200004
|
||||
#define IPW_BASEBAND_RX_FIFO_READ 0X00200004
|
||||
@ -1567,13 +1567,18 @@ do { if (ipw_debug_level & (level)) \
|
||||
#define EEPROM_BSS_CHANNELS_BG (GET_EEPROM_ADDR(0x2c,LSB)) /* 2 bytes */
|
||||
#define EEPROM_HW_VERSION (GET_EEPROM_ADDR(0x72,LSB)) /* 2 bytes */
|
||||
|
||||
/* NIC type as found in the one byte EEPROM_NIC_TYPE offset*/
|
||||
/* NIC type as found in the one byte EEPROM_NIC_TYPE offset */
|
||||
#define EEPROM_NIC_TYPE_0 0
|
||||
#define EEPROM_NIC_TYPE_1 1
|
||||
#define EEPROM_NIC_TYPE_2 2
|
||||
#define EEPROM_NIC_TYPE_3 3
|
||||
#define EEPROM_NIC_TYPE_4 4
|
||||
|
||||
/* Bluetooth Coexistence capabilities as found in EEPROM_SKU_CAPABILITY */
|
||||
#define EEPROM_SKU_CAP_BT_CHANNEL_SIG 0x01 /* we can tell BT our channel # */
|
||||
#define EEPROM_SKU_CAP_BT_PRIORITY 0x02 /* BT can take priority over us */
|
||||
#define EEPROM_SKU_CAP_BT_OOB 0x04 /* we can signal BT out-of-band */
|
||||
|
||||
#define FW_MEM_REG_LOWER_BOUND 0x00300000
|
||||
#define FW_MEM_REG_EEPROM_ACCESS (FW_MEM_REG_LOWER_BOUND + 0x40)
|
||||
#define IPW_EVENT_REG (FW_MEM_REG_LOWER_BOUND + 0x04)
|
||||
@ -1658,9 +1663,10 @@ enum {
|
||||
IPW_FW_ERROR_FATAL_ERROR
|
||||
};
|
||||
|
||||
#define AUTH_OPEN 0
|
||||
#define AUTH_SHARED_KEY 1
|
||||
#define AUTH_IGNORE 3
|
||||
#define AUTH_OPEN 0
|
||||
#define AUTH_SHARED_KEY 1
|
||||
#define AUTH_LEAP 2
|
||||
#define AUTH_IGNORE 3
|
||||
|
||||
#define HC_ASSOCIATE 0
|
||||
#define HC_REASSOCIATE 1
|
||||
@ -1860,7 +1866,7 @@ struct host_cmd {
|
||||
u8 cmd;
|
||||
u8 len;
|
||||
u16 reserved;
|
||||
u32 param[TFD_CMD_IMMEDIATE_PAYLOAD_LENGTH];
|
||||
u32 *param;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct ipw_cmd_log {
|
||||
@ -1869,21 +1875,23 @@ struct ipw_cmd_log {
|
||||
struct host_cmd cmd;
|
||||
};
|
||||
|
||||
#define CFG_BT_COEXISTENCE_MIN 0x00
|
||||
#define CFG_BT_COEXISTENCE_DEFER 0x02
|
||||
#define CFG_BT_COEXISTENCE_KILL 0x04
|
||||
#define CFG_BT_COEXISTENCE_WME_OVER_BT 0x08
|
||||
#define CFG_BT_COEXISTENCE_OOB 0x10
|
||||
#define CFG_BT_COEXISTENCE_MAX 0xFF
|
||||
#define CFG_BT_COEXISTENCE_DEF 0x80 /* read Bt from EEPROM */
|
||||
/* SysConfig command parameters ... */
|
||||
/* bt_coexistence param */
|
||||
#define CFG_BT_COEXISTENCE_SIGNAL_CHNL 0x01 /* tell BT our chnl # */
|
||||
#define CFG_BT_COEXISTENCE_DEFER 0x02 /* defer our Tx if BT traffic */
|
||||
#define CFG_BT_COEXISTENCE_KILL 0x04 /* kill our Tx if BT traffic */
|
||||
#define CFG_BT_COEXISTENCE_WME_OVER_BT 0x08 /* multimedia extensions */
|
||||
#define CFG_BT_COEXISTENCE_OOB 0x10 /* signal BT via out-of-band */
|
||||
|
||||
#define CFG_CTS_TO_ITSELF_ENABLED_MIN 0x0
|
||||
#define CFG_CTS_TO_ITSELF_ENABLED_MAX 0x1
|
||||
/* clear-to-send to self param */
|
||||
#define CFG_CTS_TO_ITSELF_ENABLED_MIN 0x00
|
||||
#define CFG_CTS_TO_ITSELF_ENABLED_MAX 0x01
|
||||
#define CFG_CTS_TO_ITSELF_ENABLED_DEF CFG_CTS_TO_ITSELF_ENABLED_MIN
|
||||
|
||||
#define CFG_SYS_ANTENNA_BOTH 0x000
|
||||
#define CFG_SYS_ANTENNA_A 0x001
|
||||
#define CFG_SYS_ANTENNA_B 0x003
|
||||
/* Antenna diversity param (h/w can select best antenna, based on signal) */
|
||||
#define CFG_SYS_ANTENNA_BOTH 0x00 /* NIC selects best antenna */
|
||||
#define CFG_SYS_ANTENNA_A 0x01 /* force antenna A */
|
||||
#define CFG_SYS_ANTENNA_B 0x03 /* force antenna B */
|
||||
|
||||
/*
|
||||
* The definitions below were lifted off the ipw2100 driver, which only
|
||||
|
@ -55,10 +55,8 @@
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/bitops.h>
|
||||
#ifdef CONFIG_NET_RADIO
|
||||
#include <linux/wireless.h>
|
||||
#include <net/iw_handler.h>
|
||||
#endif
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
|
@ -98,11 +98,7 @@
|
||||
* characteristics of the hardware. Applications such as mobile IP may
|
||||
* take advantage of it.
|
||||
*
|
||||
* You will need to enable the CONFIG_NET_RADIO define in the kernel
|
||||
* configuration to enable the wireless extensions (this is the one
|
||||
* giving access to the radio network device choice).
|
||||
*
|
||||
* It might also be a good idea as well to fetch the wireless tools to
|
||||
* It might be a good idea as well to fetch the wireless tools to
|
||||
* configure the device and play a bit.
|
||||
*/
|
||||
|
||||
|
@ -99,11 +99,7 @@
|
||||
* caracteristics of the hardware in a standard way and support for
|
||||
* applications for taking advantage of it (like Mobile IP).
|
||||
*
|
||||
* You will need to enable the CONFIG_NET_RADIO define in the kernel
|
||||
* configuration to enable the wireless extensions (this is the one
|
||||
* giving access to the radio network device choice).
|
||||
*
|
||||
* It might also be a good idea as well to fetch the wireless tools to
|
||||
* It might be a good idea as well to fetch the wireless tools to
|
||||
* configure the device and play a bit.
|
||||
*/
|
||||
|
||||
@ -440,11 +436,8 @@
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/ethtool.h>
|
||||
|
||||
#ifdef CONFIG_NET_RADIO
|
||||
#include <linux/wireless.h> /* Wireless extensions */
|
||||
#include <net/iw_handler.h> /* New driver API */
|
||||
#endif
|
||||
|
||||
/* Pcmcia headers that we need */
|
||||
#include <pcmcia/cs_types.h>
|
||||
|
@ -1285,6 +1285,14 @@ extern int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee,
|
||||
extern int ieee80211_wx_get_encodeext(struct ieee80211_device *ieee,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra);
|
||||
extern int ieee80211_wx_set_auth(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra);
|
||||
extern int ieee80211_wx_get_auth(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra);
|
||||
|
||||
static inline void ieee80211_increment_scans(struct ieee80211_device *ieee)
|
||||
{
|
||||
|
@ -217,6 +217,9 @@ source "net/irda/Kconfig"
|
||||
source "net/bluetooth/Kconfig"
|
||||
source "net/ieee80211/Kconfig"
|
||||
|
||||
config WIRELESS_EXT
|
||||
bool
|
||||
|
||||
endif # if NET
|
||||
endmenu # Networking
|
||||
|
||||
|
@ -14,5 +14,5 @@ obj-$(CONFIG_XFRM) += flow.o
|
||||
obj-$(CONFIG_SYSFS) += net-sysfs.o
|
||||
obj-$(CONFIG_NET_DIVERT) += dv.o
|
||||
obj-$(CONFIG_NET_PKTGEN) += pktgen.o
|
||||
obj-$(CONFIG_NET_RADIO) += wireless.o
|
||||
obj-$(CONFIG_WIRELESS_EXT) += wireless.o
|
||||
obj-$(CONFIG_NETPOLL) += netpoll.o
|
||||
|
@ -110,10 +110,8 @@
|
||||
#include <linux/netpoll.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/delay.h>
|
||||
#ifdef CONFIG_NET_RADIO
|
||||
#include <linux/wireless.h> /* Note : will define WIRELESS_EXT */
|
||||
#include <linux/wireless.h>
|
||||
#include <net/iw_handler.h>
|
||||
#endif /* CONFIG_NET_RADIO */
|
||||
#include <asm/current.h>
|
||||
|
||||
/*
|
||||
@ -2028,7 +2026,7 @@ static struct file_operations softnet_seq_fops = {
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
#ifdef WIRELESS_EXT
|
||||
#ifdef CONFIG_WIRELESS_EXT
|
||||
extern int wireless_proc_init(void);
|
||||
#else
|
||||
#define wireless_proc_init() 0
|
||||
@ -2581,7 +2579,7 @@ int dev_ioctl(unsigned int cmd, void __user *arg)
|
||||
ret = -EFAULT;
|
||||
return ret;
|
||||
}
|
||||
#ifdef WIRELESS_EXT
|
||||
#ifdef CONFIG_WIRELESS_EXT
|
||||
/* Take care of Wireless Extensions */
|
||||
if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
|
||||
/* If command is `set a parameter', or
|
||||
@ -2602,7 +2600,7 @@ int dev_ioctl(unsigned int cmd, void __user *arg)
|
||||
ret = -EFAULT;
|
||||
return ret;
|
||||
}
|
||||
#endif /* WIRELESS_EXT */
|
||||
#endif /* CONFIG_WIRELESS_EXT */
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
@ -369,8 +369,8 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
||||
|
||||
/* Put this code here so that we avoid duplicating it in all
|
||||
* Rx paths. - Jean II */
|
||||
#ifdef CONFIG_WIRELESS_EXT
|
||||
#ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */
|
||||
#ifdef CONFIG_NET_RADIO
|
||||
/* If spy monitoring on */
|
||||
if (ieee->spy_data.spy_number > 0) {
|
||||
struct iw_quality wstats;
|
||||
@ -397,8 +397,8 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
||||
/* Update spy records */
|
||||
wireless_spy_update(ieee->dev, hdr->addr2, &wstats);
|
||||
}
|
||||
#endif /* CONFIG_NET_RADIO */
|
||||
#endif /* IW_WIRELESS_SPY */
|
||||
#endif /* CONFIG_WIRELESS_EXT */
|
||||
|
||||
#ifdef NOT_YET
|
||||
hostap_update_rx_stats(local->ap, hdr, rx_stats);
|
||||
@ -574,7 +574,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
||||
/* skb: hdr + (possibly fragmented) plaintext payload */
|
||||
// PR: FIXME: hostap has additional conditions in the "if" below:
|
||||
// ieee->host_decrypt && (fc & IEEE80211_FCTL_PROTECTED) &&
|
||||
if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) {
|
||||
if ((frag != 0) || (fc & IEEE80211_FCTL_MOREFRAGS)) {
|
||||
int flen;
|
||||
struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr);
|
||||
IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag);
|
||||
@ -1607,6 +1607,30 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee,
|
||||
header, stats);
|
||||
break;
|
||||
|
||||
case IEEE80211_STYPE_REASSOC_REQ:
|
||||
IEEE80211_DEBUG_MGMT("received reassoc (%d)\n",
|
||||
WLAN_FC_GET_STYPE(le16_to_cpu
|
||||
(header->frame_ctl)));
|
||||
|
||||
IEEE80211_WARNING("%s: IEEE80211_REASSOC_REQ received\n",
|
||||
ieee->dev->name);
|
||||
if (ieee->handle_reassoc_request != NULL)
|
||||
ieee->handle_reassoc_request(ieee->dev,
|
||||
(struct ieee80211_reassoc_request *)
|
||||
header);
|
||||
break;
|
||||
|
||||
case IEEE80211_STYPE_ASSOC_REQ:
|
||||
IEEE80211_DEBUG_MGMT("received assoc (%d)\n",
|
||||
WLAN_FC_GET_STYPE(le16_to_cpu
|
||||
(header->frame_ctl)));
|
||||
|
||||
IEEE80211_WARNING("%s: IEEE80211_ASSOC_REQ received\n",
|
||||
ieee->dev->name);
|
||||
if (ieee->handle_assoc_request != NULL)
|
||||
ieee->handle_assoc_request(ieee->dev);
|
||||
break;
|
||||
|
||||
case IEEE80211_STYPE_DEAUTH:
|
||||
IEEE80211_DEBUG_MGMT("DEAUTH\n");
|
||||
if (ieee->handle_deauth != NULL)
|
||||
|
@ -761,9 +761,98 @@ int ieee80211_wx_get_encodeext(struct ieee80211_device *ieee,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ieee80211_wx_set_auth(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct ieee80211_device *ieee = netdev_priv(dev);
|
||||
unsigned long flags;
|
||||
int err = 0;
|
||||
|
||||
spin_lock_irqsave(&ieee->lock, flags);
|
||||
|
||||
switch (wrqu->param.flags & IW_AUTH_INDEX) {
|
||||
case IW_AUTH_WPA_VERSION:
|
||||
case IW_AUTH_CIPHER_PAIRWISE:
|
||||
case IW_AUTH_CIPHER_GROUP:
|
||||
case IW_AUTH_KEY_MGMT:
|
||||
/*
|
||||
* Host AP driver does not use these parameters and allows
|
||||
* wpa_supplicant to control them internally.
|
||||
*/
|
||||
break;
|
||||
case IW_AUTH_TKIP_COUNTERMEASURES:
|
||||
break; /* FIXME */
|
||||
case IW_AUTH_DROP_UNENCRYPTED:
|
||||
ieee->drop_unencrypted = !!wrqu->param.value;
|
||||
break;
|
||||
case IW_AUTH_80211_AUTH_ALG:
|
||||
break; /* FIXME */
|
||||
case IW_AUTH_WPA_ENABLED:
|
||||
ieee->privacy_invoked = ieee->wpa_enabled = !!wrqu->param.value;
|
||||
break;
|
||||
case IW_AUTH_RX_UNENCRYPTED_EAPOL:
|
||||
ieee->ieee802_1x = !!wrqu->param.value;
|
||||
break;
|
||||
case IW_AUTH_PRIVACY_INVOKED:
|
||||
ieee->privacy_invoked = !!wrqu->param.value;
|
||||
break;
|
||||
default:
|
||||
err = -EOPNOTSUPP;
|
||||
break;
|
||||
}
|
||||
spin_unlock_irqrestore(&ieee->lock, flags);
|
||||
return err;
|
||||
}
|
||||
|
||||
int ieee80211_wx_get_auth(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct ieee80211_device *ieee = netdev_priv(dev);
|
||||
unsigned long flags;
|
||||
int err = 0;
|
||||
|
||||
spin_lock_irqsave(&ieee->lock, flags);
|
||||
|
||||
switch (wrqu->param.flags & IW_AUTH_INDEX) {
|
||||
case IW_AUTH_WPA_VERSION:
|
||||
case IW_AUTH_CIPHER_PAIRWISE:
|
||||
case IW_AUTH_CIPHER_GROUP:
|
||||
case IW_AUTH_KEY_MGMT:
|
||||
case IW_AUTH_TKIP_COUNTERMEASURES: /* FIXME */
|
||||
case IW_AUTH_80211_AUTH_ALG: /* FIXME */
|
||||
/*
|
||||
* Host AP driver does not use these parameters and allows
|
||||
* wpa_supplicant to control them internally.
|
||||
*/
|
||||
err = -EOPNOTSUPP;
|
||||
break;
|
||||
case IW_AUTH_DROP_UNENCRYPTED:
|
||||
wrqu->param.value = ieee->drop_unencrypted;
|
||||
break;
|
||||
case IW_AUTH_WPA_ENABLED:
|
||||
wrqu->param.value = ieee->wpa_enabled;
|
||||
break;
|
||||
case IW_AUTH_RX_UNENCRYPTED_EAPOL:
|
||||
wrqu->param.value = ieee->ieee802_1x;
|
||||
break;
|
||||
default:
|
||||
err = -EOPNOTSUPP;
|
||||
break;
|
||||
}
|
||||
spin_unlock_irqrestore(&ieee->lock, flags);
|
||||
return err;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(ieee80211_wx_set_encodeext);
|
||||
EXPORT_SYMBOL(ieee80211_wx_get_encodeext);
|
||||
|
||||
EXPORT_SYMBOL(ieee80211_wx_get_scan);
|
||||
EXPORT_SYMBOL(ieee80211_wx_set_encode);
|
||||
EXPORT_SYMBOL(ieee80211_wx_get_encode);
|
||||
|
||||
EXPORT_SYMBOL_GPL(ieee80211_wx_set_auth);
|
||||
EXPORT_SYMBOL_GPL(ieee80211_wx_get_auth);
|
||||
|
@ -84,10 +84,7 @@
|
||||
#include <linux/compat.h>
|
||||
#include <linux/kmod.h>
|
||||
#include <linux/audit.h>
|
||||
|
||||
#ifdef CONFIG_NET_RADIO
|
||||
#include <linux/wireless.h> /* Note : will define WIRELESS_EXT */
|
||||
#endif /* CONFIG_NET_RADIO */
|
||||
#include <linux/wireless.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/unistd.h>
|
||||
@ -840,11 +837,11 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
|
||||
if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) {
|
||||
err = dev_ioctl(cmd, argp);
|
||||
} else
|
||||
#ifdef WIRELESS_EXT
|
||||
#ifdef CONFIG_WIRELESS_EXT
|
||||
if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
|
||||
err = dev_ioctl(cmd, argp);
|
||||
} else
|
||||
#endif /* WIRELESS_EXT */
|
||||
#endif /* CONFIG_WIRELESS_EXT */
|
||||
switch (cmd) {
|
||||
case FIOSETOWN:
|
||||
case SIOCSPGRP:
|
||||
|
Loading…
Reference in New Issue
Block a user