📄 rtusb_info.c
字号:
val++; if (val == IW_MAX_FREQUENCIES) break; } range->num_frequency = 0; for (i = 1; i <= range->num_channels; i++) { range->freq[range->num_frequency].i = i; MAP_CHANNEL_ID_TO_KHZ(i, m); range->freq[range->num_frequency].m = m; range->freq[range->num_frequency].e = 3; if (++range->num_frequency == IW_MAX_FREQUENCIES) break; } range->max_qual.qual = 100; /* percentage */ range->max_qual.level = 0; /* dB */ range->max_qual.noise = 0; /* dB */ /* What would be suitable values for "average/typical" qual? */ range->avg_qual.qual = 20; range->avg_qual.level = -60; range->avg_qual.noise = -95; range->sensitivity = 3; range->max_encoding_tokens = NR_WEP_KEYS; range->num_encoding_sizes = 2; range->encoding_size[0] = 5; range->encoding_size[1] = 13;#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 range->min_rts = 0; range->max_rts = 2347; range->min_frag = 256; range->max_frag = 2346; return 0;}int rtusb_ioctl_giwap(struct net_device *dev, struct iw_request_info *info, struct sockaddr *ap_addr, char *extra){ PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv; if (INFRA_ON(pAdapter) || ADHOC_ON(pAdapter)) { ap_addr->sa_family = ARPHRD_ETHER; memcpy(ap_addr->sa_data, &pAdapter->PortCfg.Bssid, ETH_ALEN); } else { DBGPRINT(RT_DEBUG_TRACE, "ioctl::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 voidset_quality(struct iw_quality *iq, u_int rssi){ iq->qual = rssi; /* NB: max is 94 because noise is hardcoded to 161 */ if (iq->qual > 94) iq->qual = 94; iq->noise = RSSI_TO_DBM_OFFSET; /* -95dBm */ iq->level = iq->noise + iq->qual; iq->updated = 7;}int rtusb_ioctl_iwaplist(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *extra){ PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv; struct sockaddr addr[IW_MAX_AP]; struct iw_quality qual[IW_MAX_AP]; int i; for (i = 0; i <IW_MAX_AP ; i++) { if (i >= pAdapter->PortCfg.BssTab.BssNr) break; addr[i].sa_family = ARPHRD_ETHER; memcpy(addr[i].sa_data, &pAdapter->PortCfg.BssTab.BssEntry[i].Bssid, MAC_ADDR_LEN); set_quality(&qual[i], pAdapter->PortCfg.BssTab.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 rtusb_ioctl_siwscan(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *extra){ PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv; int Status = STATUS_SUCCESS; do{ if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) return 0; if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RADIO_OFF)) return 0;#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0) if ((pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE) && (pAdapter->MLMEThr_pid > 0))#else if ((pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE) && (pAdapter->MLMEThr_active))#endif { DBGPRINT(RT_DEBUG_ERROR, "!!! MLME busy, reset MLME state machine !!!\n"); MlmeRestartStateMachine(pAdapter); MlmePostRestartStateMachine(pAdapter); return (RTUSBEnqueueCmdFromNdis(pAdapter, OID_802_11_BSSID_LIST_SCAN, TRUE, NULL, 0)); } pAdapter->Mlme.CntlAux.CurrReqIsFromNdis = FALSE; // Reset Missed scan number pAdapter->PortCfg.IgnoredScanNumber = 0; MlmeEnqueue(pAdapter, MLME_CNTL_STATE_MACHINE, OID_802_11_BSSID_LIST_SCAN, 0, NULL); RTUSBUp(pAdapter, (&(pAdapter->mlme_semaphore))); Status = NDIS_STATUS_SUCCESS; }while(0); return 0;}intrtusb_ioctl_giwscan(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *extra){ PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv; int i=2, j; char *current_ev = extra; char *end_buf = extra + IW_SCAN_MAX_DATA; char *current_val; struct iw_event iwe; if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)){ /* * Still scanning, indicate the caller should try again. */ return -EAGAIN; } for (i = 0; i < pAdapter->PortCfg.BssTab.BssNr; i++) { if (current_ev >= end_buf) break; //================================ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = SIOCGIWAP; iwe.u.ap_addr.sa_family = ARPHRD_ETHER; memcpy(iwe.u.ap_addr.sa_data, &pAdapter->PortCfg.BssTab.BssEntry[i].Bssid, ETH_ALEN); current_ev = iwe_stream_add_event(current_ev,end_buf, &iwe, IW_EV_ADDR_LEN); //================================ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = SIOCGIWMODE; if (pAdapter->PortCfg.BssTab.BssEntry[i].BssType == Ndis802_11IBSS) { iwe.u.mode = IW_MODE_ADHOC; } else if (pAdapter->PortCfg.BssTab.BssEntry[i].BssType == Ndis802_11Infrastructure) { iwe.u.mode = IW_MODE_INFRA; } else { iwe.u.mode = IW_MODE_AUTO; } iwe.len = IW_EV_UINT_LEN; current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_UINT_LEN); //================================ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = SIOCGIWESSID; iwe.u.data.length = pAdapter->PortCfg.BssTab.BssEntry[i].SsidLen; iwe.u.data.flags = 1; current_ev = iwe_stream_add_point(current_ev,end_buf, &iwe, pAdapter->PortCfg.BssTab.BssEntry[i].Ssid); //================================ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = SIOCGIWENCODE; if (CAP_IS_PRIVACY_ON (pAdapter->PortCfg.BssTab.BssEntry[i].CapabilityInfo )) iwe.u.data.flags =IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; else iwe.u.data.flags = IW_ENCODE_DISABLED; current_ev = iwe_stream_add_point(current_ev, end_buf,&iwe, pAdapter->PortCfg.BssTab.BssEntry[i].Ssid); //================================ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = SIOCGIWRATE; current_val = current_ev + IW_EV_LCP_LEN; //for (j = 0; j < pAdapter->PortCfg.BssTab.BssEntry[i].RatesLen;j++) for (j = 0; j < 1;j++) { iwe.u.bitrate.value = RateIdToMbps[pAdapter->PortCfg.BssTab.BssEntry[i].Rates[i]/2] * 1000000; iwe.u.bitrate.disabled = 0; current_val = iwe_stream_add_value(current_ev, current_val, end_buf, &iwe, IW_EV_PARAM_LEN); } //================================ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = SIOCGIWFREQ; if (INFRA_ON(pAdapter) || ADHOC_ON(pAdapter)) iwe.u.freq.m = pAdapter->PortCfg.BssTab.BssEntry[i].Channel; else iwe.u.freq.m = pAdapter->PortCfg.BssTab.BssEntry[i].Channel; iwe.u.freq.e = 0; iwe.u.freq.i = 0; current_ev = iwe_stream_add_event(current_ev,end_buf, &iwe, IW_EV_FREQ_LEN); //================================ memset(&iwe, 0, sizeof(iwe)); } data->length = current_ev - extra; DBGPRINT(RT_DEBUG_TRACE,"rtusb_ioctl_giwscan. %d BSS returned\n",pAdapter->PortCfg.BssTab.BssNr); return 0;}#endifint rtusb_ioctl_siwessid(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *essid){ PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv; NDIS_802_11_SSID Ssid, *pSsid=NULL; memset(&Ssid, 0x00, sizeof(NDIS_802_11_SSID)); if (data->flags) { if (data->length > IW_ESSID_MAX_SIZE) { return -E2BIG; } memcpy(Ssid.Ssid, essid, (data->length - 1)); Ssid.SsidLength = data->length - 1; //minus null character. memcpy(pAdapter->PortCfg.Ssid, essid, (data->length - 1)); pAdapter->PortCfg.SsidLen = data->length - 1; } else Ssid.SsidLength = 0; // ANY ssid pSsid = &Ssid; // tell CNTL state machine to call NdisMSetInformationComplete() after completing // this request, because this request is initiated by NDIS. pAdapter->Mlme.CntlAux.CurrReqIsFromNdis = FALSE; DBGPRINT(RT_DEBUG_TRACE,"--->Ssid.SsidLength = %d, %s\n",Ssid.SsidLength, Ssid.Ssid); #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0) if (pAdapter->MLMEThr_pid > 0)#else if (!IS_ERR(pAdapter->MLMEThr))#endif MlmeEnqueue(pAdapter, MLME_CNTL_STATE_MACHINE, OID_802_11_SSID, sizeof(NDIS_802_11_SSID), (VOID *)pSsid ); RTUSBUp(pAdapter, (&(pAdapter->mlme_semaphore))); return 0;}int rtusb_ioctl_giwessid(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *essid){ PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv; data->flags = 1; /* active */ DBGPRINT(RT_DEBUG_TRACE,"MediaState is connected\n"); data->length = pAdapter->PortCfg.SsidLen; memcpy(essid, pAdapter->PortCfg.Ssid, pAdapter->PortCfg.SsidLen); pAdapter->PortCfg.Ssid[pAdapter->PortCfg.SsidLen] = '\0'; DBGPRINT(RT_DEBUG_TRACE,"pAdapter->PortCfg.Ssid=%s , Ssidlen = %d\n",pAdapter->PortCfg.Ssid, pAdapter->PortCfg.SsidLen); DBGPRINT(RT_DEBUG_TRACE, "<==rtusb_ioctl_giwessid:: (Len=%d, ssid=%s...)\n", pAdapter->PortCfg.SsidLen, pAdapter->PortCfg.Ssid); return 0;}int rtusb_ioctl_siwnickn(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *nickname){ PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv; if (data->length > IEEE80211_NWID_LEN) return -EINVAL; memset(pAdapter->nickn, 0, IEEE80211_NWID_LEN); memcpy(pAdapter->nickn, nickname, data->length); pAdapter->nicknamelen = data->length; return 0;}int rtusb_ioctl_giwnickn(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *nickname){ PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv; if (data->length > pAdapter->nicknamelen + 1) data->length = pAdapter->nicknamelen + 1; if (data->length > 0) { memcpy(nickname, pAdapter->nickn, data->length-1); nickname[data->length-1] = '\0'; } return 0;}int rtusb_ioctl_siwrts(struct net_device *dev, struct iw_request_info *info, struct iw_param *rts, char *extra){ PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv; u16 val; if (rts->disabled) val = MAX_RTS_THRESHOLD; else if (1 > rts->value || rts->value > MAX_RTS_THRESHOLD) return -EINVAL; else val = rts->value;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -