diff options
-rw-r--r-- | libs/rpcd-mod-luci/src/luci.c | 205 |
1 files changed, 73 insertions, 132 deletions
diff --git a/libs/rpcd-mod-luci/src/luci.c b/libs/rpcd-mod-luci/src/luci.c index 4bef961c35..88bc004615 100644 --- a/libs/rpcd-mod-luci/src/luci.c +++ b/libs/rpcd-mod-luci/src/luci.c @@ -76,7 +76,9 @@ struct invoke_context { void *priv; }; -static const char **iw_modenames; +typedef const char * const iw_text_t; +static iw_text_t *iw_modenames, *iw_authnames, *iw_kmgmtnames, + *iw_ciphernames, *iw_htmodenames, *iw_80211names; static struct iwinfo_ops *(*iw_backend)(const char *); static void (*iw_close)(void); @@ -884,6 +886,48 @@ iw_call_num(int (*method)(const char *, int *), const char *dev, blobmsg_add_u32(blob, field, val); } +static void +iw_lower(const char *src, char *dst, size_t len) +{ + size_t i; + + for (i = 0; *src && i < len; i++) + *dst++ = tolower(*src++); + + *dst = 0; +} + +static void +iw_add_bit_array(struct blob_buf *buf, const char *name, uint32_t bits, + iw_text_t values[], size_t len, bool lower, uint32_t zero) +{ + void *c; + size_t i; + char l[128]; + const char *v; + + if (!bits) + bits = zero; + + c = blobmsg_open_array(buf, name); + + for (i = 0; i < len; i++) + if (bits & 1 << i) + { + v = values[i]; + + if (lower) + { + iw_lower(v, l, strlen(values[i])); + v = l; + } + + blobmsg_add_string(buf, NULL, v); + } + + blobmsg_close_array(buf, c); +} + static bool rpc_luci_get_iwinfo(struct blob_buf *buf, const char *devname, bool phy_only) { @@ -895,7 +939,8 @@ static bool rpc_luci_get_iwinfo(struct blob_buf *buf, const char *devname, glob_t paths; int nret, i; - if (!iw_backend || !iw_close || !iw_modenames) { + if (!iw_backend || !iw_close || !iw_modenames || !iw_80211names || + !iw_htmodenames || !iw_authnames || !iw_kmgmtnames || !iw_ciphernames) { if (glob("/usr/lib/libiwinfo.so*", 0, NULL, &paths) != 0) return false; @@ -910,8 +955,14 @@ static bool rpc_luci_get_iwinfo(struct blob_buf *buf, const char *devname, iw_backend = dlsym(iwlib, "iwinfo_backend"); iw_close = dlsym(iwlib, "iwinfo_close"); iw_modenames = dlsym(iwlib, "IWINFO_OPMODE_NAMES"); - - if (!iw_backend || !iw_close || !iw_modenames) + iw_80211names = dlsym(iwlib, "IWINFO_80211_NAMES"); + iw_htmodenames = dlsym(iwlib, "IWINFO_HTMODE_NAMES"); + iw_authnames = dlsym(iwlib, "IWINFO_AUTH_NAMES"); + iw_kmgmtnames = dlsym(iwlib, "IWINFO_KMGMT_NAMES"); + iw_ciphernames = dlsym(iwlib, "IWINFO_CIPHER_NAMES"); + + if (!iw_backend || !iw_close || !iw_modenames || !iw_80211names || + !iw_htmodenames || !iw_authnames || !iw_kmgmtnames || !iw_ciphernames) return false; } @@ -932,68 +983,13 @@ static bool rpc_luci_get_iwinfo(struct blob_buf *buf, const char *devname, iw_call_num(iw->frequency, devname, buf, "frequency"); iw_call_num(iw->frequency_offset, devname, buf, "frequency_offset"); - if (!iw->hwmodelist(devname, &nret)) { - a = blobmsg_open_array(buf, "hwmodes"); - - if (nret & IWINFO_80211_AX) - blobmsg_add_string(buf, NULL, "ax"); - - if (nret & IWINFO_80211_AC) - blobmsg_add_string(buf, NULL, "ac"); - - if (nret & IWINFO_80211_A) - blobmsg_add_string(buf, NULL, "a"); - - if (nret & IWINFO_80211_B) - blobmsg_add_string(buf, NULL, "b"); - - if (nret & IWINFO_80211_G) - blobmsg_add_string(buf, NULL, "g"); - - if (nret & IWINFO_80211_N) - blobmsg_add_string(buf, NULL, "n"); - - blobmsg_close_array(buf, a); - } - - if (!iw->htmodelist(devname, &nret)) { - a = blobmsg_open_array(buf, "htmodes"); - - if (nret & IWINFO_HTMODE_HT20) - blobmsg_add_string(buf, NULL, "HT20"); - - if (nret & IWINFO_HTMODE_HT40) - blobmsg_add_string(buf, NULL, "HT40"); - - if (nret & IWINFO_HTMODE_VHT20) - blobmsg_add_string(buf, NULL, "VHT20"); - - if (nret & IWINFO_HTMODE_VHT40) - blobmsg_add_string(buf, NULL, "VHT40"); - - if (nret & IWINFO_HTMODE_VHT80) - blobmsg_add_string(buf, NULL, "VHT80"); + if (!iw->hwmodelist(devname, &nret)) + iw_add_bit_array(buf, "hwmodes", nret, + iw_80211names, IWINFO_80211_COUNT, true, 0); - if (nret & IWINFO_HTMODE_VHT80_80) - blobmsg_add_string(buf, NULL, "VHT80+80"); - - if (nret & IWINFO_HTMODE_VHT160) - blobmsg_add_string(buf, NULL, "VHT160"); - - if (nret & IWINFO_HTMODE_HE20) - blobmsg_add_string(buf, NULL, "HE20"); - - if (nret & IWINFO_HTMODE_HE40) - blobmsg_add_string(buf, NULL, "HE40"); - - if (nret & IWINFO_HTMODE_HE80) - blobmsg_add_string(buf, NULL, "HE80"); - - if (nret & IWINFO_HTMODE_HE160) - blobmsg_add_string(buf, NULL, "HE160"); - - blobmsg_close_array(buf, a); - } + if (!iw->htmodelist(devname, &nret)) + iw_add_bit_array(buf, "htmodes", nret & ~IWINFO_HTMODE_NOHT, + iw_htmodenames, IWINFO_HTMODE_COUNT, false, 0); if (!iw->hardware_id(devname, (char *)&ids)) { o2 = blobmsg_open_table(buf, "hardware"); @@ -1028,17 +1024,10 @@ static bool rpc_luci_get_iwinfo(struct blob_buf *buf, const char *devname, if (crypto.enabled) { if (!crypto.wpa_version) { - a = blobmsg_open_array(buf, "wep"); - - if (crypto.auth_algs & IWINFO_AUTH_OPEN) - blobmsg_add_string(buf, NULL, "open"); - - if (crypto.auth_algs & IWINFO_AUTH_SHARED) - blobmsg_add_string(buf, NULL, "shared"); - - blobmsg_close_array(buf, a); - } - else { + iw_add_bit_array(buf, "wep", crypto.auth_algs, + iw_authnames, IWINFO_AUTH_COUNT, + true, 0); + } else { a = blobmsg_open_array(buf, "wpa"); for (nret = 1; nret <= 3; nret++) @@ -1047,64 +1036,16 @@ static bool rpc_luci_get_iwinfo(struct blob_buf *buf, const char *devname, blobmsg_close_array(buf, a); - a = blobmsg_open_array(buf, "authentication"); - - if (crypto.auth_suites & IWINFO_KMGMT_PSK) - blobmsg_add_string(buf, NULL, "psk"); - - if (crypto.auth_suites & IWINFO_KMGMT_8021x) - blobmsg_add_string(buf, NULL, "802.1x"); - - if (crypto.auth_suites & IWINFO_KMGMT_SAE) - blobmsg_add_string(buf, NULL, "sae"); - - if (crypto.auth_suites & IWINFO_KMGMT_OWE) - blobmsg_add_string(buf, NULL, "owe"); - - if (!crypto.auth_suites || - (crypto.auth_suites & IWINFO_KMGMT_NONE)) - blobmsg_add_string(buf, NULL, "none"); - - blobmsg_close_array(buf, a); + iw_add_bit_array(buf, "authentication", + crypto.auth_suites, + iw_kmgmtnames, IWINFO_KMGMT_COUNT, + true, IWINFO_KMGMT_NONE); } - a = blobmsg_open_array(buf, "ciphers"); - nret = crypto.pair_ciphers | crypto.group_ciphers; - - if (nret & IWINFO_CIPHER_WEP40) - blobmsg_add_string(buf, NULL, "wep-40"); - - if (nret & IWINFO_CIPHER_WEP104) - blobmsg_add_string(buf, NULL, "wep-104"); - - if (nret & IWINFO_CIPHER_TKIP) - blobmsg_add_string(buf, NULL, "tkip"); - - if (nret & IWINFO_CIPHER_CCMP) - blobmsg_add_string(buf, NULL, "ccmp"); - - if (nret & IWINFO_CIPHER_CCMP256) - blobmsg_add_string(buf, NULL, "ccmp-256"); - - if (nret & IWINFO_CIPHER_GCMP) - blobmsg_add_string(buf, NULL, "gcmp"); - - if (nret & IWINFO_CIPHER_GCMP256) - blobmsg_add_string(buf, NULL, "gcmp-256"); - - if (nret & IWINFO_CIPHER_WRAP) - blobmsg_add_string(buf, NULL, "wrap"); - - if (nret & IWINFO_CIPHER_AESOCB) - blobmsg_add_string(buf, NULL, "aes-ocb"); - - if (nret & IWINFO_CIPHER_CKIP) - blobmsg_add_string(buf, NULL, "ckip"); - - if (!nret || (nret & IWINFO_CIPHER_NONE)) - blobmsg_add_string(buf, NULL, "none"); - - blobmsg_close_array(buf, a); + iw_add_bit_array(buf, "ciphers", + crypto.pair_ciphers | crypto.group_ciphers, + iw_ciphernames, IWINFO_CIPHER_COUNT, + true, IWINFO_CIPHER_NONE); } blobmsg_close_table(buf, o2); |