mac80211: distance config: allow "auto" as a value
[openwrt/openwrt.git] / package / kernel / mac80211 / files / lib / netifd / wireless / mac80211.sh
index 1ebdceaab8a8cdc605a423ecedfdef3774c655b8..88751ce3ccea99f32ebd39a9b34012779274a8ae 100644 (file)
@@ -28,8 +28,9 @@ drv_mac80211_init_device_config() {
        config_add_string path phy 'macaddr:macaddr'
        config_add_string hwmode
        config_add_string tx_burst
+       config_add_string distance
        config_add_int beacon_int chanbw frag rts
-       config_add_int rxantenna txantenna antenna_gain txpower distance
+       config_add_int rxantenna txantenna antenna_gain txpower
        config_add_boolean noscan ht_coex acs_exclude_dfs
        config_add_array ht_capab
        config_add_array channels
@@ -590,7 +591,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 +614,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 +771,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 +928,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 +959,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 +971,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 +1040,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