Merge branch 'upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6

This commit is contained in:
Jeff Garzik 2006-01-31 11:50:55 -05:00
commit 0b310f36d7
16 changed files with 946 additions and 552 deletions

View file

@ -6,7 +6,8 @@ menu "Wireless LAN (non-hamradio)"
depends on NETDEVICES depends on NETDEVICES
config NET_RADIO config NET_RADIO
bool "Wireless LAN drivers (non-hamradio) & Wireless Extensions" bool "Wireless LAN drivers (non-hamradio)"
select WIRELESS_EXT
---help--- ---help---
Support for wireless LANs and everything having to do with radio, Support for wireless LANs and everything having to do with radio,
but not with amateur radio or FM broadcasting. but not with amateur radio or FM broadcasting.
@ -239,7 +240,8 @@ config IPW2200_DEBUG
config AIRO config AIRO
tristate "Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards" 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--- ---help---
This is the standard Linux driver to support Cisco/Aironet ISA and This is the standard Linux driver to support Cisco/Aironet ISA and
PCI 802.11 wireless cards. PCI 802.11 wireless cards.
@ -387,6 +389,7 @@ config PCMCIA_SPECTRUM
config AIRO_CS config AIRO_CS
tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards" tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards"
depends on NET_RADIO && PCMCIA && (BROKEN || !M32R) depends on NET_RADIO && PCMCIA && (BROKEN || !M32R)
select CRYPTO
---help--- ---help---
This is the standard Linux driver to support Cisco/Aironet PCMCIA This is the standard Linux driver to support Cisco/Aironet PCMCIA
802.11 wireless cards. This driver is the same as the Aironet 802.11 wireless cards. This driver is the same as the Aironet

View file

