From: Felix Fietkau Date: Fri, 10 Jul 2026 12:59:56 +0000 (+0200) Subject: wifi-scripts: emit per-line hostapd options correctly X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4062d625aea3bdb33eb5ad957e4602962505951e;p=thirdparty%2Fopenwrt.git wifi-scripts: emit per-line hostapd options correctly append() space-joins list options into one line, which breaks hostapd options that are parsed one entry per line: anqp_elem, nai_realm, venue_name, venue_url, hs20_conn_capab and the radius req_attr lists (a parse error there fails the whole phy). Add append_list() to emit one line per element and route those options through it. vendor_elements is instead a single concatenated hex blob (join ''), and iface_interworking() no longer overwrites domain_name with the 3GPP cell-net data (and uses ';'). Signed-off-by: Felix Fietkau --- diff --git a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/ap.uc b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/ap.uc index e539b00f286..58e9b43f304 100644 --- a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/ap.uc +++ b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/ap.uc @@ -4,7 +4,7 @@ import * as libuci from 'uci'; import { md5 } from 'digest'; import * as fs from 'fs'; -import { append, append_raw, append_value, append_vars, append_string_vars, comment, push_config, set_default, touch_file } from 'wifi.common'; +import { append, append_raw, append_value, append_vars, append_list, append_string_vars, comment, push_config, set_default, touch_file } from 'wifi.common'; import * as netifd from 'wifi.netifd'; import * as iface from 'wifi.iface'; @@ -51,6 +51,10 @@ function iface_setup(config) { config.wmm_enabled = 1; append_string_vars(config, [ 'ssid2' ]); + /* vendor_elements is a single concatenated hex blob, not one per line */ + if (type(config.vendor_elements) == 'array') + config.vendor_elements = join('', config.vendor_elements); + append_vars(config, [ 'ctrl_interface', 'ap_isolate', 'max_num_sta', 'ap_max_inactivity', 'airtime_bss_weight', 'airtime_bss_limit', 'airtime_sta_weight', 'bss_load_update_period', 'chan_util_avg_period', @@ -69,7 +73,7 @@ function iface_authentication_server(config) { append_vars(config, [ 'auth_server_port', 'auth_server_shared_secret' ]); } - append_vars(config, [ 'radius_auth_req_attr' ]); + append_list(config, [ 'radius_auth_req_attr' ]); } function iface_accounting_server(config) { @@ -78,7 +82,7 @@ function iface_accounting_server(config) { append_vars(config, [ 'acct_server_port', 'acct_server_shared_secret' ]); } - append_vars(config, [ 'radius_acct_req_attr' ]); + append_list(config, [ 'radius_acct_req_attr' ]); } function iface_auth_type(config, band) { @@ -522,8 +526,9 @@ function iface_hs20(config) { append_vars(config, [ 'hs20', 'disable_dgaf', 'anqp_domain_id', 'hs20_deauth_req_timeout', 'hs20_wan_metrics', 'hs20_operating_class', 'hs20_t_c_filename', 'hs20_t_c_timestamp', - 'hs20_t_c_server_url', 'hs20_conn_capab' + 'hs20_t_c_server_url' ]); + append_list(config, [ 'hs20_conn_capab' ]); } function iface_interworking(config) { @@ -536,13 +541,14 @@ function iface_interworking(config) { config.domain_name = join(',', config.domain_name); if (config.anqp_3gpp_cell_net) - config.domain_name = join(',', config.anqp_3gpp_cell_net); + config.anqp_3gpp_cell_net = join(';', config.anqp_3gpp_cell_net); append_vars(config, [ 'interworking', 'internet', 'asra', 'uesa', 'access_network_type', 'hessid', 'venue_group', - 'venue_type', 'network_auth_type', 'gas_address3', 'roaming_consortium', 'anqp_elem', 'nai_realm', - 'venue_name', 'venue_url', 'domain_name', 'anqp_3gpp_cell_net', + 'venue_type', 'network_auth_type', 'gas_address3', 'roaming_consortium', + 'domain_name', 'anqp_3gpp_cell_net', ]); + append_list(config, [ 'anqp_elem', 'nai_realm', 'venue_name', 'venue_url' ]); } export function generate(interface, data, config, vlans, stas, phy_features) { diff --git a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/common.uc b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/common.uc index de939b0c2f1..a59f764904b 100644 --- a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/common.uc +++ b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/common.uc @@ -72,6 +72,20 @@ export function append_vars(dict, keys) { append(key, dict[key]); }; +/* emit one "key=value" line per list element (for options hostapd parses + * one entry per line, which must not be space-joined) */ +export function append_list(dict, keys) { + for (let key in keys) { + let val = dict[key]; + if (val == null) + continue; + if (type(val) != 'array') + val = [ val ]; + for (let v in val) + append(key, v); + } +}; + export function append_string_vars(dict, keys) { for (let key in keys) append_string(key, dict[key]);