iwinfo: move nl80211_ops to iwinfo_nl80211.c, make functions static

Signed-off-by: Felix Fietkau <nbd@openwrt.org>

SVN-Revision: 40812
This commit is contained in:
Felix Fietkau 2014-05-21 12:33:27 +00:00
parent 6c02355830
commit b5eec473f0
5 changed files with 281 additions and 313 deletions

View File

@ -185,13 +185,10 @@ void iwinfo_finish(void);
extern const struct iwinfo_ops wext_ops; extern const struct iwinfo_ops wext_ops;
extern const struct iwinfo_ops madwifi_ops; extern const struct iwinfo_ops madwifi_ops;
extern const struct iwinfo_ops nl80211_ops;
#ifdef USE_WL #ifdef USE_WL
#include "iwinfo/wl.h" #include "iwinfo/wl.h"
#endif #endif
#ifdef USE_NL80211
#include "iwinfo/nl80211.h"
#endif
#endif #endif

View File

@ -1,129 +0,0 @@
/*
* iwinfo - Wireless Information Library - NL80211 Headers
*
* Copyright (C) 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
* as published by the Free Software Foundation.
*
* The iwinfo library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with the iwinfo library. If not, see http://www.gnu.org/licenses/.
*/
#ifndef __IWINFO_NL80211_H_
#define __IWINFO_NL80211_H_
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <dirent.h>
#include <signal.h>
#include <sys/un.h>
#include <netlink/netlink.h>
#include <netlink/genl/genl.h>
#include <netlink/genl/family.h>
#include <netlink/genl/ctrl.h>
#include "iwinfo.h"
#include "iwinfo/utils.h"
#include "iwinfo/api/nl80211.h"
struct nl80211_state {
struct nl_sock *nl_sock;
struct nl_cache *nl_cache;
struct genl_family *nl80211;
struct genl_family *nlctrl;
};
struct nl80211_msg_conveyor {
struct nl_msg *msg;
struct nl_cb *cb;
};
struct nl80211_event_conveyor {
int wait;
int recv;
};
struct nl80211_group_conveyor {
const char *name;
int id;
};
struct nl80211_rssi_rate {
int16_t rate;
int8_t rssi;
};
struct nl80211_array_buf {
void *buf;
int count;
};
int nl80211_probe(const char *ifname);
int nl80211_get_mode(const char *ifname, int *buf);
int nl80211_get_ssid(const char *ifname, char *buf);
int nl80211_get_bssid(const char *ifname, char *buf);
int nl80211_get_country(const char *ifname, char *buf);
int nl80211_get_channel(const char *ifname, int *buf);
int nl80211_get_frequency(const char *ifname, int *buf);
int nl80211_get_frequency_offset(const char *ifname, int *buf);
int nl80211_get_txpower(const char *ifname, int *buf);
int nl80211_get_txpower_offset(const char *ifname, int *buf);
int nl80211_get_bitrate(const char *ifname, int *buf);
int nl80211_get_signal(const char *ifname, int *buf);
int nl80211_get_noise(const char *ifname, int *buf);
int nl80211_get_quality(const char *ifname, int *buf);
int nl80211_get_quality_max(const char *ifname, int *buf);
int nl80211_get_encryption(const char *ifname, char *buf);
int nl80211_get_phyname(const char *ifname, char *buf);
int nl80211_get_assoclist(const char *ifname, char *buf, int *len);
int nl80211_get_txpwrlist(const char *ifname, char *buf, int *len);
int nl80211_get_scanlist(const char *ifname, char *buf, int *len);
int nl80211_get_freqlist(const char *ifname, char *buf, int *len);
int nl80211_get_countrylist(const char *ifname, char *buf, int *len);
int nl80211_get_hwmodelist(const char *ifname, int *buf);
int nl80211_get_mbssid_support(const char *ifname, int *buf);
int nl80211_get_hardware_id(const char *ifname, char *buf);
int nl80211_get_hardware_name(const char *ifname, char *buf);
void nl80211_close(void);
static const struct iwinfo_ops nl80211_ops = {
.name = "nl80211",
.probe = nl80211_probe,
.channel = nl80211_get_channel,
.frequency = nl80211_get_frequency,
.frequency_offset = nl80211_get_frequency_offset,
.txpower = nl80211_get_txpower,
.txpower_offset = nl80211_get_txpower_offset,
.bitrate = nl80211_get_bitrate,
.signal = nl80211_get_signal,
.noise = nl80211_get_noise,
.quality = nl80211_get_quality,
.quality_max = nl80211_get_quality_max,
.mbssid_support = nl80211_get_mbssid_support,
.hwmodelist = nl80211_get_hwmodelist,
.mode = nl80211_get_mode,
.ssid = nl80211_get_ssid,
.bssid = nl80211_get_bssid,
.country = nl80211_get_country,
.hardware_id = nl80211_get_hardware_id,
.hardware_name = nl80211_get_hardware_name,
.encryption = nl80211_get_encryption,
.phyname = nl80211_get_phyname,
.assoclist = nl80211_get_assoclist,
.txpwrlist = nl80211_get_txpwrlist,
.scanlist = nl80211_get_scanlist,
.freqlist = nl80211_get_freqlist,
.countrylist = nl80211_get_countrylist,
.close = nl80211_close
};
#endif

