summaryrefslogtreecommitdiffhomepage
path: root/libs
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2023-02-07 14:05:17 +0100
committerGitHub <noreply@github.com>2023-02-07 14:05:17 +0100
commit2234d0c5dda0c6ba4cb323c46901a56fb25e83ce (patch)
tree44ff5242e351ff349f274e6e8c23ad720abd3266 /libs
parentf1312cadc6675fb29d02425775dd8a2a533d7e7c (diff)
parent01c5a63934392ab66c66c594fbd93a796e36d6e6 (diff)
Merge pull request #6104 from dhewg/6g
luci-mod-network: enable configuring wifi ax networks on the 6G band
Diffstat (limited to 'libs')
-rw-r--r--libs/rpcd-mod-luci/Makefile4
-rw-r--r--libs/rpcd-mod-luci/src/luci.c206
2 files changed, 79 insertions, 131 deletions
diff --git a/libs/rpcd-mod-luci/Makefile b/libs/rpcd-mod-luci/Makefile
index ee3bc00746..ece32a4cc9 100644
--- a/libs/rpcd-mod-luci/Makefile
+++ b/libs/rpcd-mod-luci/Makefile
@@ -7,8 +7,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=rpcd-mod-luci
-PKG_VERSION:=20210614
-PKG_RELEASE:=2
+PKG_VERSION:=20230123
+PKG_RELEASE:=1
PKG_MAINTAINER:=Jo-Philipp Wich <jo@mein.io>
PKG_LICENSE:=Apache-2.0
diff --git a/libs/rpcd-mod-luci/src/luci.c b/libs/rpcd-mod-luci/src/luci.c
index 7dd3ef27c7..e21105d3c6 100644
--- a/libs/rpcd-mod-luci/src/luci.c
+++ b/libs/rpcd-mod-luci/src/luci.c
@@ -76,9 +76,12 @@ 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);
+static size_t (*iw_format_hwmodes)(int, char *, size_t);
static void
invoke_data_cb(struct ubus_request *req, int type, struct blob_attr *msg)
@@ -884,6 +887,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)
{
@@ -894,8 +939,10 @@ static bool rpc_luci_get_iwinfo(struct blob_buf *buf, const char *devname,
void *o, *o2, *a;
glob_t paths;
int nret, i;
+ char text[32];
- if (!iw_backend || !iw_close || !iw_modenames) {
+ if (!iw_backend || !iw_close || !iw_format_hwmodes || !iw_modenames || !iw_80211names ||
+ !iw_htmodenames || !iw_authnames || !iw_kmgmtnames || !iw_ciphernames) {
if (glob("/usr/lib/libiwinfo.so*", 0, NULL, &paths) != 0)
return false;
@@ -909,9 +956,16 @@ 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_format_hwmodes = dlsym(iwlib, "iwinfo_format_hwmodes");
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_format_hwmodes || !iw_modenames || !iw_80211names ||
+ !iw_htmodenames || !iw_authnames || !iw_kmgmtnames || !iw_ciphernames)
return false;
}
@@ -933,67 +987,16 @@ static bool rpc_luci_get_iwinfo(struct blob_buf *buf, const char *devname,
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");
+ iw_add_bit_array(buf, "hwmodes", nret,
+ iw_80211names, IWINFO_80211_COUNT, true, 0);
- blobmsg_close_array(buf, a);
+ if (iw_format_hwmodes(nret, text, sizeof(text)) > 0)
+ blobmsg_add_string(buf, "hwmodes_text", text);
}
- 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 (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 +1031,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 +1043,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);