mac80211: detect existing interface before adding
[openwrt/staging/rmilecki.git] / package / kernel / mac80211 / files / lib / netifd / wireless / mac80211.sh
index 5b174cded6403046c8b2848e75b03488cfdbf75f..a04f1e3ca78764e69fd540b6240809b240f06b89 100644 (file)
@@ -15,10 +15,6 @@ MP_CONFIG_INT="mesh_retry_timeout mesh_confirm_timeout mesh_holding_timeout mesh
 MP_CONFIG_BOOL="mesh_auto_open_plinks mesh_fwding"
 MP_CONFIG_STRING="mesh_power_mode"
 
-iw() {
-       command iw $@ || logger -t mac80211 "Failed command: iw $@"
-}
-
 NEWAPLIST=
 OLDAPLIST=
 NEWSPLIST=
@@ -446,6 +442,36 @@ mac80211_iw_interface_add() {
                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
+                       "AP")
+                               [ "$type" = "__ap" ] && rc=0
+                               ;;
+                       "IBSS")
+                               [ "$type" = "adhoc" ] && rc=0
+                               ;;
+                       "managed")
+                               [ "$type" = "managed" ] && rc=0
+                               ;;
+                       "mesh point")
+                               [ "$type" = "mp" ] && rc=0
+                               ;;
+                       "monitor")
+                               [ "$type" = "monitor" ] && rc=0
+                               ;;
+               esac
+       }
+
+       [ "$rc" = 233 ] && {
+               iw dev "$ifname" del
+               sleep 1
+
+               iw phy "$phy" interface add "$ifname" type "$type" $wdsflag
+               rc="$?"
+       }
+
        [ "$rc" = 233 ] && {
                # 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.
@@ -511,6 +537,11 @@ mac80211_prepare_vif() {
                        [ "$enable" = 0 ] || staidx="$(($staidx + 1))"
                        [ "$wds" -gt 0 ] && wdsflag="4addr on"
                        mac80211_iw_interface_add "$phy" "$ifname" managed "$wdsflag" || return
+                       if [ "$wds" -gt 0 ]; then
+                               iw "$ifname" set 4addr on
+                       else
+                               iw "$ifname" set 4addr off
+                       fi
                        [ "$powersave" -gt 0 ] && powersave="on" || powersave="off"
                        iw "$ifname" set power_save "$powersave"
                ;;