public inbox for development@lists.ipfire.org
 help / color / mirror / Atom feed
* [PATCH 1/5] hostapd: Bring back support for 802.11g/a
@ 2026-01-19 16:21 Michael Tremer
  2026-01-19 16:21 ` [PATCH 2/5] hostapd: Use the new readhash implementation to read configuration files Michael Tremer
                   ` (4 more replies)
  0 siblings, 5 replies; 9+ messages in thread
From: Michael Tremer @ 2026-01-19 16:21 UTC (permalink / raw)
  To: development; +Cc: Michael Tremer

I just have a little bit of easily accessible testing hardware in form
of USB devices which are very suitable for testing, but the one that I
found in my drawer doesn't support 802.11n.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
---
 doc/language_issues.de           |  2 ++
 doc/language_issues.en           |  2 ++
 doc/language_issues.es           |  2 ++
 doc/language_issues.fr           |  2 ++
 doc/language_issues.it           |  2 ++
 doc/language_issues.nl           |  2 ++
 doc/language_issues.pl           |  2 ++
 doc/language_issues.ru           |  2 ++
 doc/language_issues.tr           |  2 ++
 doc/language_issues.tw           |  2 ++
 doc/language_issues.zh           |  2 ++
 doc/language_missings            | 20 ++++++++++++++++++++
 html/cgi-bin/wlanap.cgi          |  8 +++++++-
 langs/en/cgi-bin/en.pl           |  2 ++
 src/initscripts/packages/hostapd | 15 +++++++++++++--
 15 files changed, 64 insertions(+), 3 deletions(-)

diff --git a/doc/language_issues.de b/doc/language_issues.de
index 008b9520f..1795ec5af 100644
--- a/doc/language_issues.de
+++ b/doc/language_issues.de
@@ -1210,6 +1210,8 @@ WARNING: untranslated string: wio_webinterface_link = unknown string
 WARNING: untranslated string: wireguard = WireGuard
 WARNING: untranslated string: wlan client encryption wpa3 = WPA3
 WARNING: untranslated string: wlan client management frame protection = Management Frame Protection
+WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
+WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
 WARNING: untranslated string: wlanap 802.11w disabled = Disabled
 WARNING: untranslated string: wlanap 802.11w enforced = Enforced
 WARNING: untranslated string: wlanap 802.11w optional = Optional
diff --git a/doc/language_issues.en b/doc/language_issues.en
index 6ea0f1963..30e2fbcce 100644
--- a/doc/language_issues.en
+++ b/doc/language_issues.en
@@ -2408,6 +2408,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
 WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
 WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
 WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
+WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
+WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
 WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
diff --git a/doc/language_issues.es b/doc/language_issues.es
index 48dfffa7e..980d27874 100644
--- a/doc/language_issues.es
+++ b/doc/language_issues.es
@@ -1250,6 +1250,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
 WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
 WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
 WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
+WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
+WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
 WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
diff --git a/doc/language_issues.fr b/doc/language_issues.fr
index 65b3838d0..a7c31beaf 100644
--- a/doc/language_issues.fr
+++ b/doc/language_issues.fr
@@ -1301,6 +1301,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
 WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
 WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
 WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
+WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
+WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
 WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
diff --git a/doc/language_issues.it b/doc/language_issues.it
index 5214abda2..10e77143f 100644
--- a/doc/language_issues.it
+++ b/doc/language_issues.it
@@ -1652,6 +1652,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
 WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
 WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
 WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
+WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
+WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
 WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
diff --git a/doc/language_issues.nl b/doc/language_issues.nl
index d3f814785..5d56a5ca2 100644
--- a/doc/language_issues.nl
+++ b/doc/language_issues.nl
@@ -1672,6 +1672,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
 WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
 WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
 WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
+WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
+WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
 WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
diff --git a/doc/language_issues.pl b/doc/language_issues.pl
index 24b5429ef..7a1128c20 100644
--- a/doc/language_issues.pl
+++ b/doc/language_issues.pl
@@ -1920,6 +1920,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
 WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
 WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
 WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
+WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
+WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
 WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
diff --git a/doc/language_issues.ru b/doc/language_issues.ru
index 0682bfd6f..b6320fd30 100644
--- a/doc/language_issues.ru
+++ b/doc/language_issues.ru
@@ -1919,6 +1919,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
 WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
 WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
 WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
+WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
+WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
 WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
diff --git a/doc/language_issues.tr b/doc/language_issues.tr
index 2ef6920ac..2ad1bf054 100644
--- a/doc/language_issues.tr
+++ b/doc/language_issues.tr
@@ -1522,6 +1522,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
 WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
 WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
 WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
+WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
+WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
 WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
diff --git a/doc/language_issues.tw b/doc/language_issues.tw
index 73e116b7c..c676ffa52 100644
--- a/doc/language_issues.tw
+++ b/doc/language_issues.tw
@@ -1268,6 +1268,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
 WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
 WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
 WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
+WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
+WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
 WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
diff --git a/doc/language_issues.zh b/doc/language_issues.zh
index 73e116b7c..c676ffa52 100644
--- a/doc/language_issues.zh
+++ b/doc/language_issues.zh
@@ -1268,6 +1268,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
 WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
 WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
 WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
+WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
+WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
 WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
 WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
diff --git a/doc/language_missings b/doc/language_missings
index 1d435f16f..268add65b 100644
--- a/doc/language_missings
+++ b/doc/language_missings
@@ -141,6 +141,8 @@
 < wg pre-shared key (optional)
 < winbind daemon
 < wireguard
+< wlanap 802.11ag
+< wlanap 802.11ag 20mhz
 < wlanap 802.11w disabled
 < wlanap 802.11w enforced
 < wlanap 802.11w optional
@@ -217,6 +219,8 @@
 < wlanap 802.11ac 20mhz
 < wlanap 802.11ac 40mhz
 < wlanap 802.11ac 80mhz
+< wlanap 802.11ag
+< wlanap 802.11ag 20mhz
 < wlanap 802.11agn
 < wlanap 802.11agn 20mhz
 < wlanap 802.11agn 40mhz
@@ -398,6 +402,8 @@
 < wlanap 802.11ac 20mhz
 < wlanap 802.11ac 40mhz
 < wlanap 802.11ac 80mhz
+< wlanap 802.11ag
+< wlanap 802.11ag 20mhz
 < wlanap 802.11agn
 < wlanap 802.11agn 20mhz
 < wlanap 802.11agn 40mhz
@@ -1040,6 +1046,8 @@
 < wlanap 802.11ac 20mhz
 < wlanap 802.11ac 40mhz
 < wlanap 802.11ac 80mhz
+< wlanap 802.11ag
+< wlanap 802.11ag 20mhz
 < wlanap 802.11agn
 < wlanap 802.11agn 20mhz
 < wlanap 802.11agn 40mhz
@@ -1754,6 +1762,8 @@
 < wlanap 802.11ac 20mhz
 < wlanap 802.11ac 40mhz
 < wlanap 802.11ac 80mhz
+< wlanap 802.11ag
+< wlanap 802.11ag 20mhz
 < wlanap 802.11agn
 < wlanap 802.11agn 20mhz
 < wlanap 802.11agn 40mhz
@@ -2882,6 +2892,8 @@
 < wlanap 802.11ac 20mhz
 < wlanap 802.11ac 40mhz
 < wlanap 802.11ac 80mhz
+< wlanap 802.11ag
+< wlanap 802.11ag 20mhz
 < wlanap 802.11agn
 < wlanap 802.11agn 20mhz
 < wlanap 802.11agn 40mhz
@@ -4048,6 +4060,8 @@
 < wlanap 802.11ac 20mhz
 < wlanap 802.11ac 40mhz
 < wlanap 802.11ac 80mhz
+< wlanap 802.11ag
+< wlanap 802.11ag 20mhz
 < wlanap 802.11agn
 < wlanap 802.11agn 20mhz
 < wlanap 802.11agn 40mhz
@@ -4591,6 +4605,8 @@
 < wlanap 802.11ac 20mhz
 < wlanap 802.11ac 40mhz
 < wlanap 802.11ac 80mhz
+< wlanap 802.11ag
+< wlanap 802.11ag 20mhz
 < wlanap 802.11agn
 < wlanap 802.11agn 20mhz
 < wlanap 802.11agn 40mhz
@@ -4727,6 +4743,8 @@
 < wlanap 802.11ac 20mhz
 < wlanap 802.11ac 40mhz
 < wlanap 802.11ac 80mhz
+< wlanap 802.11ag
+< wlanap 802.11ag 20mhz
 < wlanap 802.11agn
 < wlanap 802.11agn 20mhz
 < wlanap 802.11agn 40mhz
@@ -4828,6 +4846,8 @@
 < wlanap 802.11ac 20mhz
 < wlanap 802.11ac 40mhz
 < wlanap 802.11ac 80mhz
+< wlanap 802.11ag
+< wlanap 802.11ag 20mhz
 < wlanap 802.11agn
 < wlanap 802.11agn 20mhz
 < wlanap 802.11agn 40mhz
diff --git a/html/cgi-bin/wlanap.cgi b/html/cgi-bin/wlanap.cgi
index 0d1c5a90b..0c5dad558 100644
--- a/html/cgi-bin/wlanap.cgi
+++ b/html/cgi-bin/wlanap.cgi
@@ -102,7 +102,7 @@ if ($cgiparams{'ACTION'} eq "$Lang::tr{'save'}") {
 	}
 
 	# Validate MODE