View File

@ -669,31 +669,31 @@ LUA_WRAP_STRUCT_OP(madwifi,hardware_id)
#ifdef USE_NL80211 #ifdef USE_NL80211
/* NL80211 */ /* NL80211 */
LUA_WRAP_INT(nl80211,channel) LUA_WRAP_INT_OP(nl80211,channel)
LUA_WRAP_INT(nl80211,frequency) LUA_WRAP_INT_OP(nl80211,frequency)
LUA_WRAP_INT(nl80211,frequency_offset) LUA_WRAP_INT_OP(nl80211,frequency_offset)
LUA_WRAP_INT(nl80211,txpower) LUA_WRAP_INT_OP(nl80211,txpower)
LUA_WRAP_INT(nl80211,txpower_offset) LUA_WRAP_INT_OP(nl80211,txpower_offset)
LUA_WRAP_INT(nl80211,bitrate) LUA_WRAP_INT_OP(nl80211,bitrate)
LUA_WRAP_INT(nl80211,signal) LUA_WRAP_INT_OP(nl80211,signal)
LUA_WRAP_INT(nl80211,noise) LUA_WRAP_INT_OP(nl80211,noise)
LUA_WRAP_INT(nl80211,quality) LUA_WRAP_INT_OP(nl80211,quality)
LUA_WRAP_INT(nl80211,quality_max) LUA_WRAP_INT_OP(nl80211,quality_max)
LUA_WRAP_STRING(nl80211,ssid) LUA_WRAP_STRING_OP(nl80211,ssid)
LUA_WRAP_STRING(nl80211,bssid) LUA_WRAP_STRING_OP(nl80211,bssid)
LUA_WRAP_STRING(nl80211,country) LUA_WRAP_STRING_OP(nl80211,country)
LUA_WRAP_STRING(nl80211,hardware_name) LUA_WRAP_STRING_OP(nl80211,hardware_name)
LUA_WRAP_STRING(nl80211,phyname) LUA_WRAP_STRING_OP(nl80211,phyname)
LUA_WRAP_STRUCT(nl80211,mode) LUA_WRAP_STRUCT_OP(nl80211,mode)
LUA_WRAP_STRUCT(nl80211,assoclist) LUA_WRAP_STRUCT_OP(nl80211,assoclist)
LUA_WRAP_STRUCT(nl80211,txpwrlist) LUA_WRAP_STRUCT_OP(nl80211,txpwrlist)
LUA_WRAP_STRUCT(nl80211,scanlist) LUA_WRAP_STRUCT_OP(nl80211,scanlist)
LUA_WRAP_STRUCT(nl80211,freqlist) LUA_WRAP_STRUCT_OP(nl80211,freqlist)
LUA_WRAP_STRUCT(nl80211,countrylist) LUA_WRAP_STRUCT_OP(nl80211,countrylist)
LUA_WRAP_STRUCT(nl80211,hwmodelist) LUA_WRAP_STRUCT_OP(nl80211,hwmodelist)
LUA_WRAP_STRUCT(nl80211,encryption) LUA_WRAP_STRUCT_OP(nl80211,encryption)
LUA_WRAP_STRUCT(nl80211,mbssid_support) LUA_WRAP_STRUCT_OP(nl80211,mbssid_support)
LUA_WRAP_STRUCT(nl80211,hardware_id) LUA_WRAP_STRUCT_OP(nl80211,hardware_id)
#endif #endif
/* Wext */ /* Wext */

View File

@ -22,12 +22,33 @@
* Parts of this code are derived from the Linux iw utility. * Parts of this code are derived from the Linux iw utility.
*/ */
#include "iwinfo/nl80211.h" #include "iwinfo_nl80211.h"
#define min(x, y) ((x) < (y)) ? (x) : (y) #define min(x, y) ((x) < (y)) ? (x) : (y)
static struct nl80211_state *nls = NULL; static struct nl80211_state *nls = NULL;
static void nl80211_close(void)
{
if (nls)
{
if (nls->nlctrl)
genl_family_put(nls->nlctrl);
if (nls->nl80211)
genl_family_put(nls->nl80211);
if (nls->nl_sock)
nl_socket_free(nls->nl_sock);
if (nls->nl_cache)
nl_cache_free(nls->nl_cache);
free(nls);
nls = NULL;
}
}
static int nl80211_init(void) static int nl80211_init(void)
{ {
int err, fd; int err, fd;
@ -85,6 +106,23 @@ err:
return err; return err;
} }
static int nl80211_readint(const char *path)
{
int fd;
int rv = -1;
char buffer[16];
if ((fd = open(path, O_RDONLY)) > -1)
{
if (read(fd, buffer, sizeof(buffer)) > 0)
rv = atoi(buffer);
close(fd);
}
return rv;
}
static int nl80211_msg_error(struct sockaddr_nl *nla, static int nl80211_msg_error(struct sockaddr_nl *nla,
struct nlmsgerr *err, void *arg) struct nlmsgerr *err, void *arg)
@ -452,6 +490,96 @@ static char * nl80211_ifname2phy(const char *ifname)
return phy[0] ? phy : NULL; return phy[0] ? phy : NULL;
} }
static char * nl80211_phy2ifname(const char *ifname)
{
int fd, ifidx = -1, cifidx = -1, phyidx = -1;
char buffer[64];
static char nif[IFNAMSIZ] = { 0 };
DIR *d;
struct dirent *e;
if (!ifname)
return NULL;
else if (!strncmp(ifname, "phy", 3))
phyidx = atoi(&ifname[3]);
else if (!strncmp(ifname, "radio", 5))
phyidx = atoi(&ifname[5]);
memset(nif, 0, sizeof(nif));
if (phyidx > -1)
{
if ((d = opendir("/sys/class/net")) != NULL)
{
while ((e = readdir(d)) != NULL)
{
snprintf(buffer, sizeof(buffer),
"/sys/class/net/%s/phy80211/index", e->d_name);
if (nl80211_readint(buffer) == phyidx)
{
snprintf(buffer, sizeof(buffer),
"/sys/class/net/%s/ifindex", e->d_name);
if ((cifidx = nl80211_readint(buffer)) >= 0 &&
((ifidx < 0) || (cifidx < ifidx)))
{
ifidx = cifidx;
strncpy(nif, e->d_name, sizeof(nif));
}
}
}
closedir(d);
}
}
return nif[0] ? nif : NULL;
}
static int nl80211_get_mode_cb(struct nl_msg *msg, void *arg)
{
int *mode = arg;
struct nlattr **tb = nl80211_parse(msg);
const int ifmodes[NL80211_IFTYPE_MAX + 1] = {
IWINFO_OPMODE_UNKNOWN, /* unspecified */
IWINFO_OPMODE_ADHOC, /* IBSS */
IWINFO_OPMODE_CLIENT, /* managed */
IWINFO_OPMODE_MASTER, /* AP */
IWINFO_OPMODE_AP_VLAN, /* AP/VLAN */
IWINFO_OPMODE_WDS, /* WDS */
IWINFO_OPMODE_MONITOR, /* monitor */
IWINFO_OPMODE_MESHPOINT, /* mesh point */
IWINFO_OPMODE_P2P_CLIENT, /* P2P-client */
IWINFO_OPMODE_P2P_GO, /* P2P-GO */
};
if (tb[NL80211_ATTR_IFTYPE])
*mode = ifmodes[nla_get_u32(tb[NL80211_ATTR_IFTYPE])];
return NL_SKIP;
}
static int nl80211_get_mode(const char *ifname, int *buf)
{
char *res;
struct nl80211_msg_conveyor *req;
res = nl80211_phy2ifname(ifname);
req = nl80211_msg(res ? res : ifname, NL80211_CMD_GET_INTERFACE, 0);
*buf = IWINFO_OPMODE_UNKNOWN;
if (req)
{
nl80211_send(req, nl80211_get_mode_cb, buf);
nl80211_free(req);
}
return (*buf == IWINFO_OPMODE_UNKNOWN) ? -1 : 0;
}
static char * nl80211_hostapd_info(const char *ifname) static char * nl80211_hostapd_info(const char *ifname)
{ {
int mode; int mode;
@ -589,71 +717,6 @@ out:
return rv; return rv;
} }
static inline int nl80211_readint(const char *path)
{
int fd;
int rv = -1;
char buffer[16];
if ((fd = open(path, O_RDONLY)) > -1)
{
if (read(fd, buffer, sizeof(buffer)) > 0)
rv = atoi(buffer);
close(fd);
}
return rv;
}
static char * nl80211_phy2ifname(const char *ifname)
{
int fd, ifidx = -1, cifidx = -1, phyidx = -1;
char buffer[64];
static char nif[IFNAMSIZ] = { 0 };
DIR *d;
struct dirent *e;
if (!ifname)
return NULL;
else if (!strncmp(ifname, "phy", 3))
phyidx = atoi(&ifname[3]);
else if (!strncmp(ifname, "radio", 5))
phyidx = atoi(&ifname[5]);
memset(nif, 0, sizeof(nif));
if (phyidx > -1)
{
if ((d = opendir("/sys/class/net")) != NULL)
{
while ((e = readdir(d)) != NULL)
{
snprintf(buffer, sizeof(buffer),
"/sys/class/net/%s/phy80211/index", e->d_name);
if (nl80211_readint(buffer) == phyidx)
{
snprintf(buffer, sizeof(buffer),
"/sys/class/net/%s/ifindex", e->d_name);
if ((cifidx = nl80211_readint(buffer)) >= 0 &&
((ifidx < 0) || (cifidx < ifidx)))
{
ifidx = cifidx;
strncpy(nif, e->d_name, sizeof(nif));
}
}
}
closedir(d);
}
}
return nif[0] ? nif : NULL;
}
static char * nl80211_ifadd(const char *ifname) static char * nl80211_ifadd(const char *ifname)
{ {
int phyidx; int phyidx;
@ -719,75 +782,11 @@ static void nl80211_hostapd_hup(const char *ifname)
} }
int nl80211_probe(const char *ifname) static int nl80211_probe(const char *ifname)
{ {
return !!nl80211_ifname2phy(ifname); return !!nl80211_ifname2phy(ifname);
} }
void nl80211_close(void)
{
if (nls)
{
if (nls->nlctrl)
genl_family_put(nls->nlctrl);
if (nls->nl80211)
genl_family_put(nls->nl80211);
if (nls->nl_sock)
nl_socket_free(nls->nl_sock);
if (nls->nl_cache)
nl_cache_free(nls->nl_cache);
free(nls);
nls = NULL;
}
}
static int nl80211_get_mode_cb(struct nl_msg *msg, void *arg)
{
int *mode = arg;
struct nlattr **tb = nl80211_parse(msg);
const int ifmodes[NL80211_IFTYPE_MAX + 1] = {
IWINFO_OPMODE_UNKNOWN, /* unspecified */
IWINFO_OPMODE_ADHOC, /* IBSS */
IWINFO_OPMODE_CLIENT, /* managed */
IWINFO_OPMODE_MASTER, /* AP */
IWINFO_OPMODE_AP_VLAN, /* AP/VLAN */
IWINFO_OPMODE_WDS, /* WDS */
IWINFO_OPMODE_MONITOR, /* monitor */
IWINFO_OPMODE_MESHPOINT, /* mesh point */
IWINFO_OPMODE_P2P_CLIENT, /* P2P-client */
IWINFO_OPMODE_P2P_GO, /* P2P-GO */
};
if (tb[NL80211_ATTR_IFTYPE])
*mode = ifmodes[nla_get_u32(tb[NL80211_ATTR_IFTYPE])];
return NL_SKIP;
}
int nl80211_get_mode(const char *ifname, int *buf)
{
char *res;
struct nl80211_msg_conveyor *req;
res = nl80211_phy2ifname(ifname);
req = nl80211_msg(res ? res : ifname, NL80211_CMD_GET_INTERFACE, 0);
*buf = IWINFO_OPMODE_UNKNOWN;
if (req)
{
nl80211_send(req, nl80211_get_mode_cb, buf);
nl80211_free(req);
}
return (*buf == IWINFO_OPMODE_UNKNOWN) ? -1 : 0;
}
struct nl80211_ssid_bssid { struct nl80211_ssid_bssid {
unsigned char *ssid; unsigned char *ssid;
unsigned char bssid[7]; unsigned char bssid[7];
@ -851,7 +850,7 @@ static int nl80211_get_ssid_bssid_cb(struct nl_msg *msg, void *arg)
} }
} }
int nl80211_get_ssid(const char *ifname, char *buf) static int nl80211_get_ssid(const char *ifname, char *buf)
{ {
char *res; char *res;
struct nl80211_msg_conveyor *req; struct nl80211_msg_conveyor *req;
@ -881,7 +880,7 @@ int nl80211_get_ssid(const char *ifname, char *buf)
return (*buf == 0) ? -1 : 0; return (*buf == 0) ? -1 : 0;
} }
int nl80211_get_bssid(const char *ifname, char *buf) static int nl80211_get_bssid(const char *ifname, char *buf)
{ {
char *res; char *res;
struct nl80211_msg_conveyor *req; struct nl80211_msg_conveyor *req;
@ -960,7 +959,7 @@ static int nl80211_get_frequency_info_cb(struct nl_msg *msg, void *arg)
return NL_SKIP; return NL_SKIP;
} }
int nl80211_get_frequency(const char *ifname, int *buf) static int nl80211_get_frequency(const char *ifname, int *buf)
{ {
int chn; int chn;
char *res, *channel; char *res, *channel;
@ -1005,7 +1004,7 @@ int nl80211_get_frequency(const char *ifname, int *buf)
return (*buf == 0) ? -1 : 0; return (*buf == 0) ? -1 : 0;
} }
int nl80211_get_channel(const char *ifname, int *buf) static int nl80211_get_channel(const char *ifname, int *buf)
{ {
if (!nl80211_get_frequency(ifname, buf)) if (!nl80211_get_frequency(ifname, buf))
{ {
@ -1017,7 +1016,7 @@ int nl80211_get_channel(const char *ifname, int *buf)
} }
int nl80211_get_txpower(const char *ifname, int *buf) static int nl80211_get_txpower(const char *ifname, int *buf)
{ {
#if 0 #if 0
char *res; char *res;
@ -1127,7 +1126,7 @@ static void nl80211_fill_signal(const char *ifname, struct nl80211_rssi_rate *r)
} }
} }
int nl80211_get_bitrate(const char *ifname, int *buf) static int nl80211_get_bitrate(const char *ifname, int *buf)
{ {
struct nl80211_rssi_rate rr; struct nl80211_rssi_rate rr;
@ -1142,7 +1141,7 @@ int nl80211_get_bitrate(const char *ifname, int *buf)
return -1; return -1;
} }
int nl80211_get_signal(const char *ifname, int *buf) static int nl80211_get_signal(const char *ifname, int *buf)
{ {
struct nl80211_rssi_rate rr; struct nl80211_rssi_rate rr;
@ -1185,7 +1184,7 @@ static int nl80211_get_noise_cb(struct nl_msg *msg, void *arg)
} }
int nl80211_get_noise(const char *ifname, int *buf) static int nl80211_get_noise(const char *ifname, int *buf)
{ {
int8_t noise; int8_t noise;
struct nl80211_msg_conveyor *req; struct nl80211_msg_conveyor *req;
@ -1208,7 +1207,7 @@ int nl80211_get_noise(const char *ifname, int *buf)
return -1; return -1;
} }
int nl80211_get_quality(const char *ifname, int *buf) static int nl80211_get_quality(const char *ifname, int *buf)
{ {
int signal; int signal;
@ -1240,7 +1239,7 @@ int nl80211_get_quality(const char *ifname, int *buf)
return -1; return -1;
} }
int nl80211_get_quality_max(const char *ifname, int *buf) static int nl80211_get_quality_max(const char *ifname, int *buf)
{ {
/* The cfg80211 wext compat layer assumes a maximum /* The cfg80211 wext compat layer assumes a maximum
* quality of 70 */ * quality of 70 */
@ -1249,7 +1248,7 @@ int nl80211_get_quality_max(const char *ifname, int *buf)
return 0; return 0;
} }
int nl80211_get_encryption(const char *ifname, char *buf) static int nl80211_get_encryption(const char *ifname, char *buf)
{ {
int i; int i;
char k[9]; char k[9];
@ -1412,7 +1411,7 @@ int nl80211_get_encryption(const char *ifname, char *buf)
return -1; return -1;
} }
int nl80211_get_phyname(const char *ifname, char *buf) static int nl80211_get_phyname(const char *ifname, char *buf)
{ {
const char *name; const char *name;
@ -1528,7 +1527,7 @@ static int nl80211_get_assoclist_cb(struct nl_msg *msg, void *arg)
return NL_SKIP; return NL_SKIP;
} }
int nl80211_get_assoclist(const char *ifname, char *buf, int *len) static int nl80211_get_assoclist(const char *ifname, char *buf, int *len)
{ {
DIR *d; DIR *d;
int i, noise = 0; int i, noise = 0;
@ -1618,7 +1617,7 @@ static int nl80211_get_txpwrlist_cb(struct nl_msg *msg, void *arg)
return NL_SKIP; return NL_SKIP;
} }
int nl80211_get_txpwrlist(const char *ifname, char *buf, int *len) static int nl80211_get_txpwrlist(const char *ifname, char *buf, int *len)
{ {
int ch_cur; int ch_cur;
int dbm_max = -1, dbm_cur, dbm_cnt; int dbm_max = -1, dbm_cur, dbm_cnt;
@ -1861,7 +1860,7 @@ static int nl80211_get_scanlist_nl(const char *ifname, char *buf, int *len)
return *len ? 0 : -1; return *len ? 0 : -1;
} }
int nl80211_get_scanlist(const char *ifname, char *buf, int *len) static int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
{ {
int freq, rssi, qmax, count; int freq, rssi, qmax, count;
char *res; char *res;
@ -2083,7 +2082,7 @@ static int nl80211_get_freqlist_cb(struct nl_msg *msg, void *arg)
return NL_SKIP; return NL_SKIP;
} }
int nl80211_get_freqlist(const char *ifname, char *buf, int *len) static int nl80211_get_freqlist(const char *ifname, char *buf, int *len)
{ {
struct nl80211_msg_conveyor *req; struct nl80211_msg_conveyor *req;
struct nl80211_array_buf arr = { .buf = buf, .count = 0 }; struct nl80211_array_buf arr = { .buf = buf, .count = 0 };
@ -2117,7 +2116,7 @@ static int nl80211_get_country_cb(struct nl_msg *msg, void *arg)
return NL_SKIP; return NL_SKIP;
} }
int nl80211_get_country(const char *ifname, char *buf) static int nl80211_get_country(const char *ifname, char *buf)
{ {
int rv = -1; int rv = -1;
struct nl80211_msg_conveyor *req; struct nl80211_msg_conveyor *req;
@ -2135,7 +2134,7 @@ int nl80211_get_country(const char *ifname, char *buf)
return rv; return rv;
} }
int nl80211_get_countrylist(const char *ifname, char *buf, int *len) static int nl80211_get_countrylist(const char *ifname, char *buf, int *len)
{ {
int i, count; int i, count;
struct iwinfo_country_entry *e = (struct iwinfo_country_entry *)buf; struct iwinfo_country_entry *e = (struct iwinfo_country_entry *)buf;
@ -2203,7 +2202,7 @@ static int nl80211_get_hwmodelist_cb(struct nl_msg *msg, void *arg)
return NL_SKIP; return NL_SKIP;
} }
int nl80211_get_hwmodelist(const char *ifname, int *buf) static int nl80211_get_hwmodelist(const char *ifname, int *buf)
{ {
struct nl80211_msg_conveyor *req; struct nl80211_msg_conveyor *req;
@ -2270,7 +2269,7 @@ static int nl80211_get_ifcomb_cb(struct nl_msg *msg, void *arg)
return NL_SKIP; return NL_SKIP;
} }
int nl80211_get_mbssid_support(const char *ifname, int *buf) static int nl80211_get_mbssid_support(const char *ifname, int *buf)
{ {
struct nl80211_msg_conveyor *req; struct nl80211_msg_conveyor *req;
@ -2283,7 +2282,7 @@ int nl80211_get_mbssid_support(const char *ifname, int *buf)
return 0; return 0;
} }
int nl80211_get_hardware_id(const char *ifname, char *buf) static int nl80211_get_hardware_id(const char *ifname, char *buf)
{ {
int rv; int rv;
char *res; char *res;
@ -2329,7 +2328,7 @@ nl80211_get_hardware_entry(const char *ifname)
return iwinfo_hardware(&id); return iwinfo_hardware(&id);
} }
int nl80211_get_hardware_name(const char *ifname, char *buf) static int nl80211_get_hardware_name(const char *ifname, char *buf)
{ {
const struct iwinfo_hardware_entry *hw; const struct iwinfo_hardware_entry *hw;
@ -2341,7 +2340,7 @@ int nl80211_get_hardware_name(const char *ifname, char *buf)
return 0; return 0;
} }
int nl80211_get_txpower_offset(const char *ifname, int *buf) static int nl80211_get_txpower_offset(const char *ifname, int *buf)
{ {
const struct iwinfo_hardware_entry *hw; const struct iwinfo_hardware_entry *hw;
@ -2352,7 +2351,7 @@ int nl80211_get_txpower_offset(const char *ifname, int *buf)
return 0; return 0;
} }
int nl80211_get_frequency_offset(const char *ifname, int *buf) static int nl80211_get_frequency_offset(const char *ifname, int *buf)
{ {
const struct iwinfo_hardware_entry *hw; const struct iwinfo_hardware_entry *hw;
@ -2362,3 +2361,34 @@ int nl80211_get_frequency_offset(const char *ifname, int *buf)
*buf = hw->frequency_offset; *buf = hw->frequency_offset;
return 0; return 0;
} }
const struct iwinfo_ops nl80211_ops = {
.name = "nl80211",
.probe = nl80211_probe,
.channel = nl80211_get_channel,
.frequency = nl80211_get_frequency,
.frequency_offset = nl80211_get_frequency_offset,
.txpower = nl80211_get_txpower,
.txpower_offset = nl80211_get_txpower_offset,
.bitrate = nl80211_get_bitrate,
.signal = nl80211_get_signal,
.noise = nl80211_get_noise,
.quality = nl80211_get_quality,
.quality_max = nl80211_get_quality_max,
.mbssid_support = nl80211_get_mbssid_support,
.hwmodelist = nl80211_get_hwmodelist,
.mode = nl80211_get_mode,
.ssid = nl80211_get_ssid,
.bssid = nl80211_get_bssid,
.country = nl80211_get_country,
.hardware_id = nl80211_get_hardware_id,
.hardware_name = nl80211_get_hardware_name,
.encryption = nl80211_get_encryption,
.phyname = nl80211_get_phyname,
.assoclist = nl80211_get_assoclist,
.txpwrlist = nl80211_get_txpwrlist,
.scanlist = nl80211_get_scanlist,
.freqlist = nl80211_get_freqlist,
.countrylist = nl80211_get_countrylist,
.close = nl80211_close
};

View File

@ -0,0 +1,70 @@
/*
* iwinfo - Wireless Information Library - NL80211 Headers
*
* Copyright (C) 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
* as published by the Free Software Foundation.
*
* The iwinfo library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with the iwinfo library. If not, see http://www.gnu.org/licenses/.
*/
#ifndef __IWINFO_NL80211_H_
#define __IWINFO_NL80211_H_
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <dirent.h>
#include <signal.h>
#include <sys/un.h>
#include <netlink/netlink.h>
#include <netlink/genl/genl.h>
#include <netlink/genl/family.h>
#include <netlink/genl/ctrl.h>
#include "iwinfo.h"
#include "iwinfo/utils.h"
#include "iwinfo/api/nl80211.h"
struct nl80211_state {
struct nl_sock *nl_sock;
struct nl_cache *nl_cache;
struct genl_family *nl80211;
struct genl_family *nlctrl;
};
struct nl80211_msg_conveyor {
struct nl_msg *msg;
struct nl_cb *cb;
};
struct nl80211_event_conveyor {
int wait;
int recv;
};
struct nl80211_group_conveyor {
const char *name;
int id;
};
struct nl80211_rssi_rate {
int16_t rate;
int8_t rssi;
};
struct nl80211_array_buf {
void *buf;
int count;
};
#endif