📄 r8180_wx.c
字号:
rtl8180_commit(dev);out: up(&priv->wx_sem); return ret;}static int r8180_wx_get_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b){ int ret; struct r8180_priv *priv = dev->priv; down(&priv->wx_sem); ret = ieee80211_r8180_wx_get_essid(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); return ret;}static int r8180_wx_set_freq(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b){ int ret; struct r8180_priv *priv = dev->priv; struct iw_freq *fwrq = & wrqu->freq; down(&priv->wx_sem); if(priv->ieee80211->iw_mode == IW_MODE_INFRA){ ret = -1; goto out; } /* if setting by freq convert to channel */ if (fwrq->e == 1) { if ((fwrq->m >= (int) 2.412e8 && fwrq->m <= (int) 2.487e8)) { int f = fwrq->m / 100000; int c = 0; while ((c < 14) && (f != wlan_frequencies[c])) c++; /* hack to fall through */ fwrq->e = 0; fwrq->m = c + 1; } } if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ ret = -EOPNOTSUPP; goto out; }else { /* Set the channel */ // DMESG("setting ch %d",fwrq->m); rtl8180_rtx_disable(dev); priv->chan=fwrq->m; rtl8180_set_chan(dev, fwrq->m); if(priv->up){ // fix_rx_fifo(dev); // already done in rx_enable rtl8180_rx_enable(dev); rtl8180_tx_enable(dev); } ret = 0; goto out; } ret = 0;out: up(&priv->wx_sem); return ret;}static int r8180_wx_get_name(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ strcpy(wrqu->name, "IEEE 802.11b"); return 0;}static int r8180_wx_set_frag(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ struct r8180_priv *priv = dev->priv; if (wrqu->frag.disabled) priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; else { if (wrqu->frag.value < MIN_FRAG_THRESHOLD || wrqu->frag.value > MAX_FRAG_THRESHOLD) return -EINVAL; priv->ieee80211->fts = wrqu->frag.value & ~0x1; } return 0;}static int r8180_wx_get_frag(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ struct r8180_priv *priv = dev->priv; wrqu->frag.value = priv->ieee80211->fts; wrqu->frag.fixed = 0; /* no auto select */ wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FRAG_THRESHOLD); return 0;}static int r8180_wx_set_wap(struct net_device *dev, struct iw_request_info *info, union iwreq_data *awrq, char *extra){ int ret; struct r8180_priv *priv = dev->priv; down(&priv->wx_sem); if(priv->ieee80211->iw_mode == IW_MODE_MASTER){ ret = -EINVAL; goto out; } ret = ieee80211_r8180_wx_set_wap(priv->ieee80211, info, awrq, extra); /* r8180_set_mac_adr_(dev,awrq); */ if(priv->ieee80211->iw_mode == IW_MODE_ADHOC) rtl8180_commit(dev); out: up(&priv->wx_sem); return ret; } static int r8180_wx_get_wap(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ struct r8180_priv *priv = dev->priv; wrqu->ap_addr.sa_family = ARPHRD_ETHER; if(priv->ieee80211->iw_mode == IW_MODE_INFRA) { if(priv->ieee80211->link_state != WLAN_LINK_ASSOCIATED){ memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); }else{ memcpy(wrqu->ap_addr.sa_data, priv->ieee80211->ass_beacon->bssid, ETH_ALEN); } }else if(priv->ieee80211->iw_mode == IW_MODE_MONITOR){ memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); }else if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || priv->ieee80211->iw_mode == IW_MODE_MASTER){ memcpy(wrqu->ap_addr.sa_data, priv->ieee80211->beacon_cell_ssid, ETH_ALEN); } return 0;}static int r8180_wx_set_enc(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *key){ struct r8180_priv *priv = dev->priv; int ret; down(&priv->wx_sem); #ifndef CONFIG_IEEE80211_NOWEP if(priv->hw_wep) ret = r8180_wx_set_key(dev,info,wrqu,key); else{ DMESG("Setting SW wep key"); ret = ieee80211_r8180_wx_set_encode(priv->ieee80211,info,wrqu,key); }#else ret = r8180_wx_set_key(dev,info,wrqu,key); #endif if (priv->ieee80211->iw_mode == IW_MODE_ADHOC || priv->ieee80211->iw_mode == IW_MODE_MASTER) rtl8180_update_beacon_security(priv->dev); up(&priv->wx_sem); return ret;}static int r8180_wx_get_enc(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *key){ struct r8180_priv *priv = dev->priv; #ifdef CONFIG_IEEE80211_NOWEP return -1; //FIXME: what is going on here? if(priv->hw_wep) return -1;#else return ieee80211_r8180_wx_get_encode(priv->ieee80211, info, wrqu, key);#endif}static int r8180_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){ struct r8180_priv *priv = dev->priv; int *parms=(int*)p; int mode=parms[0]; priv->active_probe = mode; return 1;}/* added by christian */static int r8180_wx_set_monitor_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){ struct r8180_priv *priv = dev->priv; int *parms=(int*)p; int mode=parms[0]; if(priv->ieee80211->iw_mode != IW_MODE_MONITOR) return -1; priv->prism_hdr = mode; if(!mode)dev->type=ARPHRD_IEEE80211; else dev->type=ARPHRD_IEEE80211_PRISM; return 0; } //of r8180_wx_set_monitor_type/* end added christian */static int r8180_wx_set_retry(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ struct r8180_priv *priv = dev->priv; down(&priv->wx_sem); if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled) return -EINVAL; if (!(wrqu->retry.flags & IW_RETRY_LIMIT)) return -EINVAL; if(wrqu->retry.value > R8180_MAX_RETRY) return -EINVAL; if (wrqu->retry.flags & IW_RETRY_MAX) { priv->retry_rts = wrqu->retry.value; DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value); }else { priv->retry_data = wrqu->retry.value; DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value); } /* FIXME ! * We might try to write directly the TX config register * or to restart just the (R)TX process. * I'm unsure if whole reset is really needed */ rtl8180_commit(dev); /* if(priv->up){ rtl8180_rtx_disable(dev); rtl8180_rx_enable(dev); rtl8180_tx_enable(dev); } */ up(&priv->wx_sem); return 0;}static int r8180_wx_get_retry(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ struct r8180_priv *priv = dev->priv; wrqu->retry.disabled = 0; /* can't be disabled */ if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) return -EINVAL; if (wrqu->retry.flags & IW_RETRY_MAX) { wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX; wrqu->retry.value = priv->retry_rts; } else { wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MIN; wrqu->retry.value = priv->retry_data; } //DMESG("returning %d",wrqu->retry.value); return 0;}static int dummy(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu,char *b){ return -1;}static iw_handler r8180_wx_handlers[] ={ NULL, /* SIOCSIWCOMMIT */ r8180_wx_get_name, /* SIOCGIWNAME */ dummy, /* SIOCSIWNWID */ dummy, /* SIOCGIWNWID */ r8180_wx_set_freq, /* SIOCSIWFREQ */ r8180_wx_get_freq, /* SIOCGIWFREQ */ r8180_wx_set_mode, /* SIOCSIWMODE */ r8180_wx_get_mode, /* SIOCGIWMODE */ dummy, /* SIOCSIWSENS */ dummy, /* SIOCGIWSENS */ NULL, /* SIOCSIWRANGE */ rtl8180_wx_get_range, /* SIOCGIWRANGE */ NULL, /* SIOCSIWPRIV */ NULL, /* SIOCGIWPRIV */ NULL, /* SIOCSIWSTATS */ NULL, /* SIOCGIWSTATS */ dummy, /* SIOCSIWSPY */ dummy, /* SIOCGIWSPY */ NULL, /* SIOCGIWTHRSPY */ NULL, /* SIOCWIWTHRSPY */ r8180_wx_set_wap, /* SIOCSIWAP */ r8180_wx_get_wap, /* SIOCGIWAP */ NULL, /* -- hole -- */ dummy, /* SIOCGIWAPLIST -- depricated */ r8180_wx_set_scan, /* SIOCSIWSCAN */ r8180_wx_get_scan, /* SIOCGIWSCAN */ r8180_wx_set_essid, /* SIOCSIWESSID */ r8180_wx_get_essid, /* SIOCGIWESSID */ dummy, /* SIOCSIWNICKN */ dummy, /* SIOCGIWNICKN */ NULL, /* -- hole -- */ NULL, /* -- hole -- */ r8180_wx_set_rate, /* SIOCSIWRATE */ r8180_wx_get_rate, /* SIOCGIWRATE */ dummy, /* SIOCSIWRTS */ dummy, /* SIOCGIWRTS */ r8180_wx_set_frag, /* SIOCSIWFRAG */ r8180_wx_get_frag, /* SIOCGIWFRAG */ dummy, /* SIOCSIWTXPOW */ dummy, /* SIOCGIWTXPOW */ r8180_wx_set_retry, /* SIOCSIWRETRY */ r8180_wx_get_retry, /* SIOCGIWRETRY */ r8180_wx_set_enc, /* SIOCSIWENCODE */ r8180_wx_get_enc, /* SIOCGIWENCODE */ dummy, /* SIOCSIWPOWER */ dummy, /* SIOCGIWPOWER */}; static const struct iw_priv_args r8180_private_args[] = { { SIOCIWFIRSTPRIV + 0x0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "monitor" }, { SIOCIWFIRSTPRIV + 0x1, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" }, { SIOCIWFIRSTPRIV + 0x2, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "debugtx" }, { SIOCIWFIRSTPRIV + 0x3, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "beaconint" }, /* added by christian */ { SIOCIWFIRSTPRIV + 0x4, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "prismhdr" }, /* end added by christian */ { SIOCIWFIRSTPRIV + 0x5, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" }};static iw_handler r8180_private_handler[] = { r8180_wx_set_monitor, /* SIOCIWFIRSTPRIV */ r8180_wx_set_crcmon, /*SIOCIWSECONDPRIV*/ r8180_debug_tx, r8180_set_beaconinterval, r8180_wx_set_monitor_type, r8180_wx_set_scan_type,};#if WIRELESS_EXT > 17static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev){ struct r8180_priv *priv = dev->priv; return &priv->wstats;}struct iw_handler_def r8180_wx_handlers_def={ sizeof(r8180_wx_handlers) / sizeof(iw_handler), sizeof(r8180_private_handler) / sizeof(iw_handler), sizeof(r8180_private_args) / sizeof(struct iw_priv_args), r8180_wx_handlers, r8180_private_handler, (struct iw_priv_args *)r8180_private_args, 0, (struct iw_statistics *)r8180_get_wireless_stats};#elsestruct iw_handler_def r8180_wx_handlers_def={ .standard r8180_wx_handlers, .num_standard = sizeof(r8180_wx_handlers) / sizeof(iw_handler), .private = r8180_private_handler, .num_private = sizeof(r8180_private_handler) / sizeof(iw_handler), .num_private_args = sizeof(r8180_private_args) / sizeof(struct iw_priv_args), .private_args = (struct iw_priv_args *)r8180_private_args, };#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -