X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=contrib%2Fpackage%2Fiwinfo%2Fsrc%2Fiwinfo_madwifi.c;h=54a77cd4dc5643dac0950bd24decb969aedaab46;hp=cb21ac5a021ee2eae14b2391f6c848e1f471abb9;hb=ae33c64a37c8a8d6dc1e38678e967f2e457bc33a;hpb=eecec8b0f2a2cd86827115c1479de974ece00850 diff --git a/contrib/package/iwinfo/src/iwinfo_madwifi.c b/contrib/package/iwinfo/src/iwinfo_madwifi.c index cb21ac5a0..54a77cd4d 100644 --- a/contrib/package/iwinfo/src/iwinfo_madwifi.c +++ b/contrib/package/iwinfo/src/iwinfo_madwifi.c @@ -292,14 +292,23 @@ static char * madwifi_ifadd(const char *ifname) snprintf(nif, sizeof(nif), "tmp.%s", ifname); strncpy(cp.icp_name, nif, IFNAMSIZ); - cp.icp_opmode = IEEE80211_M_MONITOR; + cp.icp_opmode = IEEE80211_M_STA; cp.icp_flags = IEEE80211_CLONE_BSSID; strncpy(ifr.ifr_name, wifidev, IFNAMSIZ); ifr.ifr_data = (void *)&cp; if( !iwinfo_ioctl(SIOC80211IFCREATE, &ifr) ) + { return nif; + } + else + { + cp.icp_opmode = IEEE80211_M_MONITOR; + + if( !iwinfo_ioctl(SIOC80211IFCREATE, &ifr) ) + return nif; + } } return NULL; @@ -539,24 +548,26 @@ int madwifi_get_quality_max(const char *ifname, int *buf) int madwifi_get_encryption(const char *ifname, char *buf) { - int ciphers = 0, key_type = 0, key_len = 0; + int ciphers = 0, key_len = 0; + char keybuf[IW_ENCODING_TOKEN_MAX]; struct iwinfo_crypto_entry *c = (struct iwinfo_crypto_entry *)buf; struct iwreq wrq; struct ieee80211req_key wk; memset(&wrq, 0, sizeof(wrq)); - memset(&wk, 0, sizeof(wk)); - memset(wk.ik_macaddr, 0xff, IEEE80211_ADDR_LEN); - /* Get key information */ - if( get80211priv(ifname, IEEE80211_IOCTL_GETKEY, &wk, sizeof(wk)) >= 0 ) - { - key_type = wk.ik_type; + /* Obtain key info */ + if( madwifi_wrq(&wrq, ifname, SIOCGIWENCODE, keybuf, sizeof(keybuf)) < 0 ) + return -1; - /* Type 0 == WEP */ - if( key_type == 0 ) - c->auth_algs = (IWINFO_AUTH_OPEN | IWINFO_AUTH_SHARED); - } +#if 0 + /* Have any encryption? */ + if( (wrq.u.data.flags & IW_ENCODE_DISABLED) || (wrq.u.data.length == 0) ) + return 0; +#endif + + /* Save key len */ + key_len = wrq.u.data.length; /* Get wpa protocol version */ wrq.u.mode = IEEE80211_PARAM_WPA; @@ -576,16 +587,30 @@ int madwifi_get_encryption(const char *ifname, char *buf) c->auth_suites |= IWINFO_KMGMT_PSK; break; + case IEEE80211_AUTH_OPEN: + c->auth_algs |= IWINFO_AUTH_OPEN; + break; + + case IEEE80211_AUTH_SHARED: + c->auth_algs |= IWINFO_AUTH_SHARED; + break; + default: c->auth_suites |= IWINFO_KMGMT_NONE; break; } } - /* Get group key length */ - wrq.u.mode = IEEE80211_PARAM_MCASTKEYLEN; - if( madwifi_wrq(&wrq, ifname, IEEE80211_IOCTL_GETPARAM, NULL, 0) >= 0 ) - key_len = wrq.u.mode; + memset(&wk, 0, sizeof(wk)); + memset(wk.ik_macaddr, 0xff, IEEE80211_ADDR_LEN); + + /* Get key information */ + if( get80211priv(ifname, IEEE80211_IOCTL_GETKEY, &wk, sizeof(wk)) >= 0 ) + { + /* Type 0 == WEP */ + if( (wk.ik_type == 0) && (c->auth_algs == 0) ) + c->auth_algs = (IWINFO_AUTH_OPEN | IWINFO_AUTH_SHARED); + } /* Get used pairwise ciphers */ wrq.u.mode = IEEE80211_PARAM_UCASTCIPHERS; @@ -593,19 +618,19 @@ int madwifi_get_encryption(const char *ifname, char *buf) { ciphers = wrq.u.mode; - if( ciphers & (1 << IEEE80211_CIPHER_TKIP) ) + if( c->wpa_version && ciphers & (1 << IEEE80211_CIPHER_TKIP) ) c->pair_ciphers |= IWINFO_CIPHER_TKIP; - if( ciphers & (1 << IEEE80211_CIPHER_AES_CCM) ) + if( c->wpa_version && ciphers & (1 << IEEE80211_CIPHER_AES_CCM) ) c->pair_ciphers |= IWINFO_CIPHER_CCMP; - if( ciphers & (1 << IEEE80211_CIPHER_AES_OCB) ) + if( c->wpa_version && ciphers & (1 << IEEE80211_CIPHER_AES_OCB) ) c->pair_ciphers |= IWINFO_CIPHER_AESOCB; - if( ciphers & (1 << IEEE80211_CIPHER_CKIP) ) + if( c->wpa_version && ciphers & (1 << IEEE80211_CIPHER_CKIP) ) c->pair_ciphers |= IWINFO_CIPHER_CKIP; - if( ciphers & (1 << IEEE80211_CIPHER_WEP) ) + if( !c->pair_ciphers && ciphers & (1 << IEEE80211_CIPHER_WEP) ) { switch(key_len) { case 13: @@ -617,6 +642,8 @@ int madwifi_get_encryption(const char *ifname, char *buf) break; default: + c->pair_ciphers = IWINFO_CIPHER_WEP40 | + IWINFO_CIPHER_WEP104; break; } } @@ -629,9 +656,9 @@ int madwifi_get_encryption(const char *ifname, char *buf) wrq.u.mode = IEEE80211_PARAM_MCASTCIPHER; if( madwifi_wrq(&wrq, ifname, IEEE80211_IOCTL_GETPARAM, NULL, 0) >= 0 ) { - ciphers = wrq.u.mode; + ciphers = c->wpa_version ? wrq.u.mode : IEEE80211_CIPHER_WEP; - switch(wrq.u.mode) { + switch(ciphers) { case IEEE80211_CIPHER_TKIP: c->group_ciphers |= IWINFO_CIPHER_TKIP; break; @@ -772,7 +799,15 @@ int madwifi_get_scanlist(const char *ifname, char *buf, int *len) if( (res = madwifi_ifadd(ifname)) != NULL ) { if( iwinfo_ifup(res) ) + { + wext_get_scanlist(res, buf, len); + sleep(1); + + wext_get_scanlist(res, buf, len); + sleep(1); + ret = wext_get_scanlist(res, buf, len); + } iwinfo_ifdown(res); madwifi_ifdel(res);