📄 rtusb_info.c
字号:
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 + -