📄 rtmp_info.c
字号:
range->we_version_compiled = WIRELESS_EXT; range->we_version_source = 14; /* Retry limits and lifetime */ range->retry_capa = IW_RETRY_LIMIT; // What retry options are supported range->retry_flags = IW_RETRY_LIMIT; // How to decode max/min retry limit //range->r_time_flags = ; range->min_retry = 0; // Minimal number of retries range->max_retry = 255; // //range->min_r_time = ; //range->max_r_time = ; /* Frequency */ range->num_channels = pAdapter->ChannelListNum; // 1. For numbers lower than 10^9, we encode the number in 'm' and set 'e' to 0. // 2. For number greater than 10^9, we divide it by the lowest power of 10 to get 'm' // lower than 10^9, with 'm'= f / (10^'e')... // 3. The power of 10 is in 'e', the result of the division is in 'm'. for (val = 0, i = 1; i <= range->num_channels; i++) { u32 m; range->freq[val].i = pAdapter->ChannelList[i-1].Channel; MAP_CHANNEL_ID_TO_KHZ(pAdapter->ChannelList[i-1].Channel, m); range->freq[val].m = m * 100; /* HZ */ range->freq[val].e = 1; val++; if (val == IW_MAX_FREQUENCIES) break; } range->num_frequency = val;#if WIRELESS_EXT > 17 /* IW_ENC_CAPA_* bit field */ range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;#endif#if 0 over2 = 0; len = prism2_get_datarates(dev, rates); range->num_bitrates = 0; for (i = 0; i < len; i++) { if (range->num_bitrates < IW_MAX_BITRATES) { range->bitrate[range->num_bitrates] = rates[i] * 500000; range->num_bitrates++; } if (rates[i] == 0x0b || rates[i] == 0x16) over2 = 1; } /* estimated maximum TCP throughput values (bps) */ range->throughput = over2 ? 5500000 : 1500000;#endif return 0;}// Set BSSID of APint rt_ioctl_siwap(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) dev->priv; UCHAR Bssid[MAC_ADDR_LEN]; //check if the interface is down if ((dev->flags & IFF_UP) == 0) return -ENETDOWN; if (pAd->RTUSBCmdThr_pid < 0) return -ENETDOWN; if (wrqu->ap_addr.sa_family != ARPHRD_ETHER) return -EINVAL;#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT#if WIRELESS_EXT > 17 if (pAd->PortCfg.bNativeWpa == TRUE) // add by johnli { if (pAd->PortCfg.wx_need_sync){ wext2Rtmp_Security_Wrapper(pAd); pAd->PortCfg.wx_need_sync = 0; } }#endif#endif NdisMoveMemory(&Bssid[0], wrqu->ap_addr.sa_data, MAC_ADDR_LEN); if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) { MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, RT_CMD_RESET_MLME, 0, NULL); } #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT if (pAd->PortCfg.bNativeWpa == TRUE) // add by johnli { if (NdisEqualMemory(wrqu->ap_addr.sa_data, "\x00\x00\x00\x00\x00\x00", MAC_ADDR_LEN)) { if (INFRA_ON(pAd)) { MLME_DISASSOC_REQ_STRUCT DisassocReq; pAd->MlmeAux.CurrReqIsFromNdis = TRUE; DBGPRINT(RT_DEBUG_TRACE, "CNTL - disassociate with current AP...\n"); DisassocParmFill(pAd, &DisassocReq, pAd->PortCfg.Bssid, REASON_DISASSOC_STA_LEAVING); MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq); pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC; } return 0; } }#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, OID_802_11_BSSID, sizeof(NDIS_802_11_MAC_ADDRESS), (VOID *)&Bssid); DBGPRINT(RT_DEBUG_TRACE, "%s():IOCTL::SIOCSIWAP %02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__, Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5]); // Trigge rhr MlmeHandler because upper layer sent a MLME-related operations. RTUSBMlmeUp(pAd); return 0; }// get BSSID of connected APint rt_ioctl_giwap(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv; if (pAdapter->RTUSBCmdThr_pid < 0) return -ENETDOWN; if (INFRA_ON(pAdapter) || ADHOC_ON(pAdapter)) { wrqu->ap_addr.sa_family = ARPHRD_ETHER; memcpy(wrqu->ap_addr.sa_data, &pAdapter->PortCfg.Bssid, ETH_ALEN); } else { memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); DBGPRINT(RT_DEBUG_TRACE, "rt_ioctl_giwap():SIOCGIWAP(=EMPTY)\n"); return -ENOTCONN; } return 0;}/* * Units are in db above the noise floor. That means the * rssi values reported in the tx/rx descriptors in the * driver are the SNR expressed in db. * * If you assume that the noise floor is -95, which is an * excellent assumption 99.5 % of the time, then you can * derive the absolute signal level (i.e. -95 + rssi). * There are some other slight factors to take into account * depending on whether the rssi measurement is from 11b, * 11g, or 11a. These differences are at most 2db and * can be documented. * * NB: various calculations are based on the orinoco/wavelan * drivers for compatibility */static void set_quality(PRTMP_ADAPTER pAdapter, struct iw_quality *iq, u_int rssi){ u32 ChannelQuality, NorRssi; // Normalize Rssi if (rssi > 0x50) NorRssi = 100; else if (rssi < 0x20) NorRssi = 0; else NorRssi = (rssi - 0x20) * 2; // ChannelQuality = W1*RSSI + W2*TxPRR + W3*RxPER (RSSI 0..100), (TxPER 100..0), (RxPER 100..0) ChannelQuality = (RSSI_WEIGHTING * NorRssi + TX_WEIGHTING * (100 - 0) + RX_WEIGHTING* (100 - 0)) / 100; if (ChannelQuality >= 100) ChannelQuality = 100; iq->qual = ChannelQuality; #ifdef RTMP_EMBEDDED iq->level = rt_abs(rssi); // signal level (dBm)#else iq->level = abs(rssi); // signal level (dBm)#endif iq->level += 256 - pAdapter->BbpRssiToDbmDelta; iq->noise = (pAdapter->BbpWriteLatch[17] > pAdapter->BbpTuning.R17UpperBoundG) ? pAdapter->BbpTuning.R17UpperBoundG : ((ULONG) pAdapter->BbpWriteLatch[17]); // noise level (dBm) iq->noise += 256 - 143; iq->updated = pAdapter->iw_stats.qual.updated; }int rt_ioctl_iwaplist(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *extra){ PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv; struct sockaddr addr[IW_MAX_AP]; struct iw_quality qual[IW_MAX_AP]; int i; if (pAdapter->RTUSBCmdThr_pid < 0) return -ENETDOWN; for (i = 0; i <IW_MAX_AP ; i++) { if (i >= pAdapter->ScanTab.BssNr) break; addr[i].sa_family = ARPHRD_ETHER; memcpy(addr[i].sa_data, &pAdapter->ScanTab.BssEntry[i].Bssid, MAC_ADDR_LEN); set_quality(pAdapter, &qual[i], pAdapter->ScanTab.BssEntry[i].Rssi); } data->length = i; memcpy(extra, &addr, i*sizeof(addr[0])); data->flags = 1; /* signal quality present (sort of) */ memcpy(extra + i*sizeof(addr[0]), &qual, i*sizeof(qual[i])); return 0;}#ifdef SIOCGIWSCANint rt_ioctl_siwscan(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ ULONG Now; PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv; int Status = NDIS_STATUS_SUCCESS; //BOOLEAN StateMachineTouched = FALSE; //check if the interface is down if ((dev->flags & IFF_UP) == 0) return -ENETDOWN; if (pAdapter->RTUSBCmdThr_pid < 0) return -ENETDOWN; if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) return 0; do{ Now = jiffies; 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; break; } if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE && (pAdapter->MLMEThr_pid > 0)) { MlmeEnqueue(pAdapter, MLME_CNTL_STATE_MACHINE, RT_CMD_RESET_MLME, 0, NULL); } // Reset Missed scan number pAdapter->PortCfg.ScanCnt = 0; pAdapter->PortCfg.LastScanTime = Now; MlmeEnqueue(pAdapter, MLME_CNTL_STATE_MACHINE, OID_802_11_BSSID_LIST_SCAN, 0, NULL); RTUSBMlmeUp(pAdapter); Status = NDIS_STATUS_SUCCESS; //StateMachineTouched = TRUE; }while(0); return 0;}#define MAX_CUSTOM_LEN 64intrt_ioctl_giwscan(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv; int i=2, j; char *current_ev = extra, *previous_ev = extra; struct iw_event iwe; BSS_ENTRY *pBssEntry;#if WIRELESS_EXT >= 17 char *end_buf = (char *)(extra + wrqu->data.length);#else char *end_buf = extra + IW_SCAN_MAX_DATA; // If wireless_ext < 18, the maxima length of scan result restricted on IW_SCAN_MAX_DATA.#endif #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT // support bit rate, extended rate, quality and last beacon timing char *p; unsigned char *pExtRate, *pSupRate; char rate; int k; char custom[MAX_CUSTOM_LEN];/* remove by johnli#else char *current_val;*/#endif char *current_val; // add by johnli if (pAdapter->RTUSBCmdThr_pid < 0) return -ENETDOWN; if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)){ /* * Still scanning, indicate the caller should try again. */ return -EAGAIN; } if (pAdapter->ScanTab.BssNr == 0) return -EAGAIN; for (i = 0; i < pAdapter->ScanTab.BssNr; i++) { if (current_ev >= end_buf) break; pBssEntry = (BSS_ENTRY *)&pAdapter->ScanTab.BssEntry[i]; //AP MAC address //================================ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = SIOCGIWAP; iwe.u.ap_addr.sa_family = ARPHRD_ETHER; memcpy(iwe.u.ap_addr.sa_data, pBssEntry->Bssid, ETH_ALEN); previous_ev = current_ev; current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_ADDR_LEN); if (current_ev == previous_ev) break; //Network Type(INFRA/ADHOC) //================================ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = SIOCGIWMODE; if (pBssEntry->BssType == Ndis802_11IBSS) iwe.u.mode = IW_MODE_ADHOC; else if (pBssEntry->BssType == Ndis802_11Infrastructure) iwe.u.mode = IW_MODE_INFRA; else iwe.u.mode = IW_MODE_AUTO; iwe.len = IW_EV_UINT_LEN; previous_ev = current_ev; current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_UINT_LEN); if (current_ev == previous_ev) break; //ESSID //================================ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = SIOCGIWESSID; iwe.u.data.length = pBssEntry->SsidLen; iwe.u.data.flags = 1; previous_ev = current_ev; current_ev = iwe_stream_add_point(current_ev,end_buf, &iwe, pBssEntry->Ssid); if (current_ev == previous_ev) break; //Channel and Frequency //================================ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = SIOCGIWFREQ; iwe.u.freq.m = pBssEntry->Channel; iwe.u.freq.e = 0; iwe.u.freq.i = 0; previous_ev = current_ev; current_ev = iwe_stream_add_event(current_ev,end_buf, &iwe, IW_EV_FREQ_LEN); if (current_ev == previous_ev) break; //Encyption //================================ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = SIOCGIWENCODE; if (CAP_IS_PRIVACY_ON (pBssEntry->CapabilityInfo )) iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; else iwe.u.data.flags = IW_ENCODE_DISABLED; iwe.u.data.length = 0; previous_ev = current_ev; current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, (char *)pAdapter->SharedKey[pAdapter->PortCfg.DefaultKeyId].Key); if (current_ev == previous_ev) break;#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT if (pAdapter->PortCfg.bNativeWpa == TRUE) // add by johnli { // support bit rate //================================ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = SIOCGIWRATE; iwe.u.bitrate.fixed = 0; iwe.u.bitrate.disabled = 0; pSupRate = (unsigned char *)&pBssEntry->SupRate[0]; pExtRate = (unsigned char *)&pBssEntry->ExtRate[0];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -