aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/airo.c
diff options
context:
space:
mode:
authorDan Streetman <ddstreet@ieee.org>2005-11-11 11:41:42 -0500
committerJeff Garzik <jgarzik@pobox.com>2005-12-01 02:40:34 -0500
commitf89b23217372ed9bdba8804c1616d445402d1e05 (patch)
treecb2c44e47590dfca02f98ecd5f7c973db2f241ba /drivers/net/wireless/airo.c
parent127477840b9fd205958203648b9fa89860d69a43 (diff)
[PATCH] airo.c: add support for IW_ENCODE_TEMP (i.e. xsupplicant)
Hello Jeff, this patch changes causes the airo driver to not reset the card when a temporary WEP key is set, when the IW_ENCODE_TEMP flag is used. This is needed for xsupplicant as 802.1x, LEAP, etc. change WEP keys frequently after authentication and resetting the card causes infinite reauthentication. Javier and Jean agree with the patch, Javier suggested I send this to you, can you apply this? Thanks. Signed-off-by: Dan Streetman <ddstreet@ieee.org> Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers/net/wireless/airo.c')
-rw-r--r--drivers/net/wireless/airo.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c
index 340ab4ee4b67..6c4aa7b6a21b 100644
--- a/drivers/net/wireless/airo.c
+++ b/drivers/net/wireless/airo.c
@@ -4037,7 +4037,7 @@ static int PC4500_writerid(struct airo_info *ai, u16 rid,
4037 Cmd cmd; 4037 Cmd cmd;
4038 Resp rsp; 4038 Resp rsp;
4039 4039
4040 if (test_bit(FLAG_ENABLED, &ai->flags)) 4040 if (test_bit(FLAG_ENABLED, &ai->flags) && (RID_WEP_TEMP != rid))
4041 printk(KERN_ERR 4041 printk(KERN_ERR
4042 "%s: MAC should be disabled (rid=%04x)\n", 4042 "%s: MAC should be disabled (rid=%04x)\n",
4043 __FUNCTION__, rid); 4043 __FUNCTION__, rid);
@@ -5093,9 +5093,9 @@ static int set_wep_key(struct airo_info *ai, u16 index,
5093 printk(KERN_INFO "Setting key %d\n", index); 5093 printk(KERN_INFO "Setting key %d\n", index);
5094 } 5094 }
5095 5095
5096 disable_MAC(ai, lock); 5096 if (perm) disable_MAC(ai, lock);
5097 writeWepKeyRid(ai, &wkr, perm, lock); 5097 writeWepKeyRid(ai, &wkr, perm, lock);
5098 enable_MAC(ai, &rsp, lock); 5098 if (perm) enable_MAC(ai, &rsp, lock);
5099 return 0; 5099 return 0;
5100} 5100}
5101 5101
@@ -6170,6 +6170,8 @@ static int airo_set_encode(struct net_device *dev,
6170{ 6170{
6171 struct airo_info *local = dev->priv; 6171 struct airo_info *local = dev->priv;
6172 CapabilityRid cap_rid; /* Card capability info */ 6172 CapabilityRid cap_rid; /* Card capability info */
6173 int perm = ( dwrq->flags & IW_ENCODE_TEMP ? 0 : 1 );
6174 u16 currentAuthType = local->config.authType;
6173 6175
6174 /* Is WEP supported ? */ 6176 /* Is WEP supported ? */
6175 readCapabilityRid(local, &cap_rid, 1); 6177 readCapabilityRid(local, &cap_rid, 1);
@@ -6212,7 +6214,7 @@ static int airo_set_encode(struct net_device *dev,
6212 /* Copy the key in the driver */ 6214 /* Copy the key in the driver */
6213 memcpy(key.key, extra, dwrq->length); 6215 memcpy(key.key, extra, dwrq->length);
6214 /* Send the key to the card */ 6216 /* Send the key to the card */
6215 set_wep_key(local, index, key.key, key.len, 1, 1); 6217 set_wep_key(local, index, key.key, key.len, perm, 1);
6216 } 6218 }
6217 /* WE specify that if a valid key is set, encryption 6219 /* WE specify that if a valid key is set, encryption
6218 * should be enabled (user may turn it off later) 6220 * should be enabled (user may turn it off later)
@@ -6220,13 +6222,12 @@ static int airo_set_encode(struct net_device *dev,
6220 if((index == current_index) && (key.len > 0) && 6222 if((index == current_index) && (key.len > 0) &&
6221 (local->config.authType == AUTH_OPEN)) { 6223 (local->config.authType == AUTH_OPEN)) {
6222 local->config.authType = AUTH_ENCRYPT; 6224 local->config.authType = AUTH_ENCRYPT;
6223 set_bit (FLAG_COMMIT, &local->flags);
6224 } 6225 }
6225 } else { 6226 } else {
6226 /* Do we want to just set the transmit key index ? */ 6227 /* Do we want to just set the transmit key index ? */
6227 int index = (dwrq->flags & IW_ENCODE_INDEX) - 1; 6228 int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
6228 if ((index >= 0) && (index < ((cap_rid.softCap & 0x80)?4:1))) { 6229 if ((index >= 0) && (index < ((cap_rid.softCap & 0x80)?4:1))) {
6229 set_wep_key(local, index, NULL, 0, 1, 1); 6230 set_wep_key(local, index, NULL, 0, perm, 1);
6230 } else 6231 } else
6231 /* Don't complain if only change the mode */ 6232 /* Don't complain if only change the mode */
6232 if(!dwrq->flags & IW_ENCODE_MODE) { 6233 if(!dwrq->flags & IW_ENCODE_MODE) {
@@ -6241,7 +6242,7 @@ static int airo_set_encode(struct net_device *dev,
6241 if(dwrq->flags & IW_ENCODE_OPEN) 6242 if(dwrq->flags & IW_ENCODE_OPEN)
6242 local->config.authType = AUTH_ENCRYPT; // Only Wep 6243 local->config.authType = AUTH_ENCRYPT; // Only Wep
6243 /* Commit the changes to flags if needed */ 6244 /* Commit the changes to flags if needed */
6244 if(dwrq->flags & IW_ENCODE_MODE) 6245 if (local->config.authType != currentAuthType)
6245 set_bit (FLAG_COMMIT, &local->flags); 6246 set_bit (FLAG_COMMIT, &local->flags);
6246 return -EINPROGRESS; /* Call commit handler */ 6247 return -EINPROGRESS; /* Call commit handler */
6247} 6248}