2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 * Purpose: handle wpa supplicant ioctl input/out functions
43 /*--------------------- Static Definitions -------------------------*/
45 #define VIAWGET_WPA_MAX_BUF_SIZE 1024
47 static const int frequency_list[] = {
48 2412, 2417, 2422, 2427, 2432, 2437, 2442,
49 2447, 2452, 2457, 2462, 2467, 2472, 2484
51 /*--------------------- Static Classes ----------------------------*/
53 /*--------------------- Static Variables --------------------------*/
54 //static int msglevel =MSG_LEVEL_DEBUG;
55 static int msglevel = MSG_LEVEL_INFO;
57 /*--------------------- Static Functions --------------------------*/
59 /*--------------------- Export Variables --------------------------*/
60 static void wpadev_setup(struct net_device *dev)
62 dev->type = ARPHRD_IEEE80211;
63 dev->hard_header_len = ETH_HLEN;
65 dev->addr_len = ETH_ALEN;
66 dev->tx_queue_len = 1000;
68 memset(dev->broadcast, 0xFF, ETH_ALEN);
70 dev->flags = IFF_BROADCAST|IFF_MULTICAST;
75 * register netdev for wpa supplicant daemon
87 static int wpa_init_wpadev(PSDevice pDevice)
90 struct net_device *dev = pDevice->dev;
93 pDevice->wpadev = alloc_netdev(sizeof(PSDevice), "vntwpa", wpadev_setup);
94 if (pDevice->wpadev == NULL)
97 wpadev_priv = netdev_priv(pDevice->wpadev);
98 *wpadev_priv = *pDevice;
99 eth_hw_addr_inherit(pDevice->wpadev, dev);
100 pDevice->wpadev->base_addr = dev->base_addr;
101 pDevice->wpadev->irq = dev->irq;
102 pDevice->wpadev->mem_start = dev->mem_start;
103 pDevice->wpadev->mem_end = dev->mem_end;
104 ret = register_netdev(pDevice->wpadev);
106 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%s: register_netdev(WPA) failed!\n",
108 free_netdev(pDevice->wpadev);
112 if (pDevice->skb == NULL) {
113 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
114 if (pDevice->skb == NULL)
118 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%s: Registered netdev %s for WPA management\n",
119 dev->name, pDevice->wpadev->name);
126 * unregister net_device (wpadev)
137 static int wpa_release_wpadev(PSDevice pDevice)
140 dev_kfree_skb(pDevice->skb);
144 if (pDevice->wpadev) {
145 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%s: Netdevice %s unregistered\n",
146 pDevice->dev->name, pDevice->wpadev->name);
147 unregister_netdev(pDevice->wpadev);
148 free_netdev(pDevice->wpadev);
149 pDevice->wpadev = NULL;
157 * Set enable/disable dev for wpa supplicant daemon
169 int wpa_set_wpadev(PSDevice pDevice, int val)
172 return wpa_init_wpadev(pDevice);
174 return wpa_release_wpadev(pDevice);
179 * Set WPA algorithm & keys
191 int wpa_set_keys(PSDevice pDevice, void *ctx,
192 bool fcpfkernel) __must_hold(&pDevice->lock)
194 struct viawget_wpa_param *param = ctx;
195 PSMgmtObject pMgmt = pDevice->pMgmt;
196 unsigned long dwKeyIndex = 0;
197 unsigned char abyKey[MAX_KEY_LEN];
198 unsigned char abySeq[MAX_KEY_LEN];
200 // NDIS_802_11_KEY_RSC KeyRSC;
201 unsigned char byKeyDecMode = KEY_CTL_WEP;
205 if (param->u.wpa_key.alg_name > WPA_ALG_CCMP ||
206 param->u.wpa_key.key_len > MAX_KEY_LEN ||
207 param->u.wpa_key.seq_len > MAX_KEY_LEN)
210 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "param->u.wpa_key.alg_name = %d\n", param->u.wpa_key.alg_name);
211 if (param->u.wpa_key.alg_name == WPA_ALG_NONE) {
212 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
213 pDevice->bEncryptionEnable = false;
214 pDevice->byKeyIndex = 0;
215 pDevice->bTransmitKey = false;
216 KeyvRemoveAllWEPKey(&(pDevice->sKey), pDevice->PortOffset);
217 for (uu = 0; uu < MAX_KEY_TABLE; uu++) {
218 MACvDisableKeyEntry(pDevice->PortOffset, uu);
223 //spin_unlock_irq(&pDevice->lock);
224 if (param->u.wpa_key.key && fcpfkernel) {
225 memcpy(&abyKey[0], param->u.wpa_key.key, param->u.wpa_key.key_len);
227 spin_unlock_irq(&pDevice->lock);
228 if (param->u.wpa_key.key &&
229 copy_from_user(&abyKey[0], param->u.wpa_key.key, param->u.wpa_key.key_len)) {
230 spin_lock_irq(&pDevice->lock);
233 spin_lock_irq(&pDevice->lock);
236 dwKeyIndex = (unsigned long)(param->u.wpa_key.key_index);
238 if (param->u.wpa_key.alg_name == WPA_ALG_WEP) {
239 if (dwKeyIndex > 3) {
242 if (param->u.wpa_key.set_tx) {
243 pDevice->byKeyIndex = (unsigned char)dwKeyIndex;
244 pDevice->bTransmitKey = true;
245 dwKeyIndex |= (1 << 31);
247 KeybSetDefaultKey(&(pDevice->sKey),
248 dwKeyIndex & ~(BIT30 | USE_KEYRSC),
249 param->u.wpa_key.key_len,
257 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
258 pDevice->bEncryptionEnable = true;
262 //spin_unlock_irq(&pDevice->lock);
263 if (param->u.wpa_key.seq && fcpfkernel) {
264 memcpy(&abySeq[0], param->u.wpa_key.seq, param->u.wpa_key.seq_len);
266 spin_unlock_irq(&pDevice->lock);
267 if (param->u.wpa_key.seq &&
268 copy_from_user(&abySeq[0], param->u.wpa_key.seq, param->u.wpa_key.seq_len)) {
269 spin_lock_irq(&pDevice->lock);
272 spin_lock_irq(&pDevice->lock);
275 if (param->u.wpa_key.seq_len > 0) {
276 for (ii = 0; ii < param->u.wpa_key.seq_len; ii++) {
278 LODWORD(KeyRSC) |= (abySeq[ii] << (ii * 8));
280 HIDWORD(KeyRSC) |= (abySeq[ii] << ((ii-4) * 8));
281 //KeyRSC |= (abySeq[ii] << (ii * 8));
283 dwKeyIndex |= 1 << 29;
286 if (param->u.wpa_key.key_index >= MAX_GROUP_KEY) {
287 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "return dwKeyIndex > 3\n");
291 if (param->u.wpa_key.alg_name == WPA_ALG_TKIP) {
292 pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled;
295 if (param->u.wpa_key.alg_name == WPA_ALG_CCMP) {
296 pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled;
299 if (param->u.wpa_key.set_tx)
300 dwKeyIndex |= (1 << 31);
302 if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled)
303 byKeyDecMode = KEY_CTL_CCMP;
304 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled)
305 byKeyDecMode = KEY_CTL_TKIP;
307 byKeyDecMode = KEY_CTL_WEP;
309 // Fix HCT test that set 256 bits KEY and Ndis802_11Encryption3Enabled
310 if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
311 if (param->u.wpa_key.key_len == MAX_KEY_LEN)
312 byKeyDecMode = KEY_CTL_TKIP;
313 else if (param->u.wpa_key.key_len == WLAN_WEP40_KEYLEN)
314 byKeyDecMode = KEY_CTL_WEP;
315 else if (param->u.wpa_key.key_len == WLAN_WEP104_KEYLEN)
316 byKeyDecMode = KEY_CTL_WEP;
317 } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
318 if (param->u.wpa_key.key_len == WLAN_WEP40_KEYLEN)
319 byKeyDecMode = KEY_CTL_WEP;
320 else if (param->u.wpa_key.key_len == WLAN_WEP104_KEYLEN)
321 byKeyDecMode = KEY_CTL_WEP;
324 // Check TKIP key length
325 if ((byKeyDecMode == KEY_CTL_TKIP) &&
326 (param->u.wpa_key.key_len != MAX_KEY_LEN)) {
327 // TKIP Key must be 256 bits
328 //DBG_PRN_WLAN03(("return NDIS_STATUS_INVALID_DATA - TKIP Key must be 256 bits\n"));
329 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "return- TKIP Key must be 256 bits!\n");
332 // Check AES key length
333 if ((byKeyDecMode == KEY_CTL_CCMP) &&
334 (param->u.wpa_key.key_len != AES_KEY_LEN)) {
335 // AES Key must be 128 bits
336 //DBG_PRN_WLAN03(("return NDIS_STATUS_INVALID_DATA - AES Key must be 128 bits\n"));
340 // spin_lock_irq(&pDevice->lock);
341 if (is_broadcast_ether_addr(¶m->addr[0]) || (param->addr == NULL)) {
342 // If is_broadcast_ether_addr, set the key as every key entry's group key.
343 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Groupe Key Assign.\n");
345 if (KeybSetAllGroupKey(&(pDevice->sKey),
347 param->u.wpa_key.key_len,
349 (unsigned char *)abyKey,
352 pDevice->byLocalID) &&
353 KeybSetDefaultKey(&(pDevice->sKey),
355 param->u.wpa_key.key_len,
357 (unsigned char *)abyKey,
360 pDevice->byLocalID)) {
361 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "GROUP Key Assign.\n");
364 //DBG_PRN_WLAN03(("return NDIS_STATUS_INVALID_DATA -KeybSetDefaultKey Fail.0\n"));
365 // spin_unlock_irq(&pDevice->lock);
370 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Pairwise Key Assign.\n");
371 // BSSID not 0xffffffffffff
372 // Pairwise Key can't be WEP
373 if (byKeyDecMode == KEY_CTL_WEP) {
374 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Pairwise Key can't be WEP\n");
375 //spin_unlock_irq(&pDevice->lock);
379 dwKeyIndex |= (1 << 30); // set pairwise key
380 if (pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) {
381 //DBG_PRN_WLAN03(("return NDIS_STATUS_INVALID_DATA - WMAC_CONFIG_IBSS_STA\n"));
382 //spin_unlock_irq(&pDevice->lock);
385 if (KeybSetKey(&(pDevice->sKey),
388 param->u.wpa_key.key_len,
390 (unsigned char *)abyKey,
393 pDevice->byLocalID)) {
394 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Pairwise Key Set\n");
398 if (ether_addr_equal(param->addr, pDevice->abyBSSID)) {
399 //DBG_PRN_WLAN03(("return NDIS_STATUS_INVALID_DATA -Key Table Full.2\n"));
400 //spin_unlock_irq(&pDevice->lock);
404 // Save Key and configure just before associate/reassociate to BSSID
405 // we do not implement now
406 //spin_unlock_irq(&pDevice->lock);
410 } // BSSID not 0xffffffffffff
411 if ((ret == 0) && ((param->u.wpa_key.set_tx) != 0)) {
412 pDevice->byKeyIndex = (unsigned char)param->u.wpa_key.key_index;
413 pDevice->bTransmitKey = true;
415 pDevice->bEncryptionEnable = true;
416 //spin_unlock_irq(&pDevice->lock);
419 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " key=%x-%x-%x-%x-%x-xxxxx\n",
420 pMgmt->sNodeDBTable[iNodeIndex].abyWepKey[byKeyIndex][0],
421 pMgmt->sNodeDBTable[iNodeIndex].abyWepKey[byKeyIndex][1],
422 pMgmt->sNodeDBTable[iNodeIndex].abyWepKey[byKeyIndex][2],
423 pMgmt->sNodeDBTable[iNodeIndex].abyWepKey[byKeyIndex][3],
424 pMgmt->sNodeDBTable[iNodeIndex].abyWepKey[byKeyIndex][4]
433 * enable wpa auth & mode
445 static int wpa_set_wpa(PSDevice pDevice,
446 struct viawget_wpa_param *param)
448 PSMgmtObject pMgmt = pDevice->pMgmt;
451 pMgmt->eAuthenMode = WMAC_AUTH_OPEN;
452 pMgmt->bShareKeyAlgorithm = false;
471 static int wpa_set_disassociate(PSDevice pDevice,
472 struct viawget_wpa_param *param)
474 PSMgmtObject pMgmt = pDevice->pMgmt;
477 spin_lock_irq(&pDevice->lock);
478 if (pDevice->bLinkPass) {
479 if (!memcmp(param->addr, pMgmt->abyCurrBSSID, 6))
480 bScheduleCommand((void *)pDevice, WLAN_CMD_DISASSOCIATE, NULL);
482 spin_unlock_irq(&pDevice->lock);
489 * enable scan process
501 static int wpa_set_scan(PSDevice pDevice,
502 struct viawget_wpa_param *param)
506 spin_lock_irq(&pDevice->lock);
507 BSSvClearBSSList((void *)pDevice, pDevice->bLinkPass);
508 bScheduleCommand((void *)pDevice, WLAN_CMD_BSSID_SCAN, NULL);
509 spin_unlock_irq(&pDevice->lock);
528 static int wpa_get_bssid(PSDevice pDevice,
529 struct viawget_wpa_param *param)
531 PSMgmtObject pMgmt = pDevice->pMgmt;
534 memcpy(param->u.wpa_associate.bssid, pMgmt->abyCurrBSSID , 6);
553 static int wpa_get_ssid(PSDevice pDevice,
554 struct viawget_wpa_param *param)
556 PSMgmtObject pMgmt = pDevice->pMgmt;
557 PWLAN_IE_SSID pItemSSID;
560 pItemSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID;
562 memcpy(param->u.wpa_associate.ssid, pItemSSID->abySSID , pItemSSID->len);
563 param->u.wpa_associate.ssid_len = pItemSSID->len;
582 static int wpa_get_scan(PSDevice pDevice,
583 struct viawget_wpa_param *param)
585 struct viawget_scan_result *scan_buf;
586 PSMgmtObject pMgmt = pDevice->pMgmt;
587 PWLAN_IE_SSID pItemSSID;
595 unsigned char *ptempBSS;
597 ptempBSS = kmalloc(sizeof(KnownBSS), (int)GFP_ATOMIC);
599 if (ptempBSS == NULL) {
600 printk(KERN_ERR "bubble sort kmalloc memory fail@@@\n");
608 for (ii = 0; ii < MAX_BSS_NUM; ii++) {
609 for (jj = 0; jj < MAX_BSS_NUM - ii - 1; jj++) {
610 if ((pMgmt->sBSSList[jj].bActive != true) ||
612 ((pMgmt->sBSSList[jj].uRSSI > pMgmt->sBSSList[jj + 1].uRSSI) && (pMgmt->sBSSList[jj + 1].bActive != false))) {
613 memcpy(ptempBSS, &pMgmt->sBSSList[jj], sizeof(KnownBSS));
615 memcpy(&pMgmt->sBSSList[jj], &pMgmt->sBSSList[jj + 1], sizeof(KnownBSS));
617 memcpy(&pMgmt->sBSSList[jj + 1], ptempBSS, sizeof(KnownBSS));
628 //******mike:bubble sort by stronger RSSI*****//
631 pBSS = &(pMgmt->sBSSList[0]);
632 for (ii = 0; ii < MAX_BSS_NUM; ii++) {
633 pBSS = &(pMgmt->sBSSList[ii]);
639 pBuf = kcalloc(count, sizeof(struct viawget_scan_result), (int)GFP_ATOMIC);
645 scan_buf = (struct viawget_scan_result *)pBuf;
646 pBSS = &(pMgmt->sBSSList[0]);
647 for (ii = 0, jj = 0; ii < MAX_BSS_NUM; ii++) {
648 pBSS = &(pMgmt->sBSSList[ii]);
652 memcpy(scan_buf->bssid, pBSS->abyBSSID, WLAN_BSSID_LEN);
653 pItemSSID = (PWLAN_IE_SSID)pBSS->abySSID;
654 memcpy(scan_buf->ssid, pItemSSID->abySSID, pItemSSID->len);
655 scan_buf->ssid_len = pItemSSID->len;
656 scan_buf->freq = frequency_list[pBSS->uChannel-1];
657 scan_buf->caps = pBSS->wCapInfo;
658 //scan_buf->caps = pBSS->wCapInfo;
662 //scan_buf->maxrate =
663 if (pBSS->wWPALen != 0) {
664 scan_buf->wpa_ie_len = pBSS->wWPALen;
665 memcpy(scan_buf->wpa_ie, pBSS->byWPAIE, pBSS->wWPALen);
667 if (pBSS->wRSNLen != 0) {
668 scan_buf->rsn_ie_len = pBSS->wRSNLen;
669 memcpy(scan_buf->rsn_ie, pBSS->byRSNIE, pBSS->wRSNLen);
671 scan_buf = (struct viawget_scan_result *)((unsigned char *)scan_buf + sizeof(struct viawget_scan_result));
679 if (copy_to_user(param->u.scan_results.buf, pBuf, sizeof(struct viawget_scan_result) * count)) {
682 param->u.scan_results.scan_count = count;
683 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " param->u.scan_results.scan_count = %d\n", count);
691 * set associate with AP
703 static int wpa_set_associate(PSDevice pDevice,
704 struct viawget_wpa_param *param)
706 PSMgmtObject pMgmt = pDevice->pMgmt;
707 PWLAN_IE_SSID pItemSSID;
708 unsigned char abyNullAddr[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
709 unsigned char abyWPAIE[64];
711 bool bWepEnabled = false;
713 // set key type & algorithm
714 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pairwise_suite = %d\n", param->u.wpa_associate.pairwise_suite);
715 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "group_suite = %d\n", param->u.wpa_associate.group_suite);
716 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "key_mgmt_suite = %d\n", param->u.wpa_associate.key_mgmt_suite);
717 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "auth_alg = %d\n", param->u.wpa_associate.auth_alg);
718 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "mode = %d\n", param->u.wpa_associate.mode);
719 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wpa_ie_len = %d\n", param->u.wpa_associate.wpa_ie_len);
721 if (param->u.wpa_associate.wpa_ie_len) {
722 if (!param->u.wpa_associate.wpa_ie)
724 if (param->u.wpa_associate.wpa_ie_len > sizeof(abyWPAIE))
726 if (copy_from_user(&abyWPAIE[0], param->u.wpa_associate.wpa_ie, param->u.wpa_associate.wpa_ie_len))
730 if (param->u.wpa_associate.mode == 1)
731 pMgmt->eConfigMode = WMAC_CONFIG_IBSS_STA;
733 pMgmt->eConfigMode = WMAC_CONFIG_ESS_STA;
735 memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
736 pItemSSID = (PWLAN_IE_SSID)pMgmt->abyDesireSSID;
737 pItemSSID->byElementID = WLAN_EID_SSID;
738 pItemSSID->len = param->u.wpa_associate.ssid_len;
739 memcpy(pItemSSID->abySSID, param->u.wpa_associate.ssid, pItemSSID->len);
741 if (memcmp(param->u.wpa_associate.bssid, &abyNullAddr[0], 6) != 0)
742 memcpy(pMgmt->abyDesireBSSID, param->u.wpa_associate.bssid, 6);
744 bScheduleCommand((void *)pDevice, WLAN_CMD_BSSID_SCAN, pItemSSID->abySSID);
747 if (param->u.wpa_associate.wpa_ie_len == 0) {
748 if (param->u.wpa_associate.auth_alg & AUTH_ALG_SHARED_KEY)
749 pMgmt->eAuthenMode = WMAC_AUTH_SHAREKEY;
751 pMgmt->eAuthenMode = WMAC_AUTH_OPEN;
752 } else if (abyWPAIE[0] == RSN_INFO_ELEM) {
753 if (param->u.wpa_associate.key_mgmt_suite == KEY_MGMT_PSK)
754 pMgmt->eAuthenMode = WMAC_AUTH_WPA2PSK;
756 pMgmt->eAuthenMode = WMAC_AUTH_WPA2;
758 if (param->u.wpa_associate.key_mgmt_suite == KEY_MGMT_WPA_NONE)
759 pMgmt->eAuthenMode = WMAC_AUTH_WPANONE;
760 else if (param->u.wpa_associate.key_mgmt_suite == KEY_MGMT_PSK)
761 pMgmt->eAuthenMode = WMAC_AUTH_WPAPSK;
763 pMgmt->eAuthenMode = WMAC_AUTH_WPA;
766 switch (param->u.wpa_associate.pairwise_suite) {
768 pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled;
771 pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled;
775 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
779 if (param->u.wpa_associate.group_suite == CIPHER_CCMP)
780 pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled;
782 pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled;
785 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
788 //DavidWang add for WPA_supplicant support open/share mode
790 if (pMgmt->eAuthenMode == WMAC_AUTH_SHAREKEY) {
791 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
792 //pMgmt->eAuthenMode = WMAC_AUTH_SHAREKEY;
793 pMgmt->bShareKeyAlgorithm = true;
794 } else if (pMgmt->eAuthenMode == WMAC_AUTH_OPEN) {
795 if (!bWepEnabled) pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
796 else pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
797 //pMgmt->eAuthenMode = WMAC_AUTH_OPEN;
798 //pMgmt->bShareKeyAlgorithm = false; //20080717-06,<Modify> by chester//Fix Open mode, WEP encryption
800 //mike save old encryption status
801 pDevice->eOldEncryptionStatus = pDevice->eEncryptionStatus;
803 if (pDevice->eEncryptionStatus != Ndis802_11EncryptionDisabled)
804 pDevice->bEncryptionEnable = true;
806 pDevice->bEncryptionEnable = false;
807 if (!((pMgmt->eAuthenMode == WMAC_AUTH_SHAREKEY) ||
808 ((pMgmt->eAuthenMode == WMAC_AUTH_OPEN) && bWepEnabled))) //DavidWang //20080717-06,<Modify> by chester//Not to initial WEP
809 KeyvInitTable(&pDevice->sKey, pDevice->PortOffset);
810 spin_lock_irq(&pDevice->lock);
811 pDevice->bLinkPass = false;
812 memset(pMgmt->abyCurrBSSID, 0, 6);
813 pMgmt->eCurrState = WMAC_STATE_IDLE;
814 netif_stop_queue(pDevice->dev);
815 //20080701-02,<Add> by Mike Liu
816 /*******search if ap_scan=2 ,which is associating request in hidden ssid mode ****/
818 PKnownBSS pCurr = NULL;
819 pCurr = BSSpSearchBSSList(pDevice,
820 pMgmt->abyDesireBSSID,
821 pMgmt->abyDesireSSID,
822 pMgmt->eConfigPHYMode
826 printk("wpa_set_associate---->hidden mode site survey before associate.......\n");
827 bScheduleCommand((void *)pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
830 /****************************************************************/
831 bScheduleCommand((void *)pDevice, WLAN_CMD_SSID, NULL);
832 spin_unlock_irq(&pDevice->lock);
839 * wpa_ioctl main function supported for wpa supplicant
851 int wpa_ioctl(PSDevice pDevice, struct iw_point *p)
853 struct viawget_wpa_param *param;
857 if (p->length < sizeof(struct viawget_wpa_param) ||
858 p->length > VIAWGET_WPA_MAX_BUF_SIZE || !p->pointer)
861 param = kmalloc((int)p->length, (int)GFP_KERNEL);
865 if (copy_from_user(param, p->pointer, p->length)) {
870 switch (param->cmd) {
871 case VIAWGET_SET_WPA:
872 ret = wpa_set_wpa(pDevice, param);
873 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_SET_WPA\n");
876 case VIAWGET_SET_KEY:
877 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_SET_KEY\n");
878 spin_lock_irq(&pDevice->lock);
879 ret = wpa_set_keys(pDevice, param, false);
880 spin_unlock_irq(&pDevice->lock);
883 case VIAWGET_SET_SCAN:
884 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_SET_SCAN\n");
885 ret = wpa_set_scan(pDevice, param);
888 case VIAWGET_GET_SCAN:
889 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_GET_SCAN\n");
890 ret = wpa_get_scan(pDevice, param);
894 case VIAWGET_GET_SSID:
895 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_GET_SSID\n");
896 ret = wpa_get_ssid(pDevice, param);
900 case VIAWGET_GET_BSSID:
901 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_GET_BSSID\n");
902 ret = wpa_get_bssid(pDevice, param);
906 case VIAWGET_SET_ASSOCIATE:
907 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_SET_ASSOCIATE\n");
908 ret = wpa_set_associate(pDevice, param);
911 case VIAWGET_SET_DISASSOCIATE:
912 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_SET_DISASSOCIATE\n");
913 ret = wpa_set_disassociate(pDevice, param);
916 case VIAWGET_SET_DROP_UNENCRYPT:
917 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_SET_DROP_UNENCRYPT\n");
920 case VIAWGET_SET_DEAUTHENTICATE:
921 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_SET_DEAUTHENTICATE\n");
925 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wpa_ioctl: unknown cmd=%d\n",
931 if ((ret == 0) && wpa_ioctl) {
932 if (copy_to_user(p->pointer, param, p->length)) {