Hi, This is a patch that adds support for the IW_ENCODE_TEMP flag when setting WEP keys. Currently, the code sets both the TEMP and PERM wep keys. This patch change that to set either the TEMP only or TEMP and PERM keys. If only the TEMP keys are being set, the MAC is not disabled. Also, the warning message isn't displayed if only the TEMP keys are being set. Finally, the FLAG_COMMIT bit setting is changed to only be set if the authentication type has changed, which is really what the code wanted to do. I need this because I would like to be able to use my T40 (with a Cisco 350 MPI) with 802.1x/xsupplicant, but to do that when setting WEP keys only the temporary keys can be set. Setting the permanent keys requires disabling/enabling the MAC, and that resets the card, which causes re-authentication, etc. So I sent a patch to the xsupplicant guys adding support for the IW_ENCODE_TEMP flag when setting keys, hopefully they will add that. --- linux-2.6.10-rc2-clean/drivers/net/wireless/airo.c 2004-12-02 12:25:54.000000000 -0500 +++ linux-2.6.10-rc2/drivers/net/wireless/airo.c 2004-12-02 15:25:40.000000000 -0500 @@ -4048,7 +4048,7 @@ Cmd cmd; Resp rsp; - if (test_bit(FLAG_ENABLED, &ai->flags)) + if (test_bit(FLAG_ENABLED, &ai->flags) && (RID_WEP_TEMP != rid)) printk(KERN_ERR "%s: MAC should be disabled (rid=%04x)\n", __FUNCTION__, rid); @@ -5108,9 +5108,9 @@ printk(KERN_INFO "Setting key %d\n", index); } - disable_MAC(ai, lock); + if (perm) disable_MAC(ai, lock); writeWepKeyRid(ai, &wkr, perm, lock); - enable_MAC(ai, &rsp, lock); + if (perm) enable_MAC(ai, &rsp, lock); return 0; } @@ -6168,6 +6168,8 @@ { struct airo_info *local = dev->priv; CapabilityRid cap_rid; /* Card capability info */ + int perm = ( dwrq->flags & IW_ENCODE_TEMP ? 0 : 1 ); + u16 currentAuthType = local->config.authType; /* Is WEP supported ? */ readCapabilityRid(local, &cap_rid, 1); @@ -6210,7 +6212,7 @@ /* Copy the key in the driver */ memcpy(key.key, extra, dwrq->length); /* Send the key to the card */ - set_wep_key(local, index, key.key, key.len, 1, 1); + set_wep_key(local, index, key.key, key.len, perm, 1); } /* WE specify that if a valid key is set, encryption * should be enabled (user may turn it off later) @@ -6218,13 +6220,12 @@ if((index == current_index) && (key.len > 0) && (local->config.authType == AUTH_OPEN)) { local->config.authType = AUTH_ENCRYPT; - set_bit (FLAG_COMMIT, &local->flags); } } else { /* Do we want to just set the transmit key index ? */ int index = (dwrq->flags & IW_ENCODE_INDEX) - 1; if ((index >= 0) && (index < ((cap_rid.softCap & 0x80)?4:1))) { - set_wep_key(local, index, NULL, 0, 1, 1); + set_wep_key(local, index, NULL, 0, perm, 1); } else /* Don't complain if only change the mode */ if(!dwrq->flags & IW_ENCODE_MODE) { @@ -6239,7 +6240,7 @@ if(dwrq->flags & IW_ENCODE_OPEN) local->config.authType = AUTH_ENCRYPT; // Only Wep /* Commit the changes to flags if needed */ - if(dwrq->flags & IW_ENCODE_MODE) + if (local->config.authType != currentAuthType) set_bit (FLAG_COMMIT, &local->flags); return -EINPROGRESS; /* Call commit handler */ } - : send the line "unsubscribe linux-net" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html