/*
* iwinfo - Wireless Information Library - Madwifi Backend
*
- * Copyright (C) 2009 Jo-Philipp Wich <xm@subsignal.org>
+ * Copyright (C) 2009-2010 Jo-Philipp Wich <xm@subsignal.org>
*
* The iwinfo library is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2
};
-static int ioctl_socket = -1;
-
-static int madwifi_socket(void)
-{
- /* Prepare socket */
- if( ioctl_socket == -1 )
- {
- ioctl_socket = socket(AF_INET, SOCK_DGRAM, 0);
- fcntl(ioctl_socket, F_SETFD, fcntl(ioctl_socket, F_GETFD) | FD_CLOEXEC);
- }
-
- return ioctl_socket;
-}
-
-static int madwifi_ioctl(int cmd, void *ifr)
-{
- int s = madwifi_socket();
- return ioctl(s, cmd, ifr);
-}
-
static int madwifi_wrq(struct iwreq *wrq, const char *ifname, int cmd, void *data, size_t len)
{
strncpy(wrq->ifr_name, ifname, IFNAMSIZ);
}
}
- return madwifi_ioctl(cmd, wrq);
+ return iwinfo_ioctl(cmd, wrq);
}
static int get80211priv(const char *ifname, int op, void *data, size_t len)
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( !madwifi_ioctl(SIOC80211IFCREATE, &ifr) )
+ if( !iwinfo_ioctl(SIOC80211IFCREATE, &ifr) )
+ {
return nif;
+ }
+ else
+ {
+ cp.icp_opmode = IEEE80211_M_MONITOR;
+
+ if( !iwinfo_ioctl(SIOC80211IFCREATE, &ifr) )
+ return nif;
+ }
}
return NULL;
struct ifreq ifr = { 0 };
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
- madwifi_ioctl(SIOC80211IFDESTROY, &ifr);
-}
-
-static int madwifi_ifup(const char *ifname)
-{
- struct ifreq ifr;
-
- strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
-
- if( madwifi_ioctl(SIOCGIFFLAGS, &ifr) )
- return 0;
-
- ifr.ifr_flags |= (IFF_UP | IFF_RUNNING);
-
- return !madwifi_ioctl(SIOCSIFFLAGS, &ifr);
-}
-
-static int madwifi_ifdown(const char *ifname)
-{
- struct ifreq ifr;
-
- strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
-
- if( madwifi_ioctl(SIOCGIFFLAGS, &ifr) )
- return 0;
-
- ifr.ifr_flags &= ~(IFF_UP | IFF_RUNNING);
-
- return !madwifi_ioctl(SIOCSIFFLAGS, &ifr);
+ iwinfo_ioctl(SIOC80211IFDESTROY, &ifr);
}
void madwifi_close(void)
{
- if( ioctl_socket > -1 )
- close(ioctl_socket);
+ /* Nop */
}
int madwifi_get_mode(const char *ifname, char *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;
struct iwinfo_crypto_entry *c = (struct iwinfo_crypto_entry *)buf;
struct iwreq wrq;
struct ieee80211req_key wk;
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;
-
- /* Type 0 == WEP */
- if( key_type == 0 )
- c->auth_algs = (IWINFO_AUTH_OPEN | IWINFO_AUTH_SHARED);
- }
-
/* Get wpa protocol version */
wrq.u.mode = IEEE80211_PARAM_WPA;
if( madwifi_wrq(&wrq, ifname, IEEE80211_IOCTL_GETPARAM, NULL, 0) >= 0 )
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 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 group key length */
wrq.u.mode = IEEE80211_PARAM_MCASTKEYLEN;
if( madwifi_wrq(&wrq, ifname, IEEE80211_IOCTL_GETPARAM, NULL, 0) >= 0 )
{
if( !!madwifi_isvap(e->d_name, ifname) )
{
- if( madwifi_ifup(e->d_name) )
+ if( iwinfo_ifup(e->d_name) )
{
ret = wext_get_scanlist(e->d_name, buf, len);
break;
{
if( (res = madwifi_ifadd(ifname)) != NULL )
{
- if( madwifi_ifup(res) )
+ 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);
+ }
- madwifi_ifdown(res);
+ iwinfo_ifdown(res);
madwifi_ifdel(res);
}
}
if( nif )
{
- *buf = madwifi_ifup(nif);
+ *buf = iwinfo_ifup(nif);
- madwifi_ifdown(nif);
+ iwinfo_ifdown(nif);
madwifi_ifdel(nif);
return 0;