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

📄 rtusb_info.c

📁 台湾RALink公司的 rt2570无线 802.11g 网卡的 驱动的源代码 ,支持linux2.4以上的 内河
💻 C
📖 第 1 页 / 共 5 页
字号:
		val = rts->value;
	
	if (val != pAdapter->PortCfg.RtsThreshold)
		pAdapter->PortCfg.RtsThreshold = val;

	return 0;
}

int rtusb_ioctl_giwrts(struct net_device *dev,
		       struct iw_request_info *info,
		       struct iw_param *rts, char *extra)
{
	PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv;

	rts->value = pAdapter->PortCfg.RtsThreshold;
	rts->disabled = (rts->value == MAX_RTS_THRESHOLD);
	rts->fixed = 1;

	return 0;
}


int rtusb_ioctl_siwfrag(struct net_device *dev,
			struct iw_request_info *info,
			struct iw_param *rts, char *extra)
{
	PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv;
	u16 val;

	if (rts->disabled)
		val = MAX_FRAG_THRESHOLD;
	else if (rts->value < 256 || rts->value > MAX_FRAG_THRESHOLD)
		return -EINVAL;
	else
		val = __cpu_to_le16(rts->value & ~0x1); /* even numbers only */

	pAdapter->PortCfg.FragmentThreshold = val;
	return 0;
}

int rtusb_ioctl_giwfrag(struct net_device *dev,
			struct iw_request_info *info,
			struct iw_param *rts, char *extra)
{
	PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv;

	rts->value = pAdapter->PortCfg.FragmentThreshold;
	rts->disabled = (rts->value == 2346);
	rts->fixed = 1;

	return 0;
}

int rtusb_ioctl_siwencode(struct net_device *dev,
			  struct iw_request_info *info,
			  struct iw_point *erq, char *keybuf)
{
	PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv;
	NDIS_802_11_WEP	WepKey;
	int 	index, i, len;
	CHAR	kid = 0;
	RTMPZeroMemory(&WepKey, sizeof(NDIS_802_11_WEP));

	if (erq->flags & IW_ENCODE_DISABLED)
	{
		pAdapter->PortCfg.PairCipher = Ndis802_11WEPDisabled;
		pAdapter->PortCfg.GroupCipher = Ndis802_11WEPDisabled;
		pAdapter->PortCfg.WepStatus = Ndis802_11WEPDisabled;
	}
	else
	{
		pAdapter->PortCfg.PairCipher = Ndis802_11WEPEnabled;
		pAdapter->PortCfg.GroupCipher = Ndis802_11WEPEnabled;
		pAdapter->PortCfg.WepStatus = Ndis802_11WEPEnabled;
	}

	if (erq->flags & IW_ENCODE_RESTRICTED)
		pAdapter->PortCfg.AuthMode = Ndis802_11AuthModeShared;
	else 
		pAdapter->PortCfg.AuthMode = Ndis802_11AuthModeOpen;

	if(pAdapter->PortCfg.WepStatus == Ndis802_11WEPDisabled)
		pAdapter->PortCfg.AuthMode = Ndis802_11AuthModeOpen;
    
