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

📄 wps_wlandrv_ar5kdrv.c

📁 WiFi Protected Setup (WPS) 又叫Simple config。 是无线局域网领域推出的新协议
💻 C
字号:
/*
 *  WPS_WLANDRV_AR5KDRV.C : WPS WLAN Driver Interface Implemented upon AR5K
 * 
 *  ver       date        author      comment
 *  0.0.1     08/02/18    Gao Hua     First
 */
#include "../wps/wps_eap_pkt.h"
#include "../common/metatype.h"
#include "../common/order.h"
#include "../common/strlib.h"
#include "../common/malloc.h"
#include "../common/memlib.h"
#include "../main/main.h"
#include "../main/mem_pool.h"
#include "wlandrv.h"
#include "vport.h"
#include "wlanDev.h"
#include "wlanPhy.h"
#include "pci.h"
#include "wlanext.h"
#include "wlansmeext.h"
#include "wlanbeacon.h"
#include "wlanchannel.h"
#include "wlanSend.h"
#include "stacserv.h"
#include "../ar5kdrv/sx_ar5kdrv.h"
#include "../ar5kdrv/sx_ar5kd.h"
#include "../datalink/datalink.h"
#include "../main/eapol.h"
#include "../main/w802_11.h"
#include "wps_wlandrv.h"


int Wlan_GetWpsApList(WPS_AP_DESC *apDescArray, int nCount)
{
	int dev_uid = 0;
	int           i, j, numBss, cnt = 0;
	WLAN_DEV_INFO *pDevInfo;
	CSERV_INFO    *pCsInfo;
	BSSDESCR      *pBssDesc;
	WPS_AP_DESC   *pTmp;

	sx_ar5kd_wcfg_scan(0);
	crm_sleep(500); /* Wait for scan finish */
	
	sx_ar5kd_wcfg_clear_list(dev_uid, 0);

	pDevInfo = (WLAN_DEV_INFO*)sx_ar5kd_search_drvinfo(dev_uid);
	if (pDevInfo != NULL) {
		/* The list several acquisition */
		pCsInfo = pDevInfo->pCsInfo;
		numBss = pCsInfo->scanInfo.bssSet.count;

		/* The acquisition of a detection result */
		for (i = 0; i < numBss; i++) {
			pBssDesc = &pCsInfo->scanInfo.bssSet.bssDescrArray[i];
			
			if (!pBssDesc->wifiWpsSupported) {
				continue;
			}
			
			if (cnt + 1 > nCount) {
				break;
			}
			
			pTmp = &apDescArray[cnt];
			cnt++;
			
			/* Clear of an old value */
			A_MEM_ZERO(pTmp, sizeof(WPS_AP_DESC));

			A_STRNCPY(pTmp->ssid, pBssDesc->ssid.ssid, pBssDesc->ssid.length);
			for (j=0; j<SX_BSSID_SIZE; j++) {
				pTmp->bssid[j] = pBssDesc->bssId.octets[j];
			}
			
			A_DRIVER_BCOPY(&pBssDesc->wifiWpsIe, &pTmp->wpsIE, sizeof(WPS_IE));
		}
	}
	
	return cnt;
}

int Wlan_Associate(WPS_AP_DESC *apDesc)
{
	if (!sx_EAPOLjob)
		return -1;

	sx_eapol_job *eapol_jobp = sx_EAPOLjob;
	w80211_cfg  *cfg = eapol_jobp->netcfg.cfg;

	crm_wait_semaphore(&cfg->cfg_sem, 1);

	cfg->linkmode      = SX_W80211_LINK_INFRA;
	cfg->authmode      = SX_W80211_AUTH_OPEN;
	cfg->wpa_enable    = 0;
	cfg->dot1x_enable  = 0;
	cfg->usewep_eep    = 0;

	mem_cpy((byte*)cfg->ssid->octets, apDesc->ssid, 33);
	cfg->ssid->length = str_len((byte*)cfg->ssid->octets);
	
	if (cfg->vfunc->vf_w80211_set_cfg != NULL) {
		cfg->vfunc->vf_w80211_set_cfg(cfg);
	}

	crm_post_semaphore(&cfg->cfg_sem, 1);
	
	sx_ar5kd_disassoc(0);
	crm_sleep(200);
	return 0;
}

int Wlan_Disassociate(void)
{
	sx_ar5kd_disassoc(0);
	return 0;
}

WPS_u8 Wlan_IsAssociated(void)
{
	int connect;
	
	sx_ar5kd_wcfg_isConnected(0, &connect);
	return connect;
}

int Wlan_GetApSsid(WPS_u8 *SsidBuff, WPS_s32 BuffLen)
{
	extern int sx_ar5k_get_dev_uid(void);
	extern char *sx_ar5k_get_cur_ssid(int dev_uid, char *p);
	char *ret;
	
	if (!Wlan_IsAssociated()) {
		return -1;
	}

	ret = sx_ar5k_get_cur_ssid(0, /*sx_ar5k_get_dev_uid()*/
								SsidBuff);
	return ((dword)ret - (dword)SsidBuff);
}

int Wlan_GetWlanDrvInfo(WLANDRV_INFO *infoBuff)
{
	extern byte My_Ethernet_Address[];
	
	mem_cpy(infoBuff->mac, My_Ethernet_Address, 6);
	str_cpy(infoBuff->manufacturer, "silex technology, Inc.");
	str_cpy(infoBuff->modelName, "SX-10WG");
	str_cpy(infoBuff->modelNumber, "0000");
	str_cpy(infoBuff->serialNumber, "1234");
	str_cpy(infoBuff->deviceName, "Wireless 11g MiniPCI Adapter");
	
	return 0;
}

int Wlan_SendEapPacket(WPS_u8 *dataBuf, int dataLen)
{
	extern sx_eapol_job *sx_EAPOLjob;
	extern int sx_eapol_send_packet(sx_eapol_job *eapol_jobp, byte *data, int send_len);
	byte *p;
	
	if (sx_EAPOLjob == NULL) {
		return -1;
	}
	
	p = (byte *)sx_mempool_get(14 + EAPOL_HEAD_LENGTH + dataLen);
	mem_cpy(p+14+EAPOL_HEAD_LENGTH, dataBuf, dataLen);
	sx_eapol_send_packet(sx_EAPOLjob, p, dataLen);
	sx_mempool_free(p);
	return 0;
}

/*---------------------------------------------------------------------------*/
byte isListenerAdded = 0;
EAPOL_LISTENER eapol_listener = NULL;

int Wlan_AddEapolListener(EAPOL_LISTENER listener)	
{
	eapol_listener = listener;
	isListenerAdded = 1;
	return 0;
}

int Wlan_RemoveEapolListener(void)
{
	eapol_listener = NULL;
	isListenerAdded = 0;
	return 0;
}
/*---------------------------------------------------------------------------*/

⌨️ 快捷键说明

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