mac80211, hostapd: always explicitly set beacon interval
[openwrt/staging/luka.git] / package / kernel / mac80211 / files / lib / netifd / wireless / mac80211.sh
index baa023ecf63ba3515e1458064e1b14bc5c74a8bc..cda6f9f438c89fb78a834c60251c13bd53a10eb6 100644 (file)
@@ -268,7 +268,7 @@ mac80211_hostapd_setup_base() {
                        vht_max_mpdu_hw=11454
                [ "$vht_max_mpdu_hw" != 3895 ] && \
                        vht_capab="$vht_capab[MAX-MPDU-$vht_max_mpdu_hw]"
-                       
+
                # maximum A-MPDU length exponent
                vht_max_a_mpdu_len_exp_hw=0
                [ "$(($vht_cap & 58720256))" -ge 8388608 -a 1 -le "$vht_max_a_mpdu_len_exp" ] && \
@@ -411,6 +411,28 @@ mac80211_check_ap() {
        has_ap=1
 }
 
+mac80211_iw_interface_add() {
+       local phy="$1"
+       local ifname="$2"
+       local type="$3"
+       local wdsflag="$4"
+       local rc
+
+       iw phy "$phy" interface add "$ifname" type "$type" $wdsflag
+       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
+               rc="$?"
+       }
+
+       [ "$rc" != 0 ] && wireless_setup_failed INTERFACE_CREATION_FAILED
+       return $rc
+}
+
 mac80211_prepare_vif() {
        json_select config
 
@@ -437,7 +459,7 @@ mac80211_prepare_vif() {
        # It is far easier to delete and create the desired interface
        case "$mode" in
                adhoc)
-                       iw phy "$phy" interface add "$ifname" type adhoc
+                       mac80211_iw_interface_add "$phy" "$ifname" adhoc || return
                ;;
                ap)
                        # Hostapd will handle recreating the interface and
@@ -451,21 +473,21 @@ mac80211_prepare_vif() {
                        mac80211_hostapd_setup_bss "$phy" "$ifname" "$macaddr" "$type" || return
 
                        [ -n "$hostapd_ctrl" ] || {
-                               iw phy "$phy" interface add "$ifname" type __ap
+                               mac80211_iw_interface_add "$phy" "$ifname" __ap || return
                                hostapd_ctrl="${hostapd_ctrl:-/var/run/hostapd/$ifname}"
                        }
                ;;
                mesh)
-                       iw phy "$phy" interface add "$ifname" type mp
+                       mac80211_iw_interface_add "$phy" "$ifname" mp || return
                ;;
                monitor)
-                       iw phy "$phy" interface add "$ifname" type monitor
+                       mac80211_iw_interface_add "$phy" "$ifname" monitor || return
                ;;
                sta)
                        local wdsflag=
                        staidx="$(($staidx + 1))"
                        [ "$wds" -gt 0 ] && wdsflag="4addr on"
-                       iw phy "$phy" interface add "$ifname" type managed $wdsflag
+                       mac80211_iw_interface_add "$phy" "$ifname" managed "$wdsflag" || return
                        [ "$powersave" -gt 0 ] && powersave="on" || powersave="off"
                        iw "$ifname" set power_save "$powersave"
                ;;
@@ -566,7 +588,7 @@ mac80211_setup_adhoc() {
        [ -n "$mcast_rate" ] && wpa_supplicant_add_rate mcval "$mcast_rate"
 
        iw dev "$ifname" ibss join "$ssid" $freq $ibss_htmode fixed-freq $bssid \
-               ${beacon_int:+beacon-interval $beacon_int} \
+               beacon-interval $beacon_int \
                ${brstr:+basic-rates $brstr} \
                ${mcval:+mcast-rate $mcval} \
                ${keyspec:+keys $keyspec}
@@ -646,7 +668,9 @@ mac80211_setup_vif() {
                                esac
 
                                freq="$(get_freq "$phy" "$channel")"
-                               iw dev "$ifname" mesh join "$mesh_id" freq $freq $mesh_htmode ${mcval:+mcast-rate $mcval}
+                               iw dev "$ifname" mesh join "$mesh_id" freq $freq $mesh_htmode \
+                                       ${mcval:+mcast-rate $mcval} \
+                                       beacon-interval $beacon_int
                        fi
 
                        for var in $MP_CONFIG_INT $MP_CONFIG_BOOL $MP_CONFIG_STRING; do
@@ -698,7 +722,7 @@ drv_mac80211_setup() {
                country chanbw distance \
                txpower antenna_gain \
                rxantenna txantenna \
-               frag rts beacon_int htmode
+               frag rts beacon_int:100 htmode
        json_get_values basic_rate_list basic_rate
        json_select ..