From b5516603dd90215d5cdc5bac7ea496a6c758bb0f Mon Sep 17 00:00:00 2001 From: John Crispin Date: Tue, 28 Apr 2020 16:10:26 +0200 Subject: [PATCH] mac80211: more wifi reconf related fixes * uci state was not getting reset properly during teardown * AP+STA co-exist state was not flushed properly upon channel switch * remove a debug logger call * properly teardown supplicant instances when they get disabled * add md5 config support for supplicant * don't call wpa_supplicant_prepare_interface twice Signed-off-by: John Crispin --- .../files/lib/netifd/wireless/mac80211.sh | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh index 1ebdceaab8..ab2c6ad38d 100644 --- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh +++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh @@ -590,7 +590,13 @@ mac80211_setup_supplicant() { local add_sp=0 local spobj="$(ubus -S list | grep wpa_supplicant.${ifname})" - wpa_supplicant_prepare_interface "$ifname" nl80211 || return 1 + [ "$enable" = 0 ] && { + ubus call wpa_supplicant.${phy} config_del "{\"iface\":\"$ifname\"}" + ip link set dev "$ifname" down + iw dev "$ifname" del + return 0 + } + wpa_supplicant_prepare_interface "$ifname" nl80211 || { iw dev "$ifname" del return 1 @@ -607,18 +613,17 @@ mac80211_setup_supplicant() { [ "$spobj" ] && ubus call wpa_supplicant config_remove "{\"iface\":\"$ifname\"}" add_sp=1 fi - [ "$enable" = 0 ] && { - ubus call wpa_supplicant config_remove "{\"iface\":\"$ifname\"}" - ip link set dev "$ifname" down - return 0 - } [ -z "$spobj" ] && add_sp=1 + NEW_MD5_SP=$(test -e "${_config}" && md5sum ${_config}) + OLD_MD5_SP=$(uci -q -P /var/state get wireless._${phy}.md5_${ifname}) if [ "$add_sp" = "1" ]; then wpa_supplicant_run "$ifname" "$hostapd_ctrl" else - ubus call $spobj reload + [ "${NEW_MD5_SP}" == "${OLD_MD5_SP}" ] || ubus call $spobj reload fi + uci -q -P /var/state set wireless._${phy}.md5_${ifname}="${NEW_MD5_SP}" + return 0 } mac80211_setup_supplicant_noctl() { @@ -765,7 +770,6 @@ mac80211_setup_vif() { [ "$vif_enable" = 1 ] || action=down if [ "$mode" != "ap" ] || [ "$ifname" = "$ap_ifname" ]; then - logger ip link set dev "$ifname" $action ip link set dev "$ifname" "$action" || { wireless_setup_vif_failed IFUP_ERROR json_select .. @@ -923,8 +927,8 @@ drv_mac80211_setup() { [ "$rxantenna" = "all" ] && rxantenna=0xffffffff iw phy "$phy" set antenna $txantenna $rxantenna >/dev/null 2>&1 - iw phy "$phy" set antenna_gain $antenna_gain - iw phy "$phy" set distance "$distance" + iw phy "$phy" set antenna_gain $antenna_gain >/dev/null 2>&1 + iw phy "$phy" set distance "$distance" >/dev/null 2>&1 if [ -n "$txpower" ]; then iw phy "$phy" set txpower fixed "${txpower%%.*}00" @@ -954,8 +958,8 @@ drv_mac80211_setup() { OLD_MD5=$(uci -q -P /var/state get wireless._${phy}.md5) if [ "${NEWAPLIST}" != "${OLDAPLIST}" ]; then mac80211_vap_cleanup hostapd "${OLDAPLIST}" - [ -n "${NEWAPLIST}" ] && mac80211_iw_interface_add "$phy" "${NEWAPLIST%% *}" __ap || return fi + [ -n "${NEWAPLIST}" ] && mac80211_iw_interface_add "$phy" "${NEWAPLIST%% *}" __ap local add_ap=0 local primary_ap=${NEWAPLIST%% *} [ -n "$hostapd_ctrl" ] && { @@ -966,7 +970,11 @@ drv_mac80211_setup() { no_reload=$? if [ "$no_reload" != "0" ]; then mac80211_vap_cleanup hostapd "${OLDAPLIST}" - [ -n "${NEWAPLIST}" ] && mac80211_iw_interface_add "$phy" "${NEWAPLIST%% *}" __ap || return + mac80211_vap_cleanup wpa_supplicant "$(uci -q -P /var/state get wireless._${phy}.splist)" + mac80211_vap_cleanup none "$(uci -q -P /var/state get wireless._${phy}.umlist)" + sleep 2 + mac80211_iw_interface_add "$phy" "${NEWAPLIST%% *}" __ap + for_each_interface "sta adhoc mesh monitor" mac80211_prepare_vif fi } fi @@ -1031,12 +1039,10 @@ list_phy_interfaces() { drv_mac80211_teardown() { wireless_process_kill_all - json_select data - json_get_vars phy - json_select .. - - mac80211_interface_cleanup "$phy" - uci -q -P /var/state revert wireless._${phy} + for phy in `ls /sys/class/ieee80211/`; do + mac80211_interface_cleanup "$phy" + uci -q -P /var/state revert wireless._${phy} + done } add_driver mac80211