⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wpactl.c

📁 VIA VT6656 USB linux source code.
💻 C
📖 第 1 页 / 共 2 页
字号:
   /* * Description: *      set disassociate * * Parameters: *  In: *      pDevice   -  *      param     -  *  Out: * * Return Value:  * */ static int wpa_set_disassociate(PSDevice pDevice,				     struct viawget_wpa_param *param){    PSMgmtObject    pMgmt = &(pDevice->sMgmtObj);    	int ret = 0;        spin_lock_irq(&pDevice->lock);    if (pDevice->bLinkPass) {        if (!memcmp(param->addr, pMgmt->abyCurrBSSID, 6))            bScheduleCommand((HANDLE)pDevice, WLAN_CMD_DISASSOCIATE, NULL);	        }            spin_unlock_irq(&pDevice->lock);	            return ret;}/* * Description: *      enable scan process * * Parameters: *  In: *      pDevice   -  *      param     -  *  Out: * * Return Value:  * */ static int wpa_set_scan(PSDevice pDevice,				     struct viawget_wpa_param *param){	int ret = 0;        		        //2007-0919-01<Add>by MikeLiu/**set ap_scan=1&&scan_ssid=1 under hidden ssid mode**/        PSMgmtObject        pMgmt = &(pDevice->sMgmtObj);         PWLAN_IE_SSID       pItemSSID;printk("wpa_set_scan-->desired [ssid=%s,ssid_len=%d]\n",	     param->u.scan_req.ssid,param->u.scan_req.ssid_len);// Set the SSID memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);pItemSSID = (PWLAN_IE_SSID)pMgmt->abyDesireSSID;pItemSSID->byElementID = WLAN_EID_SSID;memcpy(pItemSSID->abySSID, param->u.scan_req.ssid, param->u.scan_req.ssid_len);pItemSSID->len = param->u.scan_req.ssid_len;    spin_lock_irq(&pDevice->lock);    BSSvClearBSSList((HANDLE)pDevice, pDevice->bLinkPass);  //  bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, NULL);        bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);    spin_unlock_irq(&pDevice->lock);        return ret;}  /* * Description: *      get bssid * * Parameters: *  In: *      pDevice   -  *      param     -  *  Out: * * Return Value:  * */ static int wpa_get_bssid(PSDevice pDevice,				     struct viawget_wpa_param *param){    PSMgmtObject        pMgmt = &(pDevice->sMgmtObj);	int ret = 0;	memcpy(param->u.wpa_associate.bssid, pMgmt->abyCurrBSSID , 6);	    return ret;    }  /* * Description: *      get bssid * * Parameters: *  In: *      pDevice   -  *      param     -  *  Out: * * Return Value:  * */ static int wpa_get_ssid(PSDevice pDevice,				     struct viawget_wpa_param *param){    PSMgmtObject        pMgmt = &(pDevice->sMgmtObj);	PWLAN_IE_SSID       pItemSSID;	int ret = 0;    pItemSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID;    	memcpy(param->u.wpa_associate.ssid, pItemSSID->abySSID , pItemSSID->len);		param->u.wpa_associate.ssid_len = pItemSSID->len;    return ret;}  /* * Description: *      get scan results * * Parameters: *  In: *      pDevice   -  *      param     -  *  Out: * * Return Value:  * */ static int wpa_get_scan(PSDevice pDevice,				     struct viawget_wpa_param *param){	struct viawget_scan_result *scan_buf;        PSMgmtObject    pMgmt = &(pDevice->sMgmtObj);    PWLAN_IE_SSID   pItemSSID;    PKnownBSS pBSS;	PBYTE  pBuf;	int ret = 0;    	u16 count = 0;	u16 ii, jj;    //******mike:bubble sort by stronger RSSI*****//    PBYTE ptempBSS;     ptempBSS = kmalloc(sizeof(KnownBSS), (int)GFP_ATOMIC);    if (ptempBSS == NULL) {       printk("bubble sort kmalloc memory fail@@@\n");        ret = -ENOMEM;        return ret;    }    for (ii = 0; ii < MAX_BSS_NUM; ii++) {         for(jj=0;jj<MAX_BSS_NUM-ii-1;jj++) {           if((pMgmt->sBSSList[jj].bActive!=TRUE) ||                ((pMgmt->sBSSList[jj].uRSSI>pMgmt->sBSSList[jj+1].uRSSI) &&(pMgmt->sBSSList[jj+1].bActive!=FALSE))) {                 memcpy(ptempBSS,&pMgmt->sBSSList[jj],sizeof(KnownBSS));                 memcpy(&pMgmt->sBSSList[jj],&pMgmt->sBSSList[jj+1],sizeof(KnownBSS));                 memcpy(&pMgmt->sBSSList[jj+1],ptempBSS,sizeof(KnownBSS));              }         }    };  kfree(ptempBSS); // printk("bubble sort result:\n");	count = 0;			pBSS = &(pMgmt->sBSSList[0]);    for (ii = 0; ii < MAX_BSS_NUM; ii++) {        pBSS = &(pMgmt->sBSSList[ii]);        if (!pBSS->bActive)            continue;        count++;    };        pBuf = kmalloc(sizeof(struct viawget_scan_result) * count, (int)GFP_ATOMIC);        if (pBuf == NULL) {            ret = -ENOMEM;        return ret;    }   	memset(pBuf, 0, sizeof(struct viawget_scan_result) * count);        scan_buf = (struct viawget_scan_result *)pBuf;	pBSS = &(pMgmt->sBSSList[0]);    for (ii = 0, jj = 0; ii < MAX_BSS_NUM ; ii++) {        pBSS = &(pMgmt->sBSSList[ii]);        if (pBSS->bActive) {            if (jj >= count)                break;            memcpy(scan_buf->bssid, pBSS->abyBSSID, WLAN_BSSID_LEN);            pItemSSID = (PWLAN_IE_SSID)pBSS->abySSID;   		    memcpy(scan_buf->ssid, pItemSSID->abySSID, pItemSSID->len);   		    scan_buf->ssid_len = pItemSSID->len;            scan_buf->freq = frequency_list[pBSS->uChannel-1];            scan_buf->caps = pBSS->wCapInfo;    //DavidWang for sharemode            //scan_buf->caps = pBSS->wCapInfo;            //scan_buf->qual =             //scan_buf->noise =             //scan_buf->level =             //scan_buf->maxrate =             if (pBSS->wWPALen != 0) {                scan_buf->wpa_ie_len = pBSS->wWPALen;                memcpy(scan_buf->wpa_ie, pBSS->byWPAIE, pBSS->wWPALen);             }               if (pBSS->wRSNLen != 0) {                 scan_buf->rsn_ie_len = pBSS->wRSNLen;                memcpy(scan_buf->rsn_ie, pBSS->byRSNIE, pBSS->wRSNLen);             }            scan_buf = (struct viawget_scan_result *)((PBYTE)scan_buf + sizeof(struct viawget_scan_result));            jj ++;                    }    }                if (jj < count)        count = jj;            if (copy_to_user(param->u.scan_results.buf, pBuf, sizeof(struct viawget_scan_result) * count)) {		ret = -EFAULT;	};	param->u.scan_results.scan_count = count;    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " param->u.scan_results.scan_count = %d\n", count)	        kfree(pBuf);    return ret;}/* * Description: *      set associate with AP * * Parameters: *  In: *      pDevice   -  *      param     -  *  Out: * * Return Value:  * */ static int wpa_set_associate(PSDevice pDevice,				     struct viawget_wpa_param *param){    PSMgmtObject    pMgmt = &(pDevice->sMgmtObj);    PWLAN_IE_SSID   pItemSSID;    BYTE    abyNullAddr[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};    BYTE    abyWPAIE[64];        int ret = 0;    	// set key type & algorithm     DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pairwise_suite = %d\n", param->u.wpa_associate.pairwise_suite);    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "group_suite = %d\n", param->u.wpa_associate.group_suite);    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "key_mgmt_suite = %d\n", param->u.wpa_associate.key_mgmt_suite);        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "auth_alg = %d\n", param->u.wpa_associate.auth_alg);    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "mode = %d\n", param->u.wpa_associate.mode);    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wpa_ie_len = %d\n", param->u.wpa_associate.wpa_ie_len);        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Roaming dBm = %d\n", param->u.wpa_associate.roam_dbm);  //Davidwang	if (param->u.wpa_associate.wpa_ie &&	    copy_from_user(&abyWPAIE[0], param->u.wpa_associate.wpa_ie, param->u.wpa_associate.wpa_ie_len))	    return -EINVAL;		           	if (param->u.wpa_associate.mode == 1)	    pMgmt->eConfigMode = WMAC_CONFIG_IBSS_STA;	else     	    pMgmt->eConfigMode = WMAC_CONFIG_ESS_STA;	    		// set bssid    if (memcmp(param->u.wpa_associate.bssid, &abyNullAddr[0], 6) != 0)	        memcpy(pMgmt->abyDesireBSSID, param->u.wpa_associate.bssid, 6);    // set ssid        	memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);    pItemSSID = (PWLAN_IE_SSID)pMgmt->abyDesireSSID;    pItemSSID->byElementID = WLAN_EID_SSID;	pItemSSID->len = param->u.wpa_associate.ssid_len;	memcpy(pItemSSID->abySSID, param->u.wpa_associate.ssid, pItemSSID->len);	    if (param->u.wpa_associate.wpa_ie_len == 0) {	    if (param->u.wpa_associate.auth_alg & AUTH_ALG_SHARED_KEY)             pMgmt->eAuthenMode = WMAC_AUTH_SHAREKEY;	    else             pMgmt->eAuthenMode = WMAC_AUTH_OPEN;	} else if (abyWPAIE[0] == RSN_INFO_ELEM) {		if (param->u.wpa_associate.key_mgmt_suite == KEY_MGMT_PSK)			pMgmt->eAuthenMode = WMAC_AUTH_WPA2PSK;		else			pMgmt->eAuthenMode = WMAC_AUTH_WPA2;			} else {		if (param->u.wpa_associate.key_mgmt_suite == KEY_MGMT_WPA_NONE)			pMgmt->eAuthenMode = WMAC_AUTH_WPANONE;		else if (param->u.wpa_associate.key_mgmt_suite == KEY_MGMT_PSK)		    pMgmt->eAuthenMode = WMAC_AUTH_WPAPSK;		else		    pMgmt->eAuthenMode = WMAC_AUTH_WPA;			}    	switch (param->u.wpa_associate.pairwise_suite) {	case CIPHER_CCMP:		pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled;		break;	case CIPHER_TKIP:		pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled;		break;	case CIPHER_WEP40:	case CIPHER_WEP104:		pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;		break;	case CIPHER_NONE:		if (param->u.wpa_associate.group_suite == CIPHER_CCMP)			pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled;		else			pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled;		break;	default:		pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;	};           pMgmt->Roam_dbm = param->u.wpa_associate.roam_dbm;          if ((pMgmt->Roam_dbm > 40)&&(pMgmt->Roam_dbm<80))             pDevice->bEnableRoaming = TRUE;	    if (param->u.wpa_associate.auth_alg & AUTH_ALG_SHARED_KEY) {            pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;            pMgmt->eAuthenMode = WMAC_AUTH_SHAREKEY;            pMgmt->bShareKeyAlgorithm = TRUE;              }	    else if ((param->u.wpa_associate.auth_alg & AUTH_ALG_OPEN_SYSTEM)&&(param->u.wpa_associate.wpa_ie_len == 0)) {            pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;            pMgmt->eAuthenMode = WMAC_AUTH_OPEN;            pMgmt->bShareKeyAlgorithm = FALSE;            }//mike save old encryption status	pDevice->eOldEncryptionStatus = pDevice->eEncryptionStatus;	    if (pDevice->eEncryptionStatus !=  Ndis802_11EncryptionDisabled)        pDevice->bEncryptionEnable = TRUE;    else         pDevice->bEncryptionEnable = FALSE; if (!(param->u.wpa_associate.auth_alg & AUTH_ALG_SHARED_KEY))   //DavidWang         KeyvInitTable(pDevice,&pDevice->sKey);               spin_lock_irq(&pDevice->lock);        pDevice->bLinkPass = FALSE;     ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);    memset(pMgmt->abyCurrBSSID, 0, 6);     pMgmt->eCurrState = WMAC_STATE_IDLE;    netif_stop_queue(pDevice->dev);    bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SSID, NULL);    spin_unlock_irq(&pDevice->lock);    return ret;}/* * Description: *      wpa_ioctl main function supported for wpa supplicant * * Parameters: *  In: *      pDevice   -  *      iw_point  -  *  Out: * * Return Value:  * */ int wpa_ioctl(PSDevice pDevice, struct iw_point *p){	struct viawget_wpa_param *param;	int ret = 0;	int wpa_ioctl = 0;	if (p->length < sizeof(struct viawget_wpa_param) ||	    p->length > VIAWGET_WPA_MAX_BUF_SIZE || !p->pointer)		return -EINVAL;	param = (struct viawget_wpa_param *) kmalloc((int)p->length, (int)GFP_KERNEL);	if (param == NULL)		return -ENOMEM;	if (copy_from_user(param, p->pointer, p->length)) {		ret = -EFAULT;		goto out;	}	switch (param->cmd) {	case VIAWGET_SET_WPA:        ret = wpa_set_wpa(pDevice, param);		    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_SET_WPA \n");			break;			case VIAWGET_SET_KEY:	    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_SET_KEY \n");	    spin_lock_irq(&pDevice->lock);        ret = wpa_set_keys(pDevice, param, FALSE);        spin_unlock_irq(&pDevice->lock);		break;					case VIAWGET_SET_SCAN:	    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_SET_SCAN \n");	        ret = wpa_set_scan(pDevice, param);		break;					case VIAWGET_GET_SCAN:	    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_GET_SCAN\n");	        ret = wpa_get_scan(pDevice, param);		wpa_ioctl = 1;		break;			case VIAWGET_GET_SSID:	    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_GET_SSID \n");	        ret = wpa_get_ssid(pDevice, param);		wpa_ioctl = 1;        		break;							case VIAWGET_GET_BSSID:	    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_GET_BSSID \n");	        ret = wpa_get_bssid(pDevice, param);		wpa_ioctl = 1;        		break;											case VIAWGET_SET_ASSOCIATE:	    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_SET_ASSOCIATE \n");	        ret = wpa_set_associate(pDevice, param);		break;									case VIAWGET_SET_DISASSOCIATE:	    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_SET_DISASSOCIATE \n");	        ret = wpa_set_disassociate(pDevice, param);		break;									case VIAWGET_SET_DROP_UNENCRYPT:	    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_SET_DROP_UNENCRYPT \n");			break;						    case VIAWGET_SET_DEAUTHENTICATE:	    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_SET_DEAUTHENTICATE \n");			break;									 	default:	    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wpa_ioctl: unknown cmd=%d\n",		       param->cmd);		return -EOPNOTSUPP;			break;	}	if ((ret == 0) && wpa_ioctl) {		if (copy_to_user(p->pointer, param, p->length)) {			ret = -EFAULT;			goto out;		}	}out:	if (param != NULL)		kfree(param);	return ret;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -