#!/usr/bin/env ucode import { readfile } from "fs"; import * as uci from 'uci'; const bands_order = [ "6G", "5G", "2G" ]; const htmode_order = [ "EHT", "HE", "VHT", "HT" ]; let board = json(readfile("/etc/board.json")); if (!board.wlan) exit(0); let idx = 0; let commit; let config = uci.cursor().get_all("wireless") ?? {}; function radio_exists(path, macaddr, phy, radio) { for (let name, s in config) { if (s[".type"] != "wifi-device") continue; if (radio != null && int(s.radio) != radio) continue; if (s.macaddr & lc(s.macaddr) == lc(macaddr)) return true; if (s.phy == phy) return true; if (!s.path || !path) continue; if (substr(s.path, -length(path)) == path) return true; } } for (let phy_name, phy in board.wlan) { let info = phy.info; if (!info || !length(info.bands)) continue; let radios = length(info.radios) > 0 ? info.radios : [{ bands: info.bands }]; for (let radio in radios) { while (config[`radio${idx}`]) idx++; let name = "radio" + idx; let s = "wireless." + name; let si = "wireless.default_" + name; let band_name = filter(bands_order, (b) => radio.bands[b])[0]; if (!band_name) continue; let band = info.bands[band_name]; let rband = radio.bands[band_name]; let channel = rband.default_channel ?? "auto"; let width = band.max_width; if (band_name == "2G") width = 20; else if (width > 80) width = 80; let htmode = filter(htmode_order, (m) => band[lc(m)])[0]; if (htmode) htmode += width; else htmode = "NOHT"; if (!phy.path) continue; let macaddr = trim(readfile(`/sys/class/ieee80211/${phy_name}/macaddress`)); if (radio_exists(phy.path, macaddr, phy_name, radio.index)) continue; let id = `phy='${phy_name}'`; if (match(phy_name, /^phy[0-9]/)) id = `path='${phy.path}'`; band_name = lc(band_name); let country, defaults, num_global_macaddr; if (board.wlan.defaults) { defaults = board.wlan.defaults.ssids?.[band_name]?.ssid ? board.wlan.defaults.ssids?.[band_name] : board.wlan.defaults.ssids?.all; country = board.wlan.defaults.country; if (!country && band_name != '2g') defaults = null; num_global_macaddr = board.wlan.defaults.ssids?.[band_name]?.mac_count; } if (length(info.radios) > 0) id += `\nset ${s}.radio='${radio.index}'`; print(`set ${s}=wifi-device set ${s}.type='mac80211' set ${s}.${id} set ${s}.band='${band_name}' set ${s}.channel='${channel}' set ${s}.htmode='${htmode}' set ${s}.country='${country || ''}' set ${s}.num_global_macaddr='${num_global_macaddr || ''}' set ${s}.disabled='${defaults ? 0 : 1}' set ${si}=wifi-iface set ${si}.device='${name}' set ${si}.network='lan' set ${si}.mode='ap' set ${si}.ssid='${defaults?.ssid || "OpenWrt"}' set ${si}.encryption='${defaults?.encryption || "none"}' set ${si}.key='${defaults?.key || ""}' `); config[name] = {}; commit = true; } } if (commit) print("commit wireless\n");