📄 wl_iw.c
字号:
{ WL_TRACE(("%s: SIOCGIWENCODEEXT\n", dev->name)); return 0;}static intwl_iw_set_wpaauth( struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra){ int error = 0; int paramid; int paramval; int val = 0; WL_TRACE(("%s: SIOCSIWAUTH\n", dev->name)); paramid = vwrq->flags & IW_AUTH_INDEX; paramval = vwrq->value; switch(paramid) { case IW_AUTH_WPA_VERSION: /* supported wpa version disabled or wpa or wpa2 */ if (paramval & IW_AUTH_WPA_VERSION_DISABLED) val = WPA_AUTH_DISABLED; else if (paramval & (IW_AUTH_WPA_VERSION_WPA)) val = WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED;#ifdef BCMWPA2 else if (paramval & IW_AUTH_WPA_VERSION_WPA2) val = WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED;#endif /* BCMWPA2 */ WL_ERROR(("%s: %d: setting wpa_auth to %d\n", __FUNCTION__, __LINE__, val)); if ((error = dev_wlc_intvar_set(dev, "wpa_auth", val))) return error; break; case IW_AUTH_CIPHER_PAIRWISE: case IW_AUTH_CIPHER_GROUP: /* none, wep40, tkip, ccmp, wep104 */ /* wsec: none, wep40, tkip, aes, wep104 */ if (paramval & (IW_AUTH_CIPHER_WEP40 | IW_AUTH_CIPHER_WEP104)) val |= WEP_ENABLED; if (paramval & IW_AUTH_CIPHER_TKIP) val |= TKIP_ENABLED; if (paramval & IW_AUTH_CIPHER_CCMP) val |= AES_ENABLED; if (paramid == IW_AUTH_CIPHER_PAIRWISE) { if ((error = dev_wlc_intvar_set(dev, "pwsec", val))) return error; } else { if ((error = dev_wlc_intvar_set(dev, "gwsec", val))) return error; } break; case IW_AUTH_KEY_MGMT: if ((error = dev_wlc_intvar_get(dev, "wpa_auth", &val))) return error; if (val & (WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED)) { if (paramval & IW_AUTH_KEY_MGMT_PSK) val = WPA_AUTH_PSK ; else val = WPA_AUTH_UNSPECIFIED; }#ifdef BCMWPA2 else if (val & (WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED)) { if (paramval & IW_AUTH_KEY_MGMT_PSK) val = WPA2_AUTH_PSK; else val = WPA2_AUTH_UNSPECIFIED; }#endif /* BCMWPA2 */ WL_ERROR(("%s: %d: setting wpa_auth to %d\n", __FUNCTION__, __LINE__, val)); if ((error = dev_wlc_intvar_set(dev, "wpa_auth", val))) return error; break; case IW_AUTH_TKIP_COUNTERMEASURES: dev_wlc_bufvar_set(dev, "tkip_countermeasures", (char *)¶mval, 1); break; case IW_AUTH_80211_AUTH_ALG: /* open shared */ WL_ERROR(("Setting the D11auth %d\n", paramval)); if (paramval & IW_AUTH_ALG_OPEN_SYSTEM) val = 0; else if (paramval & IW_AUTH_ALG_SHARED_KEY) val = 1; else error = 1; if (!error && (error = dev_wlc_intvar_set(dev, "auth", val))) return error; break; case IW_AUTH_WPA_ENABLED: if (paramval == 0) { if ((error = dev_wlc_intvar_get(dev, "wsec", &val))) return error; if (val & (TKIP_ENABLED | AES_ENABLED)) { val &= ~(TKIP_ENABLED | AES_ENABLED); dev_wlc_intvar_set(dev, "wsec", val); } val = 0; WL_ERROR(("%s: %d: setting wpa_auth to %d\n", __FUNCTION__, __LINE__, val)); dev_wlc_intvar_set(dev, "wpa_auth", 0); return error; } /* nothing really needs to be done if wpa_auth enabled */ break; case IW_AUTH_DROP_UNENCRYPTED: dev_wlc_bufvar_set(dev, "wsec_restrict", (char *)¶mval, 1); break; case IW_AUTH_RX_UNENCRYPTED_EAPOL: dev_wlc_bufvar_set(dev, "rx_unencrypted_eapol", (char *)¶mval, 1); break;#if WIRELESS_EXT > 18 case IW_AUTH_ROAMING_CONTROL: WL_ERROR(("%s: IW_AUTH_ROAMING_CONTROL\n", __FUNCTION__)); /* driver control or user space app control */ break; case IW_AUTH_PRIVACY_INVOKED: WL_ERROR(("%s: IW_AUTH_PRIVACY_INVOKED\n", __FUNCTION__)); break;#endif /* WIRELESS_EXT > 18 */ default: break; } return 0;}static intwl_iw_get_wpaauth( struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra){ int error; int paramid; int paramval = 0; int val; WL_TRACE(("%s: SIOCGIWAUTH\n", dev->name)); paramid = vwrq->flags & IW_AUTH_INDEX; switch(paramid) { case IW_AUTH_WPA_VERSION: /* supported wpa version disabled or wpa or wpa2 */ if ((error = dev_wlc_intvar_get(dev, "wpa_auth", &val))) return error; if (val & (WPA_AUTH_NONE | WPA_AUTH_DISABLED)) paramval = IW_AUTH_WPA_VERSION_DISABLED; else if (val & (WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED)) paramval = IW_AUTH_WPA_VERSION_WPA;#ifdef BCMWPA2 else if (val & (WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED)) paramval = IW_AUTH_WPA_VERSION_WPA2;#endif /* BCMWPA2 */ break; case IW_AUTH_CIPHER_PAIRWISE: case IW_AUTH_CIPHER_GROUP: if (paramid == IW_AUTH_CIPHER_PAIRWISE) { if ((error = dev_wlc_intvar_get(dev, "pwsec", &val))) return error; } else { if ((error = dev_wlc_intvar_get(dev, "gwsec", &val))) return error; } paramval = 0; if (val) { if (val & WEP_ENABLED) paramval |= (IW_AUTH_CIPHER_WEP40 | IW_AUTH_CIPHER_WEP104) ; if (val & TKIP_ENABLED) paramval |= (IW_AUTH_CIPHER_TKIP) ; if (val & AES_ENABLED) paramval |= (IW_AUTH_CIPHER_CCMP) ; } else paramval = IW_AUTH_CIPHER_NONE; break; case IW_AUTH_KEY_MGMT: /* psk, 1x */ if ((error = dev_wlc_intvar_get(dev, "wpa_auth", &val))) return error; if ( (val & WPA_AUTH_PSK)#ifdef BCMWPA2 || (val & WPA2_AUTH_PSK)#endif /* BCMWPA2 */ ) paramval = IW_AUTH_KEY_MGMT_PSK; else paramval = IW_AUTH_KEY_MGMT_802_1X; break; case IW_AUTH_TKIP_COUNTERMEASURES: dev_wlc_bufvar_get(dev, "tkip_countermeasures", (char *)¶mval, 1); break; case IW_AUTH_DROP_UNENCRYPTED: dev_wlc_bufvar_get(dev, "wsec_restrict", (char *)¶mval, 1); break; case IW_AUTH_RX_UNENCRYPTED_EAPOL: dev_wlc_bufvar_get(dev, "rx_unencrypted_eapol", (char *)¶mval, 1); break; case IW_AUTH_80211_AUTH_ALG: /* open, shared, leap */ if ((error = dev_wlc_intvar_get(dev, "auth", &val))) return error; if (!val) paramval = IW_AUTH_ALG_OPEN_SYSTEM; else paramval = IW_AUTH_ALG_SHARED_KEY; break; case IW_AUTH_WPA_ENABLED: if ((error = dev_wlc_intvar_get(dev, "wpa_auth", &val))) return error; if (val) paramval = TRUE; else paramval = FALSE; break;#if WIRELESS_EXT > 18 case IW_AUTH_ROAMING_CONTROL: WL_ERROR(("%s: IW_AUTH_ROAMING_CONTROL\n", __FUNCTION__)); /* driver control or user space app control */ break; case IW_AUTH_PRIVACY_INVOKED: WL_ERROR(("%s: IW_AUTH_PRIVACY_INVOKED\n", __FUNCTION__)); break;#endif /* WIRELESS_EXT > 18 */ } vwrq->value = paramval; return 0;}#endifstatic const iw_handler wl_iw_handler[] ={ (iw_handler) wl_iw_config_commit, /* SIOCSIWCOMMIT */ (iw_handler) wl_iw_get_name, /* SIOCGIWNAME */ (iw_handler) NULL, /* SIOCSIWNWID */ (iw_handler) NULL, /* SIOCGIWNWID */ (iw_handler) wl_iw_set_freq, /* SIOCSIWFREQ */ (iw_handler) wl_iw_get_freq, /* SIOCGIWFREQ */ (iw_handler) wl_iw_set_mode, /* SIOCSIWMODE */ (iw_handler) wl_iw_get_mode, /* SIOCGIWMODE */ (iw_handler) NULL, /* SIOCSIWSENS */ (iw_handler) NULL, /* SIOCGIWSENS */ (iw_handler) NULL, /* SIOCSIWRANGE */ (iw_handler) wl_iw_get_range, /* SIOCGIWRANGE */ (iw_handler) NULL, /* SIOCSIWPRIV */ (iw_handler) NULL, /* SIOCGIWPRIV */ (iw_handler) NULL, /* SIOCSIWSTATS */ (iw_handler) NULL, /* SIOCGIWSTATS */ (iw_handler) wl_iw_set_spy, /* SIOCSIWSPY */ (iw_handler) wl_iw_get_spy, /* SIOCGIWSPY */ (iw_handler) NULL, /* -- hole -- */ (iw_handler) NULL, /* -- hole -- */ (iw_handler) wl_iw_set_wap, /* SIOCSIWAP */ (iw_handler) wl_iw_get_wap, /* SIOCGIWAP */#if WIRELESS_EXT > 17 (iw_handler) wl_iw_mlme, /* SIOCSIWMLME */#else (iw_handler) NULL, /* -- hole -- */#endif (iw_handler) wl_iw_get_aplist, /* SIOCGIWAPLIST */#if WIRELESS_EXT > 13 (iw_handler) wl_iw_set_scan, /* SIOCSIWSCAN */ (iw_handler) wl_iw_get_scan, /* SIOCGIWSCAN */#else /* WIRELESS_EXT > 13 */ (iw_handler) NULL, /* SIOCSIWSCAN */ (iw_handler) NULL, /* SIOCGIWSCAN */#endif /* WIRELESS_EXT > 13 */ (iw_handler) wl_iw_set_essid, /* SIOCSIWESSID */ (iw_handler) wl_iw_get_essid, /* SIOCGIWESSID */ (iw_handler) wl_iw_set_nick, /* SIOCSIWNICKN */ (iw_handler) wl_iw_get_nick, /* SIOCGIWNICKN */ (iw_handler) NULL, /* -- hole -- */ (iw_handler) NULL, /* -- hole -- */ (iw_handler) wl_iw_set_rate, /* SIOCSIWRATE */ (iw_handler) wl_iw_get_rate, /* SIOCGIWRATE */ (iw_handler) wl_iw_set_rts, /* SIOCSIWRTS */ (iw_handler) wl_iw_get_rts, /* SIOCGIWRTS */ (iw_handler) wl_iw_set_frag, /* SIOCSIWFRAG */ (iw_handler) wl_iw_get_frag, /* SIOCGIWFRAG */ (iw_handler) wl_iw_set_txpow, /* SIOCSIWTXPOW */ (iw_handler) wl_iw_get_txpow, /* SIOCGIWTXPOW */#if WIRELESS_EXT > 10 (iw_handler) wl_iw_set_retry, /* SIOCSIWRETRY */ (iw_handler) wl_iw_get_retry, /* SIOCGIWRETRY */#endif /* WIRELESS_EXT > 10 */ (iw_handler) wl_iw_set_encode, /* SIOCSIWENCODE */ (iw_handler) wl_iw_get_encode, /* SIOCGIWENCODE */ (iw_handler) wl_iw_set_power, /* SIOCSIWPOWER */ (iw_handler) wl_iw_get_power, /* SIOCGIWPOWER */#if WIRELESS_EXT > 17 (iw_handler) NULL, /* -- hole -- */ (iw_handler) NULL, /* -- hole -- */ (iw_handler) wl_iw_set_wpaie, /* SIOCSIWGENIE */ (iw_handler) wl_iw_get_wpaie, /* SIOCGIWGENIE */ (iw_handler) wl_iw_set_wpaauth, /* SIOCSIWAUTH */ (iw_handler) wl_iw_get_wpaauth, /* SIOCGIWAUTH */ (iw_handler) wl_iw_set_encodeext, /* SIOCSIWENCODEEXT */ (iw_handler) wl_iw_get_encodeext, /* SIOCGIWENCODEEXT */#ifdef BCMWPA2 (iw_handler) NULL, /* SIOCSIWPMKSA */#endif#endif};#if WIRELESS_EXT > 12const struct iw_handler_def wl_iw_handler_def ={ num_standard: ARRAYSIZE(wl_iw_handler), num_private: 0, num_private_args: 0, standard: (iw_handler *) wl_iw_handler, private: NULL, private_args: NULL, };#endif /* WIRELESS_EXT > 12 */intwl_iw_ioctl( struct net_device *dev, struct ifreq *rq, int cmd){ struct iwreq *wrq = (struct iwreq *) rq; struct iw_request_info info; iw_handler handler; char *extra = NULL; int token_size = 1, max_tokens = 0, ret = 0; if (cmd < SIOCIWFIRST || (cmd - SIOCIWFIRST) >= ARRAYSIZE(wl_iw_handler) || !(handler = wl_iw_handler[cmd - SIOCIWFIRST])) return -EOPNOTSUPP; switch (cmd) { case SIOCSIWESSID: case SIOCGIWESSID: case SIOCSIWNICKN: case SIOCGIWNICKN: max_tokens = IW_ESSID_MAX_SIZE + 1; break; case SIOCSIWENCODE: case SIOCGIWENCODE:#if WIRELESS_EXT > 17 case SIOCSIWENCODEEXT: case SIOCGIWENCODEEXT:#endif max_tokens = IW_ENCODING_TOKEN_MAX; break; case SIOCGIWRANGE: max_tokens = sizeof(struct iw_range); break; case SIOCGIWAPLIST: token_size = sizeof(struct sockaddr) + sizeof(struct iw_quality); max_tokens = IW_MAX_AP; break;#if WIRELESS_EXT > 13 case SIOCGIWSCAN: max_tokens = IW_SCAN_MAX_DATA; break;#endif /* WIRELESS_EXT > 13 */ case SIOCSIWSPY: token_size = sizeof(struct sockaddr); max_tokens = IW_MAX_SPY; break; case SIOCGIWSPY: token_size = sizeof(struct sockaddr) + sizeof(struct iw_quality); max_tokens = IW_MAX_SPY; break; } if (max_tokens && wrq->u.data.pointer) { if (wrq->u.data.length > max_tokens) return -E2BIG; if (!(extra = kmalloc(max_tokens * token_size, GFP_KERNEL))) return -ENOMEM; if (copy_from_user(extra, wrq->u.data.pointer, wrq->u.data.length * token_size)) { kfree(extra); return -EFAULT; } } info.cmd = cmd; info.flags = 0; ret = handler(dev, &info, &wrq->u, extra); if (extra) { if (copy_to_user(wrq->u.data.pointer, extra, wrq->u.data.length * token_size)) { kfree(extra); return -EFAULT; } kfree(extra); } return ret;}#ifndef IW_CeSTOM_MAX#define IW_CUSTOM_MAX 256 /* size of extra buffer used for translation of events */#endif /* IW_CUSTOM_MAX */voidwl_iw_event(struct net_device *dev, wlc_event_t *e){#if WIRELESS_EXT > 13 union iwreq_data wrqu; char extra[IW_CUSTOM_MAX + 1]; int cmd; memset(&wrqu, 0, sizeof(wrqu)); memset(extra, 0, sizeof(extra)); if (e->addr) { memcpy(wrqu.addr.sa_data, e->addr, ETHER_ADDR_LEN); wrqu.addr.sa_family = ARPHRD_ETHER; } switch (e->event.event_type) { case WLC_E_TXFAIL: cmd = IWEVTXDROP; break;#if WIRELESS_EXT > 14 case WLC_E_JOIN: case WLC_E_ASSOC_IND: case WLC_E_REASSOC_IND: cmd = IWEVREGISTERED; break; case WLC_E_DEAUTH_IND: case WLC_E_DISASSOC_IND: cmd = SIOCGIWAP; wrqu.data.length = strlen(extra); bzero(wrqu.addr.sa_data, ETHER_ADDR_LEN); bzero(&extra, ETHER_ADDR_LEN); break; case WLC_E_LINK: case WLC_E_NDIS_LINK: cmd = SIOCGIWAP; wrqu.data.length = strlen(extra); if (!e->event.flags & WLC_EVENT_MSG_LINK) { bzero(wrqu.addr.sa_data, ETHER_ADDR_LEN); bzero(&extra, ETHER_ADDR_LEN); } break;#endif /* WIRELESS_EXT > 14 */#if WIRELESS_EXT > 17 case WLC_E_MIC_ERROR: { struct iw_michaelmicfailure *micerrevt = (struct iw_michaelmicfailure *)&extra; cmd = IWEVMICHAELMICFAILURE; wrqu.data.length = sizeof(struct iw_michaelmicfailure); if (e->event.flags & WLC_EVENT_MSG_GROUP) micerrevt->flags |= IW_MICFAILURE_GROUP; else micerrevt->flags |= IW_MICFAILURE_PAIRWISE; if (e->addr) { memcpy(micerrevt->src_addr.sa_data, e->addr, ETHER_ADDR_LEN); micerrevt->src_addr.sa_family = ARPHRD_ETHER; } break; }#ifdef BCMWPA2 case WLC_E_PMKID_CACHE: { struct iw_pmkid_cand *iwpmkidcand = (struct iw_pmkid_cand *)&extra; pmkid_cand_list_t *pmkcandlist; pmkid_cand_t *pmkidcand; int count; cmd = IWEVPMKIDCAND; pmkcandlist = e->data; count = pmkcandlist->npmkid_cand; wrqu.data.length = sizeof(struct iw_pmkid_cand); pmkidcand = pmkcandlist->pmkid_cand; while (count) { bzero(iwpmkidcand, sizeof (struct iw_pmkid_cand)); if (pmkidcand->preauth) iwpmkidcand->flags |= IW_PMKID_CAND_PREAUTH; bcopy(&pmkidcand->BSSID, &iwpmkidcand->bssid.sa_data, ETHER_ADDR_LEN); wireless_send_event(dev, cmd, &wrqu, extra); pmkidcand++; count--; } return; }#endif /* BCMWPA2 */#endif default: /* Cannot translate event */ return; } wireless_send_event(dev, cmd, &wrqu, extra);#endif /* WIRELESS_EXT > 13 */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -