Merge pull request #6164 from hnyman/roaming
authorHannu Nyman <hannu.nyman@iki.fi>
Thu, 22 Dec 2022 16:30:33 +0000 (18:30 +0200)
committerGitHub <noreply@github.com>
Thu, 22 Dec 2022 16:30:33 +0000 (18:30 +0200)
[RFC] luci-mod-network: place wlan roaming related options to a tab

modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js

index 367cfcc2adf0e629dece21a991a82bc0e2e6746e..16ed918724798d52b8a1f867f34d11ae7f0c1cc6 100644 (file)
@@ -987,6 +987,7 @@ return view.extend({
                                ss.tab('encryption', _('Wireless Security'));
                                ss.tab('macfilter', _('MAC-Filter'));
                                ss.tab('advanced', _('Advanced Settings'));
+                               ss.tab('roaming', _('WLAN roaming'), _('Settings for assisting wireless clients in roaming between multiple APs: 802.11r, 802.11k and 802.11v'));
 
                                o = ss.taboption('general', form.ListValue, 'mode', _('Mode'));
                                o.value('ap', _('Access Point'));
@@ -1074,41 +1075,6 @@ return view.extend({
                                            bssid = ss.children[5],
                                            encr;
 
-                                       /* 802.11v settings start */
-                                       // Probe 802.11v support (needs full hostapd/wpad) via EAP support (full hostapd has EAP)
-                                       if (L.hasSystemFeature('hostapd', 'eap'))
-                                       {
-                                               o = ss.taboption('advanced', form.ListValue, 'time_advertisement', _('Time advertisement'), _('802.11v: Time Advertisement in management frames.'));
-                                               o.value('0', _('Disabled'));
-                                               o.value('2', _('Enabled'));
-                                               o.write = function (section_id, value) {
-                                                       return this.super('write', [section_id, (value == 2) ? value: null]);
-                                               }
-
-                                               //Pull current System TZ setting
-                                               var tz = uci.get('system', '@system[0]', 'timezone');
-                                               o = ss.taboption('advanced', form.Value, 'time_zone', _('Time zone'), _('802.11v: Local Time Zone Advertisement in management frames.'));
-                                               o.value(tz);
-                                               o.rmempty = true;
-
-                                               o = ss.taboption('advanced', form.Flag, 'wnm_sleep_mode', _('WNM Sleep Mode'), _('802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode for stations).'));
-                                               o.rmempty = true;
-
-                                               /* wnm_sleep_mode_no_keys: https://git.openwrt.org/?p=openwrt/openwrt.git;a=commitdiff;h=bf98faaac8ed24cf7d3d93dd4fcd7304d109363b */
-                                               o = ss.taboption('advanced', form.Flag, 'wnm_sleep_mode_no_keys', _('WNM Sleep Mode Fixes'), _('802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents reinstallation attacks.'));
-                                               o.rmempty = true;
-
-                                               o = ss.taboption('advanced', form.Flag, 'bss_transition', _('BSS Transition'), _('802.11v: Basic Service Set (BSS) transition management.'));
-                                               o.rmempty = true;
-
-                                               /* in master, but not 21.02.1: proxy_arp */
-                                               o = ss.taboption('advanced', form.Flag, 'proxy_arp', _('ProxyARP'), _('802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer.'));
-                                               o.rmempty = true;
-
-                                               /* TODO: na_mcast_to_ucast is missing: needs adding to hostapd.sh - nice to have */
-                                       }
-                                       /* 802.11v settings end */
-
                                        mode.value('mesh', '802.11s');
                                        mode.value('ahdemo', _('Pseudo Ad-Hoc (ahdemo)'));
                                        mode.value('monitor', _('Monitor'));
@@ -1187,24 +1153,6 @@ return view.extend({
                                        o = ss.taboption('advanced', form.Flag, 'multicast_to_unicast', _('Multi To Unicast'), _('ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast to the STA MAC address. Note: This is not Directed Multicast Service (DMS) in 802.11v. Note: might break receiver STA multicast expectations.'));
                                        o.rmempty = true;
 
-                                       /* 802.11k settings start */
-                                       // Probe 802.11k support via EAP support (full hostapd has EAP)
-                                       if (L.hasSystemFeature('hostapd', 'eap')) {
-                                               o = ss.taboption('advanced', form.Flag, 'ieee80211k', _('802.11k RRM'), _('Radio Resource Measurement - Sends beacons to assist roaming. Not all clients support this.'));
-                                               // add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['psk', 'psk2', 'psk-mixed', 'sae', 'sae-mixed'] });
-                                               o.depends('mode', 'ap');
-                                               o.depends('mode', 'ap-wds');
-
-                                               o = ss.taboption('advanced', form.Flag, 'rrm_neighbor_report', _('Neighbour Report'), _('802.11k: Enable neighbor report via radio measurements.'));
-                                               o.depends({ ieee80211k: '1' });
-                                               o.default = o.enabled;
-
-                                               o = ss.taboption('advanced', form.Flag, 'rrm_beacon_report', _('Beacon Report'), _('802.11k: Enable beacon report via radio measurements.'));
-                                               o.depends({ ieee80211k: '1' });
-                                               o.default = o.enabled;
-                                       }
-                                       /* 802.11k settings end */
-
                                        o = ss.taboption('advanced', form.Flag, 'isolate', _('Isolate Clients'), _('Prevents client-to-client communication'));
                                        o.depends('mode', 'ap');
                                        o.depends('mode', 'ap-wds');
@@ -1573,66 +1521,117 @@ return view.extend({
                                        // Probe 802.11r support (and EAP support as a proxy for Openwrt)
                                        var has_80211r = L.hasSystemFeature('hostapd', '11r') || L.hasSystemFeature('hostapd', 'eap');
 
-                                       o = ss.taboption('encryption', form.Flag, 'ieee80211r', _('802.11r Fast Transition'), _('Enables fast roaming among access points that belong to the same Mobility Domain'));
+                                       o = ss.taboption('roaming', form.Flag, 'ieee80211r', _('802.11r Fast Transition'), _('Enables fast roaming among access points that belong to the same Mobility Domain'));
                                        add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] });
                                        if (has_80211r)
                                                add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['psk', 'psk2', 'psk-mixed', 'sae', 'sae-mixed'] });
                                        o.rmempty = true;
 
-                                       o = ss.taboption('encryption', form.Value, 'nasid', _('NAS ID'), _('Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not needed with normal WPA(2)-PSK.'));
+                                       o = ss.taboption('roaming', form.Value, 'nasid', _('NAS ID'), _('Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not needed with normal WPA(2)-PSK.'));
                                        add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] });
                                        o.depends({ ieee80211r: '1' });
                                        o.rmempty = true;
 
