Merge pull request #6104 from dhewg/6g

luci-mod-network: enable configuring wifi ax networks on the 6G band
This commit is contained in:
Jo-Philipp Wich 2023-02-07 14:05:17 +01:00 committed by GitHub
commit 2234d0c5dd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 91 additions and 149 deletions

View file

@ -7,8 +7,8 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=rpcd-mod-luci PKG_NAME:=rpcd-mod-luci
PKG_VERSION:=20210614 PKG_VERSION:=20230123
PKG_RELEASE:=2 PKG_RELEASE:=1
PKG_MAINTAINER:=Jo-Philipp Wich <jo@mein.io> PKG_MAINTAINER:=Jo-Philipp Wich <jo@mein.io>
PKG_LICENSE:=Apache-2.0 PKG_LICENSE:=Apache-2.0

View file

@ -76,9 +76,12 @@ struct invoke_context {
void *priv; 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 struct iwinfo_ops *(*iw_backend)(const char *);
static void (*iw_close)(void); static void (*iw_close)(void);
static size_t (*iw_format_hwmodes)(int, char *, size_t);
static void static void
invoke_data_cb(struct ubus_request *req, int type, struct blob_attr *msg) 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); 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, static bool rpc_luci_get_iwinfo(struct blob_buf *buf, const char *devname,
bool phy_only) bool phy_only)
{ {
@ -894,8 +939,10 @@ static bool rpc_luci_get_iwinfo(struct blob_buf *buf, const char *devname,
void *o, *o2, *a; void *o, *o2, *a;
glob_t paths; glob_t paths;
int nret, i; 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) if (glob("/usr/lib/libiwinfo.so*", 0, NULL, &paths) != 0)
return false; 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_backend = dlsym(iwlib, "iwinfo_backend");
iw_close = dlsym(iwlib, "iwinfo_close"); iw_close = dlsym(iwlib, "iwinfo_close");
iw_format_hwmodes = dlsym(iwlib, "iwinfo_format_hwmodes");
iw_modenames = dlsym(iwlib, "IWINFO_OPMODE_NAMES"); iw_modenames = dlsym(iwlib, "IWINFO_OPMODE_NAMES");
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) if (!iw_backend || !iw_close || !iw_format_hwmodes || !iw_modenames || !iw_80211names ||
!iw_htmodenames || !iw_authnames || !iw_kmgmtnames || !iw_ciphernames)
return false; 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"); iw_call_num(iw->frequency_offset, devname, buf, "frequency_offset");
if (!iw->hwmodelist(devname, &nret)) { if (!iw->hwmodelist(devname, &nret)) {
a = blobmsg_open_array(buf, "hwmodes"); iw_add_bit_array(buf, "hwmodes", nret,
iw_80211names, IWINFO_80211_COUNT, true, 0);
if (nret & IWINFO_80211_AX) if (iw_format_hwmodes(nret, text, sizeof(text)) > 0)
blobmsg_add_string(buf, NULL, "ax"); blobmsg_add_string(buf, "hwmodes_text", text);
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)) { if (!iw->htmodelist(devname, &nret))
a = blobmsg_open_array(buf, "htmodes"); iw_add_bit_array(buf, "htmodes", nret & ~IWINFO_HTMODE_NOHT,
iw_htmodenames, IWINFO_HTMODE_COUNT, false, 0);
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->hardware_id(devname, (char *)&ids)) { if (!iw->hardware_id(devname, (char *)&ids)) {
o2 = blobmsg_open_table(buf, "hardware"); 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.enabled) {
if (!crypto.wpa_version) { if (!crypto.wpa_version) {
a = blobmsg_open_array(buf, "wep"); iw_add_bit_array(buf, "wep", crypto.auth_algs,
iw_authnames, IWINFO_AUTH_COUNT,
if (crypto.auth_algs & IWINFO_AUTH_OPEN) true, 0);
blobmsg_add_string(buf, NULL, "open"); } else {
if (crypto.auth_algs & IWINFO_AUTH_SHARED)
blobmsg_add_string(buf, NULL, "shared");
blobmsg_close_array(buf, a);
}
else {
a = blobmsg_open_array(buf, "wpa"); a = blobmsg_open_array(buf, "wpa");
for (nret = 1; nret <= 3; nret++) 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); blobmsg_close_array(buf, a);
a = blobmsg_open_array(buf, "authentication"); iw_add_bit_array(buf, "authentication",
crypto.auth_suites,
if (crypto.auth_suites & IWINFO_KMGMT_PSK) iw_kmgmtnames, IWINFO_KMGMT_COUNT,
blobmsg_add_string(buf, NULL, "psk"); true, IWINFO_KMGMT_NONE);
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);
} }
a = blobmsg_open_array(buf, "ciphers"); iw_add_bit_array(buf, "ciphers",
nret = crypto.pair_ciphers | crypto.group_ciphers; crypto.pair_ciphers | crypto.group_ciphers,
iw_ciphernames, IWINFO_CIPHER_COUNT,
if (nret & IWINFO_CIPHER_WEP40) true, IWINFO_CIPHER_NONE);
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);
} }
blobmsg_close_table(buf, o2); blobmsg_close_table(buf, o2);

View file

@ -3396,13 +3396,14 @@ WifiDevice = baseclass.extend(/** @lends LuCI.network.WifiDevice.prototype */ {
getI18n: function() { getI18n: function() {
var hw = this.ubus('dev', 'iwinfo', 'hardware'), var hw = this.ubus('dev', 'iwinfo', 'hardware'),
type = L.isObject(hw) ? hw.name : null; type = L.isObject(hw) ? hw.name : null;
var modes = this.ubus('dev', 'iwinfo', 'hwmodes_text');
if (this.ubus('dev', 'iwinfo', 'type') == 'wl') if (this.ubus('dev', 'iwinfo', 'type') == 'wl')
type = 'Broadcom'; type = 'Broadcom';
return '%s 802.11%s Wireless Controller (%s)'.format( return '%s %s Wireless Controller (%s)'.format(
type || 'Generic', type || 'Generic',
this.getHWModes().sort(L.naturalCompare).join(''), modes ? '802.11' + modes : 'unknown',
this.getName()); this.getName());
}, },

View file

@ -208,7 +208,7 @@ const methods = {
relayd: access('/usr/sbin/relayd') == true, relayd: access('/usr/sbin/relayd') == true,
}; };
const wifi_features = [ 'eap', '11n', '11ac', '11r', 'acs', 'sae', 'owe', 'suiteb192', 'wep', 'wps' ]; const wifi_features = [ 'eap', '11ac', '11ax', '11r', 'acs', 'sae', 'owe', 'suiteb192', 'wep', 'wps' ];
if (access('/usr/sbin/hostapd')) { if (access('/usr/sbin/hostapd')) {
result.hostapd = { cli: access('/usr/sbin/hostapd_cli') == true }; result.hostapd = { cli: access('/usr/sbin/hostapd_cli') == true };

View file

@ -314,24 +314,16 @@ var CBIWifiFrequencyValue = form.Value.extend({
this.channels = { this.channels = {
'2g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [], '2g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [],
'5g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [], '5g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [],
'6g': [], '6g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [],
'60g': [] '60g': []
}; };
for (var i = 0; i < data[1].length; i++) { for (var i = 0; i < data[1].length; i++) {
var band; if (!data[1][i].band)
if (data[1][i].mhz >= 2412 && data[1][i].mhz <= 2484)
band = '2g';
else if (data[1][i].mhz >= 5160 && data[1][i].mhz <= 5885)
band = '5g';
else if (data[1][i].mhz >= 5925 && data[1][i].mhz <= 7125)
band = '6g';
else if (data[1][i].mhz >= 58320 && data[1][i].mhz <= 69120)
band = '60g';
else
continue; continue;
var band = '%dg'.format(data[1][i].band);
this.channels[band].push( this.channels[band].push(
data[1][i].channel, data[1][i].channel,
'%d (%d Mhz)'.format(data[1][i].channel, data[1][i].mhz), '%d (%d Mhz)'.format(data[1][i].channel, data[1][i].mhz),
@ -343,10 +335,10 @@ var CBIWifiFrequencyValue = form.Value.extend({
.reduce(function(o, v) { o[v] = true; return o }, {}); .reduce(function(o, v) { o[v] = true; return o }, {});
this.modes = [ this.modes = [
'', 'Legacy', true, '', 'Legacy', hwmodelist.a || hwmodelist.b || hwmodelist.g,
'n', 'N', hwmodelist.n, 'n', 'N', hwmodelist.n,
'ac', 'AC', hwmodelist.ac, 'ac', 'AC', L.hasSystemFeature('hostapd', '11ac') && hwmodelist.ac,
'ax', 'AX', hwmodelist.ax 'ax', 'AX', L.hasSystemFeature('hostapd', '11ax') && hwmodelist.ax
]; ];
var htmodelist = L.toArray(data[0] ? data[0].getHTModes() : null) var htmodelist = L.toArray(data[0] ? data[0].getHTModes() : null)
@ -387,7 +379,8 @@ var CBIWifiFrequencyValue = form.Value.extend({
], ],
'ax': [ 'ax': [
'2g', '2.4 GHz', this.channels['2g'].length > 3, '2g', '2.4 GHz', this.channels['2g'].length > 3,
'5g', '5 GHz', this.channels['5g'].length > 3 '5g', '5 GHz', this.channels['5g'].length > 3,
'6g', '6 GHz', this.channels['6g'].length > 3
] ]
}; };
}, this)); }, this));