From 6b1089f2e95e5afa88ebf5b484198480992b2c41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Bl=C3=A4se?= Date: Thu, 28 Jul 2022 19:14:58 +0200 Subject: [PATCH] WIP: owe --- bsp/ath79-generic/.config | 2 - .../files/usr/lib/functions/fff/hoodfile | 4 + .../fff-hoods/files/usr/sbin/configurehood | 8 ++ .../fff-wireless/files/etc/layer3.d/28-wifi | 8 ++ .../files/etc/uci-defaults/24a-fff-wireless | 23 +++++ .../files/lib/functions/fff/wireless | 92 +++++++++++++++++++ 6 files changed, 135 insertions(+), 2 deletions(-) diff --git a/bsp/ath79-generic/.config b/bsp/ath79-generic/.config index 67c0f578..1aeab84a 100644 --- a/bsp/ath79-generic/.config +++ b/bsp/ath79-generic/.config @@ -80,11 +80,9 @@ CONFIG_CLEAN_IPKG=y # CONFIG_FASTD_ENABLE_METHOD_GENERIC_UMAC is not set CONFIG_KERNEL_SQUASHFS_FRAGMENT_CACHE_SIZE=1 # CONFIG_PACKAGE_ALFRED_VIS is not set -CONFIG_PACKAGE_hostapd-mini=y CONFIG_PACKAGE_iwinfo=m CONFIG_PACKAGE_libiwinfo=m CONFIG_PACKAGE_opkg=m -CONFIG_PACKAGE_wpad-mini=m CONFIG_PACKAGE_ath10k-firmware-qca9887=m CONFIG_PACKAGE_ath10k-firmware-qca9888=m CONFIG_PACKAGE_ath10k-firmware-qca988x=m diff --git a/src/packages/fff/fff-hoods/files/usr/lib/functions/fff/hoodfile b/src/packages/fff/fff-hoods/files/usr/lib/functions/fff/hoodfile index 8755a73f..1a21832e 100644 --- a/src/packages/fff/fff-hoods/files/usr/lib/functions/fff/hoodfile +++ b/src/packages/fff/fff-hoods/files/usr/lib/functions/fff/hoodfile @@ -19,6 +19,10 @@ getWirelessHoodfile() { uci set wireless.w${freq}ap.disabled='1' uci set wireless.w${freq}mesh.disabled='1' uci set wireless.w${freq}configap.disabled='1' + + if uci -q get wireless.w${freq}owe >/dev/null; then + uci set wireless.w${freq}owe.disabled='1' + fi done uci commit wireless diff --git a/src/packages/fff/fff-hoods/files/usr/sbin/configurehood b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood index 67c47f12..98b5d4f0 100755 --- a/src/packages/fff/fff-hoods/files/usr/sbin/configurehood +++ b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood @@ -134,6 +134,14 @@ if [ -s "$hoodfiletmp" ]; then uci set wireless.w${freq}ap.ssid="$essid" uci set wireless.w${freq}ap.disabled='0' + # Configure wXowe + if uci -q get wireless.w${freq}owe >/dev/null; then + uci set wireless.w${freq}owe.ssid="${essid}_OWE" + uci set wireless.w${freq}owe.owe_transition_ssid="$essid" + uci set wireless.w${freq}ap.owe_transition_ssid="${essid}_OWE" + uci set wireless.w${freq}owe.disabled='0' + fi + # Configure 802.11s mesh if type = "802.11s" if [ "$mesh_type" = "802.11s" ]; then uci set wireless.w${freq}mesh.mode='mesh' diff --git a/src/packages/fff/fff-wireless/files/etc/layer3.d/28-wifi b/src/packages/fff/fff-wireless/files/etc/layer3.d/28-wifi index dd2a649a..3cdcb6fb 100644 --- a/src/packages/fff/fff-wireless/files/etc/layer3.d/28-wifi +++ b/src/packages/fff/fff-wireless/files/etc/layer3.d/28-wifi @@ -41,10 +41,18 @@ configure() { # set essid uci set wireless.w${freq}ap.ssid="$essid" + + # owe stuff (TODO: check if ssid is too long, add owe variable) + if uci -q get wireless.w${freq}owe >/dev/null; then + uci set wireless.w${freq}owe.ssid="${essid}_OWE" + uci set wireless.w${freq}owe.owe_transition_ssid="$essid" + uci set wireless.w${freq}ap.owe_transition_ssid="${essid}_OWE" + fi fi # enable or disable ap interface appropriately. The radios 'disabled'-option is not touched uci set wireless.w${freq}ap.disabled="$disabled" + uci set wireless.w${freq}owe.disabled="$disabled" done } diff --git a/src/packages/fff/fff-wireless/files/etc/uci-defaults/24a-fff-wireless b/src/packages/fff/fff-wireless/files/etc/uci-defaults/24a-fff-wireless index bc1bff69..0e8d37c6 100644 --- a/src/packages/fff/fff-wireless/files/etc/uci-defaults/24a-fff-wireless +++ b/src/packages/fff/fff-wireless/files/etc/uci-defaults/24a-fff-wireless @@ -14,6 +14,7 @@ removeWifiIface() { configWifiDevice() { local radio="$1" local freq="$(wifiGetFreq $radio)" + local path=$(uci get wireless.${radio}.path) [ "$freq" = "2" ] && uci set "wireless.${radio}.legacy_rates=0" @@ -38,6 +39,7 @@ configWifiDevice() { set wireless.w${freq}ap.encryption='none' set wireless.w${freq}ap.hidden='0' set wireless.w${freq}ap.disabled='0' + set wireless.w${freq}ap.macaddr='$(wifiGetMacIndex "$path" 1)' set network.w${freq}mesh='interface' set network.w${freq}mesh.mtu='1560' @@ -53,6 +55,7 @@ configWifiDevice() { set wireless.w${freq}mesh.encryption='none' set wireless.w${freq}mesh.mesh_fwding=0 set wireless.w${freq}mesh.disabled='0' + set wireless.w${freq}mesh.macaddr='$(wifiGetMacIndex "$path" 0)' set network.configap${freq}=interface set network.configap${freq}.proto='static' @@ -67,7 +70,27 @@ configWifiDevice() { set wireless.w${freq}configap.encryption='none' set wireless.w${freq}configap.hidden='1' set wireless.w${freq}configap.disabled='1' + set wireless.w${freq}configap.macaddr='$(wifiGetMacIndex "$path" 2)' __EOF__ + + if wifiRadioSupportsOWE "$path"; then + uci batch <<-__EOF__ + set wireless.w${freq}owe='wifi-iface' + set wireless.w${freq}owe.device='${radio}' + set wireless.w${freq}owe.network='client' + set wireless.w${freq}owe.ifname='w${freq}owe' + set wireless.w${freq}owe.mode='ap' + set wireless.w${freq}owe.ssid='noservice.freifunk_OWE' + set wireless.w${freq}owe.encryption='owe' + set wireless.w${freq}owe.hidden='1' + set wireless.w${freq}owe.disabled='1' + set wireless.w${freq}owe.macaddr='$(wifiGetMacIndex "$path" 3)' + set wireless.w${freq}owe.owe_transition_ssid='noservice.freifunk' + set wireless.w${freq}owe.owe_transition_bssid='$(wifiGetMacIndex "$path" 1)' + set wireless.w${freq}ap.owe_transition_ssid='noservice.freifunk_OWE' + set wireless.w${freq}ap.owe_transition_bssid='$(wifiGetMacIndex "$path" 3)' + __EOF__ + fi } # Remove WiFi config diff --git a/src/packages/fff/fff-wireless/files/lib/functions/fff/wireless b/src/packages/fff/fff-wireless/files/lib/functions/fff/wireless index f57b354a..08a5c612 100644 --- a/src/packages/fff/fff-wireless/files/lib/functions/fff/wireless +++ b/src/packages/fff/fff-wireless/files/lib/functions/fff/wireless @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-3.0-only # # Copyright 2016 Tim Niemeyer +# Copyright 2022 Fabian Bläse wifiListRadio() { if [ $# -ne "0" ] @@ -27,4 +28,95 @@ wifiGetFreq() { [ "$(uci get "wireless.${radio}.band")" = "5g" ] && echo "5" || echo "2" return 0 } + +wifiRadioSupportsOWE() { + if [ $# -ne "1" ] + then + echo "Usage: wifiGetMacIndexDriver " + return 1 + fi + + local phy=$(ls /sys/devices/$1/ieee80211/ | head -n1) + [ -n "$phy" ] || return 1 + + local file="/sys/kernel/debug/ieee80211/$phy/hwflags" + + grep -q "MFP_CAPABLE" "$file" || return 1 + + return 0 +} + +wifiGetMacIndexDriver() { + # adopted from OpenWrt: /lib/netifd/wireless/mac80211.sh -> mac80211_get_addr() + + if [ $# -ne "2" ] + then + echo "Usage: wifiGetMacIndexDriver " + return 1 + fi + + local phy="$1" + local idx="$(($2 + 1))" + + head -n $idx /sys/class/ieee80211/${phy}/addresses | tail -n1 + + return 0 +} + +wifiGetMacIndex() { + # adopted from OpenWrt: /lib/netifd/wireless/mac80211.sh -> mac80211_generate_mac() + + if [ $# -ne "2" ] + then + echo "Usage: wifiGetMacIndex " + return 1 + fi + + local phy=$(ls /sys/devices/$1/ieee80211/ | head -n1) + local id="$2" + + [ -n "$phy" ] || return 1 + + local ref="$(cat /sys/class/ieee80211/${phy}/macaddress)" + local mask="$(cat /sys/class/ieee80211/${phy}/address_mask)" + + [ "$mask" = "00:00:00:00:00:00" ] && { + mask="ff:ff:ff:ff:ff:ff"; + + [ "$(wc -l < /sys/class/ieee80211/${phy}/addresses)" -gt $id ] && { + addr="$(wifiGetMacIndexDriver "$phy" "$id")" + [ -n "$addr" ] && { + echo "$addr" + return 0 + } + } + } + + local oIFS="$IFS"; IFS=":"; set -- $mask; IFS="$oIFS" + + local mask1=$1 + local mask6=$6 + + local oIFS="$IFS"; IFS=":"; set -- $ref; IFS="$oIFS" + + macidx=$(($id + 1)) + [ "$((0x$mask1))" -gt 0 ] && { + b1="0x$1" + [ "$id" -gt 0 ] && \ + b1=$(($b1 ^ ((($id - !($b1 & 2)) << 2)) | 0x2)) + printf "%02x:%s:%s:%s:%s:%s" $b1 $2 $3 $4 $5 $6 + return + } + [ "$((0x$mask6))" -lt 255 ] && { + printf "%s:%s:%s:%s:%s:%02x" $1 $2 $3 $4 $5 $(( 0x$6 ^ $id )) + return + } + off2=$(( (0x$6 + $id) / 0x100 )) + printf "%s:%s:%s:%s:%02x:%02x" \ + $1 $2 $3 $4 \ + $(( (0x$5 + $off2) % 0x100 )) \ + $(( (0x$6 + $id) % 0x100 )) + + return 0 +} # vim: set noexpandtab:tabstop=4