summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJo-Philipp Wich <jow@openwrt.org>2014-06-30 10:54:24 +0000
committerJo-Philipp Wich <jow@openwrt.org>2014-06-30 10:54:24 +0000
commit89678917bd244337728f3303b9be98455e952dfd (patch)
treeac4f853954c3b04e6610b15022e084d56cb35485
parentf835fc1edfb4b678a63d7033234e42b84582e033 (diff)
modules/admin-full: rework luci-bwc/libiwinfo integration
Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
-rw-r--r--contrib/package/luci/Makefile2
-rw-r--r--modules/admin-full/src/luci-bwc.c75
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;
}