diff options
-rw-r--r-- | contrib/package/luci/Makefile | 2 | ||||
-rw-r--r-- | modules/admin-full/src/luci-bwc.c | 75 |
2 files changed, 31 insertions, 46 deletions
diff --git a/contrib/package/luci/Makefile b/contrib/package/luci/Makefile index 40009a28b..5ee13d4d4 100644 --- a/contrib/package/luci/Makefile +++ b/contrib/package/luci/Makefile @@ -9,7 +9,7 @@ PKG_BUILD_PARALLEL:=0 PKG_VERSION:=$(shell $(LUCI_TOPDIR)/build/mkrevision.sh 2>/dev/null || echo unknown) -PKG_BUILD_DEPENDS:=$(if $(STAGING_DIR_ROOT),lua/host) +PKG_BUILD_DEPENDS:=$(if $(STAGING_DIR_ROOT),lua/host) iwinfo PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install PKG_USE_MIPS16:=0 diff --git a/modules/admin-full/src/luci-bwc.c b/modules/admin-full/src/luci-bwc.c index 1a4f510d7..05e46671e 100644 --- a/modules/admin-full/src/luci-bwc.c +++ b/modules/admin-full/src/luci-bwc.c @@ -32,6 +32,7 @@ #include <arpa/inet.h> #include <dlfcn.h> +#include <iwinfo.h> #define STEP_COUNT 60 #define STEP_TIME 1 @@ -140,9 +141,7 @@ static void reset_countdown(int sig) static char *progname; static int prognamelen; -static int (*iw_get_rate)(const char *, int *) = NULL; -static int (*iw_get_rssi)(const char *, int *) = NULL; -static int (*iw_get_noise)(const char *, int *) = NULL; +static struct iwinfo_ops *backend = NULL; static int init_directory(char *path) @@ -252,59 +251,45 @@ static void umap_file(struct file_map *m) close(m->fd); } -static void * iwinfo_open(void) +static void * iw_open(void) { return dlopen("/usr/lib/libiwinfo.so", RTLD_LAZY); } -static int iwinfo_update( +static int iw_update( void *iw, const char *ifname, uint16_t *rate, uint8_t *rssi, uint8_t *noise ) { - int (*probe)(const char *); + struct iwinfo_ops *(*probe)(const char *); int val; - if (!iw_get_rate) + if (!backend) { - if ((probe = dlsym(iw, "nl80211_probe")) != NULL && probe(ifname)) - { - iw_get_rate = dlsym(iw, "nl80211_get_bitrate"); - iw_get_rssi = dlsym(iw, "nl80211_get_signal"); - iw_get_noise = dlsym(iw, "nl80211_get_noise"); - } - else if ((probe = dlsym(iw, "madwifi_probe")) != NULL && probe(ifname)) - { - iw_get_rate = dlsym(iw, "madwifi_get_bitrate"); - iw_get_rssi = dlsym(iw, "madwifi_get_signal"); - iw_get_noise = dlsym(iw, "madwifi_get_noise"); - } - else if ((probe = dlsym(iw, "wl_probe")) != NULL && probe(ifname)) - { - iw_get_rate = dlsym(iw, "wl_get_bitrate"); - iw_get_rssi = dlsym(iw, "wl_get_signal"); - iw_get_noise = dlsym(iw, "wl_get_noise"); - } - else - { + probe = dlsym(iw, "iwinfo_backend"); + + if (!probe) + return 0; + + backend = probe(ifname); + + if (!backend) return 0; - } } - *rate = (iw_get_rate && !iw_get_rate(ifname, &val)) ? val : 0; - *rssi = (iw_get_rssi && !iw_get_rssi(ifname, &val)) ? val : 0; - *noise = (iw_get_noise && !iw_get_noise(ifname, &val)) ? val : 0; + *rate = (backend->bitrate && !backend->bitrate(ifname, &val)) ? val : 0; + *rssi = (backend->signal && !backend->signal(ifname, &val)) ? val : 0; + *noise = (backend->noise && !backend->noise(ifname, &val)) ? val : 0; return 1; } -static void iwinfo_close(void *iw) +static void iw_close(void *iw) { - void (*do_close)(void); + void (*finish)(void); + + finish = dlsym(iw, "iwinfo_finish"); - if ((do_close = dlsym(iw, "nl80211_close")) != NULL) do_close(); - if ((do_close = dlsym(iw, "madwifi_close")) != NULL) do_close(); - if ((do_close = dlsym(iw, "wl_close")) != NULL) do_close(); - if ((do_close = dlsym(iw, "wext_close")) != NULL) do_close(); - if ((do_close = dlsym(iw, "iwinfo_close")) != NULL) do_close(); + if (finish) + finish(); dlclose(iw); } @@ -479,7 +464,7 @@ static int run_daemon(void) } /* initialize iwinfo */ - iw = iwinfo_open(); + iw = iw_open(); /* go */ for (reset_countdown(0); countdown >= 0; countdown--) @@ -509,19 +494,19 @@ static int run_daemon(void) { for (i = 0; i < 5; i++) { -#define iwinfo_checkif(pattern) \ +#define iw_checkif(pattern) \ do { \ snprintf(ifname, sizeof(ifname), pattern, i); \ - if (iwinfo_update(iw, ifname, &rate, &rssi, &noise)) \ + if (iw_update(iw, ifname, &rate, &rssi, &noise)) \ { \ update_radiostat(ifname, rate, rssi, noise); \ continue; \ } \ } while(0) - iwinfo_checkif("wlan%d"); - iwinfo_checkif("ath%d"); - iwinfo_checkif("wl%d"); + iw_checkif("wlan%d"); + iw_checkif("ath%d"); + iw_checkif("wl%d"); } } @@ -574,7 +559,7 @@ static int run_daemon(void) unlink(PID_PATH); if (iw) - iwinfo_close(iw); + iw_close(iw); return 0; } |