X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=package%2Fkernel%2Fmac80211%2Ffiles%2Flib%2Fnetifd%2Fwireless%2Fmac80211.sh;h=88751ce3ccea99f32ebd39a9b34012779274a8ae;hb=a8a1ef856871dc8403ea9c0a3bb347c7120b0e65;hp=b0fc5fb37be3970801572bd1547e63ae2e8c0313;hpb=b1a1c222c93bb4e8f2d2e13f50fe6329e523ae3b;p=openwrt%2Fopenwrt.git diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh index b0fc5fb37b..88751ce3cc 100644 --- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh +++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh @@ -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 @@ -62,6 +63,7 @@ drv_mac80211_init_iface_config() { config_add_string 'macaddr:macaddr' ifname config_add_boolean wds powersave enable + config_add_string wds_bridge config_add_int maxassoc config_add_int max_listen_int config_add_int dtim_period @@ -328,6 +330,8 @@ $base_cfg EOF json_select .. + radio_md5sum=$(md5sum $hostapd_conf_file | cut -d" " -f1) + echo "radio_config_id=${radio_md5sum}" >> $hostapd_conf_file } mac80211_hostapd_setup_bss() { @@ -340,12 +344,15 @@ mac80211_hostapd_setup_bss() { append hostapd_cfg "$type=$ifname" "$N" hostapd_set_bss_options hostapd_cfg "$vif" || return 1 - json_get_vars wds dtim_period max_listen_int start_disabled + json_get_vars wds wds_bridge dtim_period max_listen_int start_disabled set_default wds 0 set_default start_disabled 0 - [ "$wds" -gt 0 ] && append hostapd_cfg "wds_sta=1" "$N" + [ "$wds" -gt 0 ] && { + append hostapd_cfg "wds_sta=1" "$N" + [ -n "$wds_bridge" ] && append hostapd_cfg "wds_bridge=$wds_bridge" "$N" + } [ "$staidx" -gt 0 -o "$start_disabled" -eq 1 ] && append hostapd_cfg "start_disabled=1" "$N" cat >> /var/run/hostapd-$phy.conf </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 ;; @@ -469,17 +477,26 @@ mac80211_iw_interface_add() { } [ "$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 @@ -527,6 +544,7 @@ mac80211_prepare_vif() { NEWAPLIST="${NEWAPLIST}$ifname " [ -n "$hostapd_ctrl" ] || { + ap_ifname="${ifname}" hostapd_ctrl="${hostapd_ctrl:-/var/run/hostapd/$ifname}" } ;; @@ -573,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 @@ -587,21 +611,20 @@ mac80211_setup_supplicant() { 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() { @@ -616,7 +639,7 @@ 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 } @@ -747,13 +770,14 @@ mac80211_setup_vif() { json_get_var vif_enable enable 1 [ "$vif_enable" = 1 ] || action=down - logger ip link set dev "$ifname" $action - ip link set dev "$ifname" "$action" || { - wireless_setup_vif_failed IFUP_ERROR - json_select .. - return - } - [ -z "$vif_txpower" ] || iw dev "$ifname" set txpower fixed "${vif_txpower%%.*}00" + if [ "$mode" != "ap" ] || [ "$ifname" = "$ap_ifname" ]; then + ip link set dev "$ifname" "$action" || { + wireless_setup_vif_failed IFUP_ERROR + json_select .. + return + } + [ -z "$vif_txpower" ] || iw dev "$ifname" set txpower fixed "${vif_txpower%%.*}00" + fi case "$mode" in mesh) @@ -805,7 +829,7 @@ mac80211_vap_cleanup() { 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 @@ -890,7 +914,7 @@ drv_mac80211_setup() { staidx=0 [ -n "$chanbw" ] && { - for file in /sys/kernel/debug/ieee80211/$phy/ath9k/chanbw /sys/kernel/debug/ieee80211/$phy/ath5k/bwmode; do + for file in /sys/kernel/debug/ieee80211/$phy/ath9k*/chanbw /sys/kernel/debug/ieee80211/$phy/ath5k/bwmode; do [ -f "$file" ] && echo "$chanbw" > "$file" done } @@ -904,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" @@ -918,6 +942,7 @@ drv_mac80211_setup() { has_ap= hostapd_ctrl= + ap_ifname= hostapd_noscan= for_each_interface "ap" mac80211_check_ap @@ -934,20 +959,31 @@ 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" ] && { + local no_reload=1 if [ -n "$(ubus list | grep hostapd.$primary_ap)" ]; then [ "${NEW_MD5}" = "${OLD_MD5}" ] || { ubus call hostapd.$primary_ap reload + no_reload=$? + if [ "$no_reload" != "0" ]; then + mac80211_vap_cleanup hostapd "${OLDAPLIST}" + 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 } - else + 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="$?" @@ -1004,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