-	unless ($cgiparams{'MODE'} =~ m/^(HT|HE|VHT|EHT)(20|40|80|160|320)$/) {
+	unless ($cgiparams{'MODE'} =~ m/^(|HT|HE|VHT|EHT)(20|40|80|160|320)$/) {
 		$errormessage .= "$Lang::tr{'wlanap invalid mode'}<br />";
 	}
 
@@ -343,6 +343,12 @@ print <<END;
 								$Lang::tr{'wlanap 802.11agn 20mhz'}
 							</option>
 						</optgroup>
+
+						<optgroup label="$Lang::tr{'wlanap 802.11ag'}">
+							<option value="20" $selected{'MODE'}{'20'}>
+								$Lang::tr{'wlanap 802.11ag 20mhz'}
+							</option>
+						</optgroup>
 					</select>
 				</td>
 			</tr>
diff --git a/langs/en/cgi-bin/en.pl b/langs/en/cgi-bin/en.pl
index 79a512498..dda3e8d5b 100644
--- a/langs/en/cgi-bin/en.pl
+++ b/langs/en/cgi-bin/en.pl
@@ -3202,6 +3202,8 @@
 'wlanap 802.11ac 20mhz' => 'IEEE 802.11ac @ 20 MHz',
 'wlanap 802.11ac 40mhz' => 'IEEE 802.11ac @ 40 MHz',
 'wlanap 802.11ac 80mhz' => 'IEEE 802.11ac @ 80 MHz',
+'wlanap 802.11ag' => 'IEEE 802.11a/g',
+'wlanap 802.11ag 20mhz' => 'IEEE802.11a/g @ 20 MHz',
 'wlanap 802.11agn' => 'IEEE 802.11an/gn',
 'wlanap 802.11agn 20mhz' => 'IEEE 802.11an/gn @ 20 MHz',
 'wlanap 802.11agn 40mhz' => 'IEEE 802.11an/gn @ 40 MHz',
diff --git a/src/initscripts/packages/hostapd b/src/initscripts/packages/hostapd
index 5384badab..9bb6a2120 100644
--- a/src/initscripts/packages/hostapd
+++ b/src/initscripts/packages/hostapd
@@ -360,6 +360,15 @@ write_config() {
 	# Always enable WMM
 	echo "wmm_enabled=1"
 
+	# 802.11n
+	local enable_n=0
+
+	case "${MODE}" in
+		HT*|VHT*|HE*|EHT*)
+			enable_n=1
+			;;
+	esac
+
 	# 802.11ac
 	local enable_ac=0
 	local vht_oper_chwidth=0
@@ -507,8 +516,10 @@ write_config() {
 		fi
 	fi
 
-	# Always enable 802.11n
-	echo "ieee80211n=1"
+	# Enable 802.11n?
+	if [ "${enable_n}" -eq 1 ]; then
+		echo "ieee80211n=1"
+	fi
 
 	# Set HT capabilities
 	if [ ${#ht_caps[@]} -gt 0 ]; then
-- 
2.47.3



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 2/5] hostapd: Use the new readhash implementation to read configuration files
  2026-01-19 16:21 [PATCH 1/5] hostapd: Bring back support for 802.11g/a Michael Tremer
@ 2026-01-19 16:21 ` Michael Tremer
  2026-01-21 19:58   ` Bernhard Bitsch
  2026-01-19 16:21 ` [PATCH 3/5] readhash: Fix the quote check Michael Tremer
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 9+ messages in thread
From: Michael Tremer @ 2026-01-19 16:21 UTC (permalink / raw)
  To: development; +Cc: Michael Tremer

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
---
 src/initscripts/packages/hostapd | 110 ++++++++++++++++---------------
 1 file changed, 56 insertions(+), 54 deletions(-)

diff --git a/src/initscripts/packages/hostapd b/src/initscripts/packages/hostapd
index 9bb6a2120..93ddae72f 100644
--- a/src/initscripts/packages/hostapd
+++ b/src/initscripts/packages/hostapd
@@ -127,9 +127,9 @@ write_config() {
 	local eht_phy_flags=0
 
 	# Set some default BAND if none is set
-	if [ -z "${BAND}" ]; then
+	if [ -z "${CONFIG["BAND"]}" ]; then
 		# Use 2.4 GHz for 802.11g/n and assume 5 GHz for anything else
-		case "${HW_MODE}" in
+		case "${CONFIG["HW_MODE"]}" in
 			gn)
 				BAND="2g"
 				;;
@@ -164,13 +164,13 @@ write_config() {
 
 			# Check if we are in the right band
 			"* 2412.0 MHz"*)
-				if [ "${BAND}" = "2g" ]; then
+				if [ "${CONFIG["BAND"]}" = "2g" ]; then
 					break
 				fi
 				;;
 
 			"* 5180.0 MHz"*)
-				if [ "${BAND}" = "5g" ]; then
+				if [ "${CONFIG["BAND"]}" = "5g" ]; then
 					break
 				fi
 				;;
@@ -310,18 +310,18 @@ write_config() {
 	done
 
 	# Set the channel to zero if not set
-	if [ -z "${CHANNEL}" ]; then
-		CHANNEL=0
+	if [ -z "${CONFIG["CHANNEL"]}" ]; then
+		CONFIG["CHANNEL"]=0
 	fi
 
 	# Translate the old HW_MODE to the newer MODE setting
-	if [ -z "${MODE}" ]; then
-		case "${HW_MODE}" in
+	if [ -z "${CONFIG["MODE"]}" ]; then
+		case "${CONFIG["HW_MODE"]}" in
 			ac)
-				MODE="VHT20"
+				CONFIG["MODE"]="VHT20"
 				;;
 			an|gn)
-				MODE="HT20";
+				CONFIG["MODE"]="HT20";
 				;;
 		esac
 	fi
@@ -338,7 +338,7 @@ write_config() {
 	echo "driver=nl80211"
 
 	# Set the country code
-	echo "country_code=${COUNTRY}"
+	echo "country_code=${CONFIG["COUNTRY"]}"
 	echo "country3=0x49"
 
 	# Enable 802.11d and 802.11h
@@ -346,8 +346,8 @@ write_config() {
 	echo "ieee80211h=1"
 
 	# Set the channel (if chosen)
-	if [ -n "${CHANNEL}" ]; then
-		echo "channel=${CHANNEL}"
+	if [ -n "${CONFIG["CHANNEL"]}" ]; then
+		echo "channel=${CONFIG["CHANNEL"]}"
 	fi
 
 	# Always advertise TPC
@@ -363,7 +363,7 @@ write_config() {
 	# 802.11n
 	local enable_n=0
 
-	case "${MODE}" in
+	case "${CONFIG["MODE"]}" in
 		HT*|VHT*|HE*|EHT*)
 			enable_n=1
 			;;
@@ -374,7 +374,7 @@ write_config() {
 	local vht_oper_chwidth=0
 	local vht_oper_centr_freq_seg0_idx=""
 
-	case "${MODE}" in
+	case "${CONFIG["MODE"]}" in
 		VHT20|HE20|EHT20)
 			enable_ac=1
 			;;
@@ -384,13 +384,13 @@ write_config() {
 			enable_ac=1
 
 			# Compute the channel segment index
-			if [ "${CHANNEL}" -gt 0 ]; then
-				case "$(( (${CHANNEL} / 4) % 2 ))" in
+			if [ "${CONFIG["CHANNEL"]}" -gt 0 ]; then
+				case "$(( (${CONFIG["CHANNEL"]} / 4) % 2 ))" in
 					0)
-						vht_oper_centr_freq_seg0_idx="$(( ${CHANNEL} - 2 ))"
+						vht_oper_centr_freq_seg0_idx="$(( ${CONFIG["CHANNEL"]} - 2 ))"
 						;;
 					1)
-						vht_oper_centr_freq_seg0_idx="$(( ${CHANNEL} + 2 ))"
+						vht_oper_centr_freq_seg0_idx="$(( ${CONFIG["CHANNEL"]} + 2 ))"
 						;;
 				esac
 			fi
@@ -402,19 +402,19 @@ write_config() {
 			vht_oper_chwidth=1
 
 			# Compute the channel segment index
-			if [ "${CHANNEL}" -gt 0 ]; then
-				case "$(( (${CHANNEL} / 4) % 4 ))" in
+			if [ "${CONFIG["CHANNEL"]}" -gt 0 ]; then
+				case "$(( (${CONFIG["CHANNEL"]} / 4) % 4 ))" in
 					0)
-						vht_oper_centr_freq_seg0_idx="$(( ${CHANNEL} - 6 ))"
+						vht_oper_centr_freq_seg0_idx="$(( ${CONFIG["CHANNEL"]} - 6 ))"
 						;;
 					1)
-						vht_oper_centr_freq_seg0_idx="$(( ${CHANNEL} + 6 ))"
+						vht_oper_centr_freq_seg0_idx="$(( ${CONFIG["CHANNEL"]} + 6 ))"
 						;;
 					2)
-						vht_oper_centr_freq_seg0_idx="$(( ${CHANNEL} + 2 ))"
+						vht_oper_centr_freq_seg0_idx="$(( ${CONFIG["CHANNEL"]} + 2 ))"
 						;;
 					3)
-						vht_oper_centr_freq_seg0_idx="$(( ${CHANNEL} - 2 ))"
+						vht_oper_centr_freq_seg0_idx="$(( ${CONFIG["CHANNEL"]} - 2 ))"
 						;;
 				esac
 			fi
@@ -426,8 +426,8 @@ write_config() {
 			vht_oper_chwidth=2
 
 			# Compute the channel segment index
-			if [ "${CHANNEL}" -gt 0 ]; then
-				case "${CHANNEL}" in
+			if [ "${CONFIG["CHANNEL"]}" -gt 0 ]; then
+				case "${CONFIG["CHANNEL"]}" in
 					36|40|44|48|52|56|60|64)
 						vht_oper_centr_freq_seg0_idx=50
 						;;
@@ -447,7 +447,7 @@ write_config() {
 	local he_oper_chwidth="${vht_oper_chwidth}"
 	local he_oper_centr_freq_seg0_idx="${vht_oper_centr_freq_seg0_idx}"
 
-	case "${MODE}" in
+	case "${CONFIG["MODE"]}" in
 		HE*|EHT*)
 			enable_ax=1
 			;;
@@ -458,14 +458,14 @@ write_config() {
 	local eht_oper_chwidth="${he_oper_chwidth}"
 	local eht_oper_centr_freq_seg0_idx="${he_oper_centr_freq_seg0_idx}"
 
-	case "${MODE}" in
+	case "${CONFIG["MODE"]}" in
 		EHT*)
 			enable_be=1
 			;;
 	esac
 
 	# Set hardware mode
-	case "${BAND}" in
+	case "${CONFIG["BAND"]}" in
 		5g)
 			echo "hw_mode=a"
 			;;
@@ -527,15 +527,16 @@ write_config() {
 	fi
 
 	# Configure antennas
-	if [ -z "${RX_ANTENNAS}" ]; then
-		RX_ANTENNAS="0xffffffff"
+	if [ -z "${CONFIG["RX_ANTENNAS"]}" ]; then
+		CONFIG["RX_ANTENNAS"]="0xffffffff"
 	fi
-	if [ -z "${TX_ANTENNAS}" ]; then
-		TX_ANTENNAS="0xffffffff"
+	if [ -z "${CONFIG["TX_ANTENNAS"]}" ]; then
+		CONFIG["TX_ANTENNAS"]="0xffffffff"
 	fi
 
 	# Set the antennas to use
-	iw phy "${phy}" set antenna "${TX_ANTENNAS}" "${RX_ANTENNAS}" &>/dev/null
+	iw phy "${phy}" set antenna \
+		"${CONFIG["TX_ANTENNAS"]}" "${CONFIG["RX_ANTENNAS"]}" &>/dev/null
 
 	# Enable authentication
 	echo "auth_algs=1"
@@ -548,28 +549,28 @@ write_config() {
 	echo "disassoc_low_ack=1"
 
 	# SSID
-	echo "ssid2=\"${SSID}\""
+	echo "ssid2=\"${CONFIG["SSID"]}\""
 	echo "utf8_ssid=1"
 
 	# Hide the SSID?
-	if [ "${HIDESSID}" = "on" ]; then
+	if [ "${CONFIG["HIDESSID"]}" = "on" ]; then
 		echo "ignore_broadcast_ssid=2"
 	fi
 
 	# Isolate clients?
-	if [ "${CLIENTISOLATION}" = "on" ]; then
+	if [ "${CONFIG["CLIENTISOLATION"]}" = "on" ]; then
 		echo "ap_isolate=1"
 	fi
 
 	# Disable neighbour scan?
-	if [ "${NOSCAN}" = "on" ]; then
+	if [ "${CONFIG["NOSCAN"]}" = "on" ]; then
 		echo "noscan=1"
 	else
 		echo "noscan=0"
 	fi
 
 	# Management Frame Protection (802.11w)
-	case "${IEEE80211W}" in
+	case "${CONFIG["IEEE80211W"]}" in
 		on)
 			echo "ieee80211w=2"
 
@@ -595,35 +596,35 @@ write_config() {
 	esac
 
 	# Encryption
-	case "${ENC}" in
+	case "${CONFIG["ENC"]}" in
 		wpa3)
 			echo "wpa=2"
-			echo "wpa_passphrase=${PWD}"
+			echo "wpa_passphrase=${CONFIG["PWD"]}"
 			echo "wpa_key_mgmt=SAE"
 			echo "rsn_pairwise=CCMP"
 			;;
 		wpa2+3)
 			echo "wpa=2"
-			echo "wpa_passphrase=${PWD}"
+			echo "wpa_passphrase=${CONFIG["PWD"]}"
 			echo "wpa_key_mgmt=WPA-PSK WPA-PSK-SHA256 SAE"
 			echo "rsn_pairwise=CCMP"
 			;;
 		wpa2)
 			echo "wpa=2"
-			echo "wpa_passphrase=${PWD}"
+			echo "wpa_passphrase=${CONFIG["PWD"]}"
 			echo "wpa_key_mgmt=WPA-PSK WPA-PSK-SHA256"
 			echo "rsn_pairwise=CCMP"
 			;;
 		wpa1+2)
 			echo "wpa=3"
-			echo "wpa_passphrase=${PWD}"
+			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=${PWD}"
+			echo "wpa_passphrase=${CONFIG["PWD"]}"
 			echo "wpa_key_mgmt=WPA-PSK WPA-PSK-SHA256"
 			echo "wpa_pairwise=TKIP"
 			;;
@@ -631,7 +632,7 @@ write_config() {
 
 	# Multi-Band Operation - prefer WiFi over mobile networks
 	# This feature requires Management Frame Protection
-	case "${IEEE80211W}" in
+	case "${CONFIG["IEEE80211W"]}" in
 		on|optional)
 			echo "mbo=1"
 			echo "mbo_cell_data_conn_pref=1"
@@ -665,13 +666,14 @@ write_config() {
 	return 0
 }
 
-eval $(/usr/local/bin/readhash /var/ipfire/wlanap/settings)
+# Read the configuration
+readhash CONFIG "/var/ipfire/wlanap/settings"
 
 case "${1}" in
 	start)
-		interface="$(find_interface "${INTERFACE}")"
+		interface="$(find_interface "${CONFIG["INTERFACE"]}")"
 		if [ -z "${interface}" ]; then
-			boot_mesg "Could not find interface with address ${INTERFACE} for wireless access point"
+			boot_mesg "Could not find interface with address ${CONFIG["INTERFACE"]} for wireless access point"
 			echo_failure
 			exit 1
 		fi
@@ -693,8 +695,8 @@ case "${1}" in
 		)
 
 		# Enable debugging?
-		if [ -n "${DEBUG}" ] && [[ "${DEBUG}" =~ ^[0-9]+$ ]]; then
-			for (( i = 0; i < DEBUG; i++ )); do
+		if [ -n "${CONFIG["DEBUG"]}" ] && [[ "${CONFIG["DEBUG"]}" =~ ^[0-9]+$ ]]; then
+			for (( i = 0; i < CONFIG["DEBUG"]; i++ )); do
 				args+=( "-d" )
 			done
 		fi
@@ -720,9 +722,9 @@ case "${1}" in
 		;;
 
 	show-config)
-		interface="$(find_interface "${INTERFACE}")"
+		interface="$(find_interface "${CONFIG["INTERFACE"]}")"
 		if [ -z "${interface}" ]; then
-			boot_mesg "Could not find interface with address ${INTERFACE} for wireless access point"
+			boot_mesg "Could not find interface with address ${CONFIG["INTERFACE"]} for wireless access point"
 			echo_failure
 			exit 1
 		fi
-- 
2.47.3



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/5] readhash: Fix the quote check
  2026-01-19 16:21 [PATCH 1/5] hostapd: Bring back support for 802.11g/a Michael Tremer
  2026-01-19 16:21 ` [PATCH 2/5] hostapd: Use the new readhash implementation to read configuration files Michael Tremer
@ 2026-01-19 16:21 ` Michael Tremer
  2026-01-21 20:00   ` Bernhard Bitsch
  2026-01-19 16:21 ` [PATCH 4/5] initscripts: functions: Permit ! in the value of key/value files Michael Tremer
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 9+ messages in thread
From: Michael Tremer @ 2026-01-19 16:21 UTC (permalink / raw)
  To: development; +Cc: Michael Tremer

The single quotes changed bash's behaviour to interpret the * character
literally, but this is not what we wanted here. We need to escape the
single quotes.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
---
 src/initscripts/system/functions | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/initscripts/system/functions b/src/initscripts/system/functions
index c4b7cb39e..757912eab 100644
--- a/src/initscripts/system/functions
+++ b/src/initscripts/system/functions
@@ -930,7 +930,7 @@ readhash() {
 
 		# strip leading and trailing single quotes
 		case "${val}" in
-			'*')
+			\'*\')
 				val="${val#\'}"
 				val="${val%\'}"
 				;;
-- 
2.47.3



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 4/5] initscripts: functions: Permit ! in the value of key/value files
  2026-01-19 16:21 [PATCH 1/5] hostapd: Bring back support for 802.11g/a Michael Tremer
  2026-01-19 16:21 ` [PATCH 2/5] hostapd: Use the new readhash implementation to read configuration files Michael Tremer
  2026-01-19 16:21 ` [PATCH 3/5] readhash: Fix the quote check Michael Tremer
@ 2026-01-19 16:21 ` Michael Tremer
  2026-01-19 16:21 ` [PATCH 5/5] hostapd: Bump package version Michael Tremer
  2026-01-21 19:46 ` [PATCH 1/5] hostapd: Bring back support for 802.11g/a Bernhard Bitsch
  4 siblings, 0 replies; 9+ messages in thread
From: Michael Tremer @ 2026-01-19 16:21 UTC (permalink / raw)
  To: development; +Cc: Michael Tremer

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
---
 src/initscripts/system/functions | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/initscripts/system/functions b/src/initscripts/system/functions
index 757912eab..c0c40e986 100644
--- a/src/initscripts/system/functions
+++ b/src/initscripts/system/functions
@@ -923,7 +923,7 @@ readhash() {
 		local val="${line#*=}"
 
 		# Skip lines with invalid values
-		if ! [[ ${val} =~ ^[\'][\ A-Za-z0-9=/,.:%_@#+-]*[\']$ ]] && ! [[ ${val} =~ ^[A-Za-z0-9=/,.:%_@#+-]*$ ]]; then
+		if ! [[ ${val} =~ ^[\'][\ A-Za-z0-9=/,.:%_@#+-\\!]*[\']$ ]] && ! [[ ${val} =~ ^[A-Za-z0-9=/,.:%_@#+-\\!]*$ ]]; then
 			echo "Invalid value '${val}' for key '${key}'" >&2
 			continue
 		fi
-- 
2.47.3



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 5/5] hostapd: Bump package version
  2026-01-19 16:21 [PATCH 1/5] hostapd: Bring back support for 802.11g/a Michael Tremer
                   ` (2 preceding siblings ...)
  2026-01-19 16:21 ` [PATCH 4/5] initscripts: functions: Permit ! in the value of key/value files Michael Tremer
@ 2026-01-19 16:21 ` Michael Tremer
  2026-01-21 19:46 ` [PATCH 1/5] hostapd: Bring back support for 802.11g/a Bernhard Bitsch
  4 siblings, 0 replies; 9+ messages in thread
From: Michael Tremer @ 2026-01-19 16:21 UTC (permalink / raw)
  To: development; +Cc: Michael Tremer

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
---
 lfs/hostapd | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lfs/hostapd b/lfs/hostapd
index 1bb77a5e8..27c6006e4 100644
--- a/lfs/hostapd
+++ b/lfs/hostapd
@@ -33,7 +33,7 @@ DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 TARGET     = $(DIR_INFO)/$(THISAPP)
 PROG       = hostapd
-PAK_VER    = 71
+PAK_VER    = 72
 
 DEPS       =
 
-- 
2.47.3



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/5] hostapd: Bring back support for 802.11g/a
  2026-01-19 16:21 [PATCH 1/5] hostapd: Bring back support for 802.11g/a Michael Tremer
                   ` (3 preceding siblings ...)
  2026-01-19 16:21 ` [PATCH 5/5] hostapd: Bump package version Michael Tremer
@ 2026-01-21 19:46 ` Bernhard Bitsch
  2026-01-22 11:14   ` Michael Tremer
  4 siblings, 1 reply; 9+ messages in thread
From: Bernhard Bitsch @ 2026-01-21 19:46 UTC (permalink / raw)
  To: development

Reviewed-by: Bernhard Bitsch <bbitsch@ipfire.org>

Am 19.01.2026 um 17:21 schrieb Michael Tremer:
> I just have a little bit of easily accessible testing hardware in form
> of USB devices which are very suitable for testing, but the one that I
> found in my drawer doesn't support 802.11n.
> 
> Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
> ---
>   doc/language_issues.de           |  2 ++
>   doc/language_issues.en           |  2 ++
>   doc/language_issues.es           |  2 ++
>   doc/language_issues.fr           |  2 ++
>   doc/language_issues.it           |  2 ++
>   doc/language_issues.nl           |  2 ++
>   doc/language_issues.pl           |  2 ++
>   doc/language_issues.ru           |  2 ++
>   doc/language_issues.tr           |  2 ++
>   doc/language_issues.tw           |  2 ++
>   doc/language_issues.zh           |  2 ++
>   doc/language_missings            | 20 ++++++++++++++++++++
>   html/cgi-bin/wlanap.cgi          |  8 +++++++-
>   langs/en/cgi-bin/en.pl           |  2 ++
>   src/initscripts/packages/hostapd | 15 +++++++++++++--
>   15 files changed, 64 insertions(+), 3 deletions(-)
> 
> diff --git a/doc/language_issues.de b/doc/language_issues.de
> index 008b9520f..1795ec5af 100644
> --- a/doc/language_issues.de
> +++ b/doc/language_issues.de
> @@ -1210,6 +1210,8 @@ WARNING: untranslated string: wio_webinterface_link = unknown string
>   WARNING: untranslated string: wireguard = WireGuard
>   WARNING: untranslated string: wlan client encryption wpa3 = WPA3
>   WARNING: untranslated string: wlan client management frame protection = Management Frame Protection
> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11w disabled = Disabled
>   WARNING: untranslated string: wlanap 802.11w enforced = Enforced
>   WARNING: untranslated string: wlanap 802.11w optional = Optional
> diff --git a/doc/language_issues.en b/doc/language_issues.en
> index 6ea0f1963..30e2fbcce 100644
> --- a/doc/language_issues.en
> +++ b/doc/language_issues.en
> @@ -2408,6 +2408,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>   WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>   WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>   WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
> diff --git a/doc/language_issues.es b/doc/language_issues.es
> index 48dfffa7e..980d27874 100644
> --- a/doc/language_issues.es
> +++ b/doc/language_issues.es
> @@ -1250,6 +1250,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>   WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>   WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>   WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
> diff --git a/doc/language_issues.fr b/doc/language_issues.fr
> index 65b3838d0..a7c31beaf 100644
> --- a/doc/language_issues.fr
> +++ b/doc/language_issues.fr
> @@ -1301,6 +1301,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>   WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>   WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>   WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
> diff --git a/doc/language_issues.it b/doc/language_issues.it
> index 5214abda2..10e77143f 100644
> --- a/doc/language_issues.it
> +++ b/doc/language_issues.it
> @@ -1652,6 +1652,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>   WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>   WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>   WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
> diff --git a/doc/language_issues.nl b/doc/language_issues.nl
> index d3f814785..5d56a5ca2 100644
> --- a/doc/language_issues.nl
> +++ b/doc/language_issues.nl
> @@ -1672,6 +1672,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>   WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>   WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>   WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
> diff --git a/doc/language_issues.pl b/doc/language_issues.pl
> index 24b5429ef..7a1128c20 100644
> --- a/doc/language_issues.pl
> +++ b/doc/language_issues.pl
> @@ -1920,6 +1920,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>   WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>   WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>   WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
> diff --git a/doc/language_issues.ru b/doc/language_issues.ru
> index 0682bfd6f..b6320fd30 100644
> --- a/doc/language_issues.ru
> +++ b/doc/language_issues.ru
> @@ -1919,6 +1919,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>   WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>   WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>   WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
> diff --git a/doc/language_issues.tr b/doc/language_issues.tr
> index 2ef6920ac..2ad1bf054 100644
> --- a/doc/language_issues.tr
> +++ b/doc/language_issues.tr
> @@ -1522,6 +1522,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>   WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>   WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>   WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
> diff --git a/doc/language_issues.tw b/doc/language_issues.tw
> index 73e116b7c..c676ffa52 100644
> --- a/doc/language_issues.tw
> +++ b/doc/language_issues.tw
> @@ -1268,6 +1268,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>   WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>   WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>   WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
> diff --git a/doc/language_issues.zh b/doc/language_issues.zh
> index 73e116b7c..c676ffa52 100644
> --- a/doc/language_issues.zh
> +++ b/doc/language_issues.zh
> @@ -1268,6 +1268,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>   WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>   WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>   WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>   WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
> diff --git a/doc/language_missings b/doc/language_missings
> index 1d435f16f..268add65b 100644
> --- a/doc/language_missings
> +++ b/doc/language_missings
> @@ -141,6 +141,8 @@
>   < wg pre-shared key (optional)
>   < winbind daemon
>   < wireguard
> +< wlanap 802.11ag
> +< wlanap 802.11ag 20mhz
>   < wlanap 802.11w disabled
>   < wlanap 802.11w enforced
>   < wlanap 802.11w optional
> @@ -217,6 +219,8 @@
>   < wlanap 802.11ac 20mhz
>   < wlanap 802.11ac 40mhz
>   < wlanap 802.11ac 80mhz
> +< wlanap 802.11ag
> +< wlanap 802.11ag 20mhz
>   < wlanap 802.11agn
>   < wlanap 802.11agn 20mhz
>   < wlanap 802.11agn 40mhz
> @@ -398,6 +402,8 @@
>   < wlanap 802.11ac 20mhz
>   < wlanap 802.11ac 40mhz
>   < wlanap 802.11ac 80mhz
> +< wlanap 802.11ag
> +< wlanap 802.11ag 20mhz
>   < wlanap 802.11agn
>   < wlanap 802.11agn 20mhz
>   < wlanap 802.11agn 40mhz
> @@ -1040,6 +1046,8 @@
>   < wlanap 802.11ac 20mhz
>   < wlanap 802.11ac 40mhz
>   < wlanap 802.11ac 80mhz
> +< wlanap 802.11ag
> +< wlanap 802.11ag 20mhz
>   < wlanap 802.11agn
>   < wlanap 802.11agn 20mhz
>   < wlanap 802.11agn 40mhz
> @@ -1754,6 +1762,8 @@
>   < wlanap 802.11ac 20mhz
>   < wlanap 802.11ac 40mhz
>   < wlanap 802.11ac 80mhz
> +< wlanap 802.11ag
> +< wlanap 802.11ag 20mhz
>   < wlanap 802.11agn
>   < wlanap 802.11agn 20mhz
>   < wlanap 802.11agn 40mhz
> @@ -2882,6 +2892,8 @@
>   < wlanap 802.11ac 20mhz
>   < wlanap 802.11ac 40mhz
>   < wlanap 802.11ac 80mhz
> +< wlanap 802.11ag
> +< wlanap 802.11ag 20mhz
>   < wlanap 802.11agn
>   < wlanap 802.11agn 20mhz
>   < wlanap 802.11agn 40mhz
> @@ -4048,6 +4060,8 @@
>   < wlanap 802.11ac 20mhz
>   < wlanap 802.11ac 40mhz
>   < wlanap 802.11ac 80mhz
> +< wlanap 802.11ag
> +< wlanap 802.11ag 20mhz
>   < wlanap 802.11agn
>   < wlanap 802.11agn 20mhz
>   < wlanap 802.11agn 40mhz
> @@ -4591,6 +4605,8 @@
>   < wlanap 802.11ac 20mhz
>   < wlanap 802.11ac 40mhz
>   < wlanap 802.11ac 80mhz
> +< wlanap 802.11ag
> +< wlanap 802.11ag 20mhz
>   < wlanap 802.11agn
>   < wlanap 802.11agn 20mhz
>   < wlanap 802.11agn 40mhz
> @@ -4727,6 +4743,8 @@
>   < wlanap 802.11ac 20mhz
>   < wlanap 802.11ac 40mhz
>   < wlanap 802.11ac 80mhz
> +< wlanap 802.11ag
> +< wlanap 802.11ag 20mhz
>   < wlanap 802.11agn
>   < wlanap 802.11agn 20mhz
>   < wlanap 802.11agn 40mhz
> @@ -4828,6 +4846,8 @@
>   < wlanap 802.11ac 20mhz
>   < wlanap 802.11ac 40mhz
>   < wlanap 802.11ac 80mhz
> +< wlanap 802.11ag
> +< wlanap 802.11ag 20mhz
>   < wlanap 802.11agn
>   < wlanap 802.11agn 20mhz
>   < wlanap 802.11agn 40mhz
> diff --git a/html/cgi-bin/wlanap.cgi b/html/cgi-bin/wlanap.cgi
> index 0d1c5a90b..0c5dad558 100644
> --- a/html/cgi-bin/wlanap.cgi
> +++ b/html/cgi-bin/wlanap.cgi
> @@ -102,7 +102,7 @@ if ($cgiparams{'ACTION'} eq "$Lang::tr{'save'}") {
>   	}
>   
>   	# Validate MODE
> -	unless ($cgiparams{'MODE'} =~ m/^(HT|HE|VHT|EHT)(20|40|80|160|320)$/) {
> +	unless ($cgiparams{'MODE'} =~ m/^(|HT|HE|VHT|EHT)(20|40|80|160|320)$/) {
>   		$errormessage .= "$Lang::tr{'wlanap invalid mode'}<br />";
>   	}
>   
> @@ -343,6 +343,12 @@ print <<END;
>   								$Lang::tr{'wlanap 802.11agn 20mhz'}
>   							</option>
>   						</optgroup>
> +
> +						<optgroup label="$Lang::tr{'wlanap 802.11ag'}">
> +							<option value="20" $selected{'MODE'}{'20'}>
> +								$Lang::tr{'wlanap 802.11ag 20mhz'}
> +							</option>
> +						</optgroup>
>   					</select>
>   				</td>
>   			</tr>
> diff --git a/langs/en/cgi-bin/en.pl b/langs/en/cgi-bin/en.pl
> index 79a512498..dda3e8d5b 100644
> --- a/langs/en/cgi-bin/en.pl
> +++ b/langs/en/cgi-bin/en.pl
> @@ -3202,6 +3202,8 @@
>   'wlanap 802.11ac 20mhz' => 'IEEE 802.11ac @ 20 MHz',
>   'wlanap 802.11ac 40mhz' => 'IEEE 802.11ac @ 40 MHz',
>   'wlanap 802.11ac 80mhz' => 'IEEE 802.11ac @ 80 MHz',
> +'wlanap 802.11ag' => 'IEEE 802.11a/g',
> +'wlanap 802.11ag 20mhz' => 'IEEE802.11a/g @ 20 MHz',
>   'wlanap 802.11agn' => 'IEEE 802.11an/gn',
>   'wlanap 802.11agn 20mhz' => 'IEEE 802.11an/gn @ 20 MHz',
>   'wlanap 802.11agn 40mhz' => 'IEEE 802.11an/gn @ 40 MHz',
> diff --git a/src/initscripts/packages/hostapd b/src/initscripts/packages/hostapd
> index 5384badab..9bb6a2120 100644
> --- a/src/initscripts/packages/hostapd
> +++ b/src/initscripts/packages/hostapd
> @@ -360,6 +360,15 @@ write_config() {
>   	# Always enable WMM
>   	echo "wmm_enabled=1"
>   
> +	# 802.11n
> +	local enable_n=0
> +
> +	case "${MODE}" in
> +		HT*|VHT*|HE*|EHT*)
> +			enable_n=1
> +			;;
> +	esac
> +
>   	# 802.11ac
>   	local enable_ac=0
>   	local vht_oper_chwidth=0
> @@ -507,8 +516,10 @@ write_config() {
>   		fi
>   	fi
>   
> -	# Always enable 802.11n
> -	echo "ieee80211n=1"
> +	# Enable 802.11n?
> +	if [ "${enable_n}" -eq 1 ]; then
> +		echo "ieee80211n=1"
> +	fi
>   
>   	# Set HT capabilities
>   	if [ ${#ht_caps[@]} -gt 0 ]; then



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/5] hostapd: Use the new readhash implementation to read configuration files
  2026-01-19 16:21 ` [PATCH 2/5] hostapd: Use the new readhash implementation to read configuration files Michael Tremer
@ 2026-01-21 19:58   ` Bernhard Bitsch
  0 siblings, 0 replies; 9+ messages in thread
From: Bernhard Bitsch @ 2026-01-21 19:58 UTC (permalink / raw)
  To: development

NOSCAN is generated by the WUI, where it is used as 'scan 
neighbourhood?'. Just in diametral sense. Therefore NOSCAN should 
generate 'noscan=0'.

Reviewed-by: Bernhard Bitsch <bbitsch@ipfire.org>


Am 19.01.2026 um 17:21 schrieb Michael Tremer:
> Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
> ---
>   src/initscripts/packages/hostapd | 110 ++++++++++++++++---------------
>   1 file changed, 56 insertions(+), 54 deletions(-)
> 
> diff --git a/src/initscripts/packages/hostapd b/src/initscripts/packages/hostapd
> index 9bb6a2120..93ddae72f 100644
> --- a/src/initscripts/packages/hostapd
> +++ b/src/initscripts/packages/hostapd
> @@ -127,9 +127,9 @@ write_config() {
>   	local eht_phy_flags=0
>   
>   	# Set some default BAND if none is set
> -	if [ -z "${BAND}" ]; then
> +	if [ -z "${CONFIG["BAND"]}" ]; then
>   		# Use 2.4 GHz for 802.11g/n and assume 5 GHz for anything else
> -		case "${HW_MODE}" in
> +		case "${CONFIG["HW_MODE"]}" in
>   			gn)
>   				BAND="2g"
>   				;;
> @@ -164,13 +164,13 @@ write_config() {
>   
>   			# Check if we are in the right band
>   			"* 2412.0 MHz"*)
> -				if [ "${BAND}" = "2g" ]; then
> +				if [ "${CONFIG["BAND"]}" = "2g" ]; then
>   					break
>   				fi
>   				;;
>   
>   			"* 5180.0 MHz"*)
> -				if [ "${BAND}" = "5g" ]; then
> +				if [ "${CONFIG["BAND"]}" = "5g" ]; then
>   					break
>   				fi
>   				;;
> @@ -310,18 +310,18 @@ write_config() {
>   	done
>   
>   	# Set the channel to zero if not set
> -	if [ -z "${CHANNEL}" ]; then
> -		CHANNEL=0
> +	if [ -z "${CONFIG["CHANNEL"]}" ]; then
> +		CONFIG["CHANNEL"]=0
>   	fi
>   
>   	# Translate the old HW_MODE to the newer MODE setting
> -	if [ -z "${MODE}" ]; then
> -		case "${HW_MODE}" in
> +	if [ -z "${CONFIG["MODE"]}" ]; then
> +		case "${CONFIG["HW_MODE"]}" in
>   			ac)
> -				MODE="VHT20"
> +				CONFIG["MODE"]="VHT20"
>   				;;
>   			an|gn)
> -				MODE="HT20";
> +				CONFIG["MODE"]="HT20";
>   				;;
>   		esac
>   	fi
> @@ -338,7 +338,7 @@ write_config() {
>   	echo "driver=nl80211"
>   
>   	# Set the country code
> -	echo "country_code=${COUNTRY}"
> +	echo "country_code=${CONFIG["COUNTRY"]}"
>   	echo "country3=0x49"
>   
>   	# Enable 802.11d and 802.11h
> @@ -346,8 +346,8 @@ write_config() {
>   	echo "ieee80211h=1"
>   
>   	# Set the channel (if chosen)
> -	if [ -n "${CHANNEL}" ]; then
> -		echo "channel=${CHANNEL}"
> +	if [ -n "${CONFIG["CHANNEL"]}" ]; then
> +		echo "channel=${CONFIG["CHANNEL"]}"
>   	fi
>   
>   	# Always advertise TPC
> @@ -363,7 +363,7 @@ write_config() {
>   	# 802.11n
>   	local enable_n=0
>   
> -	case "${MODE}" in
> +	case "${CONFIG["MODE"]}" in
>   		HT*|VHT*|HE*|EHT*)
>   			enable_n=1
>   			;;
> @@ -374,7 +374,7 @@ write_config() {
>   	local vht_oper_chwidth=0
>   	local vht_oper_centr_freq_seg0_idx=""
>   
> -	case "${MODE}" in
> +	case "${CONFIG["MODE"]}" in
>   		VHT20|HE20|EHT20)
>   			enable_ac=1
>   			;;
> @@ -384,13 +384,13 @@ write_config() {
>   			enable_ac=1
>   
>   			# Compute the channel segment index
> -			if [ "${CHANNEL}" -gt 0 ]; then
> -				case "$(( (${CHANNEL} / 4) % 2 ))" in
> +			if [ "${CONFIG["CHANNEL"]}" -gt 0 ]; then
> +				case "$(( (${CONFIG["CHANNEL"]} / 4) % 2 ))" in
>   					0)
> -						vht_oper_centr_freq_seg0_idx="$(( ${CHANNEL} - 2 ))"
> +						vht_oper_centr_freq_seg0_idx="$(( ${CONFIG["CHANNEL"]} - 2 ))"
>   						;;
>   					1)
> -						vht_oper_centr_freq_seg0_idx="$(( ${CHANNEL} + 2 ))"
> +						vht_oper_centr_freq_seg0_idx="$(( ${CONFIG["CHANNEL"]} + 2 ))"
>   						;;
>   				esac
>   			fi
> @@ -402,19 +402,19 @@ write_config() {
>   			vht_oper_chwidth=1
>   
>   			# Compute the channel segment index
> -			if [ "${CHANNEL}" -gt 0 ]; then
> -				case "$(( (${CHANNEL} / 4) % 4 ))" in
> +			if [ "${CONFIG["CHANNEL"]}" -gt 0 ]; then
> +				case "$(( (${CONFIG["CHANNEL"]} / 4) % 4 ))" in
>   					0)
> -						vht_oper_centr_freq_seg0_idx="$(( ${CHANNEL} - 6 ))"
> +						vht_oper_centr_freq_seg0_idx="$(( ${CONFIG["CHANNEL"]} - 6 ))"
>   						;;
>   					1)
> -						vht_oper_centr_freq_seg0_idx="$(( ${CHANNEL} + 6 ))"
> +						vht_oper_centr_freq_seg0_idx="$(( ${CONFIG["CHANNEL"]} + 6 ))"
>   						;;
>   					2)
> -						vht_oper_centr_freq_seg0_idx="$(( ${CHANNEL} + 2 ))"
> +						vht_oper_centr_freq_seg0_idx="$(( ${CONFIG["CHANNEL"]} + 2 ))"
>   						;;
>   					3)
> -						vht_oper_centr_freq_seg0_idx="$(( ${CHANNEL} - 2 ))"
> +						vht_oper_centr_freq_seg0_idx="$(( ${CONFIG["CHANNEL"]} - 2 ))"
>   						;;
>   				esac
>   			fi
> @@ -426,8 +426,8 @@ write_config() {
>   			vht_oper_chwidth=2
>   
>   			# Compute the channel segment index
> -			if [ "${CHANNEL}" -gt 0 ]; then
> -				case "${CHANNEL}" in
> +			if [ "${CONFIG["CHANNEL"]}" -gt 0 ]; then
> +				case "${CONFIG["CHANNEL"]}" in
>   					36|40|44|48|52|56|60|64)
>   						vht_oper_centr_freq_seg0_idx=50
>   						;;
> @@ -447,7 +447,7 @@ write_config() {
>   	local he_oper_chwidth="${vht_oper_chwidth}"
>   	local he_oper_centr_freq_seg0_idx="${vht_oper_centr_freq_seg0_idx}"
>   
> -	case "${MODE}" in
> +	case "${CONFIG["MODE"]}" in
>   		HE*|EHT*)
>   			enable_ax=1
>   			;;
> @@ -458,14 +458,14 @@ write_config() {
>   	local eht_oper_chwidth="${he_oper_chwidth}"
>   	local eht_oper_centr_freq_seg0_idx="${he_oper_centr_freq_seg0_idx}"
>   
> -	case "${MODE}" in
> +	case "${CONFIG["MODE"]}" in
>   		EHT*)
>   			enable_be=1
>   			;;
>   	esac
>   
>   	# Set hardware mode
> -	case "${BAND}" in
> +	case "${CONFIG["BAND"]}" in
>   		5g)
>   			echo "hw_mode=a"
>   			;;
> @@ -527,15 +527,16 @@ write_config() {
>   	fi
>   
>   	# Configure antennas
> -	if [ -z "${RX_ANTENNAS}" ]; then
> -		RX_ANTENNAS="0xffffffff"
> +	if [ -z "${CONFIG["RX_ANTENNAS"]}" ]; then
> +		CONFIG["RX_ANTENNAS"]="0xffffffff"
>   	fi
> -	if [ -z "${TX_ANTENNAS}" ]; then
> -		TX_ANTENNAS="0xffffffff"
> +	if [ -z "${CONFIG["TX_ANTENNAS"]}" ]; then
> +		CONFIG["TX_ANTENNAS"]="0xffffffff"
>   	fi
>   
>   	# Set the antennas to use
> -	iw phy "${phy}" set antenna "${TX_ANTENNAS}" "${RX_ANTENNAS}" &>/dev/null
> +	iw phy "${phy}" set antenna \
> +		"${CONFIG["TX_ANTENNAS"]}" "${CONFIG["RX_ANTENNAS"]}" &>/dev/null
>   
>   	# Enable authentication
>   	echo "auth_algs=1"
> @@ -548,28 +549,28 @@ write_config() {
>   	echo "disassoc_low_ack=1"
>   
>   	# SSID
> -	echo "ssid2=\"${SSID}\""
> +	echo "ssid2=\"${CONFIG["SSID"]}\""
>   	echo "utf8_ssid=1"
>   
>   	# Hide the SSID?
> -	if [ "${HIDESSID}" = "on" ]; then
> +	if [ "${CONFIG["HIDESSID"]}" = "on" ]; then
>   		echo "ignore_broadcast_ssid=2"
>   	fi
>   
>   	# Isolate clients?
> -	if [ "${CLIENTISOLATION}" = "on" ]; then
> +	if [ "${CONFIG["CLIENTISOLATION"]}" = "on" ]; then
>   		echo "ap_isolate=1"
>   	fi
>   
>   	# Disable neighbour scan?
> -	if [ "${NOSCAN}" = "on" ]; then
> +	if [ "${CONFIG["NOSCAN"]}" = "on" ]; then
>   		echo "noscan=1"
>   	else
>   		echo "noscan=0"
>   	fi
>   
>   	# Management Frame Protection (802.11w)
> -	case "${IEEE80211W}" in
> +	case "${CONFIG["IEEE80211W"]}" in
>   		on)
>   			echo "ieee80211w=2"
>   
> @@ -595,35 +596,35 @@ write_config() {
>   	esac
>   
>   	# Encryption
> -	case "${ENC}" in
> +	case "${CONFIG["ENC"]}" in
>   		wpa3)
>   			echo "wpa=2"
> -			echo "wpa_passphrase=${PWD}"
> +			echo "wpa_passphrase=${CONFIG["PWD"]}"
>   			echo "wpa_key_mgmt=SAE"
>   			echo "rsn_pairwise=CCMP"
>   			;;
>   		wpa2+3)
>   			echo "wpa=2"
> -			echo "wpa_passphrase=${PWD}"
> +			echo "wpa_passphrase=${CONFIG["PWD"]}"
>   			echo "wpa_key_mgmt=WPA-PSK WPA-PSK-SHA256 SAE"
>   			echo "rsn_pairwise=CCMP"
>   			;;
>   		wpa2)
>   			echo "wpa=2"
> -			echo "wpa_passphrase=${PWD}"
> +			echo "wpa_passphrase=${CONFIG["PWD"]}"
>   			echo "wpa_key_mgmt=WPA-PSK WPA-PSK-SHA256"
>   			echo "rsn_pairwise=CCMP"
>   			;;
>   		wpa1+2)
>   			echo "wpa=3"
> -			echo "wpa_passphrase=${PWD}"
> +			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=${PWD}"
> +			echo "wpa_passphrase=${CONFIG["PWD"]}"
>   			echo "wpa_key_mgmt=WPA-PSK WPA-PSK-SHA256"
>   			echo "wpa_pairwise=TKIP"
>   			;;
> @@ -631,7 +632,7 @@ write_config() {
>   
>   	# Multi-Band Operation - prefer WiFi over mobile networks
>   	# This feature requires Management Frame Protection
> -	case "${IEEE80211W}" in
> +	case "${CONFIG["IEEE80211W"]}" in
>   		on|optional)
>   			echo "mbo=1"
>   			echo "mbo_cell_data_conn_pref=1"
> @@ -665,13 +666,14 @@ write_config() {
>   	return 0
>   }
>   
> -eval $(/usr/local/bin/readhash /var/ipfire/wlanap/settings)
> +# Read the configuration
> +readhash CONFIG "/var/ipfire/wlanap/settings"
>   
>   case "${1}" in
>   	start)
> -		interface="$(find_interface "${INTERFACE}")"
> +		interface="$(find_interface "${CONFIG["INTERFACE"]}")"
>   		if [ -z "${interface}" ]; then
> -			boot_mesg "Could not find interface with address ${INTERFACE} for wireless access point"
> +			boot_mesg "Could not find interface with address ${CONFIG["INTERFACE"]} for wireless access point"
>   			echo_failure
>   			exit 1
>   		fi
> @@ -693,8 +695,8 @@ case "${1}" in
>   		)
>   
>   		# Enable debugging?
> -		if [ -n "${DEBUG}" ] && [[ "${DEBUG}" =~ ^[0-9]+$ ]]; then
> -			for (( i = 0; i < DEBUG; i++ )); do
> +		if [ -n "${CONFIG["DEBUG"]}" ] && [[ "${CONFIG["DEBUG"]}" =~ ^[0-9]+$ ]]; then
> +			for (( i = 0; i < CONFIG["DEBUG"]; i++ )); do
>   				args+=( "-d" )
>   			done
>   		fi
> @@ -720,9 +722,9 @@ case "${1}" in
>   		;;
>   
>   	show-config)
> -		interface="$(find_interface "${INTERFACE}")"
> +		interface="$(find_interface "${CONFIG["INTERFACE"]}")"
>   		if [ -z "${interface}" ]; then
> -			boot_mesg "Could not find interface with address ${INTERFACE} for wireless access point"
> +			boot_mesg "Could not find interface with address ${CONFIG["INTERFACE"]} for wireless access point"
>   			echo_failure
>   			exit 1
>   		fi



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/5] readhash: Fix the quote check
  2026-01-19 16:21 ` [PATCH 3/5] readhash: Fix the quote check Michael Tremer
@ 2026-01-21 20:00   ` Bernhard Bitsch
  0 siblings, 0 replies; 9+ messages in thread
From: Bernhard Bitsch @ 2026-01-21 20:00 UTC (permalink / raw)
  To: development

Reviewed-by: Bernhard Bitsch <bbitsch@ipfire.org>

Am 19.01.2026 um 17:21 schrieb Michael Tremer:
> The single quotes changed bash's behaviour to interpret the * character
> literally, but this is not what we wanted here. We need to escape the
> single quotes.
> 
> Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
> ---
>   src/initscripts/system/functions | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/src/initscripts/system/functions b/src/initscripts/system/functions
> index c4b7cb39e..757912eab 100644
> --- a/src/initscripts/system/functions
> +++ b/src/initscripts/system/functions
> @@ -930,7 +930,7 @@ readhash() {
>   
>   		# strip leading and trailing single quotes
>   		case "${val}" in
> -			'*')
> +			\'*\')
>   				val="${val#\'}"
>   				val="${val%\'}"
>   				;;



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/5] hostapd: Bring back support for 802.11g/a
  2026-01-21 19:46 ` [PATCH 1/5] hostapd: Bring back support for 802.11g/a Bernhard Bitsch
@ 2026-01-22 11:14   ` Michael Tremer
  0 siblings, 0 replies; 9+ messages in thread
From: Michael Tremer @ 2026-01-22 11:14 UTC (permalink / raw)
  To: Bernhard Bitsch; +Cc: development

Hello Bernhard,

Thank you very much for reviewing this patch set.

Did you also run the scripts?

-Michael

> On 21 Jan 2026, at 19:46, Bernhard Bitsch <bbitsch@ipfire.org> wrote:
> 
> Reviewed-by: Bernhard Bitsch <bbitsch@ipfire.org>
> 
> Am 19.01.2026 um 17:21 schrieb Michael Tremer:
>> I just have a little bit of easily accessible testing hardware in form
>> of USB devices which are very suitable for testing, but the one that I
>> found in my drawer doesn't support 802.11n.
>> Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
>> ---
>>  doc/language_issues.de           |  2 ++
>>  doc/language_issues.en           |  2 ++
>>  doc/language_issues.es           |  2 ++
>>  doc/language_issues.fr           |  2 ++
>>  doc/language_issues.it           |  2 ++
>>  doc/language_issues.nl           |  2 ++
>>  doc/language_issues.pl           |  2 ++
>>  doc/language_issues.ru           |  2 ++
>>  doc/language_issues.tr           |  2 ++
>>  doc/language_issues.tw           |  2 ++
>>  doc/language_issues.zh           |  2 ++
>>  doc/language_missings            | 20 ++++++++++++++++++++
>>  html/cgi-bin/wlanap.cgi          |  8 +++++++-
>>  langs/en/cgi-bin/en.pl           |  2 ++
>>  src/initscripts/packages/hostapd | 15 +++++++++++++--
>>  15 files changed, 64 insertions(+), 3 deletions(-)
>> diff --git a/doc/language_issues.de b/doc/language_issues.de
>> index 008b9520f..1795ec5af 100644
>> --- a/doc/language_issues.de
>> +++ b/doc/language_issues.de
>> @@ -1210,6 +1210,8 @@ WARNING: untranslated string: wio_webinterface_link = unknown string
>>  WARNING: untranslated string: wireguard = WireGuard
>>  WARNING: untranslated string: wlan client encryption wpa3 = WPA3
>>  WARNING: untranslated string: wlan client management frame protection = Management Frame Protection
>> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
>> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11w disabled = Disabled
>>  WARNING: untranslated string: wlanap 802.11w enforced = Enforced
>>  WARNING: untranslated string: wlanap 802.11w optional = Optional
>> diff --git a/doc/language_issues.en b/doc/language_issues.en
>> index 6ea0f1963..30e2fbcce 100644
>> --- a/doc/language_issues.en
>> +++ b/doc/language_issues.en
>> @@ -2408,6 +2408,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
>> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
>> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>>  WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
>> diff --git a/doc/language_issues.es b/doc/language_issues.es
>> index 48dfffa7e..980d27874 100644
>> --- a/doc/language_issues.es
>> +++ b/doc/language_issues.es
>> @@ -1250,6 +1250,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
>> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
>> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>>  WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
>> diff --git a/doc/language_issues.fr b/doc/language_issues.fr
>> index 65b3838d0..a7c31beaf 100644
>> --- a/doc/language_issues.fr
>> +++ b/doc/language_issues.fr
>> @@ -1301,6 +1301,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
>> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
>> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>>  WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
>> diff --git a/doc/language_issues.it b/doc/language_issues.it
>> index 5214abda2..10e77143f 100644
>> --- a/doc/language_issues.it
>> +++ b/doc/language_issues.it
>> @@ -1652,6 +1652,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
>> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
>> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>>  WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
>> diff --git a/doc/language_issues.nl b/doc/language_issues.nl
>> index d3f814785..5d56a5ca2 100644
>> --- a/doc/language_issues.nl
>> +++ b/doc/language_issues.nl
>> @@ -1672,6 +1672,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
>> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
>> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>>  WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
>> diff --git a/doc/language_issues.pl b/doc/language_issues.pl
>> index 24b5429ef..7a1128c20 100644
>> --- a/doc/language_issues.pl
>> +++ b/doc/language_issues.pl
>> @@ -1920,6 +1920,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
>> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
>> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>>  WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
>> diff --git a/doc/language_issues.ru b/doc/language_issues.ru
>> index 0682bfd6f..b6320fd30 100644
>> --- a/doc/language_issues.ru
>> +++ b/doc/language_issues.ru
>> @@ -1919,6 +1919,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
>> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
>> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>>  WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
>> diff --git a/doc/language_issues.tr b/doc/language_issues.tr
>> index 2ef6920ac..2ad1bf054 100644
>> --- a/doc/language_issues.tr
>> +++ b/doc/language_issues.tr
>> @@ -1522,6 +1522,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
>> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
>> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>>  WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
>> diff --git a/doc/language_issues.tw b/doc/language_issues.tw
>> index 73e116b7c..c676ffa52 100644
>> --- a/doc/language_issues.tw
>> +++ b/doc/language_issues.tw
>> @@ -1268,6 +1268,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
>> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
>> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>>  WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
>> diff --git a/doc/language_issues.zh b/doc/language_issues.zh
>> index 73e116b7c..c676ffa52 100644
>> --- a/doc/language_issues.zh
>> +++ b/doc/language_issues.zh
>> @@ -1268,6 +1268,8 @@ WARNING: untranslated string: wlanap 802.11ac 160mhz = IEEE 802.11ac @ 160 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 20mhz = IEEE 802.11ac @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 40mhz = IEEE 802.11ac @ 40 MHz
>>  WARNING: untranslated string: wlanap 802.11ac 80mhz = IEEE 802.11ac @ 80 MHz
>> +WARNING: untranslated string: wlanap 802.11ag = IEEE 802.11a/g
>> +WARNING: untranslated string: wlanap 802.11ag 20mhz = IEEE802.11a/g @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn = IEEE 802.11an/gn
>>  WARNING: untranslated string: wlanap 802.11agn 20mhz = IEEE 802.11an/gn @ 20 MHz
>>  WARNING: untranslated string: wlanap 802.11agn 40mhz = IEEE 802.11an/gn @ 40 MHz
>> diff --git a/doc/language_missings b/doc/language_missings
>> index 1d435f16f..268add65b 100644
>> --- a/doc/language_missings
>> +++ b/doc/language_missings
>> @@ -141,6 +141,8 @@
>>  < wg pre-shared key (optional)
>>  < winbind daemon
>>  < wireguard
>> +< wlanap 802.11ag
>> +< wlanap 802.11ag 20mhz
>>  < wlanap 802.11w disabled
>>  < wlanap 802.11w enforced
>>  < wlanap 802.11w optional
>> @@ -217,6 +219,8 @@
>>  < wlanap 802.11ac 20mhz
>>  < wlanap 802.11ac 40mhz
>>  < wlanap 802.11ac 80mhz
>> +< wlanap 802.11ag
>> +< wlanap 802.11ag 20mhz
>>  < wlanap 802.11agn
>>  < wlanap 802.11agn 20mhz
>>  < wlanap 802.11agn 40mhz
>> @@ -398,6 +402,8 @@
>>  < wlanap 802.11ac 20mhz
>>  < wlanap 802.11ac 40mhz
>>  < wlanap 802.11ac 80mhz
>> +< wlanap 802.11ag
>> +< wlanap 802.11ag 20mhz
>>  < wlanap 802.11agn
>>  < wlanap 802.11agn 20mhz
>>  < wlanap 802.11agn 40mhz
>> @@ -1040,6 +1046,8 @@
>>  < wlanap 802.11ac 20mhz
>>  < wlanap 802.11ac 40mhz
>>  < wlanap 802.11ac 80mhz
>> +< wlanap 802.11ag
>> +< wlanap 802.11ag 20mhz
>>  < wlanap 802.11agn
>>  < wlanap 802.11agn 20mhz
>>  < wlanap 802.11agn 40mhz
>> @@ -1754,6 +1762,8 @@
>>  < wlanap 802.11ac 20mhz
>>  < wlanap 802.11ac 40mhz
>>  < wlanap 802.11ac 80mhz
>> +< wlanap 802.11ag
>> +< wlanap 802.11ag 20mhz
>>  < wlanap 802.11agn
>>  < wlanap 802.11agn 20mhz
>>  < wlanap 802.11agn 40mhz
>> @@ -2882,6 +2892,8 @@
>>  < wlanap 802.11ac 20mhz
>>  < wlanap 802.11ac 40mhz
>>  < wlanap 802.11ac 80mhz
>> +< wlanap 802.11ag
>> +< wlanap 802.11ag 20mhz
>>  < wlanap 802.11agn
>>  < wlanap 802.11agn 20mhz
>>  < wlanap 802.11agn 40mhz
>> @@ -4048,6 +4060,8 @@
>>  < wlanap 802.11ac 20mhz
>>  < wlanap 802.11ac 40mhz
>>  < wlanap 802.11ac 80mhz
>> +< wlanap 802.11ag
>> +< wlanap 802.11ag 20mhz
>>  < wlanap 802.11agn
>>  < wlanap 802.11agn 20mhz
>>  < wlanap 802.11agn 40mhz
>> @@ -4591,6 +4605,8 @@
>>  < wlanap 802.11ac 20mhz
>>  < wlanap 802.11ac 40mhz
>>  < wlanap 802.11ac 80mhz
>> +< wlanap 802.11ag
>> +< wlanap 802.11ag 20mhz
>>  < wlanap 802.11agn
>>  < wlanap 802.11agn 20mhz
>>  < wlanap 802.11agn 40mhz
>> @@ -4727,6 +4743,8 @@
>>  < wlanap 802.11ac 20mhz
>>  < wlanap 802.11ac 40mhz
>>  < wlanap 802.11ac 80mhz
>> +< wlanap 802.11ag
>> +< wlanap 802.11ag 20mhz
>>  < wlanap 802.11agn
>>  < wlanap 802.11agn 20mhz
>>  < wlanap 802.11agn 40mhz
>> @@ -4828,6 +4846,8 @@
>>  < wlanap 802.11ac 20mhz
>>  < wlanap 802.11ac 40mhz
>>  < wlanap 802.11ac 80mhz
>> +< wlanap 802.11ag
>> +< wlanap 802.11ag 20mhz
>>  < wlanap 802.11agn
>>  < wlanap 802.11agn 20mhz
>>  < wlanap 802.11agn 40mhz
>> diff --git a/html/cgi-bin/wlanap.cgi b/html/cgi-bin/wlanap.cgi
>> index 0d1c5a90b..0c5dad558 100644
>> --- a/html/cgi-bin/wlanap.cgi
>> +++ b/html/cgi-bin/wlanap.cgi
>> @@ -102,7 +102,7 @@ if ($cgiparams{'ACTION'} eq "$Lang::tr{'save'}") {
>>   }
>>     # Validate MODE
>> - unless ($cgiparams{'MODE'} =~ m/^(HT|HE|VHT|EHT)(20|40|80|160|320)$/) {
>> + unless ($cgiparams{'MODE'} =~ m/^(|HT|HE|VHT|EHT)(20|40|80|160|320)$/) {
>>   $errormessage .= "$Lang::tr{'wlanap invalid mode'}<br />";
>>   }
>>  @@ -343,6 +343,12 @@ print <<END;
>>   $Lang::tr{'wlanap 802.11agn 20mhz'}
>>   </option>
>>   </optgroup>
>> +
>> + <optgroup label="$Lang::tr{'wlanap 802.11ag'}">
>> + <option value="20" $selected{'MODE'}{'20'}>
>> + $Lang::tr{'wlanap 802.11ag 20mhz'}
>> + </option>
>> + </optgroup>
>>   </select>
>>   </td>
>>   </tr>
>> diff --git a/langs/en/cgi-bin/en.pl b/langs/en/cgi-bin/en.pl
>> index 79a512498..dda3e8d5b 100644
>> --- a/langs/en/cgi-bin/en.pl
>> +++ b/langs/en/cgi-bin/en.pl
>> @@ -3202,6 +3202,8 @@
>>  'wlanap 802.11ac 20mhz' => 'IEEE 802.11ac @ 20 MHz',
>>  'wlanap 802.11ac 40mhz' => 'IEEE 802.11ac @ 40 MHz',
>>  'wlanap 802.11ac 80mhz' => 'IEEE 802.11ac @ 80 MHz',
>> +'wlanap 802.11ag' => 'IEEE 802.11a/g',
>> +'wlanap 802.11ag 20mhz' => 'IEEE802.11a/g @ 20 MHz',
>>  'wlanap 802.11agn' => 'IEEE 802.11an/gn',
>>  'wlanap 802.11agn 20mhz' => 'IEEE 802.11an/gn @ 20 MHz',
>>  'wlanap 802.11agn 40mhz' => 'IEEE 802.11an/gn @ 40 MHz',
>> diff --git a/src/initscripts/packages/hostapd b/src/initscripts/packages/hostapd
>> index 5384badab..9bb6a2120 100644
>> --- a/src/initscripts/packages/hostapd
>> +++ b/src/initscripts/packages/hostapd
>> @@ -360,6 +360,15 @@ write_config() {
>>   # Always enable WMM
>>   echo "wmm_enabled=1"
>>  + # 802.11n
>> + local enable_n=0
>> +
>> + case "${MODE}" in
>> + HT*|VHT*|HE*|EHT*)
>> + enable_n=1
>> + ;;
>> + esac
>> +
>>   # 802.11ac
>>   local enable_ac=0
>>   local vht_oper_chwidth=0
>> @@ -507,8 +516,10 @@ write_config() {
>>   fi
>>   fi
>>  - # Always enable 802.11n
>> - echo "ieee80211n=1"
>> + # Enable 802.11n?
>> + if [ "${enable_n}" -eq 1 ]; then
>> + echo "ieee80211n=1"
>> + fi
>>     # Set HT capabilities
>>   if [ ${#ht_caps[@]} -gt 0 ]; then
> 
> 



^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2026-01-22 11:14 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-01-19 16:21 [PATCH 1/5] hostapd: Bring back support for 802.11g/a Michael Tremer
2026-01-19 16:21 ` [PATCH 2/5] hostapd: Use the new readhash implementation to read configuration files Michael Tremer
2026-01-21 19:58   ` Bernhard Bitsch
2026-01-19 16:21 ` [PATCH 3/5] readhash: Fix the quote check Michael Tremer
2026-01-21 20:00   ` Bernhard Bitsch
2026-01-19 16:21 ` [PATCH 4/5] initscripts: functions: Permit ! in the value of key/value files Michael Tremer
2026-01-19 16:21 ` [PATCH 5/5] hostapd: Bump package version Michael Tremer
2026-01-21 19:46 ` [PATCH 1/5] hostapd: Bring back support for 802.11g/a Bernhard Bitsch
2026-01-22 11:14   ` Michael Tremer

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