luci-mod-network: add support for wireless no outdoor restriction

Some channels may restrict its use to indoor only. Add support for
this and alert the user if a channel with this limitation is used.

Closes #5695

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
Signed-off-by: Paul Donald <newtwen+github@gmail.com>
This commit is contained in:
Christian Marangi 2022-02-22 14:54:42 +01:00 committed by Paul Donald
parent 46e6b9ba44
commit e662dc8151
1 changed files with 76 additions and 42 deletions

View File

@ -324,9 +324,9 @@ var CBIWifiFrequencyValue = form.Value.extend({
this.callFrequencyList(section_id)
]).then(L.bind(function(data) {
this.channels = {
'2g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [],
'5g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [],
'6g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [],
'2g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', { available: true } ] : [],
'5g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', { available: true } ] : [],
'6g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', { available: true } ] : [],
'60g': []
};
@ -334,12 +334,21 @@ var CBIWifiFrequencyValue = form.Value.extend({
if (!data[1][i].band)
continue;
var band = '%dg'.format(data[1][i].band);
var band = '%dg'.format(data[1][i].band),
available = true;
if (data[1][i].restricted && data[1][i].no_ir)
available = false;
this.channels[band].push(
data[1][i].channel,
'%d (%d Mhz)'.format(data[1][i].channel, data[1][i].mhz),
!data[1][i].restricted
{
available: available,
no_outdoor: data[1][i].no_outdoor
}
);
}
@ -348,11 +357,11 @@ var CBIWifiFrequencyValue = form.Value.extend({
// 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,
'be', 'BE', L.hasSystemFeature('hostapd', '11be') && hwmodelist.be
'', 'Legacy', { available: hwmodelist.a || hwmodelist.b || hwmodelist.g },
'n', 'N', { available: hwmodelist.n },
'ac', 'AC', { available: L.hasSystemFeature('hostapd', '11ac') && hwmodelist.ac },
'ax', 'AX', { available: L.hasSystemFeature('hostapd', '11ax') && hwmodelist.ax },
'be', 'BE', { available: L.hasSystemFeature('hostapd', '11be') && hwmodelist.be }
];
// Create a list of HT modes based on device capabilities
@ -360,29 +369,29 @@ var CBIWifiFrequencyValue = form.Value.extend({
.reduce(function(o, v) { o[v] = true; return o }, {});
this.htmodes = {
'': [ '', '-', true ],
'': [ '', '-', { available: true } ],
'n': [
'HT20', '20 MHz', htmodelist.HT20,
'HT40', '40 MHz', htmodelist.HT40
'HT20', '20 MHz', { available: htmodelist.HT20 },
'HT40', '40 MHz', { available: htmodelist.HT40 }
],
'ac': [
'VHT20', '20 MHz', htmodelist.VHT20,
'VHT40', '40 MHz', htmodelist.VHT40,
'VHT80', '80 MHz', htmodelist.VHT80,
'VHT160', '160 MHz', htmodelist.VHT160
'VHT20', '20 MHz', { available: htmodelist.VHT20 },
'VHT40', '40 MHz', { available: htmodelist.VHT40 },
'VHT80', '80 MHz', { available: htmodelist.VHT80 },
'VHT160', '160 MHz', { available: htmodelist.VHT160 }
],
'ax': [
'HE20', '20 MHz', htmodelist.HE20,
'HE40', '40 MHz', htmodelist.HE40,
'HE80', '80 MHz', htmodelist.HE80,
'HE160', '160 MHz', htmodelist.HE160
'HE20', '20 MHz', { available: htmodelist.HE20 },
'HE40', '40 MHz', { available: htmodelist.HE40 },
'HE80', '80 MHz', { available: htmodelist.HE80 },
'HE160', '160 MHz', { available: 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
'EHT20', '20 MHz', { available: htmodelist.EHT20 },
'EHT40', '40 MHz', { available: htmodelist.EHT40 },
'EHT80', '80 MHz', { available: htmodelist.EHT80 },
'EHT160', '160 MHz', { available: htmodelist.EHT160 },
'EHT320', '320 MHz', { available: htmodelist.EHT320 }
]
};
@ -390,27 +399,27 @@ var CBIWifiFrequencyValue = form.Value.extend({
// AX and BE are available on 2/5/6G bands
this.bands = {
'': [
'2g', '2.4 GHz', this.channels['2g'].length > 3,
'5g', '5 GHz', this.channels['5g'].length > 3,
'60g', '60 GHz', this.channels['60g'].length > 0
'2g', '2.4 GHz', { available: this.channels['2g'].length > 3 },
'5g', '5 GHz', { available: this.channels['5g'].length > 3 },
'60g', '60 GHz', { available: this.channels['60g'].length > 0 }
],
'n': [
'2g', '2.4 GHz', this.channels['2g'].length > 3,
'5g', '5 GHz', this.channels['5g'].length > 3
'2g', '2.4 GHz', { available: this.channels['2g'].length > 3 },
'5g', '5 GHz', { available: this.channels['5g'].length > 3 }
],
'ac': [
'5g', '5 GHz', true
'5g', '5 GHz', { available: true }
],
'ax': [
'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
'2g', '2.4 GHz', { available: this.channels['2g'].length > 3 },
'5g', '5 GHz', { available: this.channels['5g'].length > 3 },
'6g', '6 GHz', { available: 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
],
'2g', '2.4 GHz', { available: this.channels['2g'].length > 3 },
'5g', '5 GHz', { available: this.channels['5g'].length > 3 },
'6g', '6 GHz', { available: this.channels['6g'].length > 3 }
]
};
}, this));
},
@ -424,7 +433,7 @@ var CBIWifiFrequencyValue = form.Value.extend({
sel.remove(0);
for (var i = 0; vals && i < vals.length; i += 3)
if (vals[i+2])
if (vals[i+2] && vals[i+2].available)
sel.add(E('option', { value: vals[i+0] }, [ vals[i+1] ]));
if (vals && !isNaN(vals.selected))
@ -456,11 +465,31 @@ var CBIWifiFrequencyValue = form.Value.extend({
this.map.checkDepends();
},
checkWifiChannelRestriction: function(elem) {
var band = elem.querySelector('.band'),
chan = elem.querySelector('.channel'),
restricted_chan = elem.querySelector('.restricted_channel'),
channels = this.channels[band.value],
no_outdoor;
if (chan.selectedIndex < 0)
return;
no_outdoor = channels[(chan.selectedIndex*3)+2].no_outdoor;
if (no_outdoor)
restricted_chan.style.display = '';
else
restricted_chan.style.display = 'none';
},
toggleWifiChannel: function(elem) {
var band = elem.querySelector('.band');
var chan = elem.querySelector('.channel');
this.setValues(chan, this.channels[band.value]);
this.map.checkDepends();
this.checkWifiChannelRestriction(elem);
},
setInitialValues: function(section_id, elem) {
@ -510,6 +539,8 @@ var CBIWifiFrequencyValue = form.Value.extend({
bwdt.value = htval;
chan.value = chval || (chan.options[0] ? chan.options[0].value : 'auto');
this.checkWifiChannelRestriction(elem);
return elem;
},
@ -517,6 +548,9 @@ var CBIWifiFrequencyValue = form.Value.extend({
var elem = E('div');
dom.content(elem, [
E('div', { 'class' : 'restricted_channel', 'style': 'display:none'}, [
E('div', {'class': 'cbi-button alert-message warning disabled'}, _('Indoor Only Channel Selected'))
]),
E('label', { 'style': 'float:left; margin-right:3px' }, [
_('Mode'), E('br'),
E('select', {
@ -540,7 +574,7 @@ var CBIWifiFrequencyValue = form.Value.extend({
E('select', {
'class': 'channel',
'style': 'width:auto',
'change': L.bind(this.map.checkDepends, this.map),
'change': L.bind(this.toggleWifiChannel, this, elem),
'disabled': (this.disabled != null) ? this.disabled : this.map.readonly
})
]),
@ -966,7 +1000,7 @@ return view.extend({
o.inputtitle = isDisabled ? _('Enable') : _('Disable');
o.onclick = ui.createHandlerFn(s, network_updown, s.section, s.map);
o = ss.taboption('general', CBIWifiFrequencyValue, '_freq', '<br />' + _('Operating frequency'));
o = ss.taboption('general', CBIWifiFrequencyValue, '_freq', '<br />' + _('Operating frequency'), _('Some channels may be restricted to Indoor Only use by your Regulatory Domain. Make sure to follow this advice if a channel is reported as such.'));
o.ucisection = s.section;
if (hwtype == 'mac80211') {