luci-wireless: Add 11be support
authorRudy Andram <rmandrad@gmail.com>
Thu, 3 Oct 2024 08:39:10 +0000 (09:39 +0100)
committerPaul Donald <newtwen+github@gmail.com>
Mon, 7 Oct 2024 17:29:35 +0000 (19:29 +0200)
Tested with filogic banana rpi4 / QNAP qualcommax ipq8074

Signed-off-by: Rudy Andram <rmandrad@gmail.com>
Tested-By: Daniel Pawlik <pawlik.dan@gmail.com>
modules/luci-base/htdocs/luci-static/resources/network.js
modules/luci-base/root/usr/share/rpcd/ucode/luci
modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm
modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js

index b6b996818a54b2f7d22b2e8e0937ad8373f79d2b..c504279eeb88214b1b524c949ce1653f82103357 100644 (file)
@@ -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.
         */
 
        /**
index 93ce1dd3b92c2435e849fca72adc797fa42d464e..9bb8bb88c7d84e4773f2cb5da6c08269197d37f9 100644 (file)
@@ -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 };
index eeb1d5c5cbc7d1e137866fa3d84cf7542a5993c5..f81ee19614e13d98b6a1abbf77b875090ef9dd57 100644 (file)
@@ -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 = {
                        '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
                ]
        };
 
                ],
                '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)
 
                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';
index cedf1675ffa3637ae14445a2340ea3ec9d9db1e2..2cce3ed46d76e4125de50cab85245a7791419e97 100644 (file)
@@ -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';