📄 rtusb_info.c
字号:
if (++range->num_frequency == IW_MAX_FREQUENCIES)
break;
}
range->max_qual.qual = 70; /* what is correct max? This was not
* documented exactly. At least
* 69 has been observed. */
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 void
set_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 SIOCGIWSCAN
int 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 ((pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE) && (pAdapter->MLMEThr_pid > 0))
{
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;
}
int
rtusb_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;
}
#endif
int 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.
}
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 (pAdapter->MLMEThr_pid > 0)
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 */
if(pAdapter->MediaState == NdisMediaStateConnected)
{
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);
}
else
{//the ANY ssid was specified
data->length = 0;
DBGPRINT(RT_DEBUG_TRACE,"MediaState is not connected, ess\n");
}
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -