iwinfo: keep an array of backends, reduce the number of ifdefs and hardcoded strcmp calls

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

SVN-Revision: 40809
This commit is contained in:
Felix Fietkau 2014-05-21 12:33:10 +00:00
parent 55131c5f42
commit 2d06acd6ac
6 changed files with 40 additions and 57 deletions

View file

@ -148,6 +148,9 @@ extern const struct iwinfo_iso3166_label IWINFO_ISO3166_NAMES[];
struct iwinfo_ops { struct iwinfo_ops {
const char *name;
int (*probe)(const char *ifname);
int (*mode)(const char *, int *); int (*mode)(const char *, int *);
int (*channel)(const char *, int *); int (*channel)(const char *, int *);
int (*frequency)(const char *, int *); int (*frequency)(const char *, int *);

View file

@ -54,6 +54,8 @@ int madwifi_get_hardware_name(const char *ifname, char *buf);
void madwifi_close(void); void madwifi_close(void);
static const struct iwinfo_ops madwifi_ops = { static const struct iwinfo_ops madwifi_ops = {
.name = "madwifi",
.probe = madwifi_probe,
.channel = madwifi_get_channel, .channel = madwifi_get_channel,
.frequency = madwifi_get_frequency, .frequency = madwifi_get_frequency,
.frequency_offset = madwifi_get_frequency_offset, .frequency_offset = madwifi_get_frequency_offset,

View file

@ -96,6 +96,8 @@ int nl80211_get_hardware_name(const char *ifname, char *buf);
void nl80211_close(void); void nl80211_close(void);
static const struct iwinfo_ops nl80211_ops = { static const struct iwinfo_ops nl80211_ops = {
.name = "nl80211",
.probe = nl80211_probe,
.channel = nl80211_get_channel, .channel = nl80211_get_channel,
.frequency = nl80211_get_frequency, .frequency = nl80211_get_frequency,
.frequency_offset = nl80211_get_frequency_offset, .frequency_offset = nl80211_get_frequency_offset,

View file

@ -55,6 +55,8 @@ int wext_get_hardware_name(const char *ifname, char *buf);
void wext_close(void); void wext_close(void);
static const struct iwinfo_ops wext_ops = { static const struct iwinfo_ops wext_ops = {
.name = "wext",
.probe = wext_probe,
.channel = wext_get_channel, .channel = wext_get_channel,
.frequency = wext_get_frequency, .frequency = wext_get_frequency,
.frequency_offset = wext_get_frequency_offset, .frequency_offset = wext_get_frequency_offset,

View file

@ -55,6 +55,8 @@ int wl_get_hardware_name(const char *ifname, char *buf);
void wl_close(void); void wl_close(void);
static const struct iwinfo_ops wl_ops = { static const struct iwinfo_ops wl_ops = {
.name = "wl",
.probe = wl_probe,
.channel = wl_get_channel, .channel = wl_get_channel,
.frequency = wl_get_frequency, .frequency = wl_get_frequency,
.frequency_offset = wl_get_frequency_offset, .frequency_offset = wl_get_frequency_offset,

View file

@ -313,77 +313,49 @@ const struct iwinfo_iso3166_label IWINFO_ISO3166_NAMES[] = {
{ 0, "" } { 0, "" }
}; };
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
#endif
static const struct iwinfo_ops *backends[] = {
#ifdef USE_NL80211
&nl80211_ops,
#endif
#ifdef USE_MADWIFI
&madwifi_ops,
#endif
#ifdef USE_WL
&wl_ops,
#endif
&wext_ops,
};
const char * iwinfo_type(const char *ifname) const char * iwinfo_type(const char *ifname)
{ {
#ifdef USE_NL80211 const struct iwinfo_ops *ops = iwinfo_backend(ifname);
if (nl80211_probe(ifname)) if (!ops)
return "nl80211"; return NULL;
else
#endif
#ifdef USE_MADWIFI return ops->name;
if (madwifi_probe(ifname))
return "madwifi";
else
#endif
#ifdef USE_WL
if (wl_probe(ifname))
return "wl";
else
#endif
if (wext_probe(ifname))
return "wext";
return NULL;
} }
const struct iwinfo_ops * iwinfo_backend(const char *ifname) const struct iwinfo_ops * iwinfo_backend(const char *ifname)
{ {
const char *type; int i;
struct iwinfo_ops *ops;
type = iwinfo_type(ifname); for (i = 0; i < ARRAY_SIZE(backends); i++)
if (!type) if (backends[i]->probe(ifname))
return NULL; return backends[i];
#ifdef USE_NL80211
if (!strcmp(type, "nl80211"))
return &nl80211_ops;
else
#endif
#ifdef USE_MADWIFI
if (!strcmp(type, "madwifi"))
return &madwifi_ops;
else
#endif
#ifdef USE_WL
if (!strcmp(type, "wl"))
return &wl_ops;
else
#endif
if (!strcmp(type, "wext"))
return &wext_ops;
return NULL; return NULL;
} }
void iwinfo_finish(void) void iwinfo_finish(void)
{ {
#ifdef USE_WL int i;
wl_close();
#endif for (i = 0; i < ARRAY_SIZE(backends); i++)
#ifdef USE_MADWIFI backends[i]->close();
madwifi_close();
#endif
#ifdef USE_NL80211
nl80211_close();
#endif
wext_close();
iwinfo_close(); iwinfo_close();
} }