mirror of
https://github.com/openwrt/luci
synced 2025-01-09 04:28:37 +08:00
luci-wireless: Add 11be support
Tested with filogic banana rpi4 / QNAP qualcommax ipq8074 Signed-off-by: Rudy Andram <rmandrad@gmail.com> Tested-By: Daniel Pawlik <pawlik.dan@gmail.com>
This commit is contained in:
parent
300961bb1b
commit
383edb4d6d
@ -3371,6 +3371,7 @@ WifiDevice = baseclass.extend(/** @lends LuCI.network.WifiDevice.prototype */ {
|
||||
* - `n` - IEEE 802.11n mode, 2.4 or 5 GHz, up to 600 Mbit/s
|
||||
* - `ac` - IEEE 802.11ac mode, 5 GHz, up to 6770 Mbit/s
|
||||
* - `ax` - IEEE 802.11ax mode, 2.4 or 5 GHz
|
||||
* - 'be' - IEEE 802.11be mode, 2.4, 5 or 6 GHz
|
||||
*/
|
||||
getHWModes: function() {
|
||||
var hwmodes = this.ubus('dev', 'iwinfo', 'hwmodes');
|
||||
@ -3396,6 +3397,11 @@ WifiDevice = baseclass.extend(/** @lends LuCI.network.WifiDevice.prototype */ {
|
||||
* - `HE40` - applicable to IEEE 802.11ax, 40 MHz wide channels
|
||||
* - `HE80` - applicable to IEEE 802.11ax, 80 MHz wide channels
|
||||
* - `HE160` - applicable to IEEE 802.11ax, 160 MHz wide channels
|
||||
* - `EHT20` - applicable to IEEE 802.11be, 20 MHz wide channels
|
||||
* - `EHT40` - applicable to IEEE 802.11be, 40 MHz wide channels
|
||||
* - `EHT80` - applicable to IEEE 802.11be, 80 MHz wide channels
|
||||
* - `EHT160` - applicable to IEEE 802.11be, 160 MHz wide channels
|
||||
* - `EHT320` - applicable to IEEE 802.11be, 320 MHz wide channels
|
||||
*/
|
||||
getHTModes: function() {
|
||||
var htmodes = this.ubus('dev', 'iwinfo', 'htmodes');
|
||||
@ -4101,6 +4107,17 @@ WifiNetwork = baseclass.extend(/** @lends LuCI.network.WifiNetwork.prototype */
|
||||
* @property {number} [he_dcm]
|
||||
* Specifies whether dual concurrent modulation is used for the transmission.
|
||||
* Only applicable to HE rates.
|
||||
*
|
||||
* @property {boolean} [eht]
|
||||
* Specifies whether this rate is an EHT (IEEE 802.11be) rate.
|
||||
*
|
||||
* @property {number} [eht_gi]
|
||||
* Specifies whether the guard interval used for the transmission.
|
||||
* Only applicable to EHT rates.
|
||||
*
|
||||
* @property {number} [eht_dcm]
|
||||
* Specifies whether dual concurrent modulation is used for the transmission.
|
||||
* Only applicable to EHT rates.
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -208,7 +208,7 @@ const methods = {
|
||||
relayd: access('/usr/sbin/relayd') == true,
|
||||
};
|
||||
|
||||
const wifi_features = [ 'eap', '11ac', '11ax', '11r', 'acs', 'sae', 'owe', 'suiteb192', 'wep', 'wps', 'ocv' ];
|
||||
const wifi_features = [ 'eap', '11ac', '11ax', '11be', '11r', 'acs', 'sae', 'owe', 'suiteb192', 'wep', 'wps', 'ocv' ];
|
||||
|
||||
if (access('/usr/sbin/hostapd')) {
|
||||
result.hostapd = { cli: access('/usr/sbin/hostapd_cli') == true };
|
||||
|
@ -29,7 +29,9 @@
|
||||
var modes = [
|
||||
'', 'Legacy', true,
|
||||
'n', 'N', hwmodes.n,
|
||||
'ac', 'AC', hwmodes.ac
|
||||
'ac', 'AC', hwmodes.ac,
|
||||
'ax', 'AX', hwmodes.ax,
|
||||
'be', 'BE', hwmodes.be
|
||||
];
|
||||
|
||||
var htmodes = {
|
||||
@ -45,6 +47,19 @@
|
||||
'VHT40', '40 MHz', htmodes.VHT40,
|
||||
'VHT80', '80 MHz', htmodes.VHT80,
|
||||
'VHT160', '160 MHz', htmodes.VHT160
|
||||
],
|
||||
'ax': [
|
||||
'HE20', '20 MHz', htmodes.HE20,
|
||||
'HE40', '40 MHz', htmodes.HE40,
|
||||
'HE80', '80 MHz', htmodes.HE80,
|
||||
'HE160', '160 MHz', htmodes.HE160
|
||||
],
|
||||
'be': [
|
||||
'EHT20', '20 MHz', htmodes.EHT20,
|
||||
'EHT40', '40 MHz', htmodes.EHT40,
|
||||
'EHT80', '80 MHz', htmodes.EHT80,
|
||||
'EHT160', '160 MHz', htmodes.EHT160,
|
||||
'EHT320', '320 MHz', htmodes.EHT320
|
||||
]
|
||||
};
|
||||
|
||||
@ -59,7 +74,16 @@
|
||||
],
|
||||
'ac': [
|
||||
'11a', '5 GHz', true
|
||||
]
|
||||
],
|
||||
'ax': [
|
||||
'11a', '2 GHz', true,
|
||||
'11a', '5 GHz', true
|
||||
],
|
||||
'be': [
|
||||
'11a', '2 GHz', true,
|
||||
'11a', '5 GHz', true,
|
||||
'11a', '6 GHz', true
|
||||
]
|
||||
};
|
||||
|
||||
function cbi_set_values(sel, vals)
|
||||
@ -129,7 +153,11 @@
|
||||
|
||||
cbi_set_values(mode, modes);
|
||||
|
||||
if (/VHT20|VHT40|VHT80|VHT160/.test(<%= luci.http.write_json(self.map:get(section, "htmode")) %>))
|
||||
if (/EHT20|EHT40|EHT80|EHT160|EHT320/.test(<%= luci.http.write_json(self.map:get(section, "htmode")) %>))
|
||||
mode.value = 'be';
|
||||
else if (/HE20|HE40|HE80|HE160/.test(<%= luci.http.write_json(self.map:get(section, "htmode")) %>))
|
||||
mode.value = 'ax';
|
||||
else if (/VHT20|VHT40|VHT80|VHT160/.test(<%= luci.http.write_json(self.map:get(section, "htmode")) %>))
|
||||
mode.value = 'ac';
|
||||
else if (/HT20|HT40/.test(<%= luci.http.write_json(self.map:get(section, "htmode")) %>))
|
||||
mode.value = 'n';
|
||||
|
@ -201,7 +201,9 @@ function format_wifirate(rate) {
|
||||
mhz = rate.mhz, nss = rate.nss,
|
||||
mcs = rate.mcs, sgi = rate.short_gi,
|
||||
he = rate.he, he_gi = rate.he_gi,
|
||||
he_dcm = rate.he_dcm;
|
||||
he_dcm = rate.he_dcm,
|
||||
eht = rate?.eht ?? false, eht_gi = rate?.eht_gi ?? 0,
|
||||
eht_dcm = rate?.eht_dcm ?? 0;
|
||||
|
||||
if (ht || vht) {
|
||||
if (vht) s += ', VHT-MCS\xa0%d'.format(mcs);
|
||||
@ -217,6 +219,13 @@ function format_wifirate(rate) {
|
||||
if (he_dcm) s += ', HE-DCM\xa0%d'.format(he_dcm);
|
||||
}
|
||||
|
||||
if (eht) {
|
||||
s += ', EHT-MCS\xa0%d'.format(mcs);
|
||||
if (nss) s += ', EHT-NSS\xa0%d'.format(nss);
|
||||
if (eht_gi) s += ', EHT-GI\xa0%d'.format(eht_gi);
|
||||
if (eht_dcm) s += ', EHT-DCM\xa0%d'.format(eht_dcm);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
@ -298,7 +307,9 @@ function add_dependency_permutations(o, deps) {
|
||||
o.depends(res[i]);
|
||||
}
|
||||
|
||||
// Define a class CBIWifiFrequencyValue that extends form.Value
|
||||
var CBIWifiFrequencyValue = form.Value.extend({
|
||||
// Declare an RPC method to get the frequency list for a given device
|
||||
callFrequencyList: rpc.declare({
|
||||
object: 'iwinfo',
|
||||
method: 'freqlist',
|
||||
@ -306,6 +317,7 @@ var CBIWifiFrequencyValue = form.Value.extend({
|
||||
expect: { results: [] }
|
||||
}),
|
||||
|
||||
// Load method to fetch WiFi device details and frequency list
|
||||
load: function(section_id) {
|
||||
return Promise.all([
|
||||
network.getWifiDevice(section_id),
|
||||
@ -334,13 +346,16 @@ var CBIWifiFrequencyValue = form.Value.extend({
|
||||
var hwmodelist = L.toArray(data[0] ? data[0].getHWModes() : null)
|
||||
.reduce(function(o, v) { o[v] = true; return o }, {});
|
||||
|
||||
// Define supported modes
|
||||
this.modes = [
|
||||
'', 'Legacy', hwmodelist.a || hwmodelist.b || hwmodelist.g,
|
||||
'n', 'N', hwmodelist.n,
|
||||
'ac', 'AC', L.hasSystemFeature('hostapd', '11ac') && hwmodelist.ac,
|
||||
'ax', 'AX', L.hasSystemFeature('hostapd', '11ax') && hwmodelist.ax
|
||||
'ax', 'AX', L.hasSystemFeature('hostapd', '11ax') && hwmodelist.ax,
|
||||
'be', 'BE', L.hasSystemFeature('hostapd', '11be') && hwmodelist.be
|
||||
];
|
||||
|
||||
// Create a list of HT modes based on device capabilities
|
||||
var htmodelist = L.toArray(data[0] ? data[0].getHTModes() : null)
|
||||
.reduce(function(o, v) { o[v] = true; return o }, {});
|
||||
|
||||
@ -361,9 +376,18 @@ var CBIWifiFrequencyValue = form.Value.extend({
|
||||
'HE40', '40 MHz', htmodelist.HE40,
|
||||
'HE80', '80 MHz', htmodelist.HE80,
|
||||
'HE160', '160 MHz', htmodelist.HE160
|
||||
],
|
||||
'be': [
|
||||
'EHT20', '20 MHz', htmodelist.EHT20,
|
||||
'EHT40', '40 MHz', htmodelist.EHT40,
|
||||
'EHT80', '80 MHz', htmodelist.EHT80,
|
||||
'EHT160', '160 MHz', htmodelist.EHT160,
|
||||
'EHT320', '320 MHz', htmodelist.EHT320
|
||||
]
|
||||
};
|
||||
|
||||
// Define available bands for widget selection based on channel availability
|
||||
// AX and BE are available on 2/5/6G bands
|
||||
this.bands = {
|
||||
'': [
|
||||
'2g', '2.4 GHz', this.channels['2g'].length > 3,
|
||||
@ -381,11 +405,17 @@ var CBIWifiFrequencyValue = form.Value.extend({
|
||||
'2g', '2.4 GHz', this.channels['2g'].length > 3,
|
||||
'5g', '5 GHz', this.channels['5g'].length > 3,
|
||||
'6g', '6 GHz', this.channels['6g'].length > 3
|
||||
]
|
||||
],
|
||||
'be': [
|
||||
'2g', '2.4 GHz', this.channels['2g'].length > 3,
|
||||
'5g', '5 GHz', this.channels['5g'].length > 3,
|
||||
'6g', '6 GHz', this.channels['6g'].length > 3
|
||||
],
|
||||
};
|
||||
}, this));
|
||||
},
|
||||
|
||||
// Set values in the select element
|
||||
setValues: function(sel, vals) {
|
||||
if (sel.vals)
|
||||
sel.vals.selected = sel.selectedIndex;
|
||||
@ -445,7 +475,10 @@ var CBIWifiFrequencyValue = form.Value.extend({
|
||||
|
||||
this.setValues(mode, this.modes);
|
||||
|
||||
if (/HE20|HE40|HE80|HE160/.test(htval))
|
||||
// Determine mode based on htmode value
|
||||
if (/EHT20|EHT40|EHT80|EHT160|EHT320/.test(htval))
|
||||
mode.value = 'be';
|
||||
else if (/HE20|HE40|HE80|HE160/.test(htval))
|
||||
mode.value = 'ax';
|
||||
else if (/VHT20|VHT40|VHT80|VHT160/.test(htval))
|
||||
mode.value = 'ac';
|
||||
@ -459,7 +492,9 @@ var CBIWifiFrequencyValue = form.Value.extend({
|
||||
if (hwval != null) {
|
||||
this.useBandOption = false;
|
||||
|
||||
if (/a/.test(hwval))
|
||||
if (/be/.test(mode.value))
|
||||
band.value = '6g';
|
||||
else if (/ax/.test(mode.value))
|
||||
band.value = '5g';
|
||||
else
|
||||
band.value = '2g';
|
||||
|
Loading…
Reference in New Issue
Block a user