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

📄 rtmp_info.c

📁 TP Link 321 Linux Driver
💻 C
📖 第 1 页 / 共 5 页
字号:
static intrt_ioctl_giwauth(struct net_device *dev,					struct iw_request_info *info,					union iwreq_data *wrqu, char *extra){	RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev->priv;	struct iw_param *param = &wrqu->param;    int ret = 0;    if (pAd->RTUSBCmdThr_pid < 0)        return -ENETDOWN;#if 1    switch (param->flags & IW_AUTH_INDEX) 	{		case IW_AUTH_WPA_VERSION:		#if 0			if (param->value == IW_AUTH_WPA_VERSION_WPA)  //AuthMode = WPA			else if (param->value == IW_AUTH_WPA_VERSION_WPA2) // AuthMode= WPA2			else if (param->value == IW_AUTH_WPA_VERSION_DISABLED) // AuthMode= 			else				//		#endif			break;						case IW_AUTH_CIPHER_PAIRWISE:		case IW_AUTH_CIPHER_GROUP:		case IW_AUTH_KEY_MGMT:			/*			 * wpa_supplicant will control these internally			 */			ret = -EOPNOTSUPP;			break;		case IW_AUTH_TKIP_COUNTERMEASURES:			param->value = 1;			break;		case IW_AUTH_DROP_UNENCRYPTED:			param->value = 1;			break;		case IW_AUTH_80211_AUTH_ALG:			param->value = pAd->PortCfg.AuthMode;			break;		case IW_AUTH_WPA_ENABLED:			param->value = (pAd->PortCfg.AuthMode > Ndis802_11AuthModeWPA ? 1 : 0);			break;		case IW_AUTH_RX_UNENCRYPTED_EAPOL:			param->value = 1;			break;		case IW_AUTH_ROAMING_CONTROL:		case IW_AUTH_PRIVACY_INVOKED:			param->value = 1;			break;		default:			return -EOPNOTSUPP;    }	    return 0;#else	return -EOPNOTSUPP;#endif}static intrt_ioctl_siwencodeext(struct net_device *dev,							struct iw_request_info *info,							union iwreq_data *wrqu, char *extra){	RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev->priv;	struct iw_point *encoding = &wrqu->encoding;	struct iw_encode_ext *ext = wrqu->encoding.pointer;	unsigned int keyIdx;	UCHAR *pBuf = NULL;	int bufLen;	    //check if the interface is down	if ((dev->flags & IFF_UP) == 0)		 return -ENETDOWN;    if (pAd->RTUSBCmdThr_pid < 0)        return -ENETDOWN;	DBGPRINT(RT_DEBUG_TRACE,"%s(): encoding->flags = %x, ext->ext_flags=0x%x, ext->alg=0x%x!\n", 							__FUNCTION__, encoding->flags, ext->ext_flags, ext->alg);		// Get Key Index and convet to our own defined key index	keyIdx = (encoding->flags & IW_ENCODE_INDEX);	if((keyIdx < 0) || (keyIdx > NR_WEP_KEYS))		return -EINVAL;	keyIdx = ((keyIdx > 0) ? (keyIdx - 1) : pAd->PortCfg.DefaultKeyId);	if((ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) == 0)		keyIdx |= 1 << 30;		if(ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY)		keyIdx |= 1 << 31;			if ((encoding->flags & IW_ENCODE_DISABLED) || (ext->alg && IW_ENCODE_ALG_NONE))	{		NDIS_802_11_REMOVE_KEY RtmpRmvKey;				// Remove key.		NdisZeroMemory(&RtmpRmvKey, sizeof(RtmpRmvKey));		NdisMoveMemory(RtmpRmvKey.BSSID, ext->addr.sa_data, ETH_ALEN);		RtmpRmvKey.KeyIndex = keyIdx;		RtmpRmvKey.Length = sizeof(RtmpRmvKey);		DBGPRINT(RT_DEBUG_TRACE, "%s(): Do remove key action! Remove KeyIdx=0x%x!\n", 					__FUNCTION__, keyIdx);		if (NDIS_STATUS_SUCCESS == RTMPRemoveKeySanity(pAd, (PVOID)&RtmpRmvKey))			RTUSBEnqueueCmdFromNdis(pAd, OID_802_11_REMOVE_KEY, TRUE, (PVOID)&RtmpRmvKey, sizeof(RtmpRmvKey));	} 	else if (ext->key_len == 0)	{		// Set default key index		pAd->PortCfg.DefaultKeyId = keyIdx;		DBGPRINT(RT_DEBUG_TRACE, "%s(): Do set default key index action!set default key=0x%x!\n", 					__FUNCTION__, pAd->PortCfg.DefaultKeyId);		return 0;	}	else	{		// Add key.		if (ext->alg == IW_ENCODE_ALG_WEP)		{			NDIS_802_11_WEP *pRtmpWepKey;			ULONG real_keyIdx;						bufLen = (sizeof(NDIS_802_11_WEP)- 1)+ ext->key_len;			if((pBuf = kmalloc(bufLen, MEM_ALLOC_FLAG)) == NULL)				return -ENOMEM;			NdisZeroMemory(pBuf, bufLen);			pRtmpWepKey = (NDIS_802_11_WEP *)pBuf;			pRtmpWepKey->KeyIndex = keyIdx;			pRtmpWepKey->KeyLength = ext->key_len;			pRtmpWepKey->Length = bufLen;			NdisMoveMemory(&(pRtmpWepKey->KeyMaterial[0]), ext->key, ext->key_len);			real_keyIdx = keyIdx & 0x0fffffff;			//DBGPRINT(RT_DEBUG_TRACE, "real_keyIdx=0x%x!\n", real_keyIdx);			NdisZeroMemory(pAd->SharedKey[real_keyIdx].Key, 16);			NdisMoveMemory(pAd->SharedKey[real_keyIdx].Key, ext->key, ext->key_len);			pAd->SharedKey[real_keyIdx].KeyLen = ext->key_len;			if(ext->key_len == 5)				pAd->SharedKey[real_keyIdx].CipherAlg = CIPHER_WEP64;			else				pAd->SharedKey[real_keyIdx].CipherAlg = CIPHER_WEP128;			NdisZeroMemory(pAd->PortCfg.DesireSharedKey[real_keyIdx].Key, 16);			NdisMoveMemory(pAd->PortCfg.DesireSharedKey[real_keyIdx].Key, ext->key, ext->key_len);			pAd->PortCfg.DesireSharedKey[real_keyIdx].KeyLen = ext->key_len;			pAd->PortCfg.DesireSharedKey[real_keyIdx].CipherAlg = pAd->SharedKey[real_keyIdx].CipherAlg;						DBGPRINT(RT_DEBUG_TRACE, "%s(): Do add WEP key action! keyIdx=0x%x!KeyLength=%d!\n", 						__FUNCTION__, keyIdx, ext->key_len);			RTUSBEnqueueCmdFromNdis(pAd, OID_802_11_ADD_WEP, TRUE, (PVOID)pRtmpWepKey, pRtmpWepKey->Length);		} 		else if((ext->alg == IW_ENCODE_ALG_TKIP) || (ext->alg == IW_ENCODE_ALG_CCMP))		{			NDIS_802_11_KEY  *pRtmpKey;			int i;			bufLen = (sizeof(NDIS_802_11_KEY)- 1)+ ext->key_len;			if((pBuf = kmalloc(bufLen, MEM_ALLOC_FLAG)) == NULL)				return -ENOMEM;			NdisZeroMemory(pBuf, bufLen);						pRtmpKey = (NDIS_802_11_KEY *)pBuf;			// Set the total structure length.			pRtmpKey->Length = bufLen;			// Set KeyIdx			pRtmpKey->KeyIndex = keyIdx;			//Set KeyLength			pRtmpKey->KeyLength = ext->key_len;			// Get the mac entry to set the key			NdisMoveMemory(pRtmpKey->BSSID, ext->addr.sa_data, ETH_ALEN);			// Prepare the KeyRSC			if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID)			{				keyIdx |= 1 << 29;				for (i = 0; i < IW_ENCODE_SEQ_MAX_SIZE; i++)					pRtmpKey->KeyRSC |= ext->rx_seq[i] << (i * 8);			}			if (ext->alg == IW_ENCODE_ALG_TKIP && ext->key_len == 32)			{                NdisMoveMemory(&pRtmpKey->KeyMaterial[0], ext->key, 16);                NdisMoveMemory((&pRtmpKey->KeyMaterial[0] + 16), (ext->key + 24), 8);                NdisMoveMemory((&pRtmpKey->KeyMaterial[0] + 24), (ext->key + 16), 8);			}			else			{				NdisMoveMemory(&pRtmpKey->KeyMaterial[0], ext->key, ext->key_len);			}			DBGPRINT(RT_DEBUG_TRACE, "%s(): Do add TKIP/AES key action! keyIdx=0x%x!\n", 						__FUNCTION__, keyIdx);			RTUSBEnqueueCmdFromNdis(pAd, OID_802_11_ADD_KEY, TRUE, (PVOID)pRtmpKey, pRtmpKey->Length);		}		else		{			DBGPRINT(RT_DEBUG_ERROR, "%s(): Unknown encodeext action!\n", __FUNCTION__);			return -EINVAL;		}		if(pBuf)			kfree(pBuf);	}#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT	if (pAd->PortCfg.bNativeWpa == TRUE)  // add by johnli		pAd->PortCfg.wx_need_sync |= 1;#endif	return 0;	}static intrt_ioctl_giwencodeext(struct net_device *dev,					struct iw_request_info *info,					union iwreq_data *wrqu, char *extra){	RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev->priv;	    if (pAd->RTUSBCmdThr_pid < 0)        return -ENETDOWN;		return 0;}static intrt_ioctl_siwpmksa(struct net_device *dev,					struct iw_request_info *info,					union iwreq_data *wrqu, char *extra){#define IW_PMKID_LEN 16	RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev->priv;	struct iw_pmksa *pmksa = (struct iw_pmksa *)wrqu->data.pointer;		ULONG		CachedIdx;	int found = 0;	    //check if the interface is down	if ((dev->flags & IFF_UP) == 0)		 return -ENETDOWN;    if (pAd->RTUSBCmdThr_pid < 0)        return -ENETDOWN;		if (pmksa->cmd == IW_PMKSA_FLUSH)	{		for (CachedIdx = 0; CachedIdx < pAd->PortCfg.SavedPMKNum; CachedIdx++)			NdisZeroMemory(&pAd->PortCfg.SavedPMK[CachedIdx], sizeof(BSSID_INFO));		pAd->PortCfg.SavedPMKNum = 0;	} 	else	{		for (CachedIdx = 0; CachedIdx < pAd->PortCfg.SavedPMKNum; CachedIdx++)		{	// Find the entry in the saved data base.		    if (NdisEqualMemory(pmksa->bssid.sa_data, pAd->PortCfg.SavedPMK[CachedIdx].BSSID, ETH_ALEN))		    {	// compare the BSSID		    	found = 1;			    break;		    }		}		if (pmksa->cmd == IW_PMKSA_ADD)		{			// If found, replace it, else add to a random index entry.			DBGPRINT(RT_DEBUG_OFF, "%s():Update IW_PMKSA_ADD, idx = %d\n", __FUNCTION__, CachedIdx);			CachedIdx = (CachedIdx < PMKID_NO) ? CachedIdx : (pmksa->bssid.sa_data[5] % PMKID_NO);			DBGPRINT(RT_DEBUG_OFF, "%s():After adjust, IW_PMKSA_ADD, idx = %d\n", __FUNCTION__, CachedIdx);						NdisMoveMemory(&pAd->PortCfg.SavedPMK[CachedIdx].BSSID[0], pmksa->bssid.sa_data, ETH_ALEN);			NdisMoveMemory(&pAd->PortCfg.SavedPMK[CachedIdx].PMKID[0], pmksa->pmkid, IW_PMKID_LEN);			if((!found) && (pAd->PortCfg.SavedPMKNum < PMKID_NO))				pAd->PortCfg.SavedPMKNum++;		}		else if (pmksa->cmd == IW_PMKSA_REMOVE && found)		{				DBGPRINT(RT_DEBUG_OFF, "%s():Remove IW_PMKSA_REMOVE, idx = %d\n", __FUNCTION__, CachedIdx);			NdisZeroMemory(&pAd->PortCfg.SavedPMK[CachedIdx], sizeof(BSSID_INFO));		    pAd->PortCfg.SavedPMKNum--;		}   }	return 0;}static int rt_ioctl_siwgenie(struct net_device *dev,					struct iw_request_info *info,					union iwreq_data *wrqu, char *extra){	RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev->priv;	    //check if the interface is down	if ((dev->flags & IFF_UP) == 0)		 return -ENETDOWN;    if (pAd->RTUSBCmdThr_pid < 0)        return -ENETDOWN;		if ((wrqu->data.length > 44) ||    	((wrqu->data.length > 0) && (extra == NULL)))		return -EINVAL;	if (wrqu->data.length)	{#if 0		pAd->PortCfg.wx_RSNIE_Len = wrqu->data.length > MAX_WPA_IE_LEN ? MAX_WPA_IE_LEN : wrqu->data.length;		NdisMoveMemory(pAd->PortCfg.wx_RSN_IE, extra, pAd->PortCfg.wx_RSNIE_Len);#else		pAd->PortCfg.RSN_IELen = wrqu->data.length > 44 ? 44 : wrqu->data.length;		NdisMoveMemory(pAd->PortCfg.RSN_IE, extra, pAd->PortCfg.RSN_IELen);#endif		printk("%s(): set WPA IE for Association Request!\n", __FUNCTION__);	} else {		//The wpa ie length is zero, it means didn't enable wpa.		printk("wrqu->data.length=%d! Stop wpa!\n", wrqu->data.length);	}	return 0;}static int rt_ioctl_giwgenie(struct net_device *dev,					struct iw_request_info *info,					union iwreq_data *wrqu, char *extra){	RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev->priv;    if (pAd->RTUSBCmdThr_pid < 0)        return -ENETDOWN;	if (wrqu->data.length < pAd->PortCfg.RSN_IELen)	    return -E2BIG;	wrqu->data.length = pAd->PortCfg.RSN_IELen;	NdisMoveMemory(extra, &pAd->PortCfg.RSN_IE[0], pAd->PortCfg.RSN_IELen);	return 0;}#endif // WIRELESS_EXT > 17 //static intrt_ioctl_setparam(struct net_device *dev, struct iw_request_info *info,			 void *w, char *extra){	PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;	char *this_char = extra;	char *value;	int  Status=0;    //check if the interface is down	if ((dev->flags & IFF_UP) == 0)		 return -ENETDOWN;    if (pAdapter->RTUSBCmdThr_pid < 0)        return -ENETDOWN;	if (!*this_char)																													return Status;																																																														if ((value = rtstrchr(this_char, '=')) != NULL) 																					*value++ = 0;																												if (!value) 																									 		return Status;																														// reject setting nothing besides ANY ssid(ssidLen=0)	if (!*value && (strcmp(this_char, "SSID") != 0))		return Status;																														for (PRTMP_PRIVATE_SET_PROC = RTMP_PRIVATE_SUPPORT_PROC; PRTMP_PRIVATE_SET_PROC->name; PRTMP_PRIVATE_SET_PROC++)				{																																	if (strcmp(this_char, PRTMP_PRIVATE_SET_PROC->name) == 0)																		{																																	if(!PRTMP_PRIVATE_SET_PROC->set_proc(pAdapter, value))																			{	//FALSE:Set private failed then return Invalid argument 																		Status = -EINVAL;																											}																																break;	//Exit for loop.																								}																															}																																if(PRTMP_PRIVATE_SET_PROC->name == NULL)																						{  //Not found argument 																											Status = -EINVAL;																												DBGPRINT(RT_DEBUG_TRACE, "===>rt_ioctl_setparam:: (iwpriv) Not Support Set Command [%s=%s]\n", this_char, value);																												  	}																															  	return Status;}static const iw_handler rt_handler[] ={	(iw_handler) NULL,						/* SIOCSIWCOMMIT */	(iw_handler) rt_ioctl_giwname,			/* SIOCGIWNAME	1 */	(iw_handler) NULL,						/* SIOCSIWNWID */	(iw_handler) NULL,						/* SIOCGIWNWID */	(iw_handler) rt_ioctl_siwfreq,			/* SIOCSIWFREQ */	(iw_handler) rt_ioctl_giwfreq,			/* SIOCGIWFREQ	5 */	(iw_handler) rt_ioctl_siwmode,			/* SIOCSIWMODE */	(iw_handler) rt_ioctl_giwmode,			/* SIOCGIWMODE */	(iw_handler) NULL,						/* SIOCSIWSENS */	(iw_handler) NULL,						/* SIOCGIWSENS */	(iw_handler) NULL /* not used */,		/* SIOCSIWRANGE */	(iw_handler) rt_ioctl_giwrange,			/* SIOCGIWRANGE 11 */	(iw_handler) NULL /* not used */,		/* SIOCSIWPRIV */	(iw_handler) NULL /* kernel code */,	/* SIOCGIWPRIV */	(iw_handler) NULL /* not used */,		/* SIOCSIWSTATS */	(iw_handler) NULL /* kernel code */,	/* SIOCGIWSTATS f */	(iw_handler) NULL,						/* SIOCSIWSPY */	(iw_handler) NULL,						/* SIOCGIWSPY */	(iw_handler) NULL,						/* -- hole -- */	(iw_handler) NULL,						/* -- hole -- */	(iw_handler) rt_ioctl_siwap,			/* SIOCSIWAP */	(iw_handler) rt_ioctl_giwap,			/* SIOCGIWAP	0x15*/	(iw_handler) NULL,						/* SIOCSIWMLME	0x16 */ //After WIRELESS_EXT > 17, the 0x8b16 used for SIOC

⌨️ 快捷键说明

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