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
local type="$3"
local wdsflag="$4"
local rc
+ local oldifname
- iw phy "$phy" interface add "$ifname" type "$type" $wdsflag
+ iw phy "$phy" interface add "$ifname" type "$type" $wdsflag >/dev/null 2>&1
rc="$?"
[ "$rc" = 233 ] && {
# Device might have just been deleted, give the kernel some time to finish cleaning it up
sleep 1
- iw phy "$phy" interface add "$ifname" type "$type" $wdsflag
+ iw phy "$phy" interface add "$ifname" type "$type" $wdsflag >/dev/null 2>&1
rc="$?"
}
[ "$rc" = 233 ] && {
# Keep matching pre-existing interface
[ -d "/sys/class/ieee80211/${phy}/device/net/${ifname}" ] && \
- case "$(iw dev wlan0 info | grep "^\ttype" | cut -d' ' -f2- 2>/dev/null)" in
+ case "$(iw dev $ifname info | grep "^\ttype" | cut -d' ' -f2- 2>/dev/null)" in
"AP")
[ "$type" = "__ap" ] && rc=0
;;
}
[ "$rc" = 233 ] && {
- iw dev "$ifname" del
- sleep 1
+ iw dev "$ifname" del >/dev/null 2>&1
+ [ "$?" = 0 ] && {
+ sleep 1
- iw phy "$phy" interface add "$ifname" type "$type" $wdsflag
- rc="$?"
+ iw phy "$phy" interface add "$ifname" type "$type" $wdsflag >/dev/null 2>&1
+ rc="$?"
+ }
}
- [ "$rc" = 233 ] && {
+ [ "$rc" != 0 ] && {
# Device might not support virtual interfaces, so the interface never got deleted in the first place.
# Check if the interface already exists, and avoid failing in this case.
- ip link show dev "$ifname" >/dev/null 2>/dev/null && rc=0
+ [ -d "/sys/class/ieee80211/${phy}/device/net/${ifname}" ] && rc=0
+ }
+
+ [ "$rc" != 0 ] && {
+ # Device doesn't support virtual interfaces and may have existing interface other than ifname.
+ oldifname="$(basename "/sys/class/ieee80211/${phy}/device/net"/* 2>/dev/null)"
+ [ "$oldifname" ] && ip link set "$oldifname" name "$ifname" 1>/dev/null 2>&1
+ rc="$?"
}
[ "$rc" != 0 ] && wireless_setup_failed INTERFACE_CREATION_FAILED
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
NEWSPLIST="${NEWSPLIST}$ifname "
if [ "${NEWAPLIST%% *}" != "${OLDAPLIST%% *}" ]; then
- [ "$spobj" ] && ubus call wpa_supplicant.${phy} config_del "{\"iface\":\"$ifname\"}"
+ [ "$spobj" ] && ubus call wpa_supplicant config_remove "{\"iface\":\"$ifname\"}"
add_sp=1
fi
- [ "$enable" = 0 ] && {
- ubus call wpa_supplicant.${phy} config_del "{\"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() {
NEWSPLIST="${NEWSPLIST}$ifname "
[ "$enable" = 0 ] && {
- ubus call wpa_supplicant.${phy} config_del "{\"iface\":\"$ifname\"}"
+ ubus call wpa_supplicant config_remove "{\"iface\":\"$ifname\"}"
ip link set dev "$ifname" down
return 0
}
[ "$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 ..
local vaps="$2"
for wdev in $vaps; do
- [ "$service" != "none" ] && ubus call ${service}.${phy} config_remove "{\"iface\":\"$wdev\"}"
+ [ "$service" != "none" ] && ubus call ${service} config_remove "{\"iface\":\"$wdev\"}"
ip link set dev "$wdev" down 2>/dev/null
iw dev "$wdev" del
done
[ "$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"
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" ] && {
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
if [ "$no_reload" != "0" ]; then
add_ap=1
- ubus wait_for hostapd.$phy
- ubus call hostapd.${phy} config_add "{\"iface\":\"$primary_ap\", \"config\":\"${hostapd_conf_file}\"}"
- local hostapd_pid=$(ubus call service list '{"name": "hostapd"}' | jsonfilter -l 1 -e "@['hostapd'].instances['hostapd-${phy}'].pid")
+ ubus wait_for hostapd
+ ubus call hostapd config_add "{\"iface\":\"$primary_ap\", \"config\":\"${hostapd_conf_file}\"}"
+ local hostapd_pid=$(ubus call service list '{"name": "hostapd"}' | jsonfilter -l 1 -e "@['hostapd'].instances['hostapd'].pid")
wireless_add_process "$hostapd_pid" "/usr/sbin/hostapd" 1
fi
ret="$?"
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