From f2f6f6b787f6b1ae95c5e7f50f12dfb2fe056eaa Mon Sep 17 00:00:00 2001 From: Andreas Gnau Date: Thu, 30 Jan 2025 14:33:46 +0100 Subject: [PATCH] map-controller: Allow setting Wi-Fi SSID from board.json OpenWrt enables setting default Wi-Fi settings in board.json using board.d scripts. Read from board.json for each band or all bands, otherwise fall back to the old method of generating the SSID and key. The following can be specified: * WiFI SSID * encryption mode * key * number of MAC addresses (not implemented in this commit) Signed-off-by: Andreas Gnau --- map-controller/files/etc/config/mapcontroller | 22 ++--- .../files/etc/uci-defaults/99-mapcntlr | 81 ++++++++++++++++++- 2 files changed, 88 insertions(+), 15 deletions(-) diff --git a/map-controller/files/etc/config/mapcontroller b/map-controller/files/etc/config/mapcontroller index 56e54e68a..3030bc837 100644 --- a/map-controller/files/etc/config/mapcontroller +++ b/map-controller/files/etc/config/mapcontroller @@ -33,27 +33,27 @@ config sta_steering config ap option band '2' - option ssid '$DEVICE_MANUFACTURER-$BASEMAC_ADDR' - option encryption 'sae-mixed' - option key '$WIFI_FH_KEY' + option ssid '$WIFI_FH_2G_SSID' + option encryption '$WIFI_FH_2G_ENCRYPTION' + option key '$WIFI_FH_2G_KEY' option vid '1' option type 'fronthaul' option mld_id '1' config ap option band '5' - option ssid '$DEVICE_MANUFACTURER-$BASEMAC_ADDR' - option encryption 'sae-mixed' - option key '$WIFI_FH_KEY' + option ssid '$WIFI_FH_5G_SSID' + option encryption '$WIFI_FH_5G_ENCRYPTION' + option key '$WIFI_FH_5G_KEY' option vid '1' option type 'fronthaul' option mld_id '1' config ap option band '6' - option ssid '$DEVICE_MANUFACTURER-$BASEMAC_ADDR' - option encryption 'sae' - option key '$WIFI_FH_KEY' + option ssid '$WIFI_FH_6G_SSID' + option encryption '$WIFI_FH_6G_ENCRYPTION' + option key '$WIFI_FH_6G_KEY' option vid '1' option type 'fronthaul' option mld_id '1' @@ -87,8 +87,8 @@ config ap config mld option id '1' - option ssid '$DEVICE_MANUFACTURER-$BASEMAC_ADDR' - option key '$WIFI_FH_KEY' + option ssid '$WIFI_FH_ALL_SSID' + option key '$WIFI_FH_ALL_KEY' # option vid '1' option type 'fronthaul' diff --git a/map-controller/files/etc/uci-defaults/99-mapcntlr b/map-controller/files/etc/uci-defaults/99-mapcntlr index c1020a082..e7ce96cc9 100644 --- a/map-controller/files/etc/uci-defaults/99-mapcntlr +++ b/map-controller/files/etc/uci-defaults/99-mapcntlr @@ -1,5 +1,7 @@ #!/bin/sh +. /usr/share/libubox/jshn.sh +CFG=/etc/board.json . /etc/device_info WIFI_BH_KEY=$(openssl rand -rand /dev/urandom -hex 64 2>/dev/null | openssl dgst -hex -sha256 | cut -d " " -f 2) @@ -8,11 +10,82 @@ WIFI_BH_KEY=${WIFI_BH_KEY::-1} BASEMAC_ADDR="$(fw_printenv -n ethaddr | tr -d ':' | tr 'a-z' 'A-Z')" [ ${#BASEMAC_ADDR} -eq 12 ] || BASEMAC_ADDR="$(db -q get device.deviceinfo.BaseMACAddress | tr -d ':')" -WIFI_FH_KEY="$(db get hw.board.wpa_key)" -WIFI_FH_KEY="${WIFI_FH_KEY:-1234567890}" +FALLBACK_SSID="$DEVICE_MANUFACTURER-$BASEMAC_ADDR" +FALLBACK_KEY="1234567890" +FALLBACK_2G_ENCRYPTION="sae-mixed" +FALLBACK_5G_ENCRYPTION="sae-mixed" +FALLBACK_6G_ENCRYPTION="sae" +FALLBACK_ALL_ENCRYPTION="sae-mixed" + +set_per_band_callback() { + local band="$2" + json_select "$band" + local ssid encryption key + json_get_vars ssid encryption key + case "$band" in + all|2g|5g|6g) + local band_upper="$(printf "%s" "$band" | tr 'a-z' 'A-Z')" + eval "export -- WIFI_FH_${band_upper}_SSID='$ssid'" + eval "export -- WIFI_FH_${band_upper}_ENCRYPTION='$encryption'" + eval "export -- WIFI_FH_${band_upper}_KEY='$key'" + ;; + esac + json_select .. +} + +set_vars_from_board_json() { + json_init + json_load_file "$CFG" + json_select wlan + json_select defaults + json_for_each_item set_per_band_callback ssids + json_cleanup +} + +set_in_priority() { + local destination="$1" + for alternative in $2 $3 $4 $5 $6 $7 $8 $9; do + eval "value=\${${alternative}}" + if [ -n "$value" ]; then + echo "Setting $destination to '$value' from \$$alternative" + eval "export -- ${destination}='$value'" + break + fi + done +} + +set_missing_vars_from_fallback() { + for band in ALL 2G 5G 6G; do + for what in SSID KEY; do + set_in_priority \ + WIFI_FH_${band}_${what} \ + WIFI_FH_${band}_${what} \ + WIFI_FH_ALL_${what} \ + FALLBACK_${what} + done + # Per band fallback variables for encryption because SAE is mandatory on 6 GHz + set_in_priority \ + WIFI_FH_${band}_ENCRYPTION \ + WIFI_FH_${band}_ENCRYPTION \ + FALLBACK_${band}_ENCRYPTION + done +} + +set_vars_from_board_json +set_missing_vars_from_fallback sed -i -e "s/\$BASEMAC_ADDR/$BASEMAC_ADDR/g" \ - -e "s/\$WIFI_FH_KEY/$WIFI_FH_KEY/g" \ + -e "s/\$WIFI_FH_2G_KEY/$WIFI_FH_2G_KEY/g" \ + -e "s/\$WIFI_FH_5G_KEY/$WIFI_FH_5G_KEY/g" \ + -e "s/\$WIFI_FH_6G_KEY/$WIFI_FH_6G_KEY/g" \ + -e "s/\$WIFI_FH_ALL_KEY/$WIFI_FH_ALL_KEY/g" \ + -e "s/\$WIFI_FH_2G_SSID/$WIFI_FH_2G_SSID/g" \ + -e "s/\$WIFI_FH_5G_SSID/$WIFI_FH_5G_SSID/g" \ + -e "s/\$WIFI_FH_6G_SSID/$WIFI_FH_6G_SSID/g" \ + -e "s/\$WIFI_FH_ALL_SSID/$WIFI_FH_ALL_SSID/g" \ + -e "s/\$WIFI_FH_2G_ENCRYPTION/$WIFI_FH_2G_ENCRYPTION/g" \ + -e "s/\$WIFI_FH_5G_ENCRYPTION/$WIFI_FH_5G_ENCRYPTION/g" \ + -e "s/\$WIFI_FH_6G_ENCRYPTION/$WIFI_FH_6G_ENCRYPTION/g" \ + -e "s/\$WIFI_FH_ALL_ENCRYPTION/$WIFI_FH_ALL_ENCRYPTION/g" \ -e "s/\$WIFI_BH_KEY/$WIFI_BH_KEY/g" \ - -e "s/\$DEVICE_MANUFACTURER/$DEVICE_MANUFACTURER/g" \ /etc/config/mapcontroller 2>/dev/null