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;
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;
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;
{
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:
break;
default:
+ c->pair_ciphers = IWINFO_CIPHER_WEP40 |
+ IWINFO_CIPHER_WEP104;
break;
}
}
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;
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);