📄 rtmp_info.c
字号:
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;
//check if the interface is down
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) 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;
#if WPA_SUPPLICANT_SUPPORT
PNDIS_802_11_WEP pWepKey =NULL;
PNDIS_802_11_PMKID pPmkId = NULL;
BOOLEAN IEEE8021xState;
BOOLEAN IEEE8021x_required_keys;
BOOLEAN wpa_supplicant_enable;
BOOLEAN start_send_beacon_up;
#endif
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)
#if WPA_SUPPLICANT_SUPPORT
|| (pAdapter->PortCfg.IEEE8021X == TRUE)
#endif
) &&
(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
{
Status = copy_from_user(&Ssid, wrq->u.data.pointer, wrq->u.data.length);
pSsid = &Ssid;
if (pSsid->SsidLength > MAX_LEN_OF_SSID)
Status = -EINVAL;
else
{
// reset SSID to null
if (pSsid->SsidLength == 0)
{
memcpy(pSsid->Ssid, "", 0);
}
RTUSBEnqueueCmdFromNdis(pAdapter, OID_802_11_SSID, TRUE, pSsid, sizeof(NDIS_802_11_SSID));
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_SSID (Len=%d,Ssid=%s)\n", pSsid->SsidLength, pSsid->Ssid);
}
}
break;
case OID_802_11_BSSID:
if (wrq->u.data.length != sizeof(NDIS_802_11_MAC_ADDRESS))
Status = -EINVAL;
else
{
Status = copy_from_user(&Bssid, wrq->u.data.pointer, wrq->u.data.length);
RTUSBEnqueueCmdFromNdis(pAdapter, RT_OID_802_11_BSSID, TRUE, &Bssid, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_BSSID %02x:%02x:%02x:%02x:%02x:%02x\n",
Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5]);
}
break;
case RT_OID_802_11_RADIO:
if (wrq->u.data.length != sizeof(BOOLEAN))
Status = -EINVAL;
else
{
Status = copy_from_user(&RadioState, wrq->u.data.pointer, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, "Set::RT_OID_802_11_RADIO (=%d)\n", RadioState);
if (pAdapter->PortCfg.bSwRadio != RadioState)
{
pAdapter->PortCfg.bSwRadio = RadioState;
if (pAdapter->PortCfg.bRadio != (pAdapter->PortCfg.bHwRadio && pAdapter->PortCfg.bSwRadio))
{
pAdapter->PortCfg.bRadio = (pAdapter->PortCfg.bHwRadio && pAdapter->PortCfg.bSwRadio);
RTUSBEnqueueCmdFromNdis(pAdapter, RT_OID_SET_RADIO, TRUE, NULL, 0);
}
}
}
break;
case RT_OID_802_11_PHY_MODE:
if (wrq->u.data.length != sizeof(RT_802_11_PHY_MODE))
Status = -EINVAL;
else
{
Status = copy_from_user(&PhyMode, wrq->u.data.pointer, wrq->u.data.length);
RTUSBEnqueueCmdFromNdis(pAdapter, RT_OID_802_11_PHY_MODE, TRUE, &PhyMode, sizeof(RT_802_11_PHY_MODE));
DBGPRINT(RT_DEBUG_TRACE, "Set::RT_OID_802_11_PHY_MODE (=%d)\n", PhyMode);
}
break;
case RT_OID_802_11_STA_CONFIG:
if (wrq->u.data.length != sizeof(RT_802_11_STA_CONFIG))
Status = -EINVAL;
else
{
Status = copy_from_user(&StaConfig, wrq->u.data.pointer, wrq->u.data.length);
pStaConfig = &StaConfig;
RTUSBEnqueueCmdFromNdis(pAdapter, RT_OID_802_11_STA_CONFIG, TRUE, pStaConfig, sizeof(RT_802_11_STA_CONFIG));
DBGPRINT(RT_DEBUG_TRACE, "Set::RT_OID_802_11_SET_STA_CONFIG (Burst=%d,BGprot=%d,ShortSlot=%d,Adhoc=%d\n",
pStaConfig->EnableTxBurst,
pStaConfig->UseBGProtection,
pStaConfig->UseShortSlotTime,
pStaConfig->AdhocMode);
}
break;
case OID_802_11_DESIRED_RATES:
if (wrq->u.data.length != sizeof(NDIS_802_11_RATES))
Status = -EINVAL;
else
{
Status = copy_from_user(&aryRates, wrq->u.data.pointer, wrq->u.data.length);
NdisZeroMemory(pAdapter->PortCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);
NdisMoveMemory(pAdapter->PortCfg.DesireRate, &aryRates, sizeof(NDIS_802_11_RATES));
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_DESIRED_RATES (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\n",
pAdapter->PortCfg.DesireRate[0],pAdapter->PortCfg.DesireRate[1],
pAdapter->PortCfg.DesireRate[2],pAdapter->PortCfg.DesireRate[3],
pAdapter->PortCfg.DesireRate[4],pAdapter->PortCfg.DesireRate[5],
pAdapter->PortCfg.DesireRate[6],pAdapter->PortCfg.DesireRate[7] );
// Changing DesiredRate may affect the MAX TX rate we used to TX frames out
RTUSBEnqueueCmdFromNdis(pAdapter, RT_OID_UPDATE_TX_RATE, TRUE, NULL, 0);
}
break;
case RT_OID_802_11_PREAMBLE:
if (wrq->u.data.length != sizeof(RT_802_11_PREAMBLE))
Status = -EINVAL;
else
{
Status = copy_from_user(&Preamble, wrq->u.data.pointer, wrq->u.data.length);
if ((Preamble == Rt802_11PreambleShort) || (Preamble == Rt802_11PreambleLong) || (Preamble == Rt802_11PreambleAuto))
{
RTUSBEnqueueCmdFromNdis(pAdapter, RT_OID_802_11_PREAMBLE, TRUE, &Preamble, sizeof(RT_802_11_PREAMBLE));
}
else
{
Status = -EINVAL;
break;
}
DBGPRINT(RT_DEBUG_TRACE, "Set::RT_OID_802_11_SET_PREAMBLE (=%d)\n", Preamble);
}
break;
case OID_802_11_WEP_STATUS:
if (wrq->u.data.length != sizeof(NDIS_802_11_WEP_STATUS))
Status = -EINVAL;
else
{
Status = copy_from_user(&WepStatus, wrq->u.data.pointer, wrq->u.data.length);
// Since TKIP, AES, WEP are all supported. It should not have any invalid setting
if (WepStatus <= Ndis802_11Encryption3KeyAbsent)
{
if (pAdapter->PortCfg.WepStatus != WepStatus)
{
// Config has changed
pAdapter->bConfigChanged = TRUE;
}
//Status = RTUSBEnqueueCmdFromNdis(pAdapter, OID_802_11_WEP_STATUS, TRUE, &WepStatus, sizeof(NDIS_802_11_WEP_STATUS));
pAdapter->PortCfg.WepStatus = WepStatus;
pAdapter->PortCfg.OrigWepStatus = WepStatus;
pAdapter->PortCfg.PairCipher = WepStatus;
pAdapter->PortCfg.GroupCipher = WepStatus;
}
else
{
Status = -EINVAL;
break;
}
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_WEP_STATUS (=%d)\n",WepStatus);
}
break;
case OID_802_11_AUTHENTICATION_MODE:
if (wrq->u.data.length != sizeof(NDIS_802_11_AUTHENTICATION_MODE))
Status = -EINVAL;
else
{
Status = copy_from_user(&AuthMode, wrq->u.data.pointer, wrq->u.data.length);
if (AuthMode > Ndis802_11AuthModeMax)
{
Status = -EINVAL;
break;
}
else
{
if (pAdapter->PortCfg.AuthMode != AuthMode)
{
// Config has changed
pAdapter->bConfigChanged = TRUE;
}
pAdapter->PortCfg.AuthMode = AuthMode;
}
pAdapter->PortCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_AUTHENTICATION_MODE (=%d) \n",pAdapter->PortCfg.AuthMode);
}
break;
case OID_802_11_INFRASTRUCTURE_MODE:
if (wrq->u.data.length != sizeof(NDIS_802_11_NETWORK_INFRASTRUCTURE))
Status = -EINVAL;
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -