582
593
TRACEEXIT1(return 0);
596
/* index must be 0 - N, as per NDIS */
597
int add_wep_key(struct ndis_handle *handle, char *key, int key_len,
600
struct ndis_encr_key ndis_key;
603
TRACEENTER2("handle = %p", handle);
604
if (key_len <= 0 || key_len > NDIS_ENCODING_TOKEN_MAX) {
605
WARNING("invalid key length (%d)", key_len);
606
TRACEEXIT2(return -EINVAL);
608
ndis_key.struct_size = sizeof(ndis_key);
609
ndis_key.length = key_len;
610
memcpy(&ndis_key.key, key, key_len);
611
/* active/transmit key works only if index is 0 */
612
if (index == handle->encr_info.active)
613
ndis_key.index = 0 | (1 << 31);
615
ndis_key.index = index;
617
res = miniport_set_info(handle, NDIS_OID_ADD_WEP, (char *)&ndis_key,
619
if (res == NDIS_STATUS_INVALID_DATA) {
620
WARNING("adding encryption key %d failed (%08X)",
622
TRACEEXIT1(return -EINVAL);
625
/* Atheros driver messes up ndis_key during ADD_WEP, so
626
* don't rely on that; instead use info in key and key_len */
627
handle->encr_info.keys[index].length = key_len;
628
memcpy(&handle->encr_info.keys[index].key, key, key_len);
630
/* active/transmit key is always stored at index 0 */
631
if (index == handle->encr_info.active) {
632
handle->encr_info.keys[0].length = key_len;
633
memcpy(&handle->encr_info.keys[0].key, key, key_len);
634
res = set_encr_mode(handle, ENCR1_ENABLED);
636
WARNING("changing encr status failed (%08X)", res);
638
TRACEEXIT1(return 0);
585
641
static int iw_set_encr(struct net_device *dev, struct iw_request_info *info,
586
642
union iwreq_data *wrqu, char *extra)
588
644
struct ndis_handle *handle = dev->priv;
589
unsigned int res, written, needed, index;
645
unsigned int res, index;
590
646
struct encr_info *encr_info = &handle->encr_info;
591
struct ndis_encr_key ndis_key;
593
650
TRACEENTER1("%s", "");
594
651
index = (wrqu->encoding.flags & IW_ENCODE_INDEX);
595
652
DBGTRACE2("index = %u", index);
596
if (index > MAX_ENCR_KEYS)
654
/* iwconfig gives index as 1 - N */
658
index = encr_info->active;
660
if (index < 0 || index >= MAX_ENCR_KEYS) {
598
661
WARNING("encryption index out of range (%u)", index);
599
662
TRACEEXIT1(return -EINVAL);
603
index = encr_info->active;
607
665
/* remove key if disabled */
608
if (wrqu->data.flags & IW_ENCODE_DISABLED)
666
if (wrqu->data.flags & IW_ENCODE_DISABLED) {
610
667
unsigned long keyindex = index;
611
res = dosetinfo(handle, NDIS_OID_REMOVE_WEP,
612
(char *)&keyindex, sizeof(keyindex),
614
if (res == NDIS_STATUS_INVALID_DATA)
668
res = miniport_set_info(handle, NDIS_OID_REMOVE_WEP,
669
(char *)&keyindex, sizeof(keyindex));
670
if (res == NDIS_STATUS_INVALID_DATA) {
616
671
WARNING("removing encryption key %d failed (%08X)",
618
673
TRACEEXIT1(return -EINVAL);
635
689
res = set_auth_mode(handle, AUTHMODE_OPEN);
636
690
else // if (wrqu->data.flags & IW_ENCODE_RESTRICTED)
637
691
res = set_auth_mode(handle, AUTHMODE_RESTRICTED);
640
693
WARNING("setting authentication mode failed (%08X)", res);
641
694
TRACEEXIT1(return -EINVAL);
644
ndis_key.struct_size = sizeof(ndis_key);
645
if (wrqu->data.length == 0)
647
/* should we allow as yet unset tx_key? */
648
if (encr_info->keys[index].length == 0)
697
if (wrqu->data.length > 0) {
698
key_len = wrqu->data.length;
700
} else { // must be set as tx key
701
if (encr_info->keys[index].length == 0) {
650
702
WARNING("key %d is not set", index+1);
651
703
TRACEEXIT1(return -EINVAL);
653
ndis_key.length = encr_info->keys[index].length;
654
ndis_key.index = index | (1 << 31);
655
memcpy(ndis_key.key, encr_info->keys[index].key,
658
else // if (wrqu->data.length > 0)
660
if (wrqu->data.length > NDIS_ENCODING_TOKEN_MAX)
662
WARNING("invalid key length (%d)", wrqu->data.length);
663
TRACEEXIT(return -EINVAL);
665
ndis_key.length = wrqu->data.length;
666
ndis_key.index = index;
667
if (index == encr_info->active)
668
ndis_key.index |= 1 << 31;
669
memcpy(&ndis_key.key, extra, ndis_key.length);
672
res = dosetinfo(handle, NDIS_OID_ADD_WEP, (char *)&ndis_key,
673
sizeof(ndis_key), &written, &needed);
674
if (res == NDIS_STATUS_INVALID_DATA)
676
WARNING("adding encryption key %d failed (%08X)",
678
TRACEEXIT1(return -EINVAL);
681
res = set_encr_mode(handle, ENCR1_ENABLED);
683
WARNING("changing encr status failed (%08X)", res);
685
encr_info->keys[index].length = ndis_key.length;
686
memcpy(&encr_info->keys[index].key, ndis_key.key, ndis_key.length);
687
if (wrqu->data.length == 0)
705
key_len = encr_info->keys[index].length;
706
key = encr_info->keys[index].key;
688
707
encr_info->active = index;
690
/* ndis drivers want essid to be set after setting encr */
691
set_essid(handle, handle->essid.essid, handle->essid.length);
710
if (add_wep_key(handle, key, key_len, index))
711
TRACEEXIT2(return -EINVAL);
713
if (index == encr_info->active) {
714
/* ndis drivers want essid to be set after setting encr */
715
set_essid(handle, handle->essid.essid, handle->essid.length);
693
717
TRACEEXIT1(return 0);
817
845
iwe.u.data.length = strlen(buf);
818
846
event = iwe_stream_add_point(event, end_buf, &iwe, buf);
820
if (item->length > ((char *)&item->rates[NDIS_MAX_RATES] -
821
(char *)&item->length) &&
822
item->ie_length >= (sizeof(struct fixed_ies) + 2))
824
struct fixed_ies *fixed_ies = (struct fixed_ies *)item->ies;
825
unsigned char *iep = (unsigned char *)(fixed_ies + 1);
826
int iel = item->ie_length - sizeof(*fixed_ies);
828
DBGTRACE2("%s: adding atim\n", __FUNCTION__);
829
memset(&iwe, 0, sizeof(iwe));
830
iwe.cmd = IWEVCUSTOM;
831
sprintf(buf, "atim=%u", item->config.atim_window);
832
iwe.u.data.length = strlen(buf);
833
event = iwe_stream_add_point(event, end_buf, &iwe, buf);
836
if(iep[0] == WLAN_EID_GENERIC && iep[1] >= 4 &&
837
iep[2] == 0x00 && iep[3] == 0x50 &&
838
iep[4] == 0xf2 && iep[5] == 1)
848
DBGTRACE2("%s: adding atim", __FUNCTION__);
849
memset(&iwe, 0, sizeof(iwe));
850
iwe.cmd = IWEVCUSTOM;
851
sprintf(buf, "atim=%u", item->config.atim_window);
852
iwe.u.data.length = strlen(buf);
853
event = iwe_stream_add_point(event, end_buf, &iwe, buf);
855
if (item->length > sizeof(*item)) {
856
unsigned char *iep = (unsigned char *)item->ies +
857
sizeof(struct ndis_fixed_ies);
858
unsigned char *end = iep + item->ie_length;
860
while (iep + 1 < end && iep + 2 + iep[1] <= end) {
861
unsigned char ielen = 2 + iep[1];
863
if (ielen > SSID_MAX_WPA_IE_LEN) {
868
if (iep[0] == WLAN_EID_GENERIC && iep[1] >= 4 &&
869
memcmp(iep + 2, "\x00\x50\xf2\x01", 4) == 0) {
870
unsigned char *p = buf;
846
872
p += sprintf(p, "wpa_ie=");
847
for (i = 0; i < iel; i++)
873
for (i = 0; i < ielen; i++)
848
874
p += sprintf(p, "%02x", iep[i]);
850
DBGTRACE2("adding wpa_ie :%d\n", strlen(buf));
851
memset(&iwe, 0, sizeof(iwe));
852
iwe.cmd = IWEVCUSTOM;
853
iwe.u.data.length = strlen(buf);
854
event = iwe_stream_add_point(event, end_buf,
876
DBGTRACE2("adding wpa_ie :%ld", strlen(buf));
877
memset(&iwe, 0, sizeof(iwe));
878
iwe.cmd = IWEVCUSTOM;
879
iwe.u.data.length = strlen(buf);
880
event = iwe_stream_add_point(event, end_buf,
882
} else if (iep[0] == WLAN_EID_RSN) {
883
unsigned char *p = buf;
884
for (i = 0; i < ielen; i++)
885
p += sprintf(p, "%02x", iep[i]);
887
DBGTRACE2("adding rsn_ie :%ld\n", strlen(buf));
888
memset(&iwe, 0, sizeof(iwe));
889
iwe.cmd = IWEVCUSTOM;
890
iwe.u.data.length = strlen(buf);
891
event = iwe_stream_add_point(event, end_buf,
1208
1228
struct ndis_handle *handle = (struct ndis_handle *)dev->priv;
1210
TRACEENTER("%s", "");
1211
DBGTRACE("flags = %d, handle->capa = %ld",
1212
wrqu->data.flags, handle->capa);
1230
TRACEENTER2("%s", "");
1231
DBGTRACE1("flags = %d, handle->capa = %ld",
1232
wrqu->data.flags, handle->capa);
1234
if (set_mode(handle, NDIS_MODE_INFRA))
1235
TRACEEXIT2(return -1);
1214
1237
if (test_bit(CAPA_WPA, &handle->capa))
1215
TRACEEXIT(return 0);
1238
TRACEEXIT2(return 0);
1218
1240
WARNING("%s", "driver is not WPA capable");
1219
TRACEEXIT(return -EINVAL);
1223
static int char_to_hex(int c)
1225
if (c >= '0' && c <= '9')
1227
if (c >= 'a' && c <= 'f')
1228
return c - 'a' + 10;
1232
/* convert key in string to hex digits - 2 chars make up one digit */
1233
static int key_str_to_hex(const char *str, unsigned char *key, int str_len)
1237
if (!memcmp(str, "s:", 2))
1239
key_len = str_len-2;
1240
if (key_len >= IW_ENCODING_TOKEN_MAX)
1241
TRACEEXIT(return -1);
1242
memcpy(key, str+2, key_len);
1245
for (i = key_len = 0; i < str_len-1; i += 2, key_len++)
1249
if (key_len >= IW_ENCODING_TOKEN_MAX)
1250
TRACEEXIT(return -1);
1251
/* sscanf(str, "%1X", &ch) doesn't seem to work */
1252
c1 = char_to_hex(tolower(str[i]));
1253
c2 = char_to_hex(tolower(str[i+1]));
1254
if (c1 < 0 || c2 < 0)
1255
TRACEEXIT(return -1);
1256
key[key_len] = c1 << 4 | c2;
1258
DBGTRACE("key length = %d", key_len);
1259
if (key_len == 5 || key_len == 13)
1260
TRACEEXIT(return key_len);
1262
TRACEEXIT(return -1);
1241
TRACEEXIT2(return -1);
1265
1245
static int wpa_set_key(struct net_device *dev, struct iw_request_info *info,
1266
1246
union iwreq_data *wrqu, char *extra)
1268
1248
struct ndis_handle *handle = (struct ndis_handle *)dev->priv;
1269
struct ndis_wpa_key ndis_key;
1249
struct ndis_add_key ndis_key;
1270
1250
struct wpa_key wpa_key;
1271
int i, res, written, needed;
1272
1252
u8 addr[ETH_ALEN];
1273
1253
u8 seq[IW_ENCODING_TOKEN_MAX];
1274
u8 usrkey[IW_ENCODING_TOKEN_MAX];
1276
copy_from_user(&wpa_key, wrqu->data.pointer, sizeof(wpa_key));
1278
copy_from_user(&addr, wpa_key.addr, ETH_ALEN);
1281
copy_from_user(&seq, wpa_key.seq, IW_ENCODING_TOKEN_MAX);
1284
copy_from_user(&usrkey, wpa_key.key, IW_ENCODING_TOKEN_MAX);
1254
u8 key[IW_ENCODING_TOKEN_MAX];
1256
if (copy_from_user(&wpa_key, wrqu->data.pointer, sizeof(wpa_key)))
1257
TRACEEXIT1(return -1);
1258
if (wpa_key.addr && copy_from_user(&addr, wpa_key.addr, ETH_ALEN))
1259
TRACEEXIT1(return -1);
1262
copy_from_user(&seq, wpa_key.seq, IW_ENCODING_TOKEN_MAX))
1263
TRACEEXIT1(return -1);
1266
copy_from_user(&key, wpa_key.key, IW_ENCODING_TOKEN_MAX))
1267
TRACEEXIT1(return -1);
1286
TRACEENTER1("alg = %d, key_index = %d",
1269
TRACEENTER2("alg = %d, key_index = %d",
1287
1270
wpa_key.alg, wpa_key.key_index);
1289
if (wpa_key.alg == WPA_ALG_NONE || wpa_key.key_len == 0)
1291
struct ndis_remove_key ndis_remove_key;
1293
ndis_remove_key.struct_size = sizeof(ndis_remove_key);
1294
ndis_remove_key.index = wpa_key.key_index;
1296
memcpy(&ndis_remove_key.bssid, addr,
1299
memset(&ndis_remove_key.bssid, 0xff, ETH_ALEN);
1300
res = dosetinfo(handle, NDIS_OID_REMOVE_KEY,
1301
(char *)&ndis_remove_key,
1302
sizeof(ndis_remove_key), &written, &needed);
1303
if (res == NDIS_STATUS_INVALID_DATA)
1305
DBGTRACE("removing key failed with %08X, %d, %d",
1306
res, needed, sizeof(ndis_remove_key));
1307
TRACEEXIT(return -EINVAL);
1309
if (wpa_key.key_index >= 0 &&
1310
wpa_key.key_index < MAX_ENCR_KEYS)
1312
handle->encr_info.keys[wpa_key.key_index].length = 0;
1313
if (wpa_key.key_index == handle->encr_info.active)
1314
set_encr_mode(handle, ENCR_DISABLED);
1317
TRACEEXIT(return 0);
1320
if (wpa_key.alg == WPA_ALG_WEP)
1322
union iwreq_data encr_req;
1323
unsigned char key[IW_ENCODING_TOKEN_MAX];
1272
if (wpa_key.alg == WPA_ALG_WEP) {
1326
1273
if (test_bit(CAPA_ENCR_NONE, &handle->capa))
1327
TRACEEXIT(return -EINVAL);
1329
memset(&encr_req, 0, sizeof(encr_req));
1330
encr_req.data.flags = wpa_key.key_index;
1331
/* auth mode is set with set_auth_alg */
1332
if (handle->auth_mode == AUTHMODE_OPEN)
1333
encr_req.data.flags |= IW_ENCODE_OPEN;
1335
encr_req.data.flags |= IW_ENCODE_RESTRICTED;
1336
i = key_str_to_hex(usrkey, key, wpa_key.key_len);
1338
TRACEEXIT(return -EINVAL);
1339
encr_req.data.length = i;
1340
encr_req.data.pointer = key;
1341
if (iw_set_encr(dev, info, &encr_req, key))
1342
TRACEEXIT(return -EINVAL);
1344
TRACEEXIT(return 0);
1274
TRACEEXIT2(return -1);
1277
handle->encr_info.active = wpa_key.key_index;
1279
if (add_wep_key(handle, key, wpa_key.key_len,
1281
TRACEEXIT2(return -1);
1283
TRACEEXIT2(return 0);
1347
1286
/* alg is either WPA_ALG_TKIP or WPA_ALG_CCMP */
1348
1287
if (!test_bit(CAPA_WPA, &handle->capa))
1349
TRACEEXIT1(return -EINVAL);
1288
TRACEEXIT2(return -1);
1351
if (wpa_key.key_len > sizeof(ndis_key.key))
1353
DBGTRACE("incorrect key length (%d)", wpa_key.key_len);
1354
TRACEEXIT1(return -EINVAL);
1290
if (wpa_key.key_len > sizeof(ndis_key.key)) {
1291
DBGTRACE2("incorrect key length (%ld)", wpa_key.key_len);
1292
TRACEEXIT2(return -1);
1357
DBGTRACE("adding key %d, %d", wpa_key.key_index, wpa_key.key_len);
1295
if (wpa_key.seq_len > IW_ENCODING_TOKEN_MAX) {
1296
DBGTRACE2("incorrect seq? length = (%ld)", wpa_key.seq_len);
1297
TRACEEXIT2(return -1);
1300
DBGTRACE2("setting key %d, %ld", wpa_key.key_index, wpa_key.key_len);
1358
1301
memset(&ndis_key, 0, sizeof(ndis_key));
1360
if (wpa_key.key_len > IW_ENCODING_TOKEN_MAX)
1362
DBGTRACE1("incorrect key? length = (%d)", wpa_key.key_len);
1363
TRACEEXIT1(return -EINVAL);
1365
memcpy(&ndis_key.key, usrkey, wpa_key.key_len);
1367
1303
ndis_key.struct_size = sizeof(ndis_key);
1368
1304
ndis_key.length = wpa_key.key_len;
1370
if (wpa_key.seq_len > IW_ENCODING_TOKEN_MAX)
1372
DBGTRACE1("incorrect seq? length = (%d)", wpa_key.seq_len);
1373
TRACEEXIT1(return -EINVAL);
1376
for (i = 0, ndis_key.rsc = 0 ; i < wpa_key.seq_len ; i++)
1377
ndis_key.rsc |= (seq[i] << (i * 8));
1379
if (wpa_key.key_index == 0) /* pairwise key */
1380
ndis_key.index = (1 << 31) | (1 << 30);
1382
ndis_key.index = wpa_key.key_index;
1384
if (!memcmp(&addr, "\xff\xff\xff\xff\xff\xff", ETH_ALEN))
1386
mac_address ap_addr;
1388
get_ap_address(handle, ap_addr);
1389
memcpy(&ndis_key.bssid, &ap_addr, ETH_ALEN);
1305
ndis_key.index = wpa_key.key_index;
1307
if (wpa_key.seq && wpa_key.seq_len > 0) {
1308
for (i = 0, ndis_key.rsc = 0 ; i < wpa_key.seq_len ; i++)
1309
ndis_key.rsc |= (seq[i] << (i * 8));
1311
ndis_key.index |= 1 << 29;
1314
if (wpa_key.addr == NULL || memcmp(addr, "\xff\xff\xff\xff\xff\xff",
1317
get_ap_address(handle, ndis_key.bssid);
1320
ndis_key.index |= (1 << 30);
1392
1321
memcpy(&ndis_key.bssid, addr, ETH_ALEN);
1393
DBGTRACE("bssid " MACSTR, MAC2STR(ndis_key.bssid));
1395
if (wpa_key.alg == WPA_ALG_TKIP && wpa_key.key_len == 32)
1324
DBGTRACE2("bssid " MACSTR, MAC2STR(ndis_key.bssid));
1327
ndis_key.index |= (1 << 31);
1329
if (wpa_key.alg == WPA_ALG_TKIP && wpa_key.key_len == 32) {
1397
1330
/* wpa_supplicant gives us the Michael MIC RX/TX keys in
1398
1331
* different order than NDIS spec, so swap the order here. */
1400
memcpy(tmp, ndis_key.key + 16, 8);
1401
memcpy(ndis_key.key + 16, ndis_key.key + 24, 8);
1402
memcpy(ndis_key.key + 24, tmp, 8);
1405
res = dosetinfo(handle, NDIS_OID_ADD_KEY, (char *)&ndis_key,
1406
ndis_key.struct_size, &written, &needed);
1407
if (res == NDIS_STATUS_INVALID_DATA)
1409
DBGTRACE("adding key failed (%08X), %d, %d, %lu",
1410
res, written, needed, ndis_key.struct_size);
1411
TRACEEXIT(return -EINVAL);
1413
memcpy(&handle->encr_info.keys[wpa_key.key_index].key, &ndis_key.key,
1414
NDIS_ENCODING_TOKEN_MAX);
1415
handle->encr_info.keys[wpa_key.key_index].length =
1417
TRACEEXIT(return 0);
1332
memcpy(ndis_key.key, key, 16);
1333
memcpy(ndis_key.key + 16, key + 24, 8);
1334
memcpy(ndis_key.key + 24, key + 16, 8);
1336
memcpy(ndis_key.key, key, wpa_key.key_len);
1338
if (wpa_key.alg == WPA_ALG_NONE || wpa_key.key_len == 0) {
1339
/* TI driver crashes kernel if NDIS_OID_REMOVE_KEY is
1340
* called; other drivers seem to not require it, so
1341
* for now, don't remove the key from drvier */
1342
handle->encr_info.keys[wpa_key.key_index].length = 0;
1343
memset(&handle->encr_info.keys[wpa_key.key_index].key, 0,
1345
DBGTRACE2("key %d removed", wpa_key.key_index);
1347
res = miniport_set_info(handle, NDIS_OID_ADD_KEY,
1348
(char *)&ndis_key, sizeof(ndis_key));
1349
if (res == NDIS_STATUS_INVALID_DATA) {
1350
DBGTRACE2("adding key failed (%08X), %u",
1351
res, ndis_key.struct_size);
1352
TRACEEXIT2(return -1);
1354
handle->encr_info.keys[wpa_key.key_index].length =
1356
memcpy(&handle->encr_info.keys[wpa_key.key_index].key,
1357
&ndis_key.key, wpa_key.key_len);
1358
DBGTRACE2("key %d added", wpa_key.key_index);
1361
TRACEEXIT2(return 0);
1420
1364
static int wpa_disassociate(struct net_device *dev,
1448
1389
struct ndis_handle *handle = (struct ndis_handle *)dev->priv;
1449
1390
struct wpa_assoc_info wpa_assoc_info;
1450
char ssid[NDIS_ESSID_MAX_SIZE];
1391
char ssid[NDIS_ESSID_MAX_SIZE], ie;
1392
int auth_mode, encr_mode, wpa2 = 0;
1452
TRACEENTER("%s", "");
1453
copy_from_user(&wpa_assoc_info, wrqu->data.pointer,
1454
sizeof(wpa_assoc_info));
1394
TRACEENTER2("%s", "");
1395
if (copy_from_user(&wpa_assoc_info, wrqu->data.pointer,
1396
sizeof(wpa_assoc_info)) ||
1397
copy_from_user(&ssid, wpa_assoc_info.ssid, NDIS_ESSID_MAX_SIZE))
1398
TRACEEXIT1(return -1);
1456
if(wpa_assoc_info.ssid)
1457
copy_from_user(&ssid, wpa_assoc_info.ssid, NDIS_ESSID_MAX_SIZE);
1400
if (wpa_assoc_info.wpa_ie_len > 0 &&
1401
copy_from_user(&ie, wpa_assoc_info.wpa_ie, 1) == 0 &&
1402
ie == WLAN_EID_RSN) {
1459
DBGTRACE("key_mgmt_suite = %d, pairwise_suite = %d, group_suite= %d",
1460
wpa_assoc_info.key_mgmt_suite,
1461
wpa_assoc_info.pairwise_suite, wpa_assoc_info.group_suite);
1406
DBGTRACE1("key_mgmt_suite = %d, pairwise_suite = %d, group_suite= %d",
1407
wpa_assoc_info.key_mgmt_suite,
1408
wpa_assoc_info.pairwise_suite, wpa_assoc_info.group_suite);
1462
1409
if (wpa_assoc_info.key_mgmt_suite != KEY_MGMT_PSK &&
1410
wpa_assoc_info.key_mgmt_suite != KEY_MGMT_802_1X &&
1463
1411
wpa_assoc_info.key_mgmt_suite != KEY_MGMT_NONE)
1464
TRACEEXIT(return -EINVAL);
1466
switch (wpa_assoc_info.key_mgmt_suite)
1412
TRACEEXIT2(return -1);
1414
switch (wpa_assoc_info.pairwise_suite) {
1416
if (!test_bit(CAPA_AES, &handle->capa))
1417
TRACEEXIT2(return -1);
1418
encr_mode = ENCR3_ENABLED;
1421
if (!test_bit(CAPA_TKIP, &handle->capa))
1422
TRACEEXIT2(return -1);
1423
encr_mode = ENCR2_ENABLED;
1427
if (test_bit(CAPA_ENCR_NONE, &handle->capa))
1428
TRACEEXIT2(return -1);
1429
encr_mode = ENCR1_ENABLED;
1432
TRACEEXIT2(return -1);
1435
switch (wpa_assoc_info.key_mgmt_suite) {
1468
1436
case KEY_MGMT_PSK:
1469
if (set_auth_mode(handle, AUTHMODE_WPAPSK))
1470
TRACEEXIT(return -EINVAL);
1437
if (!test_bit(CAPA_WPA, &handle->capa))
1438
TRACEEXIT2(return -1);
1439
auth_mode = wpa2 ? AUTHMODE_WPA2PSK : AUTHMODE_WPAPSK;
1441
case KEY_MGMT_802_1X:
1442
if (!test_bit(CAPA_WPA, &handle->capa))
1443
TRACEEXIT2(return -1);
1444
auth_mode = wpa2 ? AUTHMODE_WPA2 : AUTHMODE_WPA;
1472
1446
case KEY_MGMT_NONE:
1473
1447
if (wpa_assoc_info.group_suite != CIPHER_WEP104 &&
1474
1448
wpa_assoc_info.group_suite != CIPHER_WEP40)
1475
TRACEEXIT(return -EINVAL);
1478
TRACEEXIT(return -EINVAL);
1481
switch (wpa_assoc_info.group_suite)
1484
if (!test_bit(CAPA_AES, &handle->capa) ||
1485
set_encr_mode(handle, ENCR3_ENABLED))
1486
TRACEEXIT(return -EINVAL);
1489
if (!test_bit(CAPA_WPA, &handle->capa) ||
1490
set_encr_mode(handle, ENCR2_ENABLED))
1491
TRACEEXIT(return -EINVAL);
1495
if (test_bit(CAPA_ENCR_NONE, &handle->capa))
1496
TRACEEXIT(return -EINVAL);
1499
TRACEEXIT(return -EINVAL);
1449
TRACEEXIT2(return -1);
1450
auth_mode = handle->auth_mode;
1452
if (wpa_assoc_info.auth_alg & AUTH_ALG_SHARED_KEY)
1453
auth_mode = AUTHMODE_RESTRICTED;
1455
auth_mode = AUTHMODE_OPEN;
1459
TRACEEXIT2(return -1);
1462
if (set_auth_mode(handle, auth_mode))
1463
TRACEEXIT2(return -1);
1464
if (set_encr_mode(handle, encr_mode))
1465
TRACEEXIT2(return -1);
1469
for (i = 0; i < (sizeof(freq_chan)/sizeof(freq_chan[0])); i++) {
1470
if (wpa_assoc_info.freq == freq_chan[i]) {
1471
union iwreq_data freq_req;
1473
memset(&freq_req, 0, sizeof(freq_req));
1474
freq_req.freq.m = i;
1475
if (iw_set_freq(dev, NULL, &freq_req, NULL))
1476
TRACEEXIT2(return -1);
1502
1482
if (set_essid(handle, ssid, wpa_assoc_info.ssid_len))
1503
TRACEEXIT(return -EINVAL);
1483
TRACEEXIT2(return -1);
1505
TRACEEXIT(return 0);
1485
TRACEEXIT2(return 0);
1508
1488
static int wpa_set_countermeasures(struct net_device *dev,
1509
1489
struct iw_request_info *info,
1510
1490
union iwreq_data *wrqu, char *extra)
1512
TRACEENTER("%s", "");
1492
TRACEENTER2("%s", "");