-                                       o = ss.taboption('encryption', form.Value, 'mobility_domain', _('Mobility Domain'), _('4-character hexadecimal ID'));
+                                       o = ss.taboption('roaming', form.Value, 'mobility_domain', _('Mobility Domain'), _('4-character hexadecimal ID'));
                                        o.depends({ ieee80211r: '1' });
                                        o.placeholder = '4f57';
                                        o.datatype = 'and(hexstring,length(4))';
                                        o.rmempty = true;
 
-                                       o = ss.taboption('encryption', form.Value, 'reassociation_deadline', _('Reassociation Deadline'), _('time units (TUs / 1.024 ms) [1000-65535]'));
+                                       o = ss.taboption('roaming', form.Value, 'reassociation_deadline', _('Reassociation Deadline'), _('time units (TUs / 1.024 ms) [1000-65535]'));
                                        o.depends({ ieee80211r: '1' });
                                        o.placeholder = '1000';
                                        o.datatype = 'range(1000,65535)';
                                        o.rmempty = true;
 
-                                       o = ss.taboption('encryption', form.ListValue, 'ft_over_ds', _('FT protocol'));
+                                       o = ss.taboption('roaming', form.ListValue, 'ft_over_ds', _('FT protocol'));
                                        o.depends({ ieee80211r: '1' });
                                        o.value('0', _('FT over the Air'));
                                        o.value('1', _('FT over DS'));
                                        o.rmempty = true;
 
-                                       o = ss.taboption('encryption', form.Flag, 'ft_psk_generate_local', _('Generate PMK locally'), _('When using a PSK, the PMK can be automatically generated. When enabled, the R0/R1 key options below are not applied. Disable this to use the R0 and R1 key options.'));
+                                       o = ss.taboption('roaming', form.Flag, 'ft_psk_generate_local', _('Generate PMK locally'), _('When using a PSK, the PMK can be automatically generated. When enabled, the R0/R1 key options below are not applied. Disable this to use the R0 and R1 key options.'));
                                        o.depends({ ieee80211r: '1' });
                                        o.default = o.enabled;
                                        o.rmempty = false;
 
-                                       o = ss.taboption('encryption', form.Value, 'r0_key_lifetime', _('R0 Key Lifetime'), _('minutes'));
+                                       o = ss.taboption('roaming', form.Value, 'r0_key_lifetime', _('R0 Key Lifetime'), _('minutes'));
                                        o.depends({ ieee80211r: '1' });
                                        o.placeholder = '10000';
                                        o.datatype = 'uinteger';
                                        o.rmempty = true;
 
-                                       o = ss.taboption('encryption', form.Value, 'r1_key_holder', _('R1 Key Holder'), _('6-octet identifier as a hex string - no colons'));
+                                       o = ss.taboption('roaming', form.Value, 'r1_key_holder', _('R1 Key Holder'), _('6-octet identifier as a hex string - no colons'));
                                        o.depends({ ieee80211r: '1' });
                                        o.placeholder = '00004f577274';
                                        o.datatype = 'and(hexstring,length(12))';
                                        o.rmempty = true;
 
-                                       o = ss.taboption('encryption', form.Flag, 'pmk_r1_push', _('PMK R1 Push'));
+                                       o = ss.taboption('roaming', form.Flag, 'pmk_r1_push', _('PMK R1 Push'));
                                        o.depends({ ieee80211r: '1' });
                                        o.placeholder = '0';
                                        o.rmempty = true;
 
-                                       o = ss.taboption('encryption', form.DynamicList, 'r0kh', _('External R0 Key Holder List'), _('List of R0KHs in the same Mobility Domain. <br />Format: MAC-address,NAS-Identifier,128-bit key as hex string. <br />This list is used to map R0KH-ID (NAS Identifier) to a destination MAC address when requesting PMK-R1 key from the R0KH that the STA used during the Initial Mobility Domain Association.'));
+                                       o = ss.taboption('roaming', form.DynamicList, 'r0kh', _('External R0 Key Holder List'), _('List of R0KHs in the same Mobility Domain. <br />Format: MAC-address,NAS-Identifier,128-bit key as hex string. <br />This list is used to map R0KH-ID (NAS Identifier) to a destination MAC address when requesting PMK-R1 key from the R0KH that the STA used during the Initial Mobility Domain Association.'));
                                        o.depends({ ieee80211r: '1' });
                                        o.rmempty = true;
 
-                                       o = ss.taboption('encryption', form.DynamicList, 'r1kh', _('External R1 Key Holder List'), _ ('List of R1KHs in the same Mobility Domain. <br />Format: MAC-address,R1KH-ID as 6 octets with colons,128-bit key as hex string. <br />This list is used to map R1KH-ID to a destination MAC address when sending PMK-R1 key from the R0KH. This is also the list of authorized R1KHs in the MD that can request PMK-R1 keys.'));
+                                       o = ss.taboption('roaming', form.DynamicList, 'r1kh', _('External R1 Key Holder List'), _ ('List of R1KHs in the same Mobility Domain. <br />Format: MAC-address,R1KH-ID as 6 octets with colons,128-bit key as hex string. <br />This list is used to map R1KH-ID to a destination MAC address when sending PMK-R1 key from the R0KH. This is also the list of authorized R1KHs in the MD that can request PMK-R1 keys.'));
                                        o.depends({ ieee80211r: '1' });
                                        o.rmempty = true;
                                        // End of 802.11r options
 
