mac80211: fix a race condition when bringing up wds sta interfaces on the ap
authorFelix Fietkau <nbd@openwrt.org>
Wed, 11 Nov 2009 16:32:09 +0000 (16:32 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Wed, 11 Nov 2009 16:32:09 +0000 (16:32 +0000)
SVN-Revision: 18377

package/hostapd/patches/130-wds_ap.patch
package/mac80211/patches/520-nl80211_vlan_add_fix.patch [new file with mode: 0644]

index 019257599d876882f87b10f753461e9c5cb41289..4624f88a13dd4b7cb45459b5040838d572d370ca 100644 (file)
                return -1;
        return 0;
  }
-@@ -4310,6 +4312,21 @@ static int i802_set_sta_vlan(void *priv,
+@@ -4310,6 +4312,22 @@ static int i802_set_sta_vlan(void *priv,
        return -ENOBUFS;
  }
  
 +      if (val) {
 +              if (nl80211_create_iface(priv, name, NL80211_IFTYPE_AP_VLAN, NULL, 1) < 0)
 +                      return -1;
++              hostapd_set_iface_flags(drv, name, 1);
 +              return i802_set_sta_vlan(priv, addr, name, 0);
 +      } else {
 +              i802_set_sta_vlan(priv, addr, drv->ifname, 0);
  
  static void handle_eapol(int sock, void *eloop_ctx, void *sock_ctx)
  {
-@@ -4536,5 +4553,6 @@ const struct wpa_driver_ops wpa_driver_n
+@@ -4536,5 +4554,6 @@ const struct wpa_driver_ops wpa_driver_n
        .if_update = i802_if_update,
        .if_remove = i802_if_remove,
        .set_sta_vlan = i802_set_sta_vlan,
diff --git a/package/mac80211/patches/520-nl80211_vlan_add_fix.patch b/package/mac80211/patches/520-nl80211_vlan_add_fix.patch
new file mode 100644 (file)
index 0000000..e0cdaea
--- /dev/null
@@ -0,0 +1,20 @@
+--- a/net/wireless/nl80211.c
++++ b/net/wireless/nl80211.c
+@@ -1813,7 +1813,7 @@ static int nl80211_get_station(struct sk
+ }
+ /*
+- * Get vlan interface making sure it is on the right wiphy.
++ * Get vlan interface making sure it is running and on the right wiphy.
+  */
+ static int get_vlan(struct genl_info *info,
+                   struct cfg80211_registered_device *rdev,
+@@ -1831,6 +1831,8 @@ static int get_vlan(struct genl_info *in
+                       return -EINVAL;
+               if ((*vlan)->ieee80211_ptr->wiphy != &rdev->wiphy)
+                       return -EINVAL;
++              if (!netif_running(*vlan))
++                      return -ENETDOWN;
+       }
+       return 0;
+ }