Skip to content

Commit

Permalink
luci-wireless: Add 11be support
Browse files Browse the repository at this point in the history
Tested with filogic banana rpi4 / QNAP qualcommax ipq8074

Signed-off-by: Rudy Andram <rmandrad@gmail.com>
Tested-By: Daniel Pawlik <pawlik.dan@gmail.com>
  • Loading branch information
rmandrad authored and systemcrash committed Oct 7, 2024
1 parent 300961b commit 383edb4
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 9 deletions.
17 changes: 17 additions & 0 deletions modules/luci-base/htdocs/luci-static/resources/network.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand All @@ -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');
Expand Down Expand Up @@ -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.
*/

/**
Expand Down
2 changes: 1 addition & 1 deletion modules/luci-base/root/usr/share/rpcd/ucode/luci
Original file line number Diff line number Diff line change
Expand Up @@ -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 };
Expand Down
34 changes: 31 additions & 3 deletions modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand All @@ -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
]
};

Expand All @@ -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)
Expand Down Expand Up @@ -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';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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;
}

Expand Down Expand Up @@ -298,14 +307,17 @@ 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',
params: [ 'device' ],
expect: { results: [] }
}),

// Load method to fetch WiFi device details and frequency list
load: function(section_id) {
return Promise.all([
network.getWifiDevice(section_id),
Expand Down Expand Up @@ -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 }, {});

Expand All @@ -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,
Expand All @@ -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;
Expand Down Expand Up @@ -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';
Expand All @@ -459,7 +492,9 @@ var CBIWifiFrequencyValue = form.Value.extend({
if (hwval != null) {

This comment has been minimized.

Copy link
@Shine-

Shine- Oct 28, 2024

This change is total bullshit wrong (sorry for the offensive wording). "hwval" (hwmode in config files) is a deprecated option that can only contain "11b", "11g" or "11a". Anything that contains "a" is 5G, otherwise it's 2G. That is what this part of the code meant, before you broke it. Any check for "be" or "ax" has to go somewhere else, not here.

This comment has been minimized.

Copy link
@Ansuel

Ansuel Oct 28, 2024

Member

Wow maybe lets say this with better term? Rest of the changes are also trash and bullshit or are ok? Isn't that too much?

Also instead of scream like that and waste time, can't we just fix it directly? And maybe be passive aggressive in the commit description of the fix? :)

Anyway thanks for the report, not that this is that much important consider the almost non existence relevance of wifi 7 devices around the globe :D

This comment has been minimized.

Copy link
@Shine-

Shine- Oct 28, 2024

Sorry, didn't mean to be offensive. But either way, the rest of this snippet is also wrong, since "be" isn't always 6G and "ax" isn't always 5G. So this part of the commit should be undone, fixed.

This comment has been minimized.

Copy link
@systemcrash

systemcrash via email Oct 28, 2024

Contributor

This comment has been minimized.

Copy link
@Ansuel

Ansuel Oct 28, 2024

Member

@Shine- thanks now you are more reasonable and more than happy to discuss it.

I think the other changes in other file are ok so I think we should better fix just this specific snippet instead of revert. (much easier, revert are only for full commits normally)

@rmandrad can you by chance make a follow-up to this with fixed logic and maybe @Shine- can check it?

This comment has been minimized.

Copy link
@Shine-

Shine- Oct 28, 2024

Yes yes, of course only this part should be fixed, not the whole commit reverted!

This comment has been minimized.

Copy link
@rmandrad

rmandrad Oct 29, 2024

Author Contributor

alright I will revert back to the way it was before

` if (hwval != null) {
this.useBandOption = false;

		if (/a/.test(hwval))
			band.value = '5g';
		else
			band.value = '2g';
	}
	else {
		this.useBandOption = true;

		band.value = bandval;
	}`

This comment has been minimized.

Copy link
@rmandrad

rmandrad Oct 29, 2024

Author Contributor
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';
Expand Down

0 comments on commit 383edb4

Please sign in to comment.