+                                       // Probe 802.11k and 802.11v support via EAP support (full hostapd has EAP)
+                                       if (L.hasSystemFeature('hostapd', 'eap')) {
+                                               /* 802.11k settings start */                                            o =
+                                                ss.taboption('roaming', form.Flag, 'ieee80211k', _('802.11k RRM'), _('Radio Resource Measurement - Sends beacons to assist roaming. Not all clients support this.'));
+                                               // add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['psk', 'psk2', 'psk-mixed', 'sae', 'sae-mixed'] });
+                                               o.depends('mode', 'ap');
+                                               o.depends('mode', 'ap-wds');
+
+                                               o = ss.taboption('roaming', form.Flag, 'rrm_neighbor_report', _('Neighbour Report'), _('802.11k: Enable neighbor report via radio measurements.'));
+                                               o.depends({ ieee80211k: '1' });
+                                               o.default = o.enabled;
+
+                                               o = ss.taboption('roaming', form.Flag, 'rrm_beacon_report', _('Beacon Report'), _('802.11k: Enable beacon report via radio measurements.'));
+                                               o.depends({ ieee80211k: '1' });
+                                               o.default = o.enabled;
+                                               /* 802.11k settings end */
+
+                                               /* 802.11v settings start */
+                                               o = ss.taboption('roaming', form.ListValue, 'time_advertisement', _('Time advertisement'), _('802.11v: Time Advertisement in management frames.'));
+                                               o.value('0', _('Disabled'));
+                                               o.value('2', _('Enabled'));
+                                               o.write = function (section_id, value) {
+                                                       return this.super('write', [section_id, (value == 2) ? value: null]);
+                                               }
+
+                                               //Pull current System TZ setting
+                                               var tz = uci.get('system', '@system[0]', 'timezone');
+                                               o = ss.taboption('roaming', form.Value, 'time_zone', _('Time zone'), _('802.11v: Local Time Zone Advertisement in management frames.'));
+                                               o.value(tz);
+                                               o.rmempty = true;
+
+                                               o = ss.taboption('roaming', form.Flag, 'wnm_sleep_mode', _('WNM Sleep Mode'), _('802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode for stations).'));
+                                               o.rmempty = true;
+
+                                               /* wnm_sleep_mode_no_keys: https://git.openwrt.org/?p=openwrt/openwrt.git;a=commitdiff;h=bf98faaac8ed24cf7d3d93dd4fcd7304d109363b */
+                                               o = ss.taboption('roaming', form.Flag, 'wnm_sleep_mode_no_keys', _('WNM Sleep Mode Fixes'), _('802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents reinstallation attacks.'));
+                                               o.rmempty = true;
+
+                                               o = ss.taboption('roaming', form.Flag, 'bss_transition', _('BSS Transition'), _('802.11v: Basic Service Set (BSS) transition management.'));
+                                               o.rmempty = true;
+
+                                               /* in master, but not 21.02.1: proxy_arp */
+                                               o = ss.taboption('roaming', form.Flag, 'proxy_arp', _('ProxyARP'), _('802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer.'));
+                                               o.rmempty = true;
+
+                                               /* TODO: na_mcast_to_ucast is missing: needs adding to hostapd.sh - nice to have */
+                                       }
+                                       /* 802.11v settings end */
+                               }
+
+                               if (hwtype == 'mac80211') {
                                        o = ss.taboption('encryption', form.ListValue, 'eap_type', _('EAP-Method'));
                                        o.value('tls',  'TLS');
                                        o.value('ttls', 'TTLS');