@ -36,6 +36,7 @@
#include <linux/in.h> #include <linux/in.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <linux/crypto.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/system.h> #include <asm/system.h>
@ -87,14 +88,6 @@ static struct pci_driver airo_driver = {
#include <linux/delay.h> #include <linux/delay.h>
#endif #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 */ /* Hack to do some power saving */
#define POWER_ON_DOWN #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 writerids(struct net_device *dev, aironet_ioctl *comp);
static int flashcard(struct net_device *dev, aironet_ioctl *comp); static int flashcard(struct net_device *dev, aironet_ioctl *comp);
#endif /* CISCO_EXT */ #endif /* CISCO_EXT */
#ifdef MICSUPPORT
static void micinit(struct airo_info *ai); static void micinit(struct airo_info *ai);
static int micsetup(struct airo_info *ai); static int micsetup(struct airo_info *ai);
static int encapsulate(struct airo_info *ai, etherHead *pPacket, MICBuffer *buffer, int len); 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_rssi_to_dbm (tdsRssiEntry *rssi_rid, u8 rssi);
static u8 airo_dbm_to_pct (tdsRssiEntry *rssi_rid, u8 dbm); static u8 airo_dbm_to_pct (tdsRssiEntry *rssi_rid, u8 dbm);
#include <linux/crypto.h>
#endif
struct airo_info { struct airo_info {
struct net_device_stats stats; struct net_device_stats stats;
struct net_device *dev; struct net_device *dev;
@ -1190,12 +1179,10 @@ struct airo_info {
unsigned long scan_timestamp; /* Time started to scan */ unsigned long scan_timestamp; /* Time started to scan */
struct iw_spy_data spy_data; struct iw_spy_data spy_data;
struct iw_public_data wireless_data; struct iw_public_data wireless_data;
#ifdef MICSUPPORT
/* MIC stuff */ /* MIC stuff */
struct crypto_tfm *tfm; struct crypto_tfm *tfm;
mic_module mod[2]; mic_module mod[2];
mic_statistics micstats; mic_statistics micstats;
#endif
HostRxDesc rxfids[MPI_MAX_FIDS]; // rx/tx/config MPI350 descriptors HostRxDesc rxfids[MPI_MAX_FIDS]; // rx/tx/config MPI350 descriptors
HostTxDesc txfids[MPI_MAX_FIDS]; HostTxDesc txfids[MPI_MAX_FIDS];
HostRidDesc config_desc; 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 flashputbuf(struct airo_info *ai);
static int flashrestart(struct airo_info *ai,struct net_device *dev); static int flashrestart(struct airo_info *ai,struct net_device *dev);
#ifdef MICSUPPORT
/*********************************************************************** /***********************************************************************
* MIC ROUTINES * * MIC ROUTINES *
*********************************************************************** ***********************************************************************
@ -1686,7 +1672,6 @@ static void emmh32_final(emmh32_context *context, u8 digest[4])
digest[2] = (val>>8) & 0xFF; digest[2] = (val>>8) & 0xFF;
digest[3] = val & 0xFF; digest[3] = val & 0xFF;
} }
#endif
static int readBSSListRid(struct airo_info *ai, int first, static int readBSSListRid(struct airo_info *ai, int first,
BSSListRid *list) { BSSListRid *list) {
@ -2005,7 +1990,6 @@ static int mpi_send_packet (struct net_device *dev)
* Firmware automaticly puts 802 header on so * Firmware automaticly puts 802 header on so
* we don't need to account for it in the length * we don't need to account for it in the length
*/ */
#ifdef MICSUPPORT
if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled && if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled &&
(ntohs(((u16 *)buffer)[6]) != 0x888E)) { (ntohs(((u16 *)buffer)[6]) != 0x888E)) {
MICBuffer pMic; MICBuffer pMic;
@ -2022,9 +2006,7 @@ static int mpi_send_packet (struct net_device *dev)
memcpy (sendbuf, &pMic, sizeof(pMic)); memcpy (sendbuf, &pMic, sizeof(pMic));
sendbuf += sizeof(pMic); sendbuf += sizeof(pMic);
memcpy (sendbuf, buffer, len - sizeof(etherHead)); memcpy (sendbuf, buffer, len - sizeof(etherHead));
} else } else {
#endif
{
*payloadLen = cpu_to_le16(len - sizeof(etherHead)); *payloadLen = cpu_to_le16(len - sizeof(etherHead));
dev->trans_start = jiffies; dev->trans_start = jiffies;
@ -2400,9 +2382,7 @@ void stop_airo_card( struct net_device *dev, int freeres )
ai->shared, ai->shared_dma); ai->shared, ai->shared_dma);
} }
} }
#ifdef MICSUPPORT
crypto_free_tfm(ai->tfm); crypto_free_tfm(ai->tfm);
#endif
del_airo_dev( dev ); del_airo_dev( dev );
free_netdev( 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); ai->thr_pid = kernel_thread(airo_thread, dev, CLONE_FS | CLONE_FILES);
if (ai->thr_pid < 0) if (ai->thr_pid < 0)
goto err_out_free; goto err_out_free;
#ifdef MICSUPPORT
ai->tfm = NULL; ai->tfm = NULL;
#endif
rc = add_airo_dev( dev ); rc = add_airo_dev( dev );
if (rc) if (rc)
goto err_out_thr; goto err_out_thr;
@ -2969,10 +2947,8 @@ static int airo_thread(void *data) {
airo_read_wireless_stats(ai); airo_read_wireless_stats(ai);
else if (test_bit(JOB_PROMISC, &ai->flags)) else if (test_bit(JOB_PROMISC, &ai->flags))
airo_set_promisc(ai); airo_set_promisc(ai);
#ifdef MICSUPPORT
else if (test_bit(JOB_MIC, &ai->flags)) else if (test_bit(JOB_MIC, &ai->flags))
micinit(ai); micinit(ai);
#endif
else if (test_bit(JOB_EVENT, &ai->flags)) else if (test_bit(JOB_EVENT, &ai->flags))
airo_send_event(dev); airo_send_event(dev);
else if (test_bit(JOB_AUTOWEP, &ai->flags)) 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 ) { if ( status & EV_MIC ) {
OUT4500( apriv, EVACK, EV_MIC ); OUT4500( apriv, EVACK, EV_MIC );
#ifdef MICSUPPORT
if (test_bit(FLAG_MIC_CAPABLE, &apriv->flags)) { if (test_bit(FLAG_MIC_CAPABLE, &apriv->flags)) {
set_bit(JOB_MIC, &apriv->flags); set_bit(JOB_MIC, &apriv->flags);
wake_up_interruptible(&apriv->thr_wait); wake_up_interruptible(&apriv->thr_wait);
} }
#endif
} }
if ( status & EV_LINK ) { if ( status & EV_LINK ) {
union iwreq_data wrqu; 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); bap_read (apriv, buffer + hdrlen/2, len, BAP0);
} else { } else {
#ifdef MICSUPPORT
MICBuffer micbuf; MICBuffer micbuf;
#endif
bap_read (apriv, buffer, ETH_ALEN*2, BAP0); bap_read (apriv, buffer, ETH_ALEN*2, BAP0);
#ifdef MICSUPPORT
if (apriv->micstats.enabled) { if (apriv->micstats.enabled) {
bap_read (apriv,(u16*)&micbuf,sizeof(micbuf),BAP0); bap_read (apriv,(u16*)&micbuf,sizeof(micbuf),BAP0);
if (ntohs(micbuf.typelen) > 0x05DC) 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); skb_trim (skb, len + hdrlen);
} }
} }
#endif
bap_read(apriv,buffer+ETH_ALEN,len,BAP0); bap_read(apriv,buffer+ETH_ALEN,len,BAP0);
#ifdef MICSUPPORT
if (decapsulate(apriv,&micbuf,(etherHead*)buffer,len)) { if (decapsulate(apriv,&micbuf,(etherHead*)buffer,len)) {
badmic: badmic:
dev_kfree_skb_irq (skb); dev_kfree_skb_irq (skb);
#else
if (0) {
#endif
badrx: badrx:
OUT4500( apriv, EVACK, EV_RX); OUT4500( apriv, EVACK, EV_RX);
goto exitrx; goto exitrx;
@ -3430,10 +3396,8 @@ static void mpi_receive_802_3(struct airo_info *ai)
int len = 0; int len = 0;
struct sk_buff *skb; struct sk_buff *skb;
char *buffer; char *buffer;
#ifdef MICSUPPORT
int off = 0; int off = 0;
MICBuffer micbuf; MICBuffer micbuf;
#endif
memcpy_fromio(&rxd, ai->rxfids[0].card_ram_off, sizeof(rxd)); memcpy_fromio(&rxd, ai->rxfids[0].card_ram_off, sizeof(rxd));
/* Make sure we got something */ /* Make sure we got something */
@ -3448,7 +3412,6 @@ static void mpi_receive_802_3(struct airo_info *ai)
goto badrx; goto badrx;
} }
buffer = skb_put(skb,len); buffer = skb_put(skb,len);
#ifdef MICSUPPORT
memcpy(buffer, ai->rxfids[0].virtual_host_addr, ETH_ALEN * 2); memcpy(buffer, ai->rxfids[0].virtual_host_addr, ETH_ALEN * 2);
if (ai->micstats.enabled) { if (ai->micstats.enabled) {
memcpy(&micbuf, memcpy(&micbuf,
@ -3470,9 +3433,6 @@ badmic:
dev_kfree_skb_irq (skb); dev_kfree_skb_irq (skb);
goto badrx; goto badrx;
} }
#else
memcpy(buffer, ai->rxfids[0].virtual_host_addr, len);
#endif
#ifdef WIRELESS_SPY #ifdef WIRELESS_SPY
if (ai->spy_data.spy_number > 0) { if (ai->spy_data.spy_number > 0) {
char *sa; 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.authType = AUTH_OPEN;
ai->config.modulation = MOD_CCK; ai->config.modulation = MOD_CCK;
#ifdef MICSUPPORT
if ((cap_rid.len>=sizeof(cap_rid)) && (cap_rid.extSoftCap&1) && if ((cap_rid.len>=sizeof(cap_rid)) && (cap_rid.extSoftCap&1) &&
(micsetup(ai) == SUCCESS)) { (micsetup(ai) == SUCCESS)) {
ai->config.opmode |= MODE_MIC; ai->config.opmode |= MODE_MIC;
set_bit(FLAG_MIC_CAPABLE, &ai->flags); set_bit(FLAG_MIC_CAPABLE, &ai->flags);
} }
#endif
/* Save off the MAC */ /* Save off the MAC */
for( i = 0; i < ETH_ALEN; i++ ) { 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; len -= ETH_ALEN * 2;
#ifdef MICSUPPORT
if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled && if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled &&
(ntohs(((u16 *)pPacket)[6]) != 0x888E)) { (ntohs(((u16 *)pPacket)[6]) != 0x888E)) {
if (encapsulate(ai,(etherHead *)pPacket,&pMic,len) != SUCCESS) if (encapsulate(ai,(etherHead *)pPacket,&pMic,len) != SUCCESS)
return ERROR; return ERROR;
miclen = sizeof(pMic); miclen = sizeof(pMic);
} }
#endif
// packet is destination[6], source[6], payload[len-12] // packet is destination[6], source[6], payload[len-12]
// write the payload length and dst/src/payload // write the payload length and dst/src/payload
if (bap_setup(ai, txFid, 0x0036, BAP1) != SUCCESS) return ERROR; 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; Cmd cmd;
Resp rsp; Resp rsp;
APListRid APList_rid; 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) if (awrq->sa_family != ARPHRD_ETHER)
return -EINVAL; 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)); memset(&cmd, 0, sizeof(cmd));
cmd.cmd=CMD_LOSE_SYNC; cmd.cmd=CMD_LOSE_SYNC;
if (down_interruptible(&local->sem)) if (down_interruptible(&local->sem))
@ -6294,6 +6251,267 @@ static int airo_get_encode(struct net_device *dev,
return 0; 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 * Wireless Handler : set Tx-Power
@ -7050,6 +7268,15 @@ static const iw_handler airo_handler[] =
(iw_handler) airo_get_encode, /* SIOCGIWENCODE */ (iw_handler) airo_get_encode, /* SIOCGIWENCODE */
(iw_handler) airo_set_power, /* SIOCSIWPOWER */ (iw_handler) airo_set_power, /* SIOCSIWPOWER */
(iw_handler) airo_get_power, /* SIOCGIWPOWER */ (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. /* 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 AIROGSTAT: ridcode = RID_STATUS; break;
case AIROGSTATSD32: ridcode = RID_STATSDELTA; break; case AIROGSTATSD32: ridcode = RID_STATSDELTA; break;
case AIROGSTATSC32: ridcode = RID_STATS; break; case AIROGSTATSC32: ridcode = RID_STATS; break;
#ifdef MICSUPPORT
case AIROGMICSTATS: case AIROGMICSTATS:
if (copy_to_user(comp->data, &ai->micstats, if (copy_to_user(comp->data, &ai->micstats,
min((int)comp->len,(int)sizeof(ai->micstats)))) min((int)comp->len,(int)sizeof(ai->micstats))))
return -EFAULT; return -EFAULT;
return 0; return 0;
#endif
case AIRORRID: ridcode = comp->ridnum; break; case AIRORRID: ridcode = comp->ridnum; break;
default: default:
return -EINVAL; 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) { static int writerids(struct net_device *dev, aironet_ioctl *comp) {
struct airo_info *ai = dev->priv; struct airo_info *ai = dev->priv;
int ridcode; int ridcode;
#ifdef MICSUPPORT
int enabled; int enabled;
#endif
Resp rsp; Resp rsp;
static int (* writer)(struct airo_info *, u16 rid, const void *, int, int); static int (* writer)(struct airo_info *, u16 rid, const void *, int, int);
unsigned char *iobuf; 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); PC4500_readrid(ai,RID_STATSDELTACLEAR,iobuf,RIDSIZE, 1);
#ifdef MICSUPPORT
enabled = ai->micstats.enabled; enabled = ai->micstats.enabled;
memset(&ai->micstats,0,sizeof(ai->micstats)); memset(&ai->micstats,0,sizeof(ai->micstats));
ai->micstats.enabled = enabled; ai->micstats.enabled = enabled;
#endif
if (copy_to_user(comp->data, iobuf, if (copy_to_user(comp->data, iobuf,
min((int)comp->len, (int)RIDSIZE))) { min((int)comp->len, (int)RIDSIZE))) {

View file

@ -167,7 +167,7 @@ that only one external action is invoked at a time.
#include "ipw2100.h" #include "ipw2100.h"
#define IPW2100_VERSION "1.1.3" #define IPW2100_VERSION "git-1.1.4"
#define DRV_NAME "ipw2100" #define DRV_NAME "ipw2100"
#define DRV_VERSION IPW2100_VERSION #define DRV_VERSION IPW2100_VERSION
@ -1672,6 +1672,18 @@ static int ipw2100_start_scan(struct ipw2100_priv *priv)
return err; 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) static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
{ {
unsigned long flags; unsigned long flags;
@ -1727,6 +1739,13 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
goto exit; 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; lock = LOCK_NONE;
if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) { if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) {
printk(KERN_ERR DRV_NAME 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; struct net_device *dev = priv->net_dev;
const char *p = buf; 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) if (count < 1)
return count; return count;
@ -4070,7 +4089,7 @@ static ssize_t store_scan_age(struct device *d, struct device_attribute *attr,
unsigned long val; unsigned long val;
char *p = buffer; 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"); 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 .host_command_length = 4
}; };
int err = 0; int err = 0;
u32 tmp = tx_power;
if (tx_power != IPW_TX_POWER_DEFAULT) if (tx_power != IPW_TX_POWER_DEFAULT)
tx_power = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 / tmp = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 /
(IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM); (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) if (priv->ieee->iw_mode == IW_MODE_ADHOC)
err = ipw2100_hw_send_command(priv, &cmd); 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); SEC_LEVEL_0, 0, 1);
} else { } else {
auth_mode = IPW_AUTH_OPEN; auth_mode = IPW_AUTH_OPEN;
if ((priv->ieee->sec.flags & SEC_AUTH_MODE) && if (priv->ieee->sec.flags & SEC_AUTH_MODE) {
(priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)) if (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)
auth_mode = IPW_AUTH_SHARED; 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; sec_level = SEC_LEVEL_0;
if (priv->ieee->sec.flags & SEC_LEVEL) 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) { } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) {
sec.auth_mode = WLAN_AUTH_OPEN; sec.auth_mode = WLAN_AUTH_OPEN;
ieee->open_wep = 1; ieee->open_wep = 1;
} else if (value & IW_AUTH_ALG_LEAP) {
sec.auth_mode = WLAN_AUTH_LEAP;
ieee->open_wep = 1;
} else } else
return -EINVAL; return -EINVAL;
@ -5771,8 +5797,8 @@ static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value)
return ret; return ret;
} }
void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv, static void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv,
char *wpa_ie, int wpa_ie_len) char *wpa_ie, int wpa_ie_len)
{ {
struct ipw2100_wpa_assoc_frame frame; struct ipw2100_wpa_assoc_frame frame;

View file

@ -392,8 +392,10 @@ struct ipw2100_notification {
#define IPW_WEP104_CIPHER (1<<5) #define IPW_WEP104_CIPHER (1<<5)
#define IPW_CKIP_CIPHER (1<<6) #define IPW_CKIP_CIPHER (1<<6)
#define IPW_AUTH_OPEN 0 #define IPW_AUTH_OPEN 0
#define IPW_AUTH_SHARED 1 #define IPW_AUTH_SHARED 1
#define IPW_AUTH_LEAP 2
#define IPW_AUTH_LEAP_CISCO_ID 0x80
struct statistic { struct statistic {
int value; int value;

File diff suppressed because it is too large Load diff

View file

@ -33,6 +33,7 @@
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/config.h> #include <linux/config.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/mutex.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
@ -46,6 +47,7 @@
#include <linux/firmware.h> #include <linux/firmware.h>
#include <linux/wireless.h> #include <linux/wireless.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/jiffies.h>
#include <asm/io.h> #include <asm/io.h>
#include <net/ieee80211.h> #include <net/ieee80211.h>
@ -852,7 +854,7 @@ struct ipw_scan_request_ext {
u16 dwell_time[IPW_SCAN_TYPES]; u16 dwell_time[IPW_SCAN_TYPES];
} __attribute__ ((packed)); } __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) if (index % 2)
return scan->scan_type[index / 2] & 0x0F; 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; 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) u8 index, u8 scan_type)
{ {
if (index % 2) if (index % 2)
@ -1120,7 +1122,7 @@ struct ipw_priv {
struct ieee80211_device *ieee; struct ieee80211_device *ieee;
spinlock_t lock; spinlock_t lock;
struct semaphore sem; struct mutex mutex;
/* basic pci-network driver stuff */ /* basic pci-network driver stuff */
struct pci_dev *pci_dev; struct pci_dev *pci_dev;
@ -1406,13 +1408,6 @@ do { if (ipw_debug_level & (level)) \
* Register bit definitions * 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_RW 0x00000008
#define IPW_INTA_MASK_R 0x0000000C #define IPW_INTA_MASK_R 0x0000000C
#define IPW_INDIRECT_ADDR 0x00000010 #define IPW_INDIRECT_ADDR 0x00000010
@ -1459,6 +1454,11 @@ do { if (ipw_debug_level & (level)) \
#define IPW_DOMAIN_0_END 0x1000 #define IPW_DOMAIN_0_END 0x1000
#define CLX_MEM_BAR_SIZE 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_CONTROL_STATUS 0X00200000
#define IPW_BASEBAND_TX_FIFO_WRITE 0X00200004 #define IPW_BASEBAND_TX_FIFO_WRITE 0X00200004
#define IPW_BASEBAND_RX_FIFO_READ 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_BSS_CHANNELS_BG (GET_EEPROM_ADDR(0x2c,LSB)) /* 2 bytes */
#define EEPROM_HW_VERSION (GET_EEPROM_ADDR(0x72,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_0 0
#define EEPROM_NIC_TYPE_1 1 #define EEPROM_NIC_TYPE_1 1
#define EEPROM_NIC_TYPE_2 2 #define EEPROM_NIC_TYPE_2 2
#define EEPROM_NIC_TYPE_3 3 #define EEPROM_NIC_TYPE_3 3
#define EEPROM_NIC_TYPE_4 4 #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_LOWER_BOUND 0x00300000
#define FW_MEM_REG_EEPROM_ACCESS (FW_MEM_REG_LOWER_BOUND + 0x40) #define FW_MEM_REG_EEPROM_ACCESS (FW_MEM_REG_LOWER_BOUND + 0x40)
#define IPW_EVENT_REG (FW_MEM_REG_LOWER_BOUND + 0x04) #define IPW_EVENT_REG (FW_MEM_REG_LOWER_BOUND + 0x04)
@ -1658,9 +1663,10 @@ enum {
IPW_FW_ERROR_FATAL_ERROR IPW_FW_ERROR_FATAL_ERROR
}; };
#define AUTH_OPEN 0 #define AUTH_OPEN 0
#define AUTH_SHARED_KEY 1 #define AUTH_SHARED_KEY 1
#define AUTH_IGNORE 3 #define AUTH_LEAP 2
#define AUTH_IGNORE 3
#define HC_ASSOCIATE 0 #define HC_ASSOCIATE 0
#define HC_REASSOCIATE 1 #define HC_REASSOCIATE 1
@ -1860,7 +1866,7 @@ struct host_cmd {
u8 cmd; u8 cmd;
u8 len; u8 len;
u16 reserved; u16 reserved;
u32 param[TFD_CMD_IMMEDIATE_PAYLOAD_LENGTH]; u32 *param;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct ipw_cmd_log { struct ipw_cmd_log {
@ -1869,21 +1875,23 @@ struct ipw_cmd_log {
struct host_cmd cmd; struct host_cmd cmd;
}; };
#define CFG_BT_COEXISTENCE_MIN 0x00 /* SysConfig command parameters ... */
#define CFG_BT_COEXISTENCE_DEFER 0x02 /* bt_coexistence param */
#define CFG_BT_COEXISTENCE_KILL 0x04 #define CFG_BT_COEXISTENCE_SIGNAL_CHNL 0x01 /* tell BT our chnl # */
#define CFG_BT_COEXISTENCE_WME_OVER_BT 0x08 #define CFG_BT_COEXISTENCE_DEFER 0x02 /* defer our Tx if BT traffic */
#define CFG_BT_COEXISTENCE_OOB 0x10 #define CFG_BT_COEXISTENCE_KILL 0x04 /* kill our Tx if BT traffic */
#define CFG_BT_COEXISTENCE_MAX 0xFF #define CFG_BT_COEXISTENCE_WME_OVER_BT 0x08 /* multimedia extensions */
#define CFG_BT_COEXISTENCE_DEF 0x80 /* read Bt from EEPROM */ #define CFG_BT_COEXISTENCE_OOB 0x10 /* signal BT via out-of-band */
#define CFG_CTS_TO_ITSELF_ENABLED_MIN 0x0 /* clear-to-send to self param */
#define CFG_CTS_TO_ITSELF_ENABLED_MAX 0x1 #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_CTS_TO_ITSELF_ENABLED_DEF CFG_CTS_TO_ITSELF_ENABLED_MIN
#define CFG_SYS_ANTENNA_BOTH 0x000 /* Antenna diversity param (h/w can select best antenna, based on signal) */
#define CFG_SYS_ANTENNA_A 0x001 #define CFG_SYS_ANTENNA_BOTH 0x00 /* NIC selects best antenna */
#define CFG_SYS_ANTENNA_B 0x003 #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 * The definitions below were lifted off the ipw2100 driver, which only

View file

@ -55,10 +55,8 @@
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#ifdef CONFIG_NET_RADIO
#include <linux/wireless.h> #include <linux/wireless.h>
#include <net/iw_handler.h> #include <net/iw_handler.h>
#endif
#include <pcmcia/cs_types.h> #include <pcmcia/cs_types.h>
#include <pcmcia/cs.h> #include <pcmcia/cs.h>

View file

@ -98,11 +98,7 @@
* characteristics of the hardware. Applications such as mobile IP may * characteristics of the hardware. Applications such as mobile IP may
* take advantage of it. * take advantage of it.
* *
* You will need to enable the CONFIG_NET_RADIO define in the kernel * It might be a good idea as well to fetch the wireless tools to
* 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
* configure the device and play a bit. * configure the device and play a bit.
*/ */

View file

@ -99,11 +99,7 @@
* caracteristics of the hardware in a standard way and support for * caracteristics of the hardware in a standard way and support for
* applications for taking advantage of it (like Mobile IP). * applications for taking advantage of it (like Mobile IP).
* *
* You will need to enable the CONFIG_NET_RADIO define in the kernel * It might be a good idea as well to fetch the wireless tools to
* 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
* configure the device and play a bit. * configure the device and play a bit.
*/ */
@ -440,11 +436,8 @@
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/fcntl.h> #include <linux/fcntl.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
#ifdef CONFIG_NET_RADIO
#include <linux/wireless.h> /* Wireless extensions */ #include <linux/wireless.h> /* Wireless extensions */
#include <net/iw_handler.h> /* New driver API */ #include <net/iw_handler.h> /* New driver API */
#endif
/* Pcmcia headers that we need */ /* Pcmcia headers that we need */
#include <pcmcia/cs_types.h> #include <pcmcia/cs_types.h>

View file

@ -1285,6 +1285,14 @@ extern int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee,
extern int ieee80211_wx_get_encodeext(struct ieee80211_device *ieee, extern int ieee80211_wx_get_encodeext(struct ieee80211_device *ieee,
struct iw_request_info *info, struct iw_request_info *info,
union iwreq_data *wrqu, char *extra); 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) static inline void ieee80211_increment_scans(struct ieee80211_device *ieee)
{ {

View file

@ -217,6 +217,9 @@ source "net/irda/Kconfig"
source "net/bluetooth/Kconfig" source "net/bluetooth/Kconfig"
source "net/ieee80211/Kconfig" source "net/ieee80211/Kconfig"
config WIRELESS_EXT
bool
endif # if NET endif # if NET
endmenu # Networking endmenu # Networking

View file

@ -14,5 +14,5 @@ obj-$(CONFIG_XFRM) += flow.o
obj-$(CONFIG_SYSFS) += net-sysfs.o obj-$(CONFIG_SYSFS) += net-sysfs.o
obj-$(CONFIG_NET_DIVERT) += dv.o obj-$(CONFIG_NET_DIVERT) += dv.o
obj-$(CONFIG_NET_PKTGEN) += pktgen.o obj-$(CONFIG_NET_PKTGEN) += pktgen.o
obj-$(CONFIG_NET_RADIO) += wireless.o obj-$(CONFIG_WIRELESS_EXT) += wireless.o
obj-$(CONFIG_NETPOLL) += netpoll.o obj-$(CONFIG_NETPOLL) += netpoll.o

View file

@ -110,10 +110,8 @@
#include <linux/netpoll.h> #include <linux/netpoll.h>
#include <linux/rcupdate.h> #include <linux/rcupdate.h>
#include <linux/delay.h> #include <linux/delay.h>
#ifdef CONFIG_NET_RADIO #include <linux/wireless.h>
#include <linux/wireless.h> /* Note : will define WIRELESS_EXT */
#include <net/iw_handler.h> #include <net/iw_handler.h>
#endif /* CONFIG_NET_RADIO */
#include <asm/current.h> #include <asm/current.h>
/* /*
@ -2028,7 +2026,7 @@ static struct file_operations softnet_seq_fops = {
.release = seq_release, .release = seq_release,
}; };
#ifdef WIRELESS_EXT #ifdef CONFIG_WIRELESS_EXT
extern int wireless_proc_init(void); extern int wireless_proc_init(void);
#else #else
#define wireless_proc_init() 0 #define wireless_proc_init() 0
@ -2581,7 +2579,7 @@ int dev_ioctl(unsigned int cmd, void __user *arg)
ret = -EFAULT; ret = -EFAULT;
return ret; return ret;
} }
#ifdef WIRELESS_EXT #ifdef CONFIG_WIRELESS_EXT
/* Take care of Wireless Extensions */ /* Take care of Wireless Extensions */
if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) { if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
/* If command is `set a parameter', or /* If command is `set a parameter', or
@ -2602,7 +2600,7 @@ int dev_ioctl(unsigned int cmd, void __user *arg)
ret = -EFAULT; ret = -EFAULT;
return ret; return ret;
} }
#endif /* WIRELESS_EXT */ #endif /* CONFIG_WIRELESS_EXT */
return -EINVAL; return -EINVAL;
} }
} }

View file

@ -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 /* Put this code here so that we avoid duplicating it in all
* Rx paths. - Jean II */ * Rx paths. - Jean II */
#ifdef CONFIG_WIRELESS_EXT
#ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */ #ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */
#ifdef CONFIG_NET_RADIO
/* If spy monitoring on */ /* If spy monitoring on */
if (ieee->spy_data.spy_number > 0) { if (ieee->spy_data.spy_number > 0) {
struct iw_quality wstats; struct iw_quality wstats;
@ -397,8 +397,8 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
/* Update spy records */ /* Update spy records */
wireless_spy_update(ieee->dev, hdr->addr2, &wstats); wireless_spy_update(ieee->dev, hdr->addr2, &wstats);
} }
#endif /* CONFIG_NET_RADIO */
#endif /* IW_WIRELESS_SPY */ #endif /* IW_WIRELESS_SPY */
#endif /* CONFIG_WIRELESS_EXT */
#ifdef NOT_YET #ifdef NOT_YET
hostap_update_rx_stats(local->ap, hdr, rx_stats); 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 */ /* skb: hdr + (possibly fragmented) plaintext payload */
// PR: FIXME: hostap has additional conditions in the "if" below: // PR: FIXME: hostap has additional conditions in the "if" below:
// ieee->host_decrypt && (fc & IEEE80211_FCTL_PROTECTED) && // ieee->host_decrypt && (fc & IEEE80211_FCTL_PROTECTED) &&
if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) { if ((frag != 0) || (fc & IEEE80211_FCTL_MOREFRAGS)) {
int flen; int flen;
struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr);
IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag);
@ -1607,6 +1607,30 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee,
header, stats); header, stats);
break; 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: case IEEE80211_STYPE_DEAUTH:
IEEE80211_DEBUG_MGMT("DEAUTH\n"); IEEE80211_DEBUG_MGMT("DEAUTH\n");
if (ieee->handle_deauth != NULL) if (ieee->handle_deauth != NULL)

View file

@ -761,9 +761,98 @@ int ieee80211_wx_get_encodeext(struct ieee80211_device *ieee,
return 0; 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_set_encodeext);
EXPORT_SYMBOL(ieee80211_wx_get_encodeext); EXPORT_SYMBOL(ieee80211_wx_get_encodeext);
EXPORT_SYMBOL(ieee80211_wx_get_scan); EXPORT_SYMBOL(ieee80211_wx_get_scan);
EXPORT_SYMBOL(ieee80211_wx_set_encode); EXPORT_SYMBOL(ieee80211_wx_set_encode);
EXPORT_SYMBOL(ieee80211_wx_get_encode); EXPORT_SYMBOL(ieee80211_wx_get_encode);
EXPORT_SYMBOL_GPL(ieee80211_wx_set_auth);
EXPORT_SYMBOL_GPL(ieee80211_wx_get_auth);

View file

@ -84,10 +84,7 @@
#include <linux/compat.h> #include <linux/compat.h>
#include <linux/kmod.h> #include <linux/kmod.h>
#include <linux/audit.h> #include <linux/audit.h>
#include <linux/wireless.h>
#ifdef CONFIG_NET_RADIO
#include <linux/wireless.h> /* Note : will define WIRELESS_EXT */
#endif /* CONFIG_NET_RADIO */
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/unistd.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)) { if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) {
err = dev_ioctl(cmd, argp); err = dev_ioctl(cmd, argp);
} else } else
#ifdef WIRELESS_EXT #ifdef CONFIG_WIRELESS_EXT
if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) { if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
err = dev_ioctl(cmd, argp); err = dev_ioctl(cmd, argp);
} else } else
#endif /* WIRELESS_EXT */ #endif /* CONFIG_WIRELESS_EXT */
switch (cmd) { switch (cmd) {
case FIOSETOWN: case FIOSETOWN:
case SIOCSPGRP: case SIOCSPGRP: