]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
wifi-scripts: emit per-line hostapd options correctly
authorFelix Fietkau <nbd@nbd.name>
Fri, 10 Jul 2026 12:59:56 +0000 (14:59 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 16 Jul 2026 09:50:22 +0000 (11:50 +0200)
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 <nbd@nbd.name>
package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/ap.uc
package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/common.uc

index e539b00f286a9cd6d48d47aa7a00f7cb5457b49e..58e9b43f3045047528000753cb8700fd263fc255 100644 (file)
@@ -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) {
index de939b0c2f1385c2c7c1076f44ada6fdfbcf5b7c..a59f764904b0009b0c4419148cd9cb3adbc74b4b 100644 (file)
@@ -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]);