	if ((erq->flags & IW_ENCODE_DISABLED) == 0) 
	{
		/* Enable crypto. */
		if (erq->length > IFNAMSIZ)
			return -EINVAL;

		/* Old solution to take  default key  */
		index = (erq->flags & IW_ENCODE_INDEX) ;
		if((index < 0) || (index > NR_WEP_KEYS))
			return -EINVAL;     
			DBGPRINT(RT_DEBUG_TRACE," erq->flags = %x\n",erq->flags);
		
		if (index != 0)
		{
			pAdapter->PortCfg.DefaultKeyId = index -1;
		}
		
		if ((erq->length == 1) && (index == 0))
		{
			/* New solution to take  default key  when old way not work, not change KeyMaterial*/
			RTMPMoveMemory(&kid, keybuf, 1 );
			if((index < 0) || (index >= NR_WEP_KEYS))
				return -EINVAL;     
			//WepKey.KeyIndex = 0x80000000 + index;
			DBGPRINT(RT_DEBUG_TRACE,"kid = %d , erq->length = %d\n",kid, erq->length);
			if (kid > 0)
				pAdapter->PortCfg.DefaultKeyId = kid-1;
			else 
				pAdapter->PortCfg.DefaultKeyId = 0;
		}
		else
		{
			DBGPRINT(RT_DEBUG_TRACE,"DefaultKeyId = %d , erq->length = %d, flags 0x%x\n",pAdapter->PortCfg.DefaultKeyId, erq->length,erq->flags);
			len = erq->length;
			if(len > WEP_LARGE_KEY_LEN)
				len = WEP_LARGE_KEY_LEN;
			// If this instruction default key
			RTMPZeroMemory(pAdapter->PortCfg.SharedKey[pAdapter->PortCfg.DefaultKeyId].Key,  MAX_LEN_OF_KEY);
			RTMPMoveMemory(pAdapter->PortCfg.SharedKey[pAdapter->PortCfg.DefaultKeyId].Key, keybuf, len);
			RTMPMoveMemory(WepKey.KeyMaterial, keybuf, len);
			WepKey.KeyIndex = 0x80000000 + pAdapter->PortCfg.DefaultKeyId; 
			WepKey.KeyLength = len;
			pAdapter->PortCfg.SharedKey[pAdapter->PortCfg.DefaultKeyId].KeyLen =(UCHAR) (len <= WEP_SMALL_KEY_LEN ? WEP_SMALL_KEY_LEN : WEP_LARGE_KEY_LEN);
			DBGPRINT(RT_DEBUG_TRACE,"SharedKey");
			for (i=0; i < 5;i++)
				DBGPRINT_RAW(RT_DEBUG_TRACE,"   =%x ", pAdapter->PortCfg.SharedKey[pAdapter->PortCfg.DefaultKeyId].Key[i]);
			DBGPRINT(RT_DEBUG_TRACE,   "\n");
			// need to enqueue cmd to thread
			RTUSBEnqueueCmdFromNdis(pAdapter, OID_802_11_ADD_WEP, TRUE, &WepKey, sizeof(WepKey));
		}
		
	}
	DBGPRINT(RT_DEBUG_TRACE, "==>AuthMode=%x\n",pAdapter->PortCfg.AuthMode);
	DBGPRINT(RT_DEBUG_TRACE, "==>DefaultKeyId=%x, KeyLen = %d\n",pAdapter->PortCfg.DefaultKeyId , pAdapter->PortCfg.SharedKey[pAdapter->PortCfg.DefaultKeyId].KeyLen);
	DBGPRINT(RT_DEBUG_TRACE, "==>WepStatus=%x\n",pAdapter->PortCfg.WepStatus);
	return 0;
}

int
rtusb_ioctl_giwencode(struct net_device *dev,
			  struct iw_request_info *info,
			  struct iw_point *erq, char *key)
{
	PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv;
	int kid;
	
	kid = erq->flags & IW_ENCODE_INDEX;
	DBGPRINT(RT_DEBUG_TRACE, "===>rtusb_ioctl_giwencode %d\n", erq->flags & IW_ENCODE_INDEX);

	if (pAdapter->PortCfg.WepStatus == Ndis802_11WEPDisabled)
	{
		erq->length = 0;
		erq->flags = IW_ENCODE_DISABLED;
	} 
	else if ((kid > 0) && (kid <=4))
	{
		// copy wep key
		erq->flags = kid ;			/* NB: base 1 */
		if (erq->length > pAdapter->PortCfg.SharedKey[kid-1].KeyLen)
			erq->length = pAdapter->PortCfg.SharedKey[kid-1].KeyLen;
		memcpy(key, pAdapter->PortCfg.SharedKey[kid-1].Key, erq->length);
		//if ((kid == pAdapter->PortCfg.DefaultKeyId))
		//erq->flags |= IW_ENCODE_ENABLED;	/* XXX */
		if (pAdapter->PortCfg.AuthMode == Ndis802_11AuthModeShared)
			erq->flags |= IW_ENCODE_RESTRICTED;		/* XXX */
		else
			erq->flags |= IW_ENCODE_OPEN;		/* XXX */
		
	}
	else if (kid == 0)
	{
		if (pAdapter->PortCfg.AuthMode == Ndis802_11AuthModeShared)
			erq->flags |= IW_ENCODE_RESTRICTED;		/* XXX */
		else
			erq->flags |= IW_ENCODE_OPEN;		/* XXX */
		erq->length = pAdapter->PortCfg.SharedKey[pAdapter->PortCfg.DefaultKeyId].KeyLen;
		memcpy(key, pAdapter->PortCfg.SharedKey[pAdapter->PortCfg.DefaultKeyId].Key, erq->length);
		// copy default key ID
		if (pAdapter->PortCfg.AuthMode == Ndis802_11AuthModeShared)
			erq->flags |= IW_ENCODE_RESTRICTED;		/* XXX */
		else
			erq->flags |= IW_ENCODE_OPEN;		/* XXX */
		erq->flags = pAdapter->PortCfg.DefaultKeyId + 1;			/* NB: base 1 */
		erq->flags |= IW_ENCODE_ENABLED;	/* XXX */
	}
		
	return 0;

}

static int
rtusb_ioctl_setauth(struct net_device *dev, struct iw_request_info *info,
			 void *w, char *extra)
{
	PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv;
	int *param = (int *) extra;
  
	switch(param[0])
	{
		case 1:
			pAdapter->PortCfg.AuthMode = Ndis802_11AuthModeOpen;
			DBGPRINT(RT_DEBUG_TRACE, "===>rtusb_ioctl_setauth RTPRIV802_11AuthModeOpen\n");
			break;
		case 2:
			pAdapter->PortCfg.AuthMode = Ndis802_11AuthModeShared;
			DBGPRINT(RT_DEBUG_TRACE, "===>rtusb_ioctl_setauth RTPRIV802_11AuthModeShared\n");
			break;
		case 3:
			pAdapter->PortCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
			pAdapter->PortCfg.WpaState = SS_START;
			DBGPRINT(RT_DEBUG_TRACE, "===>rtusb_ioctl_setauth RTPRIV802_11AuthModeWPAPSK\n");
			break;
		case 4:
			pAdapter->PortCfg.AuthMode = Ndis802_11AuthModeWPANone;
			DBGPRINT(RT_DEBUG_TRACE, "===>rtusb_ioctl_setauth Ndis802_11AuthModeWPANone\n");
			break;
		default:
			return -EOPNOTSUPP;

	}


    pAdapter->PortCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;

	return 0;
}
#if 0
static int rtusb_ioctl_setkeyid(struct net_device *dev, struct iw_request_info *info,
			 void *w, char *extra)
{

	PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv;
  	int *param = (int *) extra;
	USHORT	Value;

	switch(param[0])
	{
		case 1:
			pAdapter->PortCfg.DefaultKeyId = 0;
			break;
		case 2:
			pAdapter->PortCfg.DefaultKeyId = 1;
			break;
		case 3:
			pAdapter->PortCfg.DefaultKeyId = 2;
			break;
		case 4:
			pAdapter->PortCfg.DefaultKeyId = 3;
			break;
		default:
			return -EOPNOTSUPP;

	}


	if (pAdapter->PortCfg.SharedKey[pAdapter->PortCfg.DefaultKeyId].KeyLen == 5)
		pAdapter->PortCfg.CipherAlg = CIPHER_WEP64;
	else
		pAdapter->PortCfg.CipherAlg = CIPHER_WEP128;
					
	RTUSBReadMACRegister(pAdapter, TXRX_CSR0, &Value);
	Value &= 0xfe00;
	Value |= ((LENGTH_802_11 << 3) | (pAdapter->PortCfg.CipherAlg));
	RTUSBWriteMACRegister(pAdapter, TXRX_CSR0, Value);
        
	DBGPRINT(RT_DEBUG_TRACE, "===>DefaultKeyId = [%d]\n",pAdapter->PortCfg.DefaultKeyId);

	return 0;
}
#endif
static int
rtusb_ioctl_setencryp(struct net_device *dev, struct iw_request_info *info,
			 void *w, char *extra)
{

	PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv;
	int *param = (int *) extra;
	NDIS_802_11_WEP_STATUS				WepStatus;//set by OID_802_11_WEP_STATUS
	DBGPRINT(RT_DEBUG_TRACE, "===>setencryp\n");
	DBGPRINT(RT_DEBUG_TRACE, "===>info->cmd 0x%x   \n",(info->cmd));
	DBGPRINT(RT_DEBUG_TRACE, "===>info->flags 0x%x  , param %x , extra %x\n",(info->flags), param[0],*extra);
	switch(param[0])
	{
		case 1:
			pAdapter->PortCfg.WepStatus= Ndis802_11WEPDisabled;
			pAdapter->PortCfg.PairCipher= Ndis802_11WEPDisabled;
			pAdapter->PortCfg.GroupCipher= Ndis802_11WEPDisabled;
			pAdapter->PortCfg.CipherAlg = CIPHER_NONE;
			WepStatus = Ndis802_11WEPDisabled;
			break;
		case 2:
			pAdapter->PortCfg.WepStatus= Ndis802_11Encryption1Enabled;
			pAdapter->PortCfg.PairCipher= Ndis802_11Encryption1Enabled;
			pAdapter->PortCfg.GroupCipher= Ndis802_11Encryption1Enabled;
			WepStatus = Ndis802_11Encryption1Enabled;
			break;
		case 3:
			pAdapter->PortCfg.WepStatus= Ndis802_11Encryption2Enabled;
			pAdapter->PortCfg.PairCipher= Ndis802_11Encryption2Enabled;
			pAdapter->PortCfg.GroupCipher= Ndis802_11Encryption2Enabled;
			pAdapter->PortCfg.CipherAlg = CIPHER_TKIP;
			WepStatus = Ndis802_11Encryption2Enabled;
			break;
		default:
			return -EOPNOTSUPP;

	}
	RTUSBEnqueueCmdFromNdis(pAdapter, OID_802_11_WEP_STATUS, TRUE, &WepStatus, sizeof(WepStatus));

	return 0;
}
static int
rtusb_ioctl_setwpapsk(struct net_device *dev, struct iw_request_info *info,
			 void *w, char *extra)
{

	PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv;
	NDIS_802_11_KEY                    Key;
	// rtusb_ioctl_setwpapsk accept > 16 chars, so data is passed through w instead of extra.
	struct iw_point *iwp = (struct iw_point *)w;
	UCHAR                               keyMaterial[80];
	UCHAR                               keyMaterial2[80];
	int	i;

	DBGPRINT(RT_DEBUG_TRACE, "===>\n");
	DBGPRINT(RT_DEBUG_TRACE, "===>info->cmd 0x%x   \n",(info->cmd));
	DBGPRINT(RT_DEBUG_TRACE, "===>info->flags 0x%x   \n",(info->flags));
	RTMPZeroMemory(Key.KeyMaterial, 64);
	RTMPZeroMemory(keyMaterial2, 80);
	NdisMoveMemory(Key.BSSID, pAdapter->PortCfg.Bssid.Octet, 6);
	//NdisMoveMemory(&Key.KeyRSC, pMsg3->KeyDesc.KeyRsc, LEN_KEY_DESC_RSC);
	if (iwp->length < 64)
	{
		copy_from_user(&keyMaterial2, iwp->pointer, iwp->length);

		PasswordHash(keyMaterial2, pAdapter->Mlme.CntlAux.Ssid, pAdapter->Mlme.CntlAux.SsidLen, keyMaterial);

		Key.Length    = sizeof(Key);
		Key.KeyIndex  = 0x80000000;           
		Key.KeyLength = 32;
		DBGPRINT_RAW(RT_DEBUG_TEMP,"pAdapter->Mlme.CntlAux.Ssid: ");
		for(i = 0; i < pAdapter->Mlme.CntlAux.SsidLen; i++)
			DBGPRINT_RAW(RT_DEBUG_TEMP,"%c ", pAdapter->Mlme.CntlAux.Ssid[i]);
		DBGPRINT_RAW(RT_DEBUG_TEMP,"\n");

		NdisMoveMemory(pAdapter->PortCfg.PskKey.Key, keyMaterial, 32);
		NdisMoveMemory(Key.KeyMaterial, keyMaterial, 32);
		DBGPRINT_RAW(RT_DEBUG_TEMP,"WPAPSK Key : ");
		for(i = 0; i < 32; i++)
			DBGPRINT_RAW(RT_DEBUG_TEMP,"%x ", Key.KeyMaterial[i]);
		DBGPRINT_RAW(RT_DEBUG_TEMP,"\n");

	}
	else if (iwp->length == 64)
	{
                copy_from_user(&keyMaterial2, iwp->pointer, iwp->length);
		AtoH(Key.KeyMaterial, keyMaterial, 32);

⌨️ 快捷键说明

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