📄 rtmp_info.c
字号:
if (rts->disabled)
val = MAX_FRAG_THRESHOLD;
else if (rts->value >= MIN_FRAG_THRESHOLD || rts->value <= MAX_FRAG_THRESHOLD)
val = __cpu_to_le16(rts->value & ~0x1); /* even numbers only */
else if (rts->value == 0)
val = MAX_FRAG_THRESHOLD;
else
return -EINVAL;
pAdapter->PortCfg.FragmentThreshold = val;
return 0;
}
int rt_ioctl_giwfrag(struct net_device *dev,
struct iw_request_info *info,
struct iw_param *rts, char *extra)
{
PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;
rts->value = pAdapter->PortCfg.FragmentThreshold;
rts->disabled = (rts->value == 2346);
rts->fixed = 1;
return 0;
}
int rt_ioctl_siwencode(struct net_device *dev,
struct iw_request_info *info,
struct iw_point *erq, char *keybuf)
{
PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;
union {
char buf[sizeof(NDIS_802_11_WEP)+MAX_LEN_OF_KEY- 1];
NDIS_802_11_WEP keyinfo;
} WepKey;
int index, i, len;
CHAR kid = 0;
NdisZeroMemory(&WepKey, sizeof(WepKey));
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*/
NdisMoveMemory(&kid, keybuf, 1 );
if((index < 0) || (index >= NR_WEP_KEYS))
return -EINVAL;
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
NdisZeroMemory(pAdapter->SharedKey[pAdapter->PortCfg.DefaultKeyId].Key, MAX_LEN_OF_KEY);
NdisMoveMemory(pAdapter->SharedKey[pAdapter->PortCfg.DefaultKeyId].Key, keybuf, len);
NdisMoveMemory(WepKey.keyinfo.KeyMaterial, keybuf, len);
WepKey.keyinfo.KeyIndex = 0x80000000 + pAdapter->PortCfg.DefaultKeyId;
WepKey.keyinfo.KeyLength = len;
pAdapter->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->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.keyinfo) + len - 1);
}
}
DBGPRINT(RT_DEBUG_TRACE, "==>rt_ioctl_siwencode::AuthMode=%x\n",pAdapter->PortCfg.AuthMode);
DBGPRINT(RT_DEBUG_TRACE, "==>rt_ioctl_siwencode::DefaultKeyId=%x, KeyLen = %d\n",pAdapter->PortCfg.DefaultKeyId , pAdapter->SharedKey[pAdapter->PortCfg.DefaultKeyId].KeyLen);
DBGPRINT(RT_DEBUG_TRACE, "==>rt_ioctl_siwencode::WepStatus=%x\n",pAdapter->PortCfg.WepStatus);
return 0;
}
int
rt_ioctl_giwencode(struct net_device *dev,
struct iw_request_info *info,
struct iw_point *erq, char *key)
{
PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;
int kid;
kid = erq->flags & IW_ENCODE_INDEX;
DBGPRINT(RT_DEBUG_TRACE, "===>rt_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->SharedKey[kid-1].KeyLen)
erq->length = pAdapter->SharedKey[kid-1].KeyLen;
memcpy(key, pAdapter->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->SharedKey[pAdapter->PortCfg.DefaultKeyId].KeyLen;
memcpy(key, pAdapter->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
rt_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;
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) NULL, /* SIOCSIWAP */
(iw_handler) rt_ioctl_giwap, /* SIOCGIWAP 0x15*/
(iw_handler) NULL, /* -- hole -- 0x16 */
(iw_handler) rt_ioctl_iwaplist, /* SIOCGIWAPLIST */
#ifdef SIOCGIWSCAN
(iw_handler) rt_ioctl_siwscan, /* SIOCSIWSCAN 0x18*/
(iw_handler) rt_ioctl_giwscan, /* SIOCGIWSCAN */
#else
(iw_handler) NULL, /* SIOCSIWSCAN */
(iw_handler) NULL, /* SIOCGIWSCAN */
#endif /* SIOCGIWSCAN */
(iw_handler) rt_ioctl_siwessid, /* SIOCSIWESSID */
(iw_handler) rt_ioctl_giwessid, /* SIOCGIWESSID */
(iw_handler) rt_ioctl_siwnickn, /* SIOCSIWNICKN */
(iw_handler) rt_ioctl_giwnickn, /* SIOCGIWNICKN 1d*/
(iw_handler) NULL, /* -- hole -- */
(iw_handler) NULL, /* -- hole -- */
(iw_handler) NULL, /* SIOCSIWRATE 20*/
(iw_handler) NULL, /* SIOCGIWRATE */
(iw_handler) rt_ioctl_siwrts, /* SIOCSIWRTS */
(iw_handler) rt_ioctl_giwrts, /* SIOCGIWRTS */
(iw_handler) rt_ioctl_siwfrag, /* SIOCSIWFRAG */
(iw_handler) rt_ioctl_giwfrag, /* SIOCGIWFRAG 25*/
(iw_handler) NULL, /* SIOCSIWTXPOW */
(iw_handler) NULL, /* SIOCGIWTXPOW */
(iw_handler) NULL, /* SIOCSIWRETRY */
(iw_handler) NULL, /* SIOCGIWRETRY 29*/
(iw_handler) rt_ioctl_siwencode, /* SIOCSIWENCODE 2a*/
(iw_handler) rt_ioctl_giwencode, /* SIOCGIWENCODE 2b*/
(iw_handler) NULL, /* SIOCSIWPOWER 2c*/
(iw_handler) NULL, /* SIOCGIWPOWER 2d*/
};
static const iw_handler rt_priv_handlers[] = {
(iw_handler) NULL, /* SIOCWFIRSTPRIV+0 */
(iw_handler) rt_ioctl_setparam, /* SIOCWFIRSTPRIV+2 */
};
const struct iw_handler_def rt73_iw_handler_def =
{
#define N(a) (sizeof (a) / sizeof (a[0]))
.standard = (iw_handler *) rt_handler,
.num_standard = sizeof(rt_handler) / sizeof(iw_handler),
.private = (iw_handler *) rt_priv_handlers,
.num_private = N(rt_priv_handlers),
.private_args = (struct iw_priv_args *) privtab,
.num_private_args = N(privtab),
#if WIRELESS_EXT > 15
// .spy_offset = offsetof(struct hostap_interface, spy_data),
#endif /* WIRELESS_EXT > 15 */
};
INT RTMPSetInformation(
IN PRTMP_ADAPTER pAdapter,
IN OUT struct ifreq *rq,
IN INT cmd)
{
struct iwreq *wrq = (struct iwreq *) rq;
NDIS_802_11_SSID Ssid, *pSsid=NULL;
NDIS_802_11_MAC_ADDRESS Bssid;
RT_802_11_PHY_MODE PhyMode;
RT_802_11_STA_CONFIG StaConfig, *pStaConfig=NULL;
NDIS_802_11_RATES aryRates;
RT_802_11_PREAMBLE Preamble;
NDIS_802_11_WEP_STATUS WepStatus;
NDIS_802_11_AUTHENTICATION_MODE AuthMode;
NDIS_802_11_NETWORK_INFRASTRUCTURE BssType;
NDIS_802_11_RTS_THRESHOLD RtsThresh;
NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh;
NDIS_802_11_POWER_MODE PowerMode;
NDIS_802_11_TX_POWER_LEVEL TxPowerLevel;
PNDIS_802_11_KEY pKey = NULL;
PNDIS_802_11_REMOVE_KEY pRemoveKey = NULL;
NDIS_802_11_CONFIGURATION Config, *pConfig = NULL;
NDIS_802_11_NETWORK_TYPE NetType;
ULONG Now;
ULONG KeyIdx;
INT Status = NDIS_STATUS_SUCCESS;
ULONG AntDiv;
BOOLEAN RadioState;
// BOOLEAN StateMachineTouched = FALSE;
switch(cmd & 0x7FFF) {
case RT_OID_802_11_COUNTRY_REGION:
if (wrq->u.data.length < sizeof(UCHAR))
Status = -EINVAL;
else if (!(pAdapter->PortCfg.CountryRegion & 0x80) && !(pAdapter->PortCfg.CountryRegionForABand & 0x80)) // Only avaliable when EEPROM not programming
{
ULONG Country;
UCHAR TmpPhy;
Status = copy_from_user(&Country, wrq->u.data.pointer, wrq->u.data.length);
pAdapter->PortCfg.CountryRegion = (UCHAR)(Country & 0x000000FF);
pAdapter->PortCfg.CountryRegionForABand = (UCHAR)((Country >> 8) & 0x000000FF);
TmpPhy = pAdapter->PortCfg.PhyMode;
pAdapter->PortCfg.PhyMode = 0xff;
// Build all corresponding channel information
Status = RTUSBEnqueueCmdFromNdis(pAdapter, RT_OID_802_11_SET_PHY_MODE, TRUE, &TmpPhy, sizeof(TmpPhy));
DBGPRINT(RT_DEBUG_TRACE, "Set::RT_OID_802_11_SET_COUNTRY_REGION (A:%d B/G:%d)\n", pAdapter->PortCfg.CountryRegionForABand,
pAdapter->PortCfg.CountryRegion);
}
break;
case OID_802_11_BSSID_LIST_SCAN:
Now = jiffies;
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_BSSID_LIST_SCAN, TxCnt = %d \n", pAdapter->BulkLastOneSecCount);
if (pAdapter->BulkLastOneSecCount > 100)
{
DBGPRINT(RT_DEBUG_TRACE, "!!! Link UP, ignore this set::OID_802_11_BSSID_LIST_SCAN\n");
//Status = NDIS_STATUS_SUCCESS;
pAdapter->PortCfg.ScanCnt = 99; // Prevent auto scan triggered by this OID
break;
}
if ((OPSTATUS_TEST_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED)) &&
((pAdapter->PortCfg.AuthMode == Ndis802_11AuthModeWPA) ||
(pAdapter->PortCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
(pAdapter->PortCfg.AuthMode == Ndis802_11AuthModeWPA2) ||
(pAdapter->PortCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) &&
(pAdapter->PortCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED))
{
DBGPRINT(RT_DEBUG_TRACE, "!!! Link UP, Port Not Secured! ignore this set::OID_802_11_BSSID_LIST_SCAN\n");
Status = NDIS_STATUS_SUCCESS;
pAdapter->PortCfg.ScanCnt = 99; // Prevent auto scan triggered by this OID
break;
}
Status = RTUSBEnqueueCmdFromNdis(pAdapter, OID_802_11_BSSID_LIST_SCAN, TRUE, NULL, 0);
break;
case OID_802_11_SSID:
if (wrq->u.data.length != sizeof(NDIS_802_11_SSID))
Status = -EINVAL;
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -