📄 rtmp_info.c
字号:
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 intrt_ioctl_setparam(struct net_device *dev, struct iw_request_info *info, void *w, char *extra){ PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv; struct rt_priv_support *PRTMP_PRIVATE_SET_PROC; char *this_char = extra; char *value; int Status=0; DBGPRINT(RT_DEBUG_TRACE, "--> %s\n", __FUNCTION__); //check if the interface is down if (pAdapter->RTUSBCmdThr_pid < 0) return -ENETDOWN; if (!*this_char) { DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); return -EINVAL; } if ((value = rtstrchr(this_char, '=')) != NULL) *value++ = 0; else { DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); return -EINVAL; } // reject setting nothing besides ANY ssid(ssidLen=0) if (!*value && (strcmp(this_char, "SSID") != 0)) return -ENOSYS; 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 DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); 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) rt_ioctl_setparam, /* SIOCWFIRSTPRIV+1 */};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 IW_HANDLER_VERSION >= 6 .get_wireless_stats = rt73_get_wireless_stats,#endif#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;#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)) { DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); 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)) { DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); 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) { DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); Status = -EINVAL; } else { // reset SSID to null if (pSsid->SsidLength == 0) { Ssid.Ssid[0] = 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)) { DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); 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)) { DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); 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)) { DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); 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)) { DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); 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)) { DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); Status = -EINVAL; } else { Status = copy_from_user(&aryRates, wrq->u.data.pointer, wrq->u.data.length); memset(pAdapter->PortCfg.DesireRate, 0, MAX_LEN_OF_SUPPORTED_RATES); memcpy(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)) { DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); 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 { DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); 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)) { DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); 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 { DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); 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)) { DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); Status = -EINVAL; } else { Status = copy_from_user(&AuthMode, wrq->u.data.pointer, wrq->u.data.length);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -