📄 rtusb_info.c
字号:
struct iw_point *data, char *extra){ PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv; int param; char value; if (extra) { /* Change the state if there's param. */ param = *(int *)extra; switch(param) { case 1: pAdapter->PortCfg.MallowRFMONTx = TRUE; if (pAdapter->PortCfg.ForcePrismHeader == 1) pAdapter->net->type = 802; // ARPHRD_IEEE80211_PRISM else pAdapter->net->type = 801; // ARPHRD_IEEE80211 break; case 0: pAdapter->PortCfg.MallowRFMONTx = FALSE; if (pAdapter->PortCfg.ForcePrismHeader == 2) pAdapter->net->type = 801; // ARPHRD_IEEE80211 else pAdapter->net->type = 802; // ARPHRD_IEEE80211_PRISM break; default: return -EOPNOTSUPP; } } value = pAdapter->PortCfg.MallowRFMONTx == TRUE ? '1' : '0'; data->length = sizeof (char); if (data->pointer != NULL && copy_to_user (data->pointer, &value, data->length)) DBGPRINT (RT_DEBUG_ERROR, "rtusb_ioctl_setrfmontx - copy to user failure.\n"); return 0;}static int rtusb_ioctl_setforceprismheader(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *extra){ PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv; int param = *(int *)extra; switch(param) { case 0: pAdapter->PortCfg.ForcePrismHeader = 0; if (pAdapter->PortCfg.MallowRFMONTx == TRUE) pAdapter->net->type = 801; // ARPHRD_IEEE80211 else pAdapter->net->type = 802; // ARPHRD_IEEE80211_PRISM break; case 1: pAdapter->PortCfg.ForcePrismHeader = 1; pAdapter->net->type = 802; // ARPHRD_IEEE80211_PRISM break; case 2: pAdapter->PortCfg.ForcePrismHeader = 2; pAdapter->net->type = 801; // ARPHRD_IEEE80211 break; default: return -EOPNOTSUPP; } return 0;}static int rtusb_ioctl_setadhocmode(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *extra){ PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv; int param = *(int *)extra; switch(param) { case 0: pAdapter->PortCfg.AdhocMode = 0; break; case 1: pAdapter->PortCfg.AdhocMode = 1; break; case 2: pAdapter->PortCfg.AdhocMode = 2; break; default: return -EOPNOTSUPP; } return 0;}static int rtusb_ioctl_setpsm(struct net_device *dev, struct iw_request_info *info, void *w, char *extra){ PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv; int param = *(int *)extra; switch(param) { case 0: // clear PSM bit immediately MlmeSetPsmBit(pAdapter, PWR_ACTIVE); pAdapter->PortCfg.RecvDtim = TRUE; pAdapter->PortCfg.WindowsPowerMode = Ndis802_11PowerModeCAM; break; case 1: // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange() // to exclude certain situations. pAdapter->PortCfg.RecvDtim = TRUE; pAdapter->PortCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP; pAdapter->PortCfg.DefaultListenCount = 3; break; default: return -EOPNOTSUPP; } return 0;}static const iw_handler rtusb_handler[] ={ (iw_handler) NULL, /* SIOCSIWCOMMIT */ (iw_handler) rtusb_ioctl_giwname, /* SIOCGIWNAME 1 */ (iw_handler) NULL, /* SIOCSIWNWID */ (iw_handler) NULL, /* SIOCGIWNWID */ (iw_handler) rtusb_ioctl_siwfreq, /* SIOCSIWFREQ */ (iw_handler) rtusb_ioctl_giwfreq, /* SIOCGIWFREQ 5*/ (iw_handler) rtusb_ioctl_siwmode, /* SIOCSIWMODE */ (iw_handler) rtusb_ioctl_giwmode, /* SIOCGIWMODE */ (iw_handler) NULL, /* SIOCSIWSENS */ (iw_handler) NULL, /* SIOCGIWSENS */ (iw_handler) NULL /* not used */, /* SIOCSIWRANGE */ (iw_handler) rtusb_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) rtusb_ioctl_giwap, /* SIOCGIWAP 0x15*/ (iw_handler) NULL, /* -- hole -- 0x16 */ (iw_handler) rtusb_ioctl_iwaplist, /* SIOCGIWAPLIST */#ifdef SIOCGIWSCAN (iw_handler) rtusb_ioctl_siwscan, /* SIOCSIWSCAN 0x18*/ (iw_handler) rtusb_ioctl_giwscan, /* SIOCGIWSCAN */#else (iw_handler) NULL, /* SIOCSIWSCAN */ (iw_handler) NULL, /* SIOCGIWSCAN */#endif /* SIOCGIWSCAN */ (iw_handler) rtusb_ioctl_siwessid, /* SIOCSIWESSID */ (iw_handler) rtusb_ioctl_giwessid, /* SIOCGIWESSID */ (iw_handler) rtusb_ioctl_siwnickn, /* SIOCSIWNICKN */ (iw_handler) rtusb_ioctl_giwnickn, /* SIOCGIWNICKN 1d*/ (iw_handler) NULL, /* -- hole -- */ (iw_handler) NULL, /* -- hole -- */ (iw_handler) NULL, /* SIOCSIWRATE 20*/ (iw_handler) NULL, /* SIOCGIWRATE */ (iw_handler) rtusb_ioctl_siwrts, /* SIOCSIWRTS */ (iw_handler) rtusb_ioctl_giwrts, /* SIOCGIWRTS */ (iw_handler) rtusb_ioctl_siwfrag, /* SIOCSIWFRAG */ (iw_handler) rtusb_ioctl_giwfrag, /* SIOCGIWFRAG 25*/ (iw_handler) NULL, /* SIOCSIWTXPOW */ (iw_handler) NULL, /* SIOCGIWTXPOW */ (iw_handler) NULL, /* SIOCSIWRETRY */ (iw_handler) NULL, /* SIOCGIWRETRY 29*/ (iw_handler) rtusb_ioctl_siwencode, /* SIOCSIWENCODE 2a*/ (iw_handler) rtusb_ioctl_giwencode, /* SIOCGIWENCODE 2b*/ (iw_handler) NULL, /* SIOCSIWPOWER 2c*/ (iw_handler) NULL, /* SIOCGIWPOWER 2d*/};static const iw_handler rtusb_priv_handlers[] = { (iw_handler) rtusb_ioctl_setauth, /* SIOCWFIRSTPRIV+0 */ (iw_handler) rtusb_ioctl_setencryp, /* SIOCWFIRSTPRIV+1 */ (iw_handler) rtusb_ioctl_setwpapsk, /* SIOCWFIRSTPRIV+2 */ (iw_handler) rtusb_ioctl_setpsm, /* SIOCWFIRSTPRIV+3 */ (iw_handler) rtusb_ioctl_setadhocmode, /* SIOCWFIRSTPRIV+4 */ (iw_handler) rtusb_ioctl_setrfmontx, /* SIOCWFIRSTPRIV+5 */ (iw_handler) rtusb_ioctl_setforceprismheader, /* SIOCWFIRSTPRIV+6 */};#define MAX_WPAPSK_STRING 64static const struct iw_priv_args privtab[] = { { RTPRIV_IOCTL_AUTH, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "auth"}, { RTPRIV_IOCTL_WEPSTATUS, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "enc"}, { RTPRIV_IOCTL_WPAPSK, IW_PRIV_TYPE_CHAR | MAX_WPAPSK_STRING, 0, "wpapsk"}, // Variable arg count { RTPRIV_IOCTL_PSM, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "psm"}, // Variable arg count { RTPRIV_IOCTL_ADHOCMODE, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "adhocmode"}, { RTPRIV_IOCTL_RFMONTX, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | sizeof(char), "rfmontx"}, { RTPRIV_IOCTL_FORCEPRISMHEADER, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "forceprismheader"},#if 0 { RTPRIV_IOCTL_BBP, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024, "bbp"}, { RTPRIV_IOCTL_MAC, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024, "mac"}#endif};const struct iw_handler_def rt2500usb_iw_handler_def ={ .standard = (iw_handler *) rtusb_handler, .num_standard = sizeof(rtusb_handler) / sizeof(iw_handler), .private = (iw_handler *) rtusb_priv_handlers, .num_private = ARRAY_SIZE(rtusb_handler), .private_args = (struct iw_priv_args *) privtab, .num_private_args = ARRAY_SIZE(privtab),#if IW_HANDLER_VERSION >= 6 .get_wireless_stats = RTUSB_get_wireless_stats,#endif};INT RTMPQueryInformation( IN PRT2570ADAPTER pAdapter, IN OUT struct ifreq *rq, IN INT cmd){ struct iwreq *wrq = (struct iwreq *) rq; NDIS_802_11_BSSID_LIST_EX *pBssidList = NULL; PNDIS_WLAN_BSSID_EX pBss; NDIS_802_11_SSID Ssid; NDIS_802_11_CONFIGURATION Configuration; RT_802_11_LINK_STATUS LinkStatus; NDIS_802_11_STATISTICS Statistics; NDIS_802_11_RTS_THRESHOLD RtsThresh; NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh; NDIS_802_11_POWER_MODE PowerMode; NDIS_802_11_NETWORK_INFRASTRUCTURE BssType; RT_802_11_PREAMBLE PreamType; NDIS_802_11_AUTHENTICATION_MODE AuthMode; NDIS_802_11_WEP_STATUS WepStatus; RT_VERSION_INFO DriverVersionInfo; ULONG BssBufSize; ULONG BssLen; ULONG ulInfo = 0; PUCHAR pBuf = NULL; PUCHAR pPtr; INT Status = NDIS_STATUS_SUCCESS; UCHAR Padding; UINT i; BOOLEAN RadioState; UCHAR LastR17Value; switch(cmd) { case RT_OID_DEVICE_NAME: DBGPRINT(RT_DEBUG_INFO, "Query::RT_OID_DEVICE_NAME\n"); wrq->u.data.length = sizeof(NIC_DEVICE_NAME); if(copy_to_user(wrq->u.data.pointer, NIC_DEVICE_NAME, wrq->u.data.length)) Status = -EFAULT; break; case RT_OID_VERSION_INFO: DBGPRINT(RT_DEBUG_INFO, "Query::RT_OID_VERSION_INFO \n"); DriverVersionInfo.DriverMajorVersion = DRV_MAJORVERSION; DriverVersionInfo.DriverMinorVersion = DRV_MINORVERSION; DriverVersionInfo.DriverSubVersion = DRV_SUBVERSION; DriverVersionInfo.DriverTestVersion = DRV_TESTVERSION; DriverVersionInfo.DriverBuildYear = DRV_YEAR; DriverVersionInfo.DriverBuildMonth = DRV_MONTH; DriverVersionInfo.DriverBuildDay = DRV_DAY; wrq->u.data.length = sizeof(RT_VERSION_INFO); if(copy_to_user(wrq->u.data.pointer, &DriverVersionInfo, wrq->u.data.length)) Status = -EFAULT; break; case OID_802_11_BSSID_LIST: DBGPRINT(RT_DEBUG_ERROR, "Query::OID_802_11_BSSID_LIST (%d BSS returned)\n",pAdapter->PortCfg.BssTab.BssNr); // Claculate total buffer size required BssBufSize = sizeof(ULONG); for (i = 0; i < pAdapter->PortCfg.BssTab.BssNr; i++) { // Align pointer to 4 bytes boundary. Padding = 4 - (pAdapter->PortCfg.BssTab.BssEntry[i].VarIELen & 0x0003); if (Padding == 4) Padding = 0; BssBufSize += (sizeof(NDIS_WLAN_BSSID_EX) - 4 + sizeof(NDIS_802_11_FIXED_IEs) + pAdapter->PortCfg.BssTab.BssEntry[i].VarIELen + Padding); } // For safety issue, we add 256 bytes just in case BssBufSize += 256; // Allocate the same size as passed from higher layer pBuf = kmalloc(BssBufSize, GFP_KERNEL); if(pBuf == NULL) { Status = -ENOMEM; break; } // Init 802_11_BSSID_LIST_EX structure memset(pBuf, 0, BssBufSize); pBssidList = (PNDIS_802_11_BSSID_LIST_EX) pBuf; pBssidList->NumberOfItems = pAdapter->PortCfg.BssTab.BssNr; // Calculate total buffer length BssLen = 4; // Consist of NumberOfItems // Point to start of NDIS_WLAN_BSSID_EX // pPtr = pBuf + sizeof(ULONG); pPtr = (PUCHAR) &pBssidList->Bssid[0]; for (i = 0; i < pAdapter->PortCfg.BssTab.BssNr; i++) { pBss = (PNDIS_WLAN_BSSID_EX) pPtr; memcpy(&pBss->MacAddress, &pAdapter->PortCfg.BssTab.BssEntry[i].Bssid, MAC_ADDR_LEN); if (pAdapter->PortCfg.BssTab.BssEntry[i].Hidden == 1) { pBss->Ssid.SsidLength = 0; } else { pBss->Ssid.SsidLength = pAdapter->PortCfg.BssTab.BssEntry[i].SsidLen; memcpy(pBss->Ssid.Ssid, pAdapter->PortCfg.BssTab.BssEntry[i].Ssid, pAdapter->PortCfg.BssTab.BssEntry[i].SsidLen); } pBss->Privacy = pAdapter->PortCfg.BssTab.BssEntry[i].Privacy; //DBGPRINT(RT_DEBUG_ERROR,"pBss->Privacy=%x\n",(pBss->Privacy)); pBss->Rssi = pAdapter->PortCfg.BssTab.BssEntry[i].Rssi - RSSI_TO_DBM_OFFSET; //DBGPRINT(RT_DEBUG_ERROR,"pBss->Rssi=%x\n",pBss->Rssi); pBss->NetworkTypeInUse = Ndis802_11DS; //DBGPRINT(RT_DEBUG_ERROR,"pBss->NetworkTypeInUse=%x\n",(pBss->NetworkTypeInUse)); pBss->Configuration.Length = sizeof(NDIS_802_11_CONFIGURATION); //DBGPRINT(RT_DEBUG_ERROR,"pBss->pBss->Configuration.Length=%d\n",pBss->Configuration.Length); pBss->Configuration.BeaconPeriod = pAdapter->PortCfg.BssTab.BssEntry[i].BeaconPeriod; //DBGPRINT(RT_DEBUG_ERROR,"pBss->pBss->Configuration.BeaconPeriod=%d\n",pBss->Configuration.BeaconPeriod); pBss->Configuration.ATIMWindow = pAdapter->PortCfg.BssTab.BssEntry[i].AtimWin; MAP_CHANNEL_ID_TO_KHZ(pAdapter->PortCfg.BssTab.BssEntry[i].Channel, pBss->Configuration.DSConfig); if (pAdapter->PortCfg.BssTab.BssEntry[i].BssType == BSS_INFRA) pBss->InfrastructureMode = Ndis802_11Infrastructure; else pBss->InfrastructureMode = Ndis802_11IBSS; memcpy(pBss->SupportedRates, pAdapter->PortCfg.BssTab.BssEntry[i].Rates, pAdapter->PortCfg.BssTab.BssEntry[i].RatesLen); //DBGPRINT(RT_DEBUG_ERROR, "BSS#%d - %s, length of ssid=%d,Ch %d = %d Khz\n", // i,pBss->Ssid.Ssid,pBss->Ssid.SsidLength,pAdapter->PortCfg.BssTab.BssEntry[i].Channel,pBss->Configuration.DSConfig); if (pAdapter->PortCfg.BssTab.BssEntry[i].VarIELen == 0) { pBss->IELength = sizeof(NDIS_802_11_FIXED_IEs); memcpy(pBss->IEs, &pAdapter->PortCfg.BssTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs)); pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 4 + sizeof(NDIS_802_11_FIXED_IEs); } else { pBss->IELength = sizeof(NDIS_802_11_FIXED_IEs) + pAdapter->PortCfg.BssTab.BssEntry[i].VarIELen; pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 4 + sizeof(NDIS_802_11_FIXED_IEs); memcpy(pBss->IEs, &pAdapter->PortCfg.BssTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs)); memcpy(pPtr, pAdapter->PortCfg.BssTab.BssEntry[i].VarIEs, pAdapter->PortCfg.BssTab.BssEntry[i].VarIELen); pPtr += pAdapter->PortCfg.BssTab.BssEntry[i].VarIELen; } // Align pointer to 4 bytes boundary. Padding = 4 - (pAdapter->PortCfg.BssTab.BssEntry[i].VarIELen & 0x0003); if (Padding == 4) Padding = 0; pPtr += Padding; pBss->Length = sizeof(NDIS_WLAN_BSSID_EX) - 4 + sizeof(NDIS_802_11_FIXED_IEs) + pAdapter->PortCfg.BssTab.BssEntry[i].VarIELen + Padding; BssLen += pBss->Length; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -