public inbox for ipfire-scm@lists.ipfire.org
 help / color / mirror / Atom feed
* [git.ipfire.org] IPFire 2.x development tree branch, next, updated. 884303944bdba5030b2efedb455d0f64f0cf882e
@ 2026-10-29 18:02 Michael Tremer
  0 siblings, 0 replies; only message in thread
From: Michael Tremer @ 2026-10-29 18:02 UTC (permalink / raw)
  To: ipfire-scm

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 79168 bytes --]

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "IPFire 2.x development tree".

The branch, next has been updated
       via  884303944bdba5030b2efedb455d0f64f0cf882e (commit)
       via  c09ea7888433f9577bb8b94b26dbe5ab9d4e4efd (commit)
       via  5c2664c3da3be13d3771d3d71343c85c60506c6b (commit)
       via  2dc199cb00afafa107fede29c98a437150272a1d (commit)
       via  1288367f32915c6184f795ea91b9b49862576e1e (commit)
       via  3d0d96bc8689cc46b4a731ec29bb875866a4d0d5 (commit)
       via  e9a4ef71447bae3e8480aac59461fa7e3476bcb0 (commit)
       via  2caaa2f4301e1e910ecee866d6cedcb2861daf6a (commit)
       via  31d7a127fde52078eb4ea949b1ebd37f56a2c682 (commit)
       via  e9cf0b6b4e42c49862709f69f66c33a56e8d366a (commit)
       via  8cc2267e0de4a66003a54ef278554693aefae355 (commit)
       via  1f41d52be4dd67beab452af0fdd648c2d80e6375 (commit)
       via  929483c9b79ceb2cf85b600b2edfb6cbf78ff695 (commit)
       via  e624817b7c5fd27e378cbcf20ce4dbc468ec3e67 (commit)
       via  5c6f2f086e389a41abbebcea5f30f9f8791925d0 (commit)
       via  3b754012092921a041c6ad0e871b6a6232d913f0 (commit)
      from  d2b105cfc992bc29c7656873a108c22342a8dd26 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 884303944bdba5030b2efedb455d0f64f0cf882e
Merge: d2b105cfc c09ea7888
Author: Michael Tremer <michael.tremer@ipfire.org>
Date:   Thu Oct 29 18:01:22 2026 +0000

    Merge branch 'hostapd-fixes' into next

commit c09ea7888433f9577bb8b94b26dbe5ab9d4e4efd
Author: Michael Tremer <michael.tremer@ipfire.org>
Date:   Thu Oct 29 17:56:25 2026 +0000

    po: Update German translation
    
    Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>

commit 5c2664c3da3be13d3771d3d71343c85c60506c6b
Author: Michael Tremer <michael.tremer@ipfire.org>
Date:   Thu Oct 29 17:56:00 2026 +0000

    po: Update from sources
    
    Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>

commit 2dc199cb00afafa107fede29c98a437150272a1d
Author: Michael Tremer <michael.tremer@ipfire.org>
Date:   Thu Oct 29 17:41:08 2026 +0000

    hostapd: Add support for Opportunistic Wireless Encryption (OWE)
    
    OWE (also known as Enhanced Open) encrypts the traffic of open networks
    without requiring a passphrase. It requires Management Frame Protection
    and can also be used in the 6 GHz band.
    
    Clients that do not support OWE cannot connect as transition mode is not
    supported, yet.
    
    The passphrase is now also validated if it is not used as it is always
    stored.
    
    Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>

commit 1288367f32915c6184f795ea91b9b49862576e1e
Author: Michael Tremer <michael.tremer@ipfire.org>
Date:   Thu Oct 29 17:31:34 2026 +0000

    hostapd: Remove the unused configuration template and ACL files
    
    The configuration is generated by the initscript, so the template (with
    its default passphrase) was only copied around and then overwritten. The
    MAC address lists were never used.
    
    The generated configuration is now removed when the add-on is
    uninstalled as it contains the passphrase.
    
    Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>

commit 3d0d96bc8689cc46b4a731ec29bb875866a4d0d5
Author: Michael Tremer <michael.tremer@ipfire.org>
Date:   Thu Oct 29 17:31:10 2026 +0000

    wlanap.cgi: Allow to disconnect clients
    
    Fixes: #14735
    Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>

commit e9a4ef71447bae3e8480aac59461fa7e3476bcb0
Author: Michael Tremer <michael.tremer@ipfire.org>
Date:   Thu Oct 29 16:59:04 2026 +0000

    hostapd: Enforce the requirements of WPA3 and the 6 GHz band
    
    WPA3 requires Management Frame Protection, which is now enforced for
    WPA3 and at least enabled for WPA2+3 where WPA3 clients must use it.
    SAE uses both, Hash-to-Element and Hunting-and-Pecking.
    
    The web user interface now checks that the 6 GHz band uses WPA3 and
    IEEE 802.11ax or newer, and that the selected mode is available in the
    selected band.
    
    Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>

commit 2caaa2f4301e1e910ecee866d6cedcb2861daf6a
Author: Michael Tremer <michael.tremer@ipfire.org>
Date:   Thu Oct 29 16:56:45 2026 +0000

    hostapd: Drop support for WPA1
    
    WPA1 and TKIP are deprecated and hostapd disables 802.11n and newer
    when TKIP is the only cipher. Any existing WPA1 and WPA1+2 configuration
    falls back to WPA2.
    
    Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>

commit 31d7a127fde52078eb4ea949b1ebd37f56a2c682
Author: Michael Tremer <michael.tremer@ipfire.org>
Date:   Thu Oct 29 16:55:56 2026 +0000

    hostapd: Make the transmit power setting work
    
    The setting was stored under a different name than the form field
    and was never applied. It is now used as a limit (in dBm) which never
    exceeds the limit of the regulatory domain.
    
    Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>

commit e9cf0b6b4e42c49862709f69f66c33a56e8d366a
Author: Michael Tremer <michael.tremer@ipfire.org>
Date:   Thu Oct 29 16:46:11 2026 +0000

    hostapd: Only accept numeric channels
    
    The channel is used in shell arithmetic which would evaluate anything
    that is stored in the settings file.
    
    Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>

commit 8cc2267e0de4a66003a54ef278554693aefae355
Author: Michael Tremer <michael.tremer@ipfire.org>
Date:   Thu Oct 29 16:46:11 2026 +0000

    wlanap.cgi: Validate all settings before saving them
    
    Unvalidated values were written to the settings file which were then
    used to generate the hostapd configuration (as root). A newline in the
    SSID or passphrase could inject arbitrary configuration and the channel
    was used in shell arithmetic.
    
    This also migrates the old 802.11an mode to the 5 GHz band.
    
    Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>

commit 1f41d52be4dd67beab452af0fdd648c2d80e6375
Author: Michael Tremer <michael.tremer@ipfire.org>
Date:   Thu Oct 29 16:45:43 2026 +0000

    hostapd: Only enable OCE in AP mode
    
    oce=7 also set a reserved bit and enabled STA-CFON mode which is meant
    for stations that act as an access point.
    
    Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>

commit 929483c9b79ceb2cf85b600b2edfb6cbf78ff695
Author: Michael Tremer <michael.tremer@ipfire.org>
Date:   Thu Oct 29 16:45:43 2026 +0000

    hostapd: Fix detecting HE/EHT beamforming capabilities
    
    iw prints the HE/EHT PHY capabilities byte by byte which does not
    match the bit masks that we used. The HE PHY capabilities are also
    longer than 64 bits and overflowed the shell arithmetic. Therefore the
    wrong bits have been checked.
    
    We now use the decoded names that iw prints and only consider the
    capabilities that apply to the access point interface type. Anything
    that was found for a previous band is now being reset, too.
    
    Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>

commit e624817b7c5fd27e378cbcf20ce4dbc468ec3e67
Author: Michael Tremer <michael.tremer@ipfire.org>
Date:   Thu Oct 29 16:44:59 2026 +0000

    hostapd: Read all bits of the VHT capability fields
    
    RX STBC, the compressed steering number, the sounding dimension and the
    A-MPDU length exponent are three bits wide, but only two bits were read.
    Chips that support more than four beamforming antennas are now capped at
    four as this is the maximum hostapd knows.
    
    Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>

commit 5c6f2f086e389a41abbebcea5f30f9f8791925d0
Author: Michael Tremer <michael.tremer@ipfire.org>
Date:   Thu Oct 29 16:44:47 2026 +0000

    hostapd: Actually write the antenna pattern settings
    
    These were assigned to shell variables instead of being written to the
    configuration.
    
    Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>

commit 3b754012092921a041c6ad0e871b6a6232d913f0
Author: Michael Tremer <michael.tremer@ipfire.org>
Date:   Thu Oct 29 16:44:42 2026 +0000

    hostapd: Fix setting the default band
    
    The default was written to a variable that was never used again, so
    that no hw_mode was set and the capabilities of the wrong band could
    have been used.
    
    Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>

-----------------------------------------------------------------------

Summary of changes:
 config/backup/includes/hostapd    |   3 -
 config/hostapd/config             |   3 +-
 config/hostapd/hostapd.conf       |  23 -----
 config/rootfiles/packages/hostapd |   6 --
 html/cgi-bin/wlanap.cgi           | 116 +++++++++++++++++++---
 lfs/hostapd                       |   4 -
 po/de.po                          |  80 +++++++++++++--
 po/es.po                          |  77 +++++++++++++--
 po/fr.po                          |  77 +++++++++++++--
 po/ipfire.pot                     |  75 ++++++++++++--
 po/it.po                          |  74 ++++++++++++--
 po/nl.po                          |  74 ++++++++++++--
 po/pl.po                          |  74 ++++++++++++--
 po/ru.po                          |  74 ++++++++++++--
 po/tr.po                          |  74 ++++++++++++--
 po/zh_CN.po                       |  77 +++++++++++++--
 po/zh_TW.po                       |  77 +++++++++++++--
 src/initscripts/packages/hostapd  | 202 ++++++++++++++++++++++----------------
 src/misc-progs/wlanapctrl.c       |  29 +++++-
 src/paks/hostapd/install.sh       |   7 ++
 src/paks/hostapd/uninstall.sh     |   3 +
 21 files changed, 1017 insertions(+), 212 deletions(-)
 delete mode 100644 config/hostapd/hostapd.conf

Difference in files:
diff --git a/config/backup/includes/hostapd b/config/backup/includes/hostapd
index 0e9b9fb7d0..c92e455626 100644
--- a/config/backup/includes/hostapd
+++ b/config/backup/includes/hostapd
@@ -1,4 +1 @@
-/etc/hostapd.conf
-/var/ipfire/wlanap/macfile
 /var/ipfire/wlanap/settings
-/var/ipfire/wlanap/hostapd.conf
diff --git a/config/hostapd/config b/config/hostapd/config
index 7bda725a77..dec4e5f163 100644
--- a/config/hostapd/config
+++ b/config/hostapd/config
@@ -384,8 +384,7 @@ CONFIG_FILS_SK_PFS=y
 CONFIG_WPA_CLI_EDIT=y
 
 # Opportunistic Wireless Encryption (OWE)
-# Experimental implementation of draft-harkins-owe-07.txt
-#CONFIG_OWE=y
+CONFIG_OWE=y
 
 # Airtime policy support
 CONFIG_AIRTIME_POLICY=y
