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:
		@@ -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 *);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user