[OpenWrt-Devel] [PATCH] mac80211: more wifi reconf related fixes

John Crispin john at phrozen.org
Tue Apr 28 10:31:42 EDT 2020


* 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 <john at phrozen.org>
---
 .../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
-- 
2.20.1


_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list