Hi, This patch moves the WEP handling code to use the softmac layer and implements acx_e_ieee80211_set_security(), based on the rt2x00 project's one.
I do have a couple of questions though: 1) adev->wep_restricted = 0 is the same as an open auth system, and adev->wep_restricted = 1 is the same as having a shared key auth system, right? 2) What is the purpose of the index field in key_struct_t? I've assumed it is the same as adev->wep_current_index, but I'm not sure this is correct. cmn -- Carlos Martín http://www.cmartin.tk "Erdbeben? Sicherlich etwas, das mit Erdberen zu tun hat." -- me, paraphrased
diff -urp acxsm-0123.orig/acx_struct.h acxsm-0123/acx_struct.h --- acxsm-0123.orig/acx_struct.h 2006-01-16 15:25:41.000000000 +0100 +++ acxsm-0123/acx_struct.h 2006-01-29 14:06:17.000000000 +0100 @@ -603,31 +603,6 @@ typedef struct fw_ver { #define FW_ID_SIZE 20 - -/*--- WEP stuff --------------------------------------------------------------*/ -#define DOT11_MAX_DEFAULT_WEP_KEYS 4 - -/* non-firmware struct, no packing necessary */ -typedef struct wep_key { - size_t size; /* most often used member first */ - u8 index; - u8 key[29]; - u16 strange_filler; -} wep_key_t; /* size = 264 bytes (33*8) */ -/* FIXME: We don't have size 264! Or is there 2 bytes beyond the key - * (strange_filler)? */ - -/* non-firmware struct, no packing necessary */ -typedef struct key_struct { - u8 addr[ETH_ALEN]; /* 0x00 */ - u16 filler1; /* 0x06 */ - u32 filler2; /* 0x08 */ - u32 index; /* 0x0c */ - u16 len; /* 0x10 */ - u8 key[29]; /* 0x12; is this long enough??? */ -} key_struct_t; /* size = 276. FIXME: where is the remaining space?? */ - - /*--- Client (peer) info -----------------------------------------------------*/ /* adev->sta_list[] is used for: ** accumulating and processing of scan results @@ -1286,14 +1261,6 @@ struct acx_device { u8 rate_supported_len; u8 rate_supported[13]; - /*** Encryption settings (WEP) ***/ - u32 auth_alg; /* used in transmit_authen1 */ - u8 wep_enabled; - u8 wep_restricted; - u8 wep_current_index; - wep_key_t wep_keys[DOT11_MAX_DEFAULT_WEP_KEYS]; /* the default WEP keys */ - key_struct_t wep_key_struct[10]; - /*** Unknown ***/ u8 dtim_interval; diff -urp acxsm-0123.orig/common.c acxsm-0123/common.c --- acxsm-0123.orig/common.c 2006-01-19 11:28:23.000000000 +0100 +++ acxsm-0123/common.c 2006-01-29 14:59:46.000000000 +0100 @@ -1137,8 +1137,8 @@ acx_s_proc_diag_output(char *buf, acx_de "WEP ena %d, restricted %d, idx %d\n", adev->essid, adev->essid_active, (int)adev->essid_len, adev->essid_for_assoc, adev->nick, - adev->wep_enabled, adev->wep_restricted, - adev->wep_current_index); + adev->ieee->sec.enabled, adev->ieee->sec.auth_mode, + adev->ieee->sec.active_key); p += sprintf(p, "dev_addr "MACSTR"\n", MAC(adev->dev_addr)); p += sprintf(p, "bssid "MACSTR"\n", MAC(adev->bssid)); p += sprintf(p, "ap_filter "MACSTR"\n", MAC(adev->ap)); @@ -2143,7 +2143,7 @@ acx_s_set_defaults(acx_device_t *adev) /* reported to break scanning: adev->scan_probe_delay = adev->cfgopt_probe_delay; */ adev->scan_rate = ACX_SCAN_RATE_1; - adev->auth_alg = WLAN_AUTH_ALG_OPENSYSTEM; + adev->ieee->sec.auth_mode = WLAN_AUTH_OPEN; adev->preamble_mode = 2; /* auto */ adev->listen_interval = 100; adev->beacon_interval = DEFAULT_BEACON_INTERVAL; @@ -5435,14 +5435,14 @@ acx100_s_set_wepkey(acx_device_t *adev) ie_dot11WEPDefaultKey_t dk; int i; - for (i = 0; i < DOT11_MAX_DEFAULT_WEP_KEYS; i++) { - if (adev->wep_keys[i].size != 0) { + for (i = 0; i < WEP_KEYS; i++) { + if (adev->ieee->sec.key_sizes[i] != 0) { log(L_INIT, "setting WEP key: %d with " - "total size: %d\n", i, (int) adev->wep_keys[i].size); + "total size: %d\n", i, (int) adev->ieee->sec.key_sizes[i]); dk.action = 1; - dk.keySize = adev->wep_keys[i].size; + dk.keySize = adev->ieee->sec.key_sizes[i]; dk.defaultKeyNum = i; - memcpy(dk.key, adev->wep_keys[i].key, dk.keySize); + memcpy(dk.key, adev->ieee->sec.keys[i], dk.keySize); acx_s_configure(adev, &dk, ACX100_IE_DOT11_WEP_DEFAULT_KEY_WRITE); } } @@ -5454,20 +5454,20 @@ acx111_s_set_wepkey(acx_device_t *adev) acx111WEPDefaultKey_t dk; int i; - for (i = 0; i < DOT11_MAX_DEFAULT_WEP_KEYS; i++) { - if (adev->wep_keys[i].size != 0) { + for (i = 0; i < WEP_KEYS; i++) { + if (adev->ieee->sec.key_sizes[i] != 0) { log(L_INIT, "setting WEP key: %d with " - "total size: %d\n", i, (int) adev->wep_keys[i].size); + "total size: %d\n", i, (int) adev->ieee->sec.key_sizes[i]); memset(&dk, 0, sizeof(dk)); dk.action = cpu_to_le16(1); /* "add key"; yes, that's a 16bit value */ - dk.keySize = adev->wep_keys[i].size; + dk.keySize = adev->ieee->sec.key_sizes[i]; /* are these two lines necessary? */ dk.type = 0; /* default WEP key */ dk.index = 0; /* ignored when setting default key */ dk.defaultKeyNum = i; - memcpy(dk.key, adev->wep_keys[i].key, dk.keySize); + memcpy(dk.key, adev->ieee->sec.keys[i], dk.keySize); acx_s_issue_cmd(adev, ACX1xx_CMD_WEP_MGMT, &dk, sizeof(dk)); } } @@ -5514,7 +5514,7 @@ acx100_s_init_wep(acx_device_t *adev) } /* let's choose maximum setting: 4 default keys, plus 10 other keys: */ - options.NumKeys = cpu_to_le16(DOT11_MAX_DEFAULT_WEP_KEYS + 10); + options.NumKeys = cpu_to_le16(WEP_KEYS + 10); options.WEPOption = 0x00; log(L_ASSOC, "%s: writing WEP options\n", __func__); @@ -5522,10 +5522,10 @@ acx100_s_init_wep(acx_device_t *adev) acx100_s_set_wepkey(adev); - if (adev->wep_keys[adev->wep_current_index].size != 0) { + if (adev->ieee->sec.key_sizes[adev->ieee->sec.active_key] != 0) { log(L_ASSOC, "setting active default WEP key number: %d\n", - adev->wep_current_index); - dk.KeyID = adev->wep_current_index; + adev->ieee->sec.active_key); + dk.KeyID = adev->ieee->sec.active_key; acx_s_configure(adev, &dk, ACX1xx_IE_DOT11_WEP_DEFAULT_KEY_SET); /* 0x1010 */ } /* FIXME!!! wep_key_struct is filled nowhere! But adev @@ -6581,7 +6581,7 @@ acx_s_update_card_settings(acx_device_t acx_s_set_wepkey(adev); - dkey.KeyID = adev->wep_current_index; + dkey.KeyID = adev->ieee->sec.active_key; log(L_INIT, "setting WEP key %u as default\n", dkey.KeyID); acx_s_configure(adev, &dkey, ACX1xx_IE_DOT11_WEP_DEFAULT_KEY_SET); #ifdef DEBUG_WEP @@ -6602,7 +6602,7 @@ acx_s_update_card_settings(acx_device_t /* let's choose maximum setting: 4 default keys, * plus 10 other keys: */ - options.NumKeys = cpu_to_le16(DOT11_MAX_DEFAULT_WEP_KEYS + 10); + options.NumKeys = cpu_to_le16(WEP_KEYS + 10); /* don't decrypt default key only, * don't override decryption: */ options.WEPOption = 0; @@ -6905,7 +6905,7 @@ acx_update_capabilities(acx_device_t *ad /* other types of stations do not emit beacons */ } - if (adev->wep_restricted) { + if (adev->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY) { SET_BIT(cap, WF_MGMT_CAP_PRIVACY); } if (adev->cfgopt_dot11ShortPreambleOption) { @@ -7135,10 +7135,74 @@ module_exit(acx_e_cleanup_module) //SM void -acx_e_ieee80211_set_security(struct net_device *dev, +acx_e_ieee80211_set_security(struct net_device *ndev, struct ieee80211_security *sec) { -//todo +/* Shamelessly copied from the rt2x00 project. */ + acx_device_t *adev = ndev2adev(ndev); + unsigned long flags; + int i; + + acx_sem_lock(adev); + acx_lock(adev, flags); + + for (i = 0; i < WEP_KEYS; ++i) { + /* This gives us the flag for the 4 WEP keys. */ + if (sec->flags & (1 << i)) { + adev->ieee->sec.encode_alg[i] = sec->encode_alg[i]; + adev->ieee->sec.key_sizes[i] = sec->key_sizes[i]; + + if (sec->key_sizes[i] != 0) { + memcpy(adev->ieee->sec.keys[i], sec->keys[i], + sec->key_sizes[i]); + /* Make sure WEP flag is set. */ + adev->ieee->sec.flags |= (1 << i); + } else if (sec->level != SEC_LEVEL_1) + /* Make sure WEP flag isn't set. */ + adev->ieee->sec.flags &= ~(1 << i); + } + SET_BIT(adev->set_mask, SET_WEP_OPTIONS); + } + + if (sec->flags & SEC_ACTIVE_KEY) { + /* Check the key number is valid. */ + if (sec->active_key < WEP_KEYS) { + adev->ieee->sec.active_key = sec->active_key; + adev->ieee->sec.flags |= SEC_ACTIVE_KEY; + } else + adev->ieee->sec.flags &= ~SEC_ACTIVE_KEY; + + } else + adev->ieee->sec.flags &= ~SEC_ACTIVE_KEY; + + if (sec->flags & SEC_AUTH_MODE) { + adev->ieee->sec.auth_mode = sec->auth_mode; + adev->ieee->sec.flags |= SEC_AUTH_MODE; + SET_BIT(adev->set_mask, SET_WEP_OPTIONS); + } + + if (sec->flags & SEC_ENCRYPT) { + adev->ieee->sec.encrypt = sec->encrypt; + adev->ieee->sec.flags |= SEC_ENCRYPT; + SET_BIT(adev->set_mask, GETSET_WEP); + } + + if (sec->flags & SEC_ENABLED) { + adev->ieee->sec.enabled = sec->enabled; + adev->ieee->sec.flags |= SEC_ENABLED; + SET_BIT(adev->set_mask, GETSET_WEP); + } + + if (sec->flags & SEC_LEVEL) { + adev->ieee->sec.level = sec->level; + adev->ieee->sec.flags |= SEC_LEVEL; + SET_BIT(adev->set_mask, GETSET_WEP); + } + + acx_unlock(adev, flags); + acx_sem_unlock(adev); + + acx_s_update_card_settings(adev); } diff -urp acxsm-0123.orig/ioctl.c acxsm-0123/ioctl.c --- acxsm-0123.orig/ioctl.c 2006-01-16 15:25:41.000000000 +0100 +++ acxsm-0123/ioctl.c 2006-01-29 14:07:08.000000000 +0100 @@ -1024,7 +1024,7 @@ acx_ioctl_set_encode( if (dwrq->length > 0) { /* if index is 0 or invalid, use default key */ if ((index < 0) || (index > 3)) - index = (int)adev->wep_current_index; + index = (int)adev->ieee->sec.active_key; if (0 == (dwrq->flags & IW_ENCODE_NOKEY)) { if (dwrq->length > 29) @@ -1032,26 +1032,26 @@ acx_ioctl_set_encode( if (dwrq->length > 13) { /* 29*8 == 232, WEP256 */ - adev->wep_keys[index].size = 29; + adev->ieee->sec.key_sizes[index] = 29; } else if (dwrq->length > 5) { /* 13*8 == 104bit, WEP128 */ - adev->wep_keys[index].size = 13; + adev->ieee->sec.key_sizes[index] = 13; } else if (dwrq->length > 0) { /* 5*8 == 40bit, WEP64 */ - adev->wep_keys[index].size = 5; + adev->ieee->sec.key_sizes[index] = 5; } else { /* disable key */ - adev->wep_keys[index].size = 0; + adev->ieee->sec.key_sizes[index] = 0; } - memset(adev->wep_keys[index].key, 0, - sizeof(adev->wep_keys[index].key)); - memcpy(adev->wep_keys[index].key, extra, dwrq->length); + memset(adev->ieee->sec.keys[index], 0, + sizeof(adev->ieee->sec.keys[index])); + memcpy(adev->ieee->sec.keys[index], extra, dwrq->length); } } else { /* set transmit key */ if ((index >= 0) && (index <= 3)) - adev->wep_current_index = index; + adev->ieee->sec.active_key = index; else if (0 == (dwrq->flags & IW_ENCODE_MODE)) { /* complain if we were not just setting * the key mode */ @@ -1060,15 +1060,13 @@ acx_ioctl_set_encode( } } - adev->wep_enabled = !(dwrq->flags & IW_ENCODE_DISABLED); + adev->ieee->sec.enabled = !(dwrq->flags & IW_ENCODE_DISABLED); if (dwrq->flags & IW_ENCODE_OPEN) { - adev->auth_alg = WLAN_AUTH_ALG_OPENSYSTEM; - adev->wep_restricted = 0; + adev->ieee->sec.auth_mode = WLAN_AUTH_OPEN; } else if (dwrq->flags & IW_ENCODE_RESTRICTED) { - adev->auth_alg = WLAN_AUTH_ALG_SHAREDKEY; - adev->wep_restricted = 1; + adev->ieee->sec.auth_mode = WLAN_AUTH_SHARED_KEY; } /* set flag to make sure the card WEP settings get updated */ @@ -1078,11 +1076,11 @@ acx_ioctl_set_encode( dwrq->length, extra, dwrq->flags); for (index = 0; index <= 3; index++) { - if (adev->wep_keys[index].size) { + if (adev->ieee->sec.key_sizes[index]) { log(L_IOCTL, "index=%d, size=%d, key at 0x%p\n", - adev->wep_keys[index].index, - (int) adev->wep_keys[index].size, - adev->wep_keys[index].key); + adev->ieee->sec.active_key, + (int) adev->ieee->sec.key_sizes[index], + adev->ieee->sec.keys[index]); } } result = -EINPROGRESS; @@ -1111,18 +1109,18 @@ acx_ioctl_get_encode( FN_ENTER; - if (adev->wep_enabled == 0) { + if (adev->ieee->sec.enabled == 0) { dwrq->flags = IW_ENCODE_DISABLED; } else { if ((index < 0) || (index > 3)) - index = (int)adev->wep_current_index; + index = (int)adev->ieee->sec.active_key; - dwrq->flags = (adev->wep_restricted == 1) ? + dwrq->flags = (adev->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY) ? IW_ENCODE_RESTRICTED : IW_ENCODE_OPEN; - dwrq->length = adev->wep_keys[index].size; + dwrq->length = adev->ieee->sec.key_sizes[index]; - memcpy(extra, adev->wep_keys[index].key, - adev->wep_keys[index].size); + memcpy(extra, adev->ieee->sec.keys[index], + adev->ieee->sec.key_sizes[index]); } /* set the current index */ diff -urp acxsm-0123.orig/pci.c acxsm-0123/pci.c --- acxsm-0123.orig/pci.c 2006-01-22 16:48:35.000000000 +0100 +++ acxsm-0123/pci.c 2006-01-29 15:23:51.000000000 +0100 @@ -1641,6 +1641,10 @@ acxpci_e_probe(struct pci_dev *pdev, con adev->softmac = ieee80211_priv(ndev); adev->softmac->set_channel = acx_e_ieee80211_set_chan; + adev->ieee->sec.encrypt = 0; + adev->ieee->sec.enabled = 0; + adev->ieee->sec.auth_mode = WLAN_AUTH_OPEN; + #ifdef NONESSENTIAL_FEATURES acx_show_card_eeprom_id(adev); #endif /* NONESSENTIAL_FEATURES */ diff -urp acxsm-0123.orig/usb.c acxsm-0123/usb.c --- acxsm-0123.orig/usb.c 2006-01-15 23:55:25.000000000 +0100 +++ acxsm-0123/usb.c 2006-01-28 20:59:40.000000000 +0100 @@ -677,6 +677,10 @@ acxusb_e_probe(struct usb_interface *int adev->softmac = ieee80211_priv(ndev); adev->softmac->set_channel = acx_e_ieee80211_set_chan; + adev->ieee->sec.enabled = 0; + adev->ieee->sec.encrypt = 0; + adev->ieee->sec.auth_mode = WLAN_AUTH_OPEN; + /* Check that this is really the hardware we know about. ** If not sure, at least notify the user that he ** may be in trouble...
pgpZVoWGDsRGw.pgp
Description: PGP signature