diff --git a/package/network/utils/iwinfo/src/include/iwinfo.h b/package/network/utils/iwinfo/src/include/iwinfo.h index ebea319d107cf246cb5711bd48bbc73c999722a8..1302d159b9e1ed7f2c92b8ef1f2535772fb44723 100644 --- a/package/network/utils/iwinfo/src/include/iwinfo.h +++ b/package/network/utils/iwinfo/src/include/iwinfo.h @@ -148,6 +148,9 @@ extern const struct iwinfo_iso3166_label IWINFO_ISO3166_NAMES[]; struct iwinfo_ops { + const char *name; + + int (*probe)(const char *ifname); int (*mode)(const char *, int *); int (*channel)(const char *, int *); int (*frequency)(const char *, int *); diff --git a/package/network/utils/iwinfo/src/include/iwinfo/madwifi.h b/package/network/utils/iwinfo/src/include/iwinfo/madwifi.h index 3662d9f95f0af2fc49f41ece82fbdb9b48b1f480..0de9fea6e315dcd03f2a57cf4b019ee5469390f5 100644 --- a/package/network/utils/iwinfo/src/include/iwinfo/madwifi.h +++ b/package/network/utils/iwinfo/src/include/iwinfo/madwifi.h @@ -54,6 +54,8 @@ int madwifi_get_hardware_name(const char *ifname, char *buf); void madwifi_close(void); static const struct iwinfo_ops madwifi_ops = { + .name = "madwifi", + .probe = madwifi_probe, .channel = madwifi_get_channel, .frequency = madwifi_get_frequency, .frequency_offset = madwifi_get_frequency_offset, diff --git a/package/network/utils/iwinfo/src/include/iwinfo/nl80211.h b/package/network/utils/iwinfo/src/include/iwinfo/nl80211.h index 0611feed3c21a423f478dc00643f31961994bf76..97f8c7de634fa2827096e9d613224ea23fddfe21 100644 --- a/package/network/utils/iwinfo/src/include/iwinfo/nl80211.h +++ b/package/network/utils/iwinfo/src/include/iwinfo/nl80211.h @@ -96,6 +96,8 @@ 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, diff --git a/package/network/utils/iwinfo/src/include/iwinfo/wext.h b/package/network/utils/iwinfo/src/include/iwinfo/wext.h index e84f6a6f9222423e6366468382d961cfa0afacfd..22016c69ac12ed32fae256651ce4d10980db1426 100644 --- a/package/network/utils/iwinfo/src/include/iwinfo/wext.h +++ b/package/network/utils/iwinfo/src/include/iwinfo/wext.h @@ -55,6 +55,8 @@ int wext_get_hardware_name(const char *ifname, char *buf); void wext_close(void); static const struct iwinfo_ops wext_ops = { + .name = "wext", + .probe = wext_probe, .channel = wext_get_channel, .frequency = wext_get_frequency, .frequency_offset = wext_get_frequency_offset, diff --git a/package/network/utils/iwinfo/src/include/iwinfo/wl.h b/package/network/utils/iwinfo/src/include/iwinfo/wl.h index 077a51bbd49650e960db54321e1aa5fe57ac0d0a..535a43dc37b357d0a8f40bfa10e2036891d2b4bb 100644 --- a/package/network/utils/iwinfo/src/include/iwinfo/wl.h +++ b/package/network/utils/iwinfo/src/include/iwinfo/wl.h @@ -55,6 +55,8 @@ int wl_get_hardware_name(const char *ifname, char *buf); void wl_close(void); static const struct iwinfo_ops wl_ops = { + .name = "wl", + .probe = wl_probe, .channel = wl_get_channel, .frequency = wl_get_frequency, .frequency_offset = wl_get_frequency_offset, diff --git a/package/network/utils/iwinfo/src/iwinfo_lib.c b/package/network/utils/iwinfo/src/iwinfo_lib.c index df1f450cc536b18a58116fd28a550c520c3d6a2e..4ae8f591c93a2a6141e8e0c2847737837733510d 100644 --- a/package/network/utils/iwinfo/src/iwinfo_lib.c +++ b/package/network/utils/iwinfo/src/iwinfo_lib.c @@ -313,77 +313,49 @@ const struct iwinfo_iso3166_label IWINFO_ISO3166_NAMES[] = { { 0, "" } }; +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) +#endif -const char * iwinfo_type(const char *ifname) -{ +static const struct iwinfo_ops *backends[] = { #ifdef USE_NL80211 - if (nl80211_probe(ifname)) - return "nl80211"; - else + &nl80211_ops, #endif - #ifdef USE_MADWIFI - if (madwifi_probe(ifname)) - return "madwifi"; - else + &madwifi_ops, #endif - #ifdef USE_WL - if (wl_probe(ifname)) - return "wl"; - else + &wl_ops, #endif + &wext_ops, +}; - if (wext_probe(ifname)) - return "wext"; +const char * iwinfo_type(const char *ifname) +{ + const struct iwinfo_ops *ops = iwinfo_backend(ifname); + if (!ops) + return NULL; - return NULL; + return ops->name; } const struct iwinfo_ops * iwinfo_backend(const char *ifname) { - const char *type; - struct iwinfo_ops *ops; + int i; - type = iwinfo_type(ifname); - if (!type) - return NULL; - -#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; + for (i = 0; i < ARRAY_SIZE(backends); i++) + if (backends[i]->probe(ifname)) + return backends[i]; return NULL; } void iwinfo_finish(void) { -#ifdef USE_WL - wl_close(); -#endif -#ifdef USE_MADWIFI - madwifi_close(); -#endif -#ifdef USE_NL80211 - nl80211_close(); -#endif - wext_close(); + int i; + + for (i = 0; i < ARRAY_SIZE(backends); i++) + backends[i]->close(); + iwinfo_close(); }