diff --git a/config/hostapd/hostapd.conf b/config/hostapd/hostapd.conf
deleted file mode 100644
index 33fd30411b..0000000000
--- a/config/hostapd/hostapd.conf
+++ /dev/null
@@ -1,23 +0,0 @@
-driver=nl80211
-######################### basic hostapd configuration ##########################
-#
-interface=blue0
-hw_mode=g
-channel=6
-logger_syslog=-1
-logger_syslog_level=3
-logger_stdout=-1
-logger_stdout_level=4
-dump_file=/tmp/hostapd.dump
-auth_algs=3
-ctrl_interface=/var/run/hostapd
-ctrl_interface_group=0
-macaddr_acl=0
-ssid=IPFire
-ignore_broadcast_ssid=0
-######################### wpa hostapd configuration ############################
-#
-wpa=2
-wpa_passphrase=IPFire-2.x
-wpa_key_mgmt=WPA-PSK
-wpa_pairwise=CCMP TKIP
diff --git a/config/rootfiles/packages/hostapd b/config/rootfiles/packages/hostapd
index 78c9c82644..602527f50e 100644
--- a/config/rootfiles/packages/hostapd
+++ b/config/rootfiles/packages/hostapd
@@ -1,6 +1,3 @@
-etc/hostapd.accept
-etc/hostapd.conf
-etc/hostapd.deny
 usr/bin/hostapd
 usr/bin/hostapd_cli
 #usr/include/linux/genetlink.h
@@ -8,9 +5,6 @@ usr/bin/hostapd_cli
 #usr/include/linux/netfilter/nfnetlink_compat.h
 var/ipfire/backup/addons/includes/hostapd
 #var/ipfire/wlanap
-var/ipfire/wlanap/hostapd.accept
-var/ipfire/wlanap/hostapd.conf
-var/ipfire/wlanap/hostapd.deny
 var/ipfire/wlanap/settings
 srv/web/ipfire/cgi-bin/wlanap.cgi
 var/ipfire/menu.d/EX-wlanap.menu
diff --git a/html/cgi-bin/wlanap.cgi b/html/cgi-bin/wlanap.cgi
index a5c25bb351..128791b2d9 100644
--- a/html/cgi-bin/wlanap.cgi
+++ b/html/cgi-bin/wlanap.cgi
@@ -43,7 +43,10 @@ unless (defined $wlanapsettings{'MODE'}) {
 	if ($wlanapsettings{'HW_MODE'} eq "ac") {
 		$wlanapsettings{'BAND'} = '5g';
 		$wlanapsettings{'MODE'} = "VHT20";
-	} elsif ($wlanapsettings{'HW_MODE'} eq "an" || $wlanapsettings{'HW_MODE'} eq "gn") {
+	} elsif ($wlanapsettings{'HW_MODE'} eq "an") {
+		$wlanapsettings{'BAND'} = '5g';
+		$wlanapsettings{'MODE'} = "HT20";
+	} elsif ($wlanapsettings{'HW_MODE'} eq "gn") {
 		$wlanapsettings{'BAND'} = '2g';
 		$wlanapsettings{'MODE'} = "HT20";
 	}
@@ -52,6 +55,11 @@ unless (defined $wlanapsettings{'MODE'}) {
 	undef $wlanapsettings{'HW_MODE'};
 }
 
+# WPA1 is no longer supported
+if ($wlanapsettings{'ENC'} eq "wpa1" || $wlanapsettings{'ENC'} eq "wpa1+2") {
+	$wlanapsettings{'ENC'} = "wpa2";
+}
+
 # Set defaults
 &General::set_defaults(\%wlanapsettings, {
 	"APMODE" => "on",
@@ -112,17 +120,17 @@ if ($station =~ m/^[0-9a-f]{12}$/) {
 }
 
 if ($cgiparams{'ACTION'} eq _('Save')) {
-	# verify WPA Passphrase - only with enabled enc
-	if ($cgiparams{'ENC'} ne "none") {
+	# verify WPA Passphrase - only if one is being used
+	if ($cgiparams{'ENC'} ne "none" && $cgiparams{'ENC'} ne "owe") {
 		# must be 8 .. 63 characters
 		if ((length($cgiparams{'PWD'}) < 8) || (length($cgiparams{'PWD'}) > 63)) {
 			$errormessage .= "@{[ _('Invalid length in WPA passphrase. Must be between 8 and 63 characters.') ]}<br />";
 		}
+	}
 
-		# only ASCII alowed
-		if (!($cgiparams{'PWD'} !~ /[^\x00-\x7f]/)) {
-			$errormessage .= "@{[ _('Invalid length in WPA passphrase. Must be between 8 and 63 characters.') ]}<br />";
-		}
+	# only printable ASCII alowed (the passphrase is stored even if not used)
+	if ($cgiparams{'PWD'} =~ /[^\x20-\x7e]/) {
+		$errormessage .= "@{[ _('Invalid length in WPA passphrase. Must be between 8 and 63 characters.') ]}<br />";
 	}
 
 	# Validate BAND
@@ -135,7 +143,72 @@ if ($cgiparams{'ACTION'} eq _('Save')) {
 		$errormessage .= "@{[ _('Invalid Mode') ]}<br />";
 	}
 
-	# XXX This needs validation
+	# Validate INTERFACE
+	unless ($cgiparams{'INTERFACE'} =~ m/^[0-9a-f]{2}(:[0-9a-f]{2}){5}$/) {
+		$errormessage .= "@{[ _('Invalid Interface') ]}<br />";
+	}
+
+	# Validate SSID (1-32 bytes without any control characters)
+	my $ssid = $cgiparams{'SSID'} // "";
+	utf8::encode($ssid) if (utf8::is_utf8($ssid));
+
+	if ((length($ssid) < 1) || (length($ssid) > 32) || ($cgiparams{'SSID'} =~ /[\x00-\x1f\x7f]/)) {
+		$errormessage .= "@{[ _('Invalid SSID') ]}<br />";
+	}
+
+	# Validate COUNTRY
+	unless ($cgiparams{'COUNTRY'} =~ m/^[A-Z0-9]{2}$/) {
+		$errormessage .= "@{[ _('Invalid Country Code') ]}<br />";
+	}
+
+	# Validate CHANNEL
+	unless ($cgiparams{'CHANNEL'} =~ m/^\d{1,3}$/) {
+		$errormessage .= "@{[ _('Invalid Channel') ]}<br />";
+	}
+
+	# Validate TXPOWER (either automatic or a limit in dBm)
+	$cgiparams{'TXPOWER'} = "auto" if (($cgiparams{'TXPOWER'} // "") eq "");
+
+	unless ($cgiparams{'TXPOWER'} eq "auto" || ($cgiparams{'TXPOWER'} =~ m/^\d{1,2}$/ && $cgiparams{'TXPOWER'} >= 1 && $cgiparams{'TXPOWER'} <= 36)) {
+		$errormessage .= "@{[ _('Invalid Tx Power') ]}<br />";
+	}
+
+	# Validate ENC
+	unless ($cgiparams{'ENC'} =~ m/^(none|owe|wpa2|wpa3|wpa2\+3)$/) {
+		$errormessage .= "@{[ _('Invalid Encryption') ]}<br />";
+	}
+
+	# WPA3 and OWE require Management Frame Protection
+	if ($cgiparams{'ENC'} eq "wpa3" && $cgiparams{'IEEE80211W'} ne "on") {
+		$errormessage .= "@{[ _('WPA3 requires Management Frame Protection to be enforced') ]}<br />";
+	} elsif ($cgiparams{'ENC'} eq "owe" && $cgiparams{'IEEE80211W'} ne "on") {
+		$errormessage .= "@{[ _('OWE requires Management Frame Protection to be enforced') ]}<br />";
+	} elsif ($cgiparams{'ENC'} eq "wpa2+3" && $cgiparams{'IEEE80211W'} ne "on" && $cgiparams{'IEEE80211W'} ne "optional") {
+		$errormessage .= "@{[ _('WPA2+3 requires Management Frame Protection to be enabled') ]}<br />";
+	}
+
+	# The 6 GHz band only permits WPA3 and OWE
+	if ($cgiparams{'BAND'} eq "6g" && $cgiparams{'ENC'} ne "wpa3" && $cgiparams{'ENC'} ne "owe") {
+		$errormessage .= "@{[ _('The 6 GHz band requires WPA3 or OWE') ]}<br />";
+	}
+
+	# Check that the mode can be used in the selected band
+	if ($cgiparams{'BAND'} eq "6g") {
+		unless ($cgiparams{'MODE'} =~ m/^(HE|EHT)/) {
+			$errormessage .= "@{[ _('The 6 GHz band requires IEEE 802.11ax or newer') ]}<br />";
+		}
+	} elsif ($cgiparams{'BAND'} eq "5g") {
+		if ($cgiparams{'MODE'} eq "EHT320") {
+			$errormessage .= "@{[ _('320 MHz channels are only available in the 6 GHz band') ]}<br />";
+		}
+	} elsif ($cgiparams{'BAND'} eq "2g") {
+		if ($cgiparams{'MODE'} =~ m/^VHT/) {
+			$errormessage .= "@{[ _('IEEE 802.11ac is not available in the 2.4 GHz band') ]}<br />";
+		} elsif ($cgiparams{'MODE'} =~ m/(80|160|320)$/) {
+			$errormessage .= "@{[ _('The 2.4 GHz band only supports channels of up to 40 MHz') ]}<br />";
+		}
+	}
+
 	$wlanapsettings{'INTERFACE'} = $cgiparams{'INTERFACE'};
 	$wlanapsettings{'SSID'} = $cgiparams{'SSID'};
 	$wlanapsettings{'HIDESSID'} = ($cgiparams{'HIDESSID'} eq 'on') ? 'on' : 'off';
@@ -149,7 +222,10 @@ if ($cgiparams{'ACTION'} eq _('Save')) {
 	$wlanapsettings{'ENC'} = $cgiparams{'ENC'};
 	$wlanapsettings{'PWD'} = $cgiparams{'PWD'};
 	$wlanapsettings{'IEEE80211W'} = ($cgiparams{'IEEE80211W'} eq 'on' || $cgiparams{'IEEE80211W'} eq 'optional') ? $cgiparams{'IEEE80211W'} : 'off';
-	$wlanapsettings{'TX_POWER'} = $cgiparams{'TX_POWER'};
+	$wlanapsettings{'TXPOWER'} = $cgiparams{'TXPOWER'};
+
+	# This was stored under the wrong name before
+	delete $wlanapsettings{'TX_POWER'};
 
 	if ($errormessage eq '') {
 		&General::writehash("/var/ipfire/wlanap/settings", \%wlanapsettings);
@@ -164,6 +240,12 @@ if ($cgiparams{'ACTION'} eq _('Save')) {
 # Stop
 } elsif ($cgiparams{'ACTION'} eq _('Stop')) {
 	&General::system("/usr/local/bin/wlanapctrl", "stop");
+
+# Disconnect a client
+} elsif ($cgiparams{'ACTION'} eq _('Disconnect')) {
+	if ($cgiparams{'ADDRESS'} =~ m/^[0-9a-f]{2}(:[0-9a-f]{2}){5}$/) {
+		&General::system("/usr/local/bin/wlanapctrl", "disconnect", $cgiparams{'ADDRESS'});
+	}
 }
 
 &Header::openpage(_('Wireless Access Point Configuration'), 1, '', '');
@@ -207,7 +289,6 @@ $selected{'IEEE80211W'}{$wlanapsettings{'IEEE80211W'}} = "selected";
 $selected{'ENC'}{$wlanapsettings{'ENC'}} = "selected='selected'";
 $selected{'CHANNEL'}{$wlanapsettings{'CHANNEL'}} = "selected='selected'";
 $selected{'COUNTRY'}{$wlanapsettings{'COUNTRY'}} = "selected='selected'";
-$selected{'TXPOWER'}{$wlanapsettings{'TXPOWER'}} = "selected='selected'";
 
 $selected{'MODE'}{$wlanapsettings{'MODE'}} = "selected";
 $selected{'BAND'}{$wlanapsettings{'BAND'}} = "selected";
@@ -433,10 +514,9 @@ print <<END;
 				<td>
 					<select name='ENC'>
 						<option value='none' $selected{'ENC'}{'none'}>@{[ _('None') ]}</option>
-						<option value='wpa1' $selected{'ENC'}{'wpa1'}>WPA1</option>
+						<option value='owe' $selected{'ENC'}{'owe'}>@{[ _('Enhanced Open (OWE)') ]}</option>
 						<option value='wpa2' $selected{'ENC'}{'wpa2'}>WPA2</option>
 						<option value='wpa3' $selected{'ENC'}{'wpa3'}>WPA3</option>
-						<option value='wpa1+2' $selected{'ENC'}{'wpa1+2'}>WPA1+2</option>
 						<option value='wpa2+3' $selected{'ENC'}{'wpa2+3'}>WPA2+3</option>
 					</select>
 				</td>
@@ -467,9 +547,10 @@ print <<END;
 			</tr>
 
 			<tr>
-				<td>Tx Power</td>
+				<td>@{[ _('Tx Power') ]}</td>
 				<td>
-					<input type='text' name='TXPOWER' value='$wlanapsettings{'TXPOWER'}' />
+					<input type='text' name='TXPOWER' value='@{[ &Header::escape($wlanapsettings{'TXPOWER'}) ]}' placeholder="auto" />
+					dBm
 				</td>
 			</tr>
 
@@ -563,6 +644,7 @@ END
 					<th>@{[ _('Connected') ]}</th>
 					<th>@{[ _('Features') ]}</th>
 					<th></th>
+					<th></th>
 				</tr>
 END
 
@@ -656,6 +738,12 @@ END
 					<td class="text-center">$connected</td>
 					<td>@features</td>
 					<td class="text-center">$graph</td>
+					<td class="text-center">
+						<form method="post" action="$ENV{'SCRIPT_NAME'}">
+							<input type="hidden" name="ADDRESS" value="$address">
+							<input type="submit" name="ACTION" value="@{[ _('Disconnect') ]}">
+						</form>
+					</td>
 				</tr>
 END
 		}
diff --git a/lfs/hostapd b/lfs/hostapd
index 5dc719b3a4..c840e1e90e 100644
--- a/lfs/hostapd
+++ b/lfs/hostapd
@@ -93,10 +93,6 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
 	$(call INSTALL_INITSCRIPTS,$(SERVICES))
 	mkdir -p /var/ipfire/wlanap
 	touch /var/ipfire/wlanap/settings
-	cp -vrf $(DIR_SRC)/config/hostapd/hostapd.conf /var/ipfire/wlanap/hostapd.conf
-	touch /var/ipfire/wlanap/hostapd.accept
-	touch /var/ipfire/wlanap/hostapd.deny
-	cp -vrf /var/ipfire/wlanap/hostapd.* /etc/
 	chown nobody:nobody /var/ipfire/wlanap/*
 	chmod 644 /var/ipfire/wlanap/*
 	@rm -rf $(DIR_APP)
diff --git a/po/de.po b/po/de.po
index 8feed87a0d..cb94e16587 100644
--- a/po/de.po
+++ b/po/de.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: IPFire\n"
 "Report-Msgid-Bugs-To: https://bugzilla.ipfire.org/\n"
-"POT-Creation-Date: 2026-10-24 15:28+0000\n"
+"POT-Creation-Date: 2026-10-29 17:55+0000\n"
 "Language-Team: German\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
@@ -931,8 +931,8 @@ msgstr "Externer IP-Alias entfernt"
 msgid "Interface:"
 msgstr "Schnittstelle:"
 
-#: html/cgi-bin/aliases.cgi html/cgi-bin/hosts.cgi html/cgi-bin/pppsetup.cgi
-#: html/cgi-bin/wio.cgi
+#: html/cgi-bin/aliases.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Invalid hostname."
 msgstr "Ungültiger Hostname."
 
@@ -1299,7 +1299,9 @@ msgstr "Bitte geben Sie einen Gutscheincode ein"
 
 #: html/cgi-bin/captive/index.cgi
 msgid "You entered an invalid coupon code. Please try again."
-msgstr "Sie haben einen ungültigen Gutscheincode eingegeben. Bitte versuchen Sie es erneut."
+msgstr ""
+"Sie haben einen ungültigen Gutscheincode eingegeben. Bitte versuchen Sie es "
+"erneut."
 
 #: html/cgi-bin/chpasswd.cgi
 msgid "C h a n g e &nbsp; w e b &nbsp; a c c e s s &nbsp; p a s s w o r d"
@@ -1440,6 +1442,7 @@ msgid "Days:"
 msgstr "Tage:"
 
 #: html/cgi-bin/connscheduler.cgi html/cgi-bin/index.cgi
+#: html/cgi-bin/wlanap.cgi
 msgid "Disconnect"
 msgstr "Trennen"
 
@@ -1614,8 +1617,8 @@ msgstr ""
 msgid "Hostname not set."
 msgstr "Hostname nicht eingegeben."
 
-#: html/cgi-bin/ddns.cgi html/cgi-bin/hosts.cgi html/cgi-bin/index.cgi
-#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
+#: html/cgi-bin/ddns.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/index.cgi html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Hostname:"
 msgstr "Hostname:"
 
@@ -2867,7 +2870,7 @@ msgstr "IPsec-Netzwerk"
 msgid "Incoming Firewall Access:"
 msgstr "Eingehender Firewallzugang:"
 
-#: html/cgi-bin/fwhosts.cgi
+#: html/cgi-bin/fwhosts.cgi html/cgi-bin/wlanap.cgi
 msgid "Invalid Country Code"
 msgstr "Ungültiger Ländercode"
 
@@ -5939,7 +5942,9 @@ msgstr "Es wurde keine Datei hochgeladen"
 #: html/cgi-bin/ovpnmain.cgi
 msgid ""
 "This cipher is being used by clients that do not support cipher negotiation."
-msgstr "Diese Chiffre wird von Clients verwendet, die keine Aushandlung der Chiffre unterstützen."
+msgstr ""
+"Diese Chiffre wird von Clients verwendet, die keine Aushandlung der Chiffre "
+"unterstützen."
 
 #: html/cgi-bin/ovpnmain.cgi html/cgi-bin/vpnmain.cgi
 msgid ""
@@ -10435,6 +10440,10 @@ msgstr "%d Stream(s)"
 msgid "2.4 GHz"
 msgstr "2.4 GHz"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "320 MHz channels are only available in the 6 GHz band"
+msgstr "320-MHz-Kanäle sind nur im 6-GHz-Band verfügbar"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "5 GHz"
 msgstr "5 GHz"
@@ -10479,6 +10488,10 @@ msgstr "Ländercode"
 msgid "Enforced"
 msgstr "Erzwungen"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "Enhanced Open (OWE)"
+msgstr "Enhanced Open (OWE)"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Features"
 msgstr "Funktionen"
@@ -10511,6 +10524,10 @@ msgstr "IEEE 802.11ac @ 40 MHz"
 msgid "IEEE 802.11ac @ 80 MHz"
 msgstr "IEEE 802.11ac @ 80 MHz"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "IEEE 802.11ac is not available in the 2.4 GHz band"
+msgstr "IEEE 802.11ac ist im 2.4-GHz-Band nicht verfügbar"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "IEEE 802.11an/gn"
 msgstr "IEEE 802.11an/gn"
@@ -10575,10 +10592,30 @@ msgstr "IEEE802.11a/g @ 20 MHz"
 msgid "Invalid Band"
 msgstr "Ungültiges Band"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "Invalid Channel"
+msgstr "Ungültiger Kanal"
+
+#: html/cgi-bin/wlanap.cgi
+msgid "Invalid Encryption"
+msgstr "Ungültige Verschlüsselung"
+
+#: html/cgi-bin/wlanap.cgi
+msgid "Invalid Interface"
+msgstr "Ungültige Schnittstelle"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid Mode"
 msgstr "Ungültiger Modus"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "Invalid SSID"
+msgstr "Ungültige SSID"
+
+#: html/cgi-bin/wlanap.cgi
+msgid "Invalid Tx Power"
+msgstr "Ungültige Sendeleistung"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid length in WPA passphrase. Must be between 8 and 63 characters."
 msgstr ""
@@ -10596,6 +10633,10 @@ msgstr "Nachbarschaftsscan"
 msgid "Not Authorized"
 msgstr "Nicht autorisiert"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "OWE requires Management Frame Protection to be enforced"
+msgstr "OWE erfordert, dass der Schutz der Management-Frames erzwungen wird"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Pre-Shared Key"
 msgstr "Schlüssel"
@@ -10624,6 +10665,18 @@ msgstr "Kurze Slot-Zeit"
 msgid "Signal"
 msgstr "Signal"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "The 2.4 GHz band only supports channels of up to 40 MHz"
+msgstr "Das 2.4-GHz-Band unterstützt nur Kanäle mit bis zu 40 MHz"
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires IEEE 802.11ax or newer"
+msgstr "Das 6-GHz-Band erfordert IEEE 802.11ax oder neuer"
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires WPA3 or OWE"
+msgstr "Das 6-GHz-Band erfordert WPA3 oder OWE"
+
 #: html/cgi-bin/wlanap.cgi src/squid-accounting/accounting.cgi
 msgid "Traffic"
 msgstr "Traffic"
@@ -10632,9 +10685,18 @@ msgstr "Traffic"
 msgid "Tx Power"
 msgstr "Sendeleistung"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "WPA2+3 requires Management Frame Protection to be enabled"
+msgstr "WPA2+3 erfordert, dass der Schutz der Management-Frames aktiviert ist"
+
+#: html/cgi-bin/wlanap.cgi
+msgid "WPA3 requires Management Frame Protection to be enforced"
+msgstr "WPA3 erfordert, dass der Schutz der Management-Frames erzwungen wird"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Warning: Disabling the scan may violate regulatory rules"
-msgstr "Warnung: Das Deaktivieren des Scans kann gegen Funkvorschriften verstoßen"
+msgstr ""
+"Warnung: Das Deaktivieren des Scans kann gegen Funkvorschriften verstoßen"
 
 #: html/cgi-bin/wlanap.cgi
 msgid "WiFi Clients"
diff --git a/po/es.po b/po/es.po
index a090a43330..14339490db 100644
--- a/po/es.po
+++ b/po/es.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: IPFire\n"
 "Report-Msgid-Bugs-To: https://bugzilla.ipfire.org/\n"
-"POT-Creation-Date: 2026-10-24 15:28+0000\n"
+"POT-Creation-Date: 2026-10-29 17:55+0000\n"
 "Language-Team: Spanish\n"
 "Language: es\n"
 "MIME-Version: 1.0\n"
@@ -937,8 +937,8 @@ msgstr "Alias de dirección IP externa removido"
 msgid "Interface:"
 msgstr "Interfaz:"
 
-#: html/cgi-bin/aliases.cgi html/cgi-bin/hosts.cgi html/cgi-bin/pppsetup.cgi
-#: html/cgi-bin/wio.cgi
+#: html/cgi-bin/aliases.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Invalid hostname."
 msgstr "Nombre de host no válido."
 
@@ -1447,6 +1447,7 @@ msgid "Days:"
 msgstr "Días:"
 
 #: html/cgi-bin/connscheduler.cgi html/cgi-bin/index.cgi
+#: html/cgi-bin/wlanap.cgi
 msgid "Disconnect"
 msgstr "Desconectar"
 
@@ -1621,8 +1622,8 @@ msgstr ""
 msgid "Hostname not set."
 msgstr "Nombre de host no configurado"
 
-#: html/cgi-bin/ddns.cgi html/cgi-bin/hosts.cgi html/cgi-bin/index.cgi
-#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
+#: html/cgi-bin/ddns.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/index.cgi html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Hostname:"
 msgstr "Nombre de host:"
 
@@ -2868,7 +2869,7 @@ msgstr "Red IPsec"
 msgid "Incoming Firewall Access:"
 msgstr "Reglas Entrantes:"
 
-#: html/cgi-bin/fwhosts.cgi
+#: html/cgi-bin/fwhosts.cgi html/cgi-bin/wlanap.cgi
 msgid "Invalid Country Code"
 msgstr ""
 
@@ -10437,6 +10438,10 @@ msgstr ""
 msgid "2.4 GHz"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "320 MHz channels are only available in the 6 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "5 GHz"
 msgstr ""
@@ -10484,6 +10489,10 @@ msgstr "Código de País"
 msgid "Enforced"
 msgstr "Forzado"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "Enhanced Open (OWE)"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Features"
 msgstr ""
@@ -10516,6 +10525,10 @@ msgstr ""
 msgid "IEEE 802.11ac @ 80 MHz"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "IEEE 802.11ac is not available in the 2.4 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "IEEE 802.11an/gn"
 msgstr ""
@@ -10580,10 +10593,35 @@ msgstr ""
 msgid "Invalid Band"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Channel"
+msgstr "Campo inválido"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Encryption"
+msgstr "Endpoint no válido"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Interface"
+msgstr "Entrada no válida"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid Mode"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid SSID"
+msgstr "Entrada no válida"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Tx Power"
+msgstr "Puerto de proxy no válido"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid length in WPA passphrase. Must be between 8 and 63 characters."
 msgstr ""
@@ -10603,6 +10641,11 @@ msgstr "Desactivación Escaneo de vecindario"
 msgid "Not Authorized"
 msgstr "No montado"
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "OWE requires Management Frame Protection to be enforced"
+msgstr "Protección del marco de gestión"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Pre-Shared Key"
 msgstr "Clave precompartida"
@@ -10633,6 +10676,18 @@ msgstr ""
 msgid "Signal"
 msgstr "Calidad de la señal"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "The 2.4 GHz band only supports channels of up to 40 MHz"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires IEEE 802.11ax or newer"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires WPA3 or OWE"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi src/squid-accounting/accounting.cgi
 msgid "Traffic"
 msgstr ""
@@ -10641,6 +10696,16 @@ msgstr ""
 msgid "Tx Power"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "WPA2+3 requires Management Frame Protection to be enabled"
+msgstr "Protección del marco de gestión"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "WPA3 requires Management Frame Protection to be enforced"
+msgstr "Protección del marco de gestión"
+
 #: html/cgi-bin/wlanap.cgi
 #, fuzzy
 msgid "Warning: Disabling the scan may violate regulatory rules"
diff --git a/po/fr.po b/po/fr.po
index 1abe6d7e3a..4c1ef6d243 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: IPFire\n"
 "Report-Msgid-Bugs-To: https://bugzilla.ipfire.org/\n"
-"POT-Creation-Date: 2026-10-24 15:28+0000\n"
+"POT-Creation-Date: 2026-10-29 17:55+0000\n"
 "Language-Team: French\n"
 "Language: fr\n"
 "MIME-Version: 1.0\n"
@@ -939,8 +939,8 @@ msgstr "Alias d'IP externe supprimée"
 msgid "Interface:"
 msgstr "Interface :"
 
-#: html/cgi-bin/aliases.cgi html/cgi-bin/hosts.cgi html/cgi-bin/pppsetup.cgi
-#: html/cgi-bin/wio.cgi
+#: html/cgi-bin/aliases.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Invalid hostname."
 msgstr "Nom d'hôte non valide."
 
@@ -1446,6 +1446,7 @@ msgid "Days:"
 msgstr "Jours :"
 
 #: html/cgi-bin/connscheduler.cgi html/cgi-bin/index.cgi
+#: html/cgi-bin/wlanap.cgi
 msgid "Disconnect"
 msgstr "Déconnexion"
 
@@ -1619,8 +1620,8 @@ msgstr "Deviner la véritable IP publique à l'aide d'un serveur externe"
 msgid "Hostname not set."
 msgstr "Le nom d'hôte n'est pas défini."
 
-#: html/cgi-bin/ddns.cgi html/cgi-bin/hosts.cgi html/cgi-bin/index.cgi
-#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
+#: html/cgi-bin/ddns.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/index.cgi html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Hostname:"
 msgstr "Nom hôte :"
 
@@ -2873,7 +2874,7 @@ msgstr "Réseau IPsec"
 msgid "Incoming Firewall Access:"
 msgstr "Accès entrant du pare-feu :"
 
-#: html/cgi-bin/fwhosts.cgi
+#: html/cgi-bin/fwhosts.cgi html/cgi-bin/wlanap.cgi
 msgid "Invalid Country Code"
 msgstr ""
 
@@ -10452,6 +10453,10 @@ msgstr ""
 msgid "2.4 GHz"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "320 MHz channels are only available in the 6 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "5 GHz"
 msgstr ""
@@ -10499,6 +10504,10 @@ msgstr "Code pays"
 msgid "Enforced"
 msgstr "Forcé"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "Enhanced Open (OWE)"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Features"
 msgstr ""
@@ -10531,6 +10540,10 @@ msgstr ""
 msgid "IEEE 802.11ac @ 80 MHz"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "IEEE 802.11ac is not available in the 2.4 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "IEEE 802.11an/gn"
 msgstr ""
@@ -10595,10 +10608,35 @@ msgstr ""
 msgid "Invalid Band"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Channel"
+msgstr "Champ invalide"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Encryption"
+msgstr "Chiffrement"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Interface"
+msgstr "Entrée non valide"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid Mode"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid SSID"
+msgstr "Entrée non valide"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Tx Power"
+msgstr "Port proxy non valide"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid length in WPA passphrase. Must be between 8 and 63 characters."
 msgstr ""
@@ -10619,6 +10657,11 @@ msgstr "Désactivation Balayage réseaux proches"
 msgid "Not Authorized"
 msgstr "Non monté"
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "OWE requires Management Frame Protection to be enforced"
+msgstr "Protection du cadre de gestion"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Pre-Shared Key"
 msgstr "Clé pré-partagée"
@@ -10649,6 +10692,18 @@ msgstr ""
 msgid "Signal"
 msgstr "qualité du signal"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "The 2.4 GHz band only supports channels of up to 40 MHz"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires IEEE 802.11ax or newer"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires WPA3 or OWE"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi src/squid-accounting/accounting.cgi
 msgid "Traffic"
 msgstr "Trafic"
@@ -10657,6 +10712,16 @@ msgstr "Trafic"
 msgid "Tx Power"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "WPA2+3 requires Management Frame Protection to be enabled"
+msgstr "Protection du cadre de gestion"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "WPA3 requires Management Frame Protection to be enforced"
+msgstr "Protection du cadre de gestion"
+
 #: html/cgi-bin/wlanap.cgi
 #, fuzzy
 msgid "Warning: Disabling the scan may violate regulatory rules"
diff --git a/po/ipfire.pot b/po/ipfire.pot
index e0c9752a9b..8b10fc5e6c 100644
--- a/po/ipfire.pot
+++ b/po/ipfire.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: IPFire\n"
 "Report-Msgid-Bugs-To: https://bugzilla.ipfire.org/\n"
-"POT-Creation-Date: 2026-10-24 15:28+0000\n"
+"POT-Creation-Date: 2026-10-29 17:55+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -824,8 +824,8 @@ msgstr ""
 msgid "Empty name."
 msgstr ""
 
-#: html/cgi-bin/aliases.cgi html/cgi-bin/hosts.cgi html/cgi-bin/pppsetup.cgi
-#: html/cgi-bin/wio.cgi
+#: html/cgi-bin/aliases.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Invalid hostname."
 msgstr ""
 
@@ -1427,6 +1427,7 @@ msgid "Connect"
 msgstr ""
 
 #: html/cgi-bin/connscheduler.cgi html/cgi-bin/index.cgi
+#: html/cgi-bin/wlanap.cgi
 msgid "Disconnect"
 msgstr ""
 
@@ -1620,8 +1621,8 @@ msgstr ""
 msgid "Service:"
 msgstr ""
 
-#: html/cgi-bin/ddns.cgi html/cgi-bin/hosts.cgi html/cgi-bin/index.cgi
-#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
+#: html/cgi-bin/ddns.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/index.cgi html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Hostname:"
 msgstr ""
 
@@ -2773,7 +2774,7 @@ msgstr ""
 msgid "This entry already exists in the group"
 msgstr ""
 
-#: html/cgi-bin/fwhosts.cgi
+#: html/cgi-bin/fwhosts.cgi html/cgi-bin/wlanap.cgi
 msgid "Invalid Country Code"
 msgstr ""
 
@@ -10204,6 +10205,58 @@ msgstr ""
 msgid "Invalid Mode"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "Invalid Interface"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "Invalid SSID"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "Invalid Channel"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "Invalid Tx Power"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "Invalid Encryption"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "WPA3 requires Management Frame Protection to be enforced"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "OWE requires Management Frame Protection to be enforced"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "WPA2+3 requires Management Frame Protection to be enabled"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires WPA3 or OWE"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires IEEE 802.11ax or newer"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "320 MHz channels are only available in the 6 GHz band"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "IEEE 802.11ac is not available in the 2.4 GHz band"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 2.4 GHz band only supports channels of up to 40 MHz"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Wireless Access Point Configuration"
 msgstr ""
@@ -10344,6 +10397,10 @@ msgstr ""
 msgid "Warning: Disabling the scan may violate regulatory rules"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "Enhanced Open (OWE)"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Pre-Shared Key"
 msgstr ""
@@ -10357,15 +10414,15 @@ msgid "Enforced"
 msgstr ""
 
 #: html/cgi-bin/wlanap.cgi
-msgid "WiFi Status"
+msgid "Tx Power"
 msgstr ""
 
 #: html/cgi-bin/wlanap.cgi
-msgid "Channel Width"
+msgid "WiFi Status"
 msgstr ""
 
 #: html/cgi-bin/wlanap.cgi
-msgid "Tx Power"
+msgid "Channel Width"
 msgstr ""
 
 #: html/cgi-bin/wlanap.cgi
diff --git a/po/it.po b/po/it.po
index 2180da3fc8..b133b94146 100644
--- a/po/it.po
+++ b/po/it.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: IPFire\n"
 "Report-Msgid-Bugs-To: https://bugzilla.ipfire.org/\n"
-"POT-Creation-Date: 2026-10-24 15:28+0000\n"
+"POT-Creation-Date: 2026-10-29 17:55+0000\n"
 "Language-Team: Italian\n"
 "Language: it\n"
 "MIME-Version: 1.0\n"
@@ -930,8 +930,8 @@ msgstr "External IP alias removed"
 msgid "Interface:"
 msgstr "Interfaccia:"
 
-#: html/cgi-bin/aliases.cgi html/cgi-bin/hosts.cgi html/cgi-bin/pppsetup.cgi
-#: html/cgi-bin/wio.cgi
+#: html/cgi-bin/aliases.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Invalid hostname."
 msgstr "Invalid hostname."
 
@@ -1436,6 +1436,7 @@ msgid "Days:"
 msgstr "Giorno:"
 
 #: html/cgi-bin/connscheduler.cgi html/cgi-bin/index.cgi
+#: html/cgi-bin/wlanap.cgi
 msgid "Disconnect"
 msgstr "Disconnesso"
 
@@ -1607,8 +1608,8 @@ msgstr "Ottieni l'indirizzo IP pubblico con l'aiuto di un server esterno"
 msgid "Hostname not set."
 msgstr "Hostname not set."
 
-#: html/cgi-bin/ddns.cgi html/cgi-bin/hosts.cgi html/cgi-bin/index.cgi
-#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
+#: html/cgi-bin/ddns.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/index.cgi html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Hostname:"
 msgstr "Hostname:"
 
@@ -2843,7 +2844,7 @@ msgstr "IPsec network"
 msgid "Incoming Firewall Access:"
 msgstr "Incoming Firewall Access:"
 
-#: html/cgi-bin/fwhosts.cgi
+#: html/cgi-bin/fwhosts.cgi html/cgi-bin/wlanap.cgi
 msgid "Invalid Country Code"
 msgstr ""
 
@@ -10328,6 +10329,10 @@ msgstr ""
 msgid "2.4 GHz"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "320 MHz channels are only available in the 6 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "5 GHz"
 msgstr ""
@@ -10375,6 +10380,10 @@ msgstr "Country Code"
 msgid "Enforced"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "Enhanced Open (OWE)"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Features"
 msgstr ""
@@ -10407,6 +10416,10 @@ msgstr ""
 msgid "IEEE 802.11ac @ 80 MHz"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "IEEE 802.11ac is not available in the 2.4 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "IEEE 802.11an/gn"
 msgstr ""
@@ -10471,10 +10484,35 @@ msgstr ""
 msgid "Invalid Band"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Channel"
+msgstr "Invalid hostname."
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Encryption"
+msgstr "Encryption"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Interface"
+msgstr "Invalid input"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid Mode"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid SSID"
+msgstr "Invalid input"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Tx Power"
+msgstr "Invalid proxy port"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid length in WPA passphrase. Must be between 8 and 63 characters."
 msgstr ""
@@ -10492,6 +10530,10 @@ msgstr ""
 msgid "Not Authorized"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "OWE requires Management Frame Protection to be enforced"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Pre-Shared Key"
 msgstr "Pre-shared key"
@@ -10522,6 +10564,18 @@ msgstr ""
 msgid "Signal"
 msgstr "Signal Quality"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "The 2.4 GHz band only supports channels of up to 40 MHz"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires IEEE 802.11ax or newer"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires WPA3 or OWE"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi src/squid-accounting/accounting.cgi
 msgid "Traffic"
 msgstr ""
@@ -10530,6 +10584,14 @@ msgstr ""
 msgid "Tx Power"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "WPA2+3 requires Management Frame Protection to be enabled"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "WPA3 requires Management Frame Protection to be enforced"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Warning: Disabling the scan may violate regulatory rules"
 msgstr ""
diff --git a/po/nl.po b/po/nl.po
index c7486f28f4..64a4e57bcd 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: IPFire\n"
 "Report-Msgid-Bugs-To: https://bugzilla.ipfire.org/\n"
-"POT-Creation-Date: 2026-10-24 15:28+0000\n"
+"POT-Creation-Date: 2026-10-29 17:55+0000\n"
 "Language-Team: Dutch\n"
 "Language: nl\n"
 "MIME-Version: 1.0\n"
@@ -931,8 +931,8 @@ msgstr "Extern IP-alias verwijderd"
 msgid "Interface:"
 msgstr "Interface:"
 
-#: html/cgi-bin/aliases.cgi html/cgi-bin/hosts.cgi html/cgi-bin/pppsetup.cgi
-#: html/cgi-bin/wio.cgi
+#: html/cgi-bin/aliases.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Invalid hostname."
 msgstr "Ongeldige hostnaam."
 
@@ -1437,6 +1437,7 @@ msgid "Days:"
 msgstr "Dagen:"
 
 #: html/cgi-bin/connscheduler.cgi html/cgi-bin/index.cgi
+#: html/cgi-bin/wlanap.cgi
 msgid "Disconnect"
 msgstr "Verbreek"
 
@@ -1610,8 +1611,8 @@ msgstr "Bepaal het echte publieke IP-adres met behulp van een externe server"
 msgid "Hostname not set."
 msgstr "Hostnaam niet opgegeven."
 
-#: html/cgi-bin/ddns.cgi html/cgi-bin/hosts.cgi html/cgi-bin/index.cgi
-#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
+#: html/cgi-bin/ddns.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/index.cgi html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Hostname:"
 msgstr "Hostnaam:"
 
@@ -2851,7 +2852,7 @@ msgstr "IPsec netwerk"
 msgid "Incoming Firewall Access:"
 msgstr "Inkomende firewalltoegang:"
 
-#: html/cgi-bin/fwhosts.cgi
+#: html/cgi-bin/fwhosts.cgi html/cgi-bin/wlanap.cgi
 msgid "Invalid Country Code"
 msgstr ""
 
@@ -10352,6 +10353,10 @@ msgstr ""
 msgid "2.4 GHz"
 msgstr "2.4 GHz"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "320 MHz channels are only available in the 6 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "5 GHz"
 msgstr "5 GHz"
@@ -10399,6 +10404,10 @@ msgstr "Landcode"
 msgid "Enforced"
 msgstr "Afgedwongen"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "Enhanced Open (OWE)"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Features"
 msgstr ""
@@ -10431,6 +10440,10 @@ msgstr "IEEE 802.11ac @ 40 MHz"
 msgid "IEEE 802.11ac @ 80 MHz"
 msgstr "IEEE 802.11ac @ 80 MHz"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "IEEE 802.11ac is not available in the 2.4 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "IEEE 802.11an/gn"
 msgstr "IEEE 802.11an/gn"
@@ -10495,10 +10508,35 @@ msgstr "IEEE802.11a/g @ 20 MHz"
 msgid "Invalid Band"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Channel"
+msgstr "Ongeldige hostnaam."
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Encryption"
+msgstr "Encryptie"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Interface"
+msgstr "Ongeldige invoer"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid Mode"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid SSID"
+msgstr "Ongeldige invoer"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Tx Power"
+msgstr "Ongeldige proxy poort"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid length in WPA passphrase. Must be between 8 and 63 characters."
 msgstr ""
@@ -10517,6 +10555,10 @@ msgstr ""
 msgid "Not Authorized"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "OWE requires Management Frame Protection to be enforced"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Pre-Shared Key"
 msgstr "Pre-shared sleutel"
@@ -10546,6 +10588,18 @@ msgstr ""
 msgid "Signal"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "The 2.4 GHz band only supports channels of up to 40 MHz"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires IEEE 802.11ax or newer"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires WPA3 or OWE"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi src/squid-accounting/accounting.cgi
 msgid "Traffic"
 msgstr ""
@@ -10554,6 +10608,14 @@ msgstr ""
 msgid "Tx Power"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "WPA2+3 requires Management Frame Protection to be enabled"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "WPA3 requires Management Frame Protection to be enforced"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Warning: Disabling the scan may violate regulatory rules"
 msgstr ""
diff --git a/po/pl.po b/po/pl.po
index 62793b8f4f..b227c7f3d4 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: IPFire\n"
 "Report-Msgid-Bugs-To: https://bugzilla.ipfire.org/\n"
-"POT-Creation-Date: 2026-10-24 15:28+0000\n"
+"POT-Creation-Date: 2026-10-29 17:55+0000\n"
 "Language-Team: Polish\n"
 "Language: pl\n"
 "MIME-Version: 1.0\n"
@@ -929,8 +929,8 @@ msgstr "Usunięto zewnętrzny alias IP"
 msgid "Interface:"
 msgstr "Interfejs:"
 
-#: html/cgi-bin/aliases.cgi html/cgi-bin/hosts.cgi html/cgi-bin/pppsetup.cgi
-#: html/cgi-bin/wio.cgi
+#: html/cgi-bin/aliases.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Invalid hostname."
 msgstr "Niepoprawna nazwa hosta."
 
@@ -1435,6 +1435,7 @@ msgid "Days:"
 msgstr "Dni:"
 
 #: html/cgi-bin/connscheduler.cgi html/cgi-bin/index.cgi
+#: html/cgi-bin/wlanap.cgi
 msgid "Disconnect"
 msgstr "Rozłącz"
 
@@ -1606,8 +1607,8 @@ msgstr "Próbuj uzyskać publiczne IP za pomocą zewnętrznego serwera"
 msgid "Hostname not set."
 msgstr "Nazwa hosta nie ustawiona."
 
-#: html/cgi-bin/ddns.cgi html/cgi-bin/hosts.cgi html/cgi-bin/index.cgi
-#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
+#: html/cgi-bin/ddns.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/index.cgi html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Hostname:"
 msgstr "Nazwa hosta:"
 
@@ -2831,7 +2832,7 @@ msgstr ""
 msgid "Incoming Firewall Access:"
 msgstr ""
 
-#: html/cgi-bin/fwhosts.cgi
+#: html/cgi-bin/fwhosts.cgi html/cgi-bin/wlanap.cgi
 msgid "Invalid Country Code"
 msgstr ""
 
@@ -10297,6 +10298,10 @@ msgstr ""
 msgid "2.4 GHz"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "320 MHz channels are only available in the 6 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "5 GHz"
 msgstr ""
@@ -10343,6 +10348,10 @@ msgstr ""
 msgid "Enforced"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "Enhanced Open (OWE)"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Features"
 msgstr ""
@@ -10375,6 +10384,10 @@ msgstr ""
 msgid "IEEE 802.11ac @ 80 MHz"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "IEEE 802.11ac is not available in the 2.4 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "IEEE 802.11an/gn"
 msgstr ""
@@ -10439,10 +10452,35 @@ msgstr ""
 msgid "Invalid Band"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Channel"
+msgstr "Niepoprawna nazwa hosta."
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Encryption"
+msgstr "Szyfrowanie"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Interface"
+msgstr "Niepoprawna wartość"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid Mode"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid SSID"
+msgstr "Niepoprawna wartość"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Tx Power"
+msgstr "Nieprawidłowy port proxy"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid length in WPA passphrase. Must be between 8 and 63 characters."
 msgstr ""
@@ -10460,6 +10498,10 @@ msgstr ""
 msgid "Not Authorized"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "OWE requires Management Frame Protection to be enforced"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Pre-Shared Key"
 msgstr ""
@@ -10489,6 +10531,18 @@ msgstr ""
 msgid "Signal"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "The 2.4 GHz band only supports channels of up to 40 MHz"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires IEEE 802.11ax or newer"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires WPA3 or OWE"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi src/squid-accounting/accounting.cgi
 msgid "Traffic"
 msgstr ""
@@ -10497,6 +10551,14 @@ msgstr ""
 msgid "Tx Power"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "WPA2+3 requires Management Frame Protection to be enabled"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "WPA3 requires Management Frame Protection to be enforced"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Warning: Disabling the scan may violate regulatory rules"
 msgstr ""
diff --git a/po/ru.po b/po/ru.po
index c87deebc96..f9d6bfd0ea 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: IPFire\n"
 "Report-Msgid-Bugs-To: https://bugzilla.ipfire.org/\n"
-"POT-Creation-Date: 2026-10-24 15:28+0000\n"
+"POT-Creation-Date: 2026-10-29 17:55+0000\n"
 "Language-Team: Russian\n"
 "Language: ru\n"
 "MIME-Version: 1.0\n"
@@ -925,8 +925,8 @@ msgstr "External IP alias removed"
 msgid "Interface:"
 msgstr "Интерфейс:"
 
-#: html/cgi-bin/aliases.cgi html/cgi-bin/hosts.cgi html/cgi-bin/pppsetup.cgi
-#: html/cgi-bin/wio.cgi
+#: html/cgi-bin/aliases.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Invalid hostname."
 msgstr "Неверный имя хоста."
 
@@ -1430,6 +1430,7 @@ msgid "Days:"
 msgstr "Дни:"
 
 #: html/cgi-bin/connscheduler.cgi html/cgi-bin/index.cgi
+#: html/cgi-bin/wlanap.cgi
 msgid "Disconnect"
 msgstr "Отключится"
 
@@ -1601,8 +1602,8 @@ msgstr "Узнать реальный внешний IP с помощью вне
 msgid "Hostname not set."
 msgstr "Hostname not set."
 
-#: html/cgi-bin/ddns.cgi html/cgi-bin/hosts.cgi html/cgi-bin/index.cgi
-#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
+#: html/cgi-bin/ddns.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/index.cgi html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Hostname:"
 msgstr "Имя Хоста:"
 
@@ -2828,7 +2829,7 @@ msgstr ""
 msgid "Incoming Firewall Access:"
 msgstr ""
 
-#: html/cgi-bin/fwhosts.cgi
+#: html/cgi-bin/fwhosts.cgi html/cgi-bin/wlanap.cgi
 msgid "Invalid Country Code"
 msgstr ""
 
@@ -10288,6 +10289,10 @@ msgstr ""
 msgid "2.4 GHz"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "320 MHz channels are only available in the 6 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "5 GHz"
 msgstr ""
@@ -10334,6 +10339,10 @@ msgstr ""
 msgid "Enforced"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "Enhanced Open (OWE)"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Features"
 msgstr ""
@@ -10366,6 +10375,10 @@ msgstr ""
 msgid "IEEE 802.11ac @ 80 MHz"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "IEEE 802.11ac is not available in the 2.4 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "IEEE 802.11an/gn"
 msgstr ""
@@ -10430,10 +10443,35 @@ msgstr ""
 msgid "Invalid Band"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Channel"
+msgstr "Неверный имя хоста."
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Encryption"
+msgstr "Encryption"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Interface"
+msgstr "Неверный ввод"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid Mode"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid SSID"
+msgstr "Неверный ввод"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Tx Power"
+msgstr "Неверный порт proxy"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid length in WPA passphrase. Must be between 8 and 63 characters."
 msgstr ""
@@ -10451,6 +10489,10 @@ msgstr ""
 msgid "Not Authorized"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "OWE requires Management Frame Protection to be enforced"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Pre-Shared Key"
 msgstr ""
@@ -10480,6 +10522,18 @@ msgstr ""
 msgid "Signal"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "The 2.4 GHz band only supports channels of up to 40 MHz"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires IEEE 802.11ax or newer"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires WPA3 or OWE"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi src/squid-accounting/accounting.cgi
 msgid "Traffic"
 msgstr ""
@@ -10488,6 +10542,14 @@ msgstr ""
 msgid "Tx Power"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "WPA2+3 requires Management Frame Protection to be enabled"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "WPA3 requires Management Frame Protection to be enforced"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Warning: Disabling the scan may violate regulatory rules"
 msgstr ""
diff --git a/po/tr.po b/po/tr.po
index 6dcca21fa9..0de64eff2d 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: IPFire\n"
 "Report-Msgid-Bugs-To: https://bugzilla.ipfire.org/\n"
-"POT-Creation-Date: 2026-10-24 15:28+0000\n"
+"POT-Creation-Date: 2026-10-29 17:55+0000\n"
 "Language-Team: Turkish\n"
 "Language: tr\n"
 "MIME-Version: 1.0\n"
@@ -936,8 +936,8 @@ msgstr "Harici IP takma adı kaldırıldı"
 msgid "Interface:"
 msgstr "Ara birim:"
 
-#: html/cgi-bin/aliases.cgi html/cgi-bin/hosts.cgi html/cgi-bin/pppsetup.cgi
-#: html/cgi-bin/wio.cgi
+#: html/cgi-bin/aliases.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Invalid hostname."
 msgstr "Geçersiz ana bilgisayar adı."
 
@@ -1443,6 +1443,7 @@ msgid "Days:"
 msgstr "Günler:"
 
 #: html/cgi-bin/connscheduler.cgi html/cgi-bin/index.cgi
+#: html/cgi-bin/wlanap.cgi
 msgid "Disconnect"
 msgstr "Bağlantıyı kes"
 
@@ -1614,8 +1615,8 @@ msgstr "Harici sunucunun yardımıyla tahmini gerçek genel IP"
 msgid "Hostname not set."
 msgstr "Ana bilgisayar adı ayarlanmadı."
 
-#: html/cgi-bin/ddns.cgi html/cgi-bin/hosts.cgi html/cgi-bin/index.cgi
-#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
+#: html/cgi-bin/ddns.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/index.cgi html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Hostname:"
 msgstr "Ana bilgisayar adı:"
 
@@ -2856,7 +2857,7 @@ msgstr "IPsec ağ"
 msgid "Incoming Firewall Access:"
 msgstr "Gelen güvenlik duvarı bağlantısı:"
 
-#: html/cgi-bin/fwhosts.cgi
+#: html/cgi-bin/fwhosts.cgi html/cgi-bin/wlanap.cgi
 msgid "Invalid Country Code"
 msgstr ""
 
@@ -10373,6 +10374,10 @@ msgstr ""
 msgid "2.4 GHz"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "320 MHz channels are only available in the 6 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "5 GHz"
 msgstr ""
@@ -10420,6 +10425,10 @@ msgstr "Ülke Kodu"
 msgid "Enforced"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "Enhanced Open (OWE)"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Features"
 msgstr ""
@@ -10452,6 +10461,10 @@ msgstr ""
 msgid "IEEE 802.11ac @ 80 MHz"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "IEEE 802.11ac is not available in the 2.4 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "IEEE 802.11an/gn"
 msgstr ""
@@ -10516,10 +10529,35 @@ msgstr ""
 msgid "Invalid Band"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Channel"
+msgstr "Geçersiz alan"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Encryption"
+msgstr "Şifreleme"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Interface"
+msgstr "Geçersiz giriş"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid Mode"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid SSID"
+msgstr "Geçersiz giriş"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Tx Power"
+msgstr "Geçersiz vekil sunucu bağlantı noktası"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid length in WPA passphrase. Must be between 8 and 63 characters."
 msgstr ""
@@ -10538,6 +10576,10 @@ msgstr ""
 msgid "Not Authorized"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "OWE requires Management Frame Protection to be enforced"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Pre-Shared Key"
 msgstr "Önceden paylaşılan anahtar"
@@ -10568,6 +10610,18 @@ msgstr ""
 msgid "Signal"
 msgstr "Sinyal kalitesi"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "The 2.4 GHz band only supports channels of up to 40 MHz"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires IEEE 802.11ax or newer"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires WPA3 or OWE"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi src/squid-accounting/accounting.cgi
 msgid "Traffic"
 msgstr "Trafik"
@@ -10576,6 +10630,14 @@ msgstr "Trafik"
 msgid "Tx Power"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "WPA2+3 requires Management Frame Protection to be enabled"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "WPA3 requires Management Frame Protection to be enforced"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Warning: Disabling the scan may violate regulatory rules"
 msgstr ""
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 0c5684a656..6505f4a06b 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: IPFire\n"
 "Report-Msgid-Bugs-To: https://bugzilla.ipfire.org/\n"
-"POT-Creation-Date: 2026-10-24 15:28+0000\n"
+"POT-Creation-Date: 2026-10-29 17:55+0000\n"
 "Language-Team: Chinese (Simplified)\n"
 "Language: zh_CN\n"
 "MIME-Version: 1.0\n"
@@ -925,8 +925,8 @@ msgstr "外部IP别名已删除"
 msgid "Interface:"
 msgstr "接口:"
 
-#: html/cgi-bin/aliases.cgi html/cgi-bin/hosts.cgi html/cgi-bin/pppsetup.cgi
-#: html/cgi-bin/wio.cgi
+#: html/cgi-bin/aliases.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Invalid hostname."
 msgstr "无效主机。"
 
@@ -1428,6 +1428,7 @@ msgid "Days:"
 msgstr "日:"
 
 #: html/cgi-bin/connscheduler.cgi html/cgi-bin/index.cgi
+#: html/cgi-bin/wlanap.cgi
 msgid "Disconnect"
 msgstr "断开连接"
 
@@ -1598,8 +1599,8 @@ msgstr "借助外部服务器猜测真实的公共IP"
 msgid "Hostname not set."
 msgstr "未设置主机名。"
 
-#: html/cgi-bin/ddns.cgi html/cgi-bin/hosts.cgi html/cgi-bin/index.cgi
-#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
+#: html/cgi-bin/ddns.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/index.cgi html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Hostname:"
 msgstr "主机名:"
 
@@ -2827,7 +2828,7 @@ msgstr "IPsec网络"
 msgid "Incoming Firewall Access:"
 msgstr "入站防火墙访问:"
 
-#: html/cgi-bin/fwhosts.cgi
+#: html/cgi-bin/fwhosts.cgi html/cgi-bin/wlanap.cgi
 msgid "Invalid Country Code"
 msgstr ""
 
@@ -10250,6 +10251,10 @@ msgstr ""
 msgid "2.4 GHz"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "320 MHz channels are only available in the 6 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "5 GHz"
 msgstr ""
@@ -10297,6 +10302,10 @@ msgstr "国家代码"
 msgid "Enforced"
 msgstr "启用"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "Enhanced Open (OWE)"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Features"
 msgstr ""
@@ -10329,6 +10338,10 @@ msgstr ""
 msgid "IEEE 802.11ac @ 80 MHz"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "IEEE 802.11ac is not available in the 2.4 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "IEEE 802.11an/gn"
 msgstr ""
@@ -10393,10 +10406,35 @@ msgstr ""
 msgid "Invalid Band"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Channel"
+msgstr "无效字段"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Encryption"
+msgstr "端点无效"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Interface"
+msgstr "输入无效"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid Mode"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid SSID"
+msgstr "输入无效"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Tx Power"
+msgstr "无效的代理端口"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid length in WPA passphrase. Must be between 8 and 63 characters."
 msgstr "WPA密码中的长度无效。 必须介于8到63个字符之间。"
@@ -10414,6 +10452,11 @@ msgstr ""
 msgid "Not Authorized"
 msgstr "未挂载"
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "OWE requires Management Frame Protection to be enforced"
+msgstr "管理帧保护"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Pre-Shared Key"
 msgstr "预共享密钥"
@@ -10444,6 +10487,18 @@ msgstr ""
 msgid "Signal"
 msgstr "信号品质"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "The 2.4 GHz band only supports channels of up to 40 MHz"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires IEEE 802.11ax or newer"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires WPA3 or OWE"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi src/squid-accounting/accounting.cgi
 msgid "Traffic"
 msgstr ""
@@ -10452,6 +10507,16 @@ msgstr ""
 msgid "Tx Power"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "WPA2+3 requires Management Frame Protection to be enabled"
+msgstr "管理帧保护"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "WPA3 requires Management Frame Protection to be enforced"
+msgstr "管理帧保护"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Warning: Disabling the scan may violate regulatory rules"
 msgstr ""
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 0db3f90491..7b75844b40 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: IPFire\n"
 "Report-Msgid-Bugs-To: https://bugzilla.ipfire.org/\n"
-"POT-Creation-Date: 2026-10-24 15:28+0000\n"
+"POT-Creation-Date: 2026-10-29 17:55+0000\n"
 "Language-Team: Chinese (Traditional)\n"
 "Language: zh_TW\n"
 "MIME-Version: 1.0\n"
@@ -925,8 +925,8 @@ msgstr "外部IP別名已刪除"
 msgid "Interface:"
 msgstr "接口:"
 
-#: html/cgi-bin/aliases.cgi html/cgi-bin/hosts.cgi html/cgi-bin/pppsetup.cgi
-#: html/cgi-bin/wio.cgi
+#: html/cgi-bin/aliases.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Invalid hostname."
 msgstr "無效主機。"
 
@@ -1428,6 +1428,7 @@ msgid "Days:"
 msgstr "日:"
 
 #: html/cgi-bin/connscheduler.cgi html/cgi-bin/index.cgi
+#: html/cgi-bin/wlanap.cgi
 msgid "Disconnect"
 msgstr "斷開連接"
 
@@ -1598,8 +1599,8 @@ msgstr "藉助外部伺服器猜測真實的公共IP"
 msgid "Hostname not set."
 msgstr "未設置主機名。"
 
-#: html/cgi-bin/ddns.cgi html/cgi-bin/hosts.cgi html/cgi-bin/index.cgi
-#: html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
+#: html/cgi-bin/ddns.cgi html/cgi-bin/dhcp.cgi html/cgi-bin/hosts.cgi
+#: html/cgi-bin/index.cgi html/cgi-bin/pppsetup.cgi html/cgi-bin/wio.cgi
 msgid "Hostname:"
 msgstr "主機名:"
 
@@ -2827,7 +2828,7 @@ msgstr "IPsec網絡"
 msgid "Incoming Firewall Access:"
 msgstr "入站防火牆訪問:"
 
-#: html/cgi-bin/fwhosts.cgi
+#: html/cgi-bin/fwhosts.cgi html/cgi-bin/wlanap.cgi
 msgid "Invalid Country Code"
 msgstr ""
 
@@ -10250,6 +10251,10 @@ msgstr ""
 msgid "2.4 GHz"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "320 MHz channels are only available in the 6 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "5 GHz"
 msgstr ""
@@ -10297,6 +10302,10 @@ msgstr "國家代碼"
 msgid "Enforced"
 msgstr "啟用"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "Enhanced Open (OWE)"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Features"
 msgstr ""
@@ -10329,6 +10338,10 @@ msgstr ""
 msgid "IEEE 802.11ac @ 80 MHz"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+msgid "IEEE 802.11ac is not available in the 2.4 GHz band"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi
 msgid "IEEE 802.11an/gn"
 msgstr ""
@@ -10393,10 +10406,35 @@ msgstr ""
 msgid "Invalid Band"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Channel"
+msgstr "無效欄位"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Encryption"
+msgstr "端點無效"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Interface"
+msgstr "輸入無效"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid Mode"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid SSID"
+msgstr "輸入無效"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "Invalid Tx Power"
+msgstr "無效的代理埠"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Invalid length in WPA passphrase. Must be between 8 and 63 characters."
 msgstr "WPA密碼中的長度無效。 必須介於8到63個字符之間。"
@@ -10414,6 +10452,11 @@ msgstr ""
 msgid "Not Authorized"
 msgstr "未掛載"
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "OWE requires Management Frame Protection to be enforced"
+msgstr "管理幀保護"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Pre-Shared Key"
 msgstr "預共享密鑰"
@@ -10444,6 +10487,18 @@ msgstr ""
 msgid "Signal"
 msgstr "信號品質"
 
+#: html/cgi-bin/wlanap.cgi
+msgid "The 2.4 GHz band only supports channels of up to 40 MHz"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires IEEE 802.11ax or newer"
+msgstr ""
+
+#: html/cgi-bin/wlanap.cgi
+msgid "The 6 GHz band requires WPA3 or OWE"
+msgstr ""
+
 #: html/cgi-bin/wlanap.cgi src/squid-accounting/accounting.cgi
 msgid "Traffic"
 msgstr ""
@@ -10452,6 +10507,16 @@ msgstr ""
 msgid "Tx Power"
 msgstr ""
 
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "WPA2+3 requires Management Frame Protection to be enabled"
+msgstr "管理幀保護"
+
+#: html/cgi-bin/wlanap.cgi
+#, fuzzy
+msgid "WPA3 requires Management Frame Protection to be enforced"
+msgstr "管理幀保護"
+
 #: html/cgi-bin/wlanap.cgi
 msgid "Warning: Disabling the scan may violate regulatory rules"
 msgstr ""
diff --git a/src/initscripts/packages/hostapd b/src/initscripts/packages/hostapd
index 3d6ea4f698..16d4e16574 100644
--- a/src/initscripts/packages/hostapd
+++ b/src/initscripts/packages/hostapd
@@ -74,30 +74,6 @@ declare -A VHT_CAPS=(
 	[0x20000000]="[TX-ANTENNA-PATTERN]"
 )
 
-declare -A HE_MAC_CAPS=(
-	# Nothing, yet
-)
-
-declare -A HE_PHY_CAPS=(
-	# SU Beamformer
-	[0x08000000000]="he_su_beamformer=1"
-	# SU Beamformee
-	[0x10000000000]="he_su_beamformee=1"
-	# MU Beamformer
-	[0x20000000000]="he_mu_beamformer=1"
-)
-
-declare -A EHT_MAC_CAPS=(
-	# Nothing, yet
-)
-
-declare -A EHT_PHY_CAPS=(
-	# SU Beamformer
-	[0x0000000000000010]="eht_su_beamformer=1"
-	# SU Beamformee
-	[0x0000000000000020]="eht_su_beamformee=1"
-)
-
 find_interface() {
 	local address="${1}"
 
@@ -121,43 +97,84 @@ write_config() {
 	local flag
 	local ht_flags=0
 	local vht_flags=0
-	local he_mac_flags=0
-	local he_phy_flags=0
-	local eht_mac_flags=0
-	local eht_phy_flags=0
 	local channel_offset
 
+	local ht_caps=()
+	local vht_caps=()
+	local he_caps=()
+	local eht_caps=()
+
 	# Set some default BAND if none is set
 	if [ -z "${CONFIG["BAND"]}" ]; then
 		# Use 2.4 GHz for 802.11g/n and assume 5 GHz for anything else
 		case "${CONFIG["HW_MODE"]}" in
 			gn)
-				BAND="2g"
+				CONFIG["BAND"]="2g"
 				;;
 			*)
-				BAND="5g"
+				CONFIG["BAND"]="5g"
 				;;
 		esac
 	fi
 
 	# Fetch PHY information
+	local section
 	local line
 	while read -r line; do
 		case "${line}" in
-			"EHT MAC Capabilities"*)
-				eht_mac_flags="${line:22:6}"
+			# Forget anything that we have found for a previous band
+			"Band "*)
+				ht_flags=0
+				vht_flags=0
+				he_caps=()
+				eht_caps=()
+				section=
 				;;
-			"EHT PHY Capabilities"*)
-				eht_phy_flags="${line:23:18}"
-				;;
-			"HE MAC Capabilities"*)
-				he_mac_flags="${line:21:14}"
+
+			# The HE/EHT capabilities are listed for each interface type,
+			# but we are only interested in those for the access point.
+			# iw prints them in a byte order that does not fit into a
+			# shell integer, so we use the decoded names instead.
+			"HE Iftypes: "*|"EHT Iftypes: "*)
+				section=
+
+				if [[ "${line}" =~ [:,]\ AP(,|$) ]]; then
+					section="${line%% *}"
+				fi
 				;;
-			"HE PHY Capabilities"*)
-				he_phy_flags="${line:22:24}"
+
+			"SU Beamformer"|"SU Beamformee"|"MU Beamformer")
+				case "${section}" in
+					HE)
+						case "${line}" in
+							"SU Beamformer")
+								he_caps+=( "he_su_beamformer=1" )
+								;;
+							"SU Beamformee")
+								he_caps+=( "he_su_beamformee=1" )
+								;;
+							"MU Beamformer")
+								he_caps+=( "he_mu_beamformer=1" )
+								;;
+						esac
+						;;
+
+					EHT)
+						case "${line}" in
+							"SU Beamformer")
+								eht_caps+=( "eht_su_beamformer=1" )
+								;;
+							"SU Beamformee")
+								eht_caps+=( "eht_su_beamformee=1" )
+								;;
+						esac
+						;;
+				esac
 				;;
+
 			"VHT Capabilities"*)
 				vht_flags="${line:18:10}"
+				section=
 				;;
 			"Capabilities: "*)
 				ht_flags="${line:14}"
@@ -184,11 +201,6 @@ write_config() {
 		esac
 	done <<<"$(iw phy "${phy}" info)"
 
-	local ht_caps=()
-	local vht_caps=()
-	local he_caps=()
-	local eht_caps=()
-
 	# Clear [HT40+][HT40-]
 	ht_flags="$(( ht_flags & ~0x0002 ))"
 
@@ -249,7 +261,7 @@ write_config() {
 	esac
 
 	# RX Spacial Streams
-	case "$(( (${vht_flags} >> 8) & 0x03 ))" in
+	case "$(( (${vht_flags} >> 8) & 0x07 ))" in
 		1)
 			vht_caps+=( "[RX-STBC-1]" )
 			;;
@@ -264,34 +276,39 @@ write_config() {
 			;;
 	esac
 
-	# Compressed Steering
-	case "$(( ((${vht_flags} >> 13) & 0x03) + 1 ))" in
+	# Compressed Steering (hostapd cannot advertise more than four antennas)
+	case "$(( ((${vht_flags} >> 13) & 0x07) + 1 ))" in
+		1)
+			;;
 		2)
 			vht_caps+=( "[BF-ANTENNA-2]" )
 			;;
 		3)
 			vht_caps+=( "[BF-ANTENNA-3]" )
 			;;
-		4)
+		*)
 			vht_caps+=( "[BF-ANTENNA-4]" )
 			;;
 	esac
 
-	# Sounding Dimension
-	case "$(( ((${vht_flags} >> 16) & 0x03) + 1 ))" in
+	# Sounding Dimension (hostapd cannot advertise more than four)
+	case "$(( ((${vht_flags} >> 16) & 0x07) + 1 ))" in
+		1)
+			;;
 		2)
 			vht_caps+=( "[SOUNDING-DIMENSION-2]" )
 			;;
 		3)
 			vht_caps+=( "[SOUNDING-DIMENSION-3]" )
 			;;
-		4)
+		*)
 			vht_caps+=( "[SOUNDING-DIMENSION-4]" )
 			;;
 	esac
 
-	local exponent="$(( (${vht_flags} >> 23) & 0x03 ))"
-	if [ "${exponent}" -ge 0 ] && [ "${exponent}" -le 7 ]; then
+	# Max A-MPDU Length Exponent
+	local exponent="$(( (${vht_flags} >> 23) & 0x07 ))"
+	if [ "${exponent}" -gt 0 ]; then
 		vht_caps+=( "[MAX-A-MPDU-LEN-EXP${exponent}]" )
 	fi
 
@@ -305,22 +322,8 @@ write_config() {
 			;;
 	esac
 
-	# HE PHY Capabilities
-	for flag in ${!HE_PHY_CAPS[@]}; do
-		if (( ${he_phy_flags} & ${flag} )); then
-			he_caps+=( "${HE_PHY_CAPS[${flag}]}" )
-		fi
-	done
-
-	# EHT PHY Capabilities
-	for flag in ${!EHT_PHY_CAPS[@]}; do
-		if (( ${eht_phy_flags} & ${flag} )); then
-			eht_caps+=( "${EHT_PHY_CAPS[${flag}]}" )
-		fi
-	done
-
-	# Set the channel to zero if not set
-	if [ -z "${CONFIG["CHANNEL"]}" ]; then
+	# Set the channel to zero if not set (or invalid)
+	if ! [[ "${CONFIG["CHANNEL"]}" =~ ^[0-9]+$ ]]; then
 		CONFIG["CHANNEL"]=0
 	fi
 
@@ -646,8 +649,8 @@ write_config() {
 		fi
 
 		# The antenna patterns don't change
-		he_6ghz_rx_ant_pat=1
-		he_6ghz_tx_ant_pat=1
+		echo "he_6ghz_rx_ant_pat=1"
+		echo "he_6ghz_tx_ant_pat=1"
 	fi
 
 	# Enable 802.11ac?
@@ -717,6 +720,25 @@ write_config() {
 		echo "noscan=0"
 	fi
 
+	# WPA1 is no longer supported, fall back to WPA2
+	case "${CONFIG["ENC"]}" in
+		wpa1|wpa1+2)
+			CONFIG["ENC"]="wpa2"
+			;;
+	esac
+
+	# WPA3 and OWE require Management Frame Protection
+	case "${CONFIG["ENC"]}" in
+		wpa3|owe)
+			CONFIG["IEEE80211W"]="on"
+			;;
+		wpa2+3)
+			if [ "${CONFIG["IEEE80211W"]}" != "on" ]; then
+				CONFIG["IEEE80211W"]="optional"
+			fi
+			;;
+	esac
+
 	# Management Frame Protection (802.11w)
 	case "${CONFIG["IEEE80211W"]}" in
 		on)
@@ -745,17 +767,31 @@ write_config() {
 
 	# Encryption
 	case "${CONFIG["ENC"]}" in
+		owe)
+			echo "wpa=2"
+			echo "wpa_key_mgmt=OWE"
+			echo "rsn_pairwise=CCMP"
+			;;
 		wpa3)
 			echo "wpa=2"
 			echo "wpa_passphrase=${CONFIG["PWD"]}"
 			echo "wpa_key_mgmt=SAE"
 			echo "rsn_pairwise=CCMP"
+
+			# Support both, Hash-to-Element and Hunting-and-Pecking
+			echo "sae_pwe=2"
 			;;
 		wpa2+3)
 			echo "wpa=2"
 			echo "wpa_passphrase=${CONFIG["PWD"]}"
 			echo "wpa_key_mgmt=WPA-PSK WPA-PSK-SHA256 SAE"
 			echo "rsn_pairwise=CCMP"
+
+			# Support both, Hash-to-Element and Hunting-and-Pecking
+			echo "sae_pwe=2"
+
+			# Require MFP for WPA3 clients, even if it is optional for WPA2
+			echo "sae_require_mfp=1"
 			;;
 		wpa2)
 			echo "wpa=2"
@@ -763,19 +799,6 @@ write_config() {
 			echo "wpa_key_mgmt=WPA-PSK WPA-PSK-SHA256"
 			echo "rsn_pairwise=CCMP"
 			;;
-		wpa1+2)
-			echo "wpa=3"
-			echo "wpa_passphrase=${CONFIG["PWD"]}"
-			echo "wpa_key_mgmt=WPA-PSK WPA-PSK-SHA256"
-			echo "wpa_pairwise=TKIP"
-			echo "rsn_pairwise=CCMP"
-			;;
-		wpa1)
-			echo "wpa=1"
-			echo "wpa_passphrase=${CONFIG["PWD"]}"
-			echo "wpa_key_mgmt=WPA-PSK WPA-PSK-SHA256"
-			echo "wpa_pairwise=TKIP"
-			;;
 	esac
 
 	# Multi-Band Operation - prefer WiFi over mobile networks
@@ -793,8 +816,8 @@ write_config() {
 	# Extended Key ID support for Individually Addressed frames
 	echo "extended_key_id=1"
 
-	# Fully enable Optimized Connectivity Experience
-	echo "oce=7"
+	# Enable Optimized Connectivity Experience in AP mode
+	echo "oce=4"
 
 	# Enable 802.11u Interworking Support
 	echo "interworking=1"
@@ -856,6 +879,13 @@ case "${1}" in
 
 		boot_mesg "Starting hostapd... "
 		loadproc "${args[@]}"
+
+		# Limit the transmit power (the regulatory limit always applies)
+		if [[ "${CONFIG["TXPOWER"]}" =~ ^[0-9]+$ ]]; then
+			iw dev "${interface}" set txpower limit "$(( CONFIG["TXPOWER"] * 100 ))" &>/dev/null
+		else
+			iw dev "${interface}" set txpower auto &>/dev/null
+		fi
 		;;
 
 	stop)
diff --git a/src/misc-progs/wlanapctrl.c b/src/misc-progs/wlanapctrl.c
index d0ece2e262..2cfbdfb1ae 100644
--- a/src/misc-progs/wlanapctrl.c
+++ b/src/misc-progs/wlanapctrl.c
@@ -4,8 +4,25 @@
 #include <stdlib.h>
 #include <sys/types.h>
 #include <fcntl.h>
+#include <ctype.h>
 #include "setuid.h"
 
+static int is_valid_address(const char* address) {
+	if (strlen(address) != 17)
+		return 0;
+
+	for (int i = 0; i < 17; i++) {
+		if (i % 3 == 2) {
+			if (address[i] != ':')
+				return 0;
+		} else if (!isxdigit(address[i])) {
+			return 0;
+		}
+	}
+
+	return 1;
+}
+
 int main(int argc, char *argv[]){
 	if ( argc < 2 ){
 		printf("invalid parameter(s)\n");
@@ -16,15 +33,23 @@ int main(int argc, char *argv[]){
 		exit(1);
 
 	if (strcmp(argv[1], "start") == 0){
-		safe_system("cp /var/ipfire/wlanap/hostapd.* /etc/");
 		safe_system("/etc/init.d/hostapd start");
 	}else if (strcmp(argv[1], "stop") == 0){
 		safe_system("/etc/init.d/hostapd stop");
 	}else if (strcmp(argv[1], "restart") == 0){
-		safe_system("cp /var/ipfire/wlanap/hostapd.* /etc/");
 		safe_system("/etc/init.d/hostapd restart");
 	}else if (strcmp(argv[1], "status") == 0){
 		safe_system("/etc/init.d/hostapd status");
+	}else if (strcmp(argv[1], "disconnect") == 0){
+		if (argc != 3 || !is_valid_address(argv[2])) {
+			printf("invalid address\n");
+			return(1);
+		}
+
+		// Deauthenticate the client so that it has to connect again
+		char* args[] = { "-p", "/var/run/hostapd", "deauthenticate", argv[2], NULL };
+
+		return run("/usr/bin/hostapd_cli", args);
 	}else{
 		printf("invalid parameter(s)\n");
 		return(1);
diff --git a/src/paks/hostapd/install.sh b/src/paks/hostapd/install.sh
index 2dae5364ee..eaf3d32fc6 100644
--- a/src/paks/hostapd/install.sh
+++ b/src/paks/hostapd/install.sh
@@ -25,6 +25,13 @@
 extract_files
 restore_backup ${NAME}
 
+# Remove files that are no longer used (and might have been restored)
+rm -f /etc/hostapd.accept /etc/hostapd.deny \
+	/var/ipfire/wlanap/hostapd.conf \
+	/var/ipfire/wlanap/hostapd.accept \
+	/var/ipfire/wlanap/hostapd.deny \
+	/var/ipfire/wlanap/macfile
+
 # Convert INTERFACE setting to MAC address
 (
 	eval $(/usr/local/bin/readhash /var/ipfire/wlanap/settings)
diff --git a/src/paks/hostapd/uninstall.sh b/src/paks/hostapd/uninstall.sh
index 6c421b35aa..58c4541e13 100644
--- a/src/paks/hostapd/uninstall.sh
+++ b/src/paks/hostapd/uninstall.sh
@@ -26,3 +26,6 @@ stop_service ${NAME}
 make_backup ${NAME}
 rm -rf /etc/rc.d/rc*.d/*hostapd
 remove_files
+
+# Remove the generated configuration
+rm -f /etc/hostapd.conf


hooks/post-receive
--
IPFire 2.x development tree


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2026-10-29 18:02 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-29 18:02 [git.ipfire.org] IPFire 2.x development tree branch, next, updated. 884303944bdba5030b2efedb455d0f64f0cf882e Michael Tremer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox