X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=modules%2Fadmin-full%2Fsrc%2Fluci-bwc.c;h=05e46671e8edc43ae2d260266f429eab7432a381;hp=1a4f510d7812162a2f2e8bf0ab9a25db1e9ecbb1;hb=89678917bd244337728f3303b9be98455e952dfd;hpb=f835fc1edfb4b678a63d7033234e42b84582e033;ds=sidebyside 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 #include +#include #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; }