From 3d9eb1db2ee31b343c6fd53309d72f7539249b75 Mon Sep 17 00:00:00 2001 From: Adrian Schmutzler Date: Sun, 16 Jun 2019 16:23:24 +0200 Subject: [PATCH] fff-hoods/fff-wireless: Reconfigure instead of delete and create MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, when configurehood switched status, all WiFi devices were completely rewritten and all interfaces were deleted and recreated. This is both unnecessary and ugly. This patch redesigns WiFi setup to create all interfaces (in parallel) initially, and then only to enable/disable them as necessary. Where reconfiguration is necessary, only the variable parts are changed. Since most of the wifi-device config is already created by OpenWrt, this builds based on the existing wifi-devices and only removes the default wifi-ifaces. This patch will not change the logic (codeflow) of configurehood, but only affects how action on the WiFi devices/interfaces is taken. Signed-off-by: Adrian Schmutzler Reviewed-by: Fabian Bläse --- src/packages/fff/fff-hoods/Makefile | 2 +- .../files/etc/uci-defaults/24c-fff-wXsta | 27 +++ .../files/usr/lib/functions/fff/hoodfile | 35 +-- .../fff-hoods/files/usr/sbin/configurehood | 88 +++---- src/packages/fff/fff-wireless/Makefile | 2 +- .../fff-wireless/files/etc/config/wireless | 0 .../files/etc/uci-defaults/60-fff-wireless | 90 ++++++-- .../files/lib/functions/fff/wireless | 218 +----------------- 8 files changed, 163 insertions(+), 299 deletions(-) create mode 100644 src/packages/fff/fff-hoods/files/etc/uci-defaults/24c-fff-wXsta delete mode 100644 src/packages/fff/fff-wireless/files/etc/config/wireless diff --git a/src/packages/fff/fff-hoods/Makefile b/src/packages/fff/fff-hoods/Makefile index 9b6abd57..11d2523b 100644 --- a/src/packages/fff/fff-hoods/Makefile +++ b/src/packages/fff/fff-hoods/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=fff-hoods -PKG_RELEASE:=5 +PKG_RELEASE:=6 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) diff --git a/src/packages/fff/fff-hoods/files/etc/uci-defaults/24c-fff-wXsta b/src/packages/fff/fff-hoods/files/etc/uci-defaults/24c-fff-wXsta new file mode 100644 index 00000000..e9867b98 --- /dev/null +++ b/src/packages/fff/fff-hoods/files/etc/uci-defaults/24c-fff-wXsta @@ -0,0 +1,27 @@ +#!/bin/sh + +. /lib/functions/fff/wireless + +# Set up wXsta +for radio in $(wifiListRadio); do + # wXsta: We can use $freq here, as the initial radios are not set up with auto + freq="$(wifiGetFreq $radio)" + + uci batch <<-__EOF__ + set network.configsta${freq}=interface + set network.configsta${freq}.proto='static' + + set wireless.w${freq}sta='wifi-iface' + set wireless.w${freq}sta.device='${radio}' + set wireless.w${freq}sta.network='configsta${freq}' + set wireless.w${freq}sta.ifname='w${freq}sta' + set wireless.w${freq}sta.mode='sta' + set wireless.w${freq}sta.ssid='config.franken.freifunk.net' + set wireless.w${freq}sta.disabled='1' + __EOF__ +done + +uci commit network +uci commit wireless + +# vim: set noexpandtab:tabstop=4 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 d4a9ecb2..9bc6a35d 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 @@ -13,33 +13,20 @@ getWirelessHoodfile() { # only change temporarily - if ! wifiDelIface; then - echo "Can't delete current wifi setup" - exit 1 - fi - #now we look for phy and add this - for phy in $(iw phy | awk '/^Wiphy/{ print $2 }'); do - radio="$(wifiAddPhyCond "$phy" "2" "auto")" - radio5="$(wifiAddPhyCond "$phy" "5" "auto5")" - if [ -n "$radio5" ] ; then - radio="$radio5" - staiface="w5sta" - else - staiface="w2sta" - fi + # Set channel to auto, enable wXsta, disable other interfaces + for radio in $(wifiListRadio); do + uci set "wireless.${radio}.channel=auto" - #and here we add the station - if ! wifiAddSta "$radio" "config.franken.freifunk.net" "configSta" "$staiface" ; then - echo "Can't add Sta interface on $radio." - exit 1 - else - uci -q set network.configSta=interface - uci -q set network.configSta.proto='static' - uci -q commit network - reload_config - fi + freq="$(wifiGetFreq $radio)" + uci set wireless.w${freq}ap.disabled='1' + uci set wireless.w${freq}mesh.disabled='1' + uci set wireless.w${freq}configap.disabled='1' + uci set wireless.w${freq}sta.disabled='0' done + uci commit wireless + reload_config + wifi # wait a moment to start the interface sleep 10; diff --git a/src/packages/fff/fff-hoods/files/usr/sbin/configurehood b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood index 0df41887..4b85ae46 100755 --- a/src/packages/fff/fff-hoods/files/usr/sbin/configurehood +++ b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood @@ -46,27 +46,17 @@ hasInternet() { if [ -s "$hoodfilewww" ] && isGatewayAvailable ; then needwifi="0" - for radio in $(uci show wireless | sed -n 's,.*\.\([a-z0-9]*\)=wifi-device,\1,p'); do - freq="2" - if [ "$(uci get "wireless.${radio}.channel")" -gt "14" ]; then - freq="5" - fi + for radio in $(wifiListRadio); do + freq="$(wifiGetFreq $radio)" + # Break: wXconfig is up - uci -q get "wireless.w${freq}configap" > /dev/null && continue + [ "$(uci get "wireless.w${freq}configap.disabled")" = "0" ] && continue # Break: No mesh interface - uci -q get "wireless.w${freq}mesh" > /dev/null || continue + [ "$(uci get "wireless.w${freq}mesh.disabled")" = "0" ] || continue - # Create configap - iface="configap$freq" - uci set network.${iface}=interface - uci set network.${iface}.proto='static' - uci set network.${iface}.ip6addr='fe80::1/64' - uci commit network - reload_config - if ! wifiAddAP "$radio" "config.franken.freifunk.net" "$iface" "configap" "1"; then - echo "Can't add Config interface on $radio." - exit 1 - fi + # Enable configap + uci set wireless.w${freq}configap.disabled='0' + uci commit wireless needwifi="1" done @@ -157,38 +147,50 @@ if [ -s "$hoodfiletmp" ]; then uci -q commit system reload_config - if ! wifiDelIface; then - echo "Can't delete current wifi setup" - exit 1 - fi + for radio in $(wifiListRadio); do + freq="$(wifiGetFreq $radio)" - for phy in $(iw phy | awk '/^Wiphy/{ print $2 }'); do - radio="$(wifiAddPhyCond "$phy" "2" "$chan2ghz")" - radio5="$(wifiAddPhyCond "$phy" "5" "$chan5ghz")" - [ -n "$radio5" ] && radio="$radio5" - - if ! wifiAddAP "$radio" "$essid" "mesh" "ap" "0"; then - echo "Can't add AP interface on $radio." - exit 1 + if [ "$freq" = "5" ]; then + uci set wireless.${radio}.channel="$chan5ghz" + mesh_type="$mesh_type5" + elif [ "$freq" = "2" ]; then + uci set wireless.${radio}.channel="$chan2ghz" + mesh_type="$mesh_type2" fi - # add 802.11s mesh if type = "802.11s" - if ( [ -n "$radio5" ] && [ "$mesh_type5" = "802.11s" ] ) || [ "$mesh_type2" = "802.11s" ]; then - if ! wifiAddMesh "$radio" "$mesh_id"; then - echo "Can't add Mesh interface on $radio." - exit 1 - fi - fi + # Disable wXsta, wXconfigap + uci set wireless.w${freq}sta.disabled='1' + uci set wireless.w${freq}configap.disabled='1' - # add IBSS mesh if type = "ibss" - if ( [ -n "$radio5" ] && [ "$mesh_type5" = "ibss" ] ) || [ "$mesh_type2" = "ibss" ]; then - if ! wifiAddAdHocMesh "$radio" "$mesh_essid" "$mesh_bssid"; then - echo "Can't add AdHocMesh interface on $radio." - exit 1 - fi + # Configure wXap + uci set wireless.w${freq}ap.ssid="$essid" + uci set wireless.w${freq}ap.disabled='0' + + # Configure 802.11s mesh if type = "802.11s" + if [ "$mesh_type" = "802.11s" ]; then + uci set wireless.w${freq}mesh.mode='mesh' + uci -q del wireless.w${freq}mesh.bssid + uci -q del wireless.w${freq}mesh.ssid + uci -q del wireless.w${freq}mesh.mcast_rate + uci set wireless.w${freq}mesh.mesh_id="$mesh_id" + uci set wireless.w${freq}mesh.mesh_fwding='0' + uci set wireless.w${freq}mesh.disabled='0' + # Configure IBSS mesh if type = "ibss" + elif [ "$mesh_type" = "ibss" ]; then + uci set wireless.w${freq}mesh.mode='adhoc' + uci -q del wireless.w${freq}mesh.mesh_id + uci -q del wireless.w${freq}mesh.mesh_fwding + uci set wireless.w${freq}mesh.bssid="$mesh_bssid" + uci set wireless.w${freq}mesh.ssid="$mesh_essid" + uci set wireless.w${freq}mesh.mcast_rate='6000' + uci set wireless.w${freq}mesh.disabled='0' + # Disable mesh by setting no mesh_type + else + uci set wireless.w${freq}mesh.disabled='1' fi done + uci commit wireless echo "Loading wifi" wifi diff --git a/src/packages/fff/fff-wireless/Makefile b/src/packages/fff/fff-wireless/Makefile index 5a478409..6c0b6a9b 100644 --- a/src/packages/fff/fff-wireless/Makefile +++ b/src/packages/fff/fff-wireless/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=fff-wireless -PKG_RELEASE:=7 +PKG_RELEASE:=8 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) diff --git a/src/packages/fff/fff-wireless/files/etc/config/wireless b/src/packages/fff/fff-wireless/files/etc/config/wireless deleted file mode 100644 index e69de29b..00000000 diff --git a/src/packages/fff/fff-wireless/files/etc/uci-defaults/60-fff-wireless b/src/packages/fff/fff-wireless/files/etc/uci-defaults/60-fff-wireless index 7e2fcf97..e0c4a14b 100644 --- a/src/packages/fff/fff-wireless/files/etc/uci-defaults/60-fff-wireless +++ b/src/packages/fff/fff-wireless/files/etc/uci-defaults/60-fff-wireless @@ -1,32 +1,80 @@ #!/bin/sh # Copyright 2016 Tim Niemeyer +# Copyright 2019 Adrian Schmutzler # License GPLv3 +. /lib/functions.sh . /lib/functions/fff/wireless -if ! wifiDelAll; then - echo "Can't delete current wifi setup" - exit 1 -fi +removeWifiIface() { + local name="$1" + uci del "wireless.$name" +} -for phy in $(iw phy | awk '/^Wiphy/{ print $2 }'); do - radio="$(wifiAddPhyCond "$phy" "2" "1")" - radio5="$(wifiAddPhyCond "$phy" "5" "36")" - [ -n "$radio5" ] && radio="$radio5" - if [ -z "$radio" ] ; then - echo "Can't create radio for $phy" - exit 1 - fi +configWifiDevice() { + local radio="$1" + local freq="$(wifiGetFreq $radio)" - if ! wifiAddAP "$radio" "do.not.use" "mesh" "ap" "0" ; then - echo "Can't add AP interface on $radio." - exit 1 - fi + [ "$freq" = "2" ] && uci set "wireless.${radio}.legacy_rates=0" - if ! wifiAddMesh "$radio" "mesh.do.not.use" ; then - echo "Can't add Mesh interface on $radio." - exit 1 - fi -done + # Comments + # wXmesh: use 802.11s mesh as "default" + + uci batch <<-__EOF__ + set wireless.${radio}.htmode='HT20' + set wireless.${radio}.country='DE' + set wireless.${radio}.disabled='0' + + set wireless.w${freq}ap='wifi-iface' + set wireless.w${freq}ap.device='${radio}' + set wireless.w${freq}ap.network='mesh' + set wireless.w${freq}ap.ifname='w${freq}ap' + set wireless.w${freq}ap.mode='ap' + set wireless.w${freq}ap.ssid='noservice.freifunk' + set wireless.w${freq}ap.encryption='none' + set wireless.w${freq}ap.hidden='0' + set wireless.w${freq}ap.disabled='0' + + set network.w${freq}mesh='interface' + set network.w${freq}mesh.mtu='1560' + set network.w${freq}mesh.proto='batadv' + set network.w${freq}mesh.mesh='bat0' + + set wireless.w${freq}mesh='wifi-iface' + set wireless.w${freq}mesh.device='${radio}' + set wireless.w${freq}mesh.network='w${freq}mesh' + set wireless.w${freq}mesh.ifname='w${freq}mesh' + set wireless.w${freq}mesh.mode='mesh' + set wireless.w${freq}mesh.mesh_id='nomesh.freifunk' + set wireless.w${freq}mesh.encryption='none' + set wireless.w${freq}mesh.mesh_fwding=0 + set wireless.w${freq}mesh.disabled='0' + + set network.configap${freq}=interface + set network.configap${freq}.proto='static' + set network.configap${freq}.ip6addr='fe80::1/64' + + set wireless.w${freq}configap='wifi-iface' + set wireless.w${freq}configap.device='${radio}' + set wireless.w${freq}configap.network='configap${freq}' + set wireless.w${freq}configap.ifname='w${freq}configap' + set wireless.w${freq}configap.mode='ap' + set wireless.w${freq}configap.ssid='config.franken.freifunk.net' + set wireless.w${freq}configap.encryption='none' + set wireless.w${freq}configap.hidden='1' + set wireless.w${freq}configap.disabled='1' + __EOF__ +} + +# Remove WiFi config +config_load wireless +config_foreach removeWifiIface wifi-iface + +# Set up WiFi devices and interfaces, but leave the latter disabled +config_load wireless +config_foreach configWifiDevice wifi-device + +uci commit network +uci commit wireless # vim: set noexpandtab:tabstop=4 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 ae16d2d2..c531e077 100644 --- a/src/packages/fff/fff-wireless/files/lib/functions/fff/wireless +++ b/src/packages/fff/fff-wireless/files/lib/functions/fff/wireless @@ -1,229 +1,29 @@ # Copyright 2016 Tim Niemeyer # License GPLv3 -wifiDelAll() { +wifiListRadio() { if [ $# -ne "0" ] then - echo "Usage: wifiDelAll" + echo "Usage: wifiListRadio" return 1 fi - > /etc/config/wireless - + uci show wireless | sed -n 's,.*\.\([a-z0-9]*\)=wifi-device,\1,p' return 0 } -wifiDelIface() { - if [ $# -ne "0" ] +wifiGetFreq() { + if [ $# -ne "1" ] then - echo "Usage: wifiDelIface" - return 1 - fi - - grep 'config wifi-iface' /etc/config/wireless | sed -n -e "s/.*'\([^']*\)'.*/\1/p" | while read -r line ; do - uci -q delete "wireless.$line" - done - uci -q commit wireless - - return 0 -} - -wifiAddPhy() { - if [ $# -ne "2" ] - then - echo "Usage: wifiAddPhy " - return 1 - fi - - local phy=$1 - local channel=$2 - local radio="radio$(echo "$phy" | tr -d -C "0-9")" - local hwmode="11g" - if [ "$channel" = "auto5" ] ; then - hwmode="11a" - channel="auto" - elif ( ! [ "$channel" = "auto" ] ) && [ "$channel" -gt "14" ]; then - hwmode="11a" - fi - - uci batch <<-__EOF__ - set wireless.${radio}='wifi-device' - set wireless.${radio}.type='mac80211' - set wireless.${radio}.channel='${channel}' - set wireless.${radio}.phy='${phy}' - set wireless.${radio}.hwmode='${hwmode}' - set wireless.${radio}.htmode='HT20' - set wireless.${radio}.country='DE' - __EOF__ - if [ "$hwmode" = "11g" ]; then - uci batch <<-__EOF__ - set wireless.${radio}.legacy_rates='0' - __EOF__ - fi - uci commit wireless - - echo "${radio}" - return 0 -} - -wifiAddPhyCond() { - if [ $# -ne "3" ] - then - return 1 - fi - - local phy=$1 - local freq=$2 - local channel=$3 - local radio="" - - if iw phy "$phy" info | grep -q -m1 "${freq}... MHz"; then - radio="$(wifiAddPhy "$phy" "$channel")" - if [ -z "$radio" ]; then - return 1 - fi - fi - - echo "$radio" - return 0 # also returns success if outermost if is false -} - -wifiAddAdHocMesh() { - if [ $# -ne "3" ] - then - echo "Usage: wifiAddAdHocMesh " + echo "Usage: wifiGetFreq " return 1 fi local radio=$1 - local essid=$2 - local bssid=$3 - local channel=$(uci get "wireless.${radio}.channel") - local iface="w2mesh" - if [ "$channel" -gt "14" ]; then - iface="w5mesh" - fi - - uci batch <<-__EOF__ - set wireless.${iface}='wifi-iface' - set wireless.${iface}.device='${radio}' - set wireless.${iface}.network='${iface}' - set wireless.${iface}.ifname='${iface}' - set wireless.${iface}.mode='adhoc' - set wireless.${iface}.bssid='${bssid}' - set wireless.${iface}.ssid='${essid}' - set wireless.${iface}.mcast_rate='6000' - set wireless.${iface}.encryption='none' - commit wireless - - set network.${iface}='interface' - set network.${iface}.mtu='1528' - set network.${iface}.proto='batadv' - set network.${iface}.mesh='bat0' - commit network - __EOF__ - - echo "${iface}" - return 0 -} - -wifiAddAP() { - if [ $# -ne "5" ] - then - echo "Usage: wifiAddAP " - return 1 - fi - - local radio=$1 - local essid=$2 - local network=$3 - local inface=$4 - local hidden=$5 - - local channel=$(uci get "wireless.${radio}.channel") - local iface="w2${inface}" - if [ "$channel" -gt "14" ]; then - iface="w5${inface}" - fi - uci batch <<-__EOF__ - set wireless.${iface}='wifi-iface' - set wireless.${iface}.device='${radio}' - set wireless.${iface}.network='${network}' - set wireless.${iface}.ifname='${iface}' - set wireless.${iface}.mode='ap' - set wireless.${iface}.ssid='${essid}' - set wireless.${iface}.encryption='none' - set wireless.${iface}.hidden='${hidden}' - - commit wireless - __EOF__ - - echo "${iface}" - return 0 -} - -wifiAddSta() { - if [ $# -ne "4" ] - then - echo "Usage: wifiAddSta " - return 1 - fi - - local radio=$1 - local essid=$2 - local network=$3 - local iface=$4 - - uci batch <<-__EOF__ - set wireless.${iface}='wifi-iface' - set wireless.${iface}.device='${radio}' - set wireless.${iface}.network='${network}' - set wireless.${iface}.ifname='${iface}' - set wireless.${iface}.mode='sta' - set wireless.${iface}.ssid='${essid}' - - commit wireless - __EOF__ - - echo "${iface}" - return 0 -} - -wifiAddMesh() { - if [ $# -ne "2" ] - then - echo "Usage: wifiAddMesh " - return 1 - fi - - local radio=$1 - local mesh_id=$2 - - local channel=$(uci get "wireless.${radio}.channel") - local iface="w2mesh" - if [ "$channel" -gt "14" ]; then - iface="w5mesh" - fi - uci batch <<-__EOF__ - set wireless.${iface}='wifi-iface' - set wireless.${iface}.device='${radio}' - set wireless.${iface}.network='${iface}' - set wireless.${iface}.ifname='${iface}' - set wireless.${iface}.mode='mesh' - set wireless.${iface}.mesh_id='${mesh_id}' - set wireless.${iface}.encryption='none' - set wireless.${iface}.mesh_fwding=0 - commit wireless - - set network.${iface}='interface' - set network.${iface}.mtu='1560' - set network.${iface}.proto='batadv' - set network.${iface}.mesh='bat0' - commit network - __EOF__ - - echo "${iface}" + # Use hwmode for switching, since this is always set by firmware (effectively hard-coded) + # Do not use channel, as this might be "auto" for both + [ "$(uci get "wireless.${radio}.hwmode")" = "11a" ] && echo "5" || echo "2" return 0 } # vim: set noexpandtab:tabstop=4