Skip to contentSkip to conversation

mac80211: Disable requests for new scans in AP mode

RFC In review Jouni Malinen 3 participants 7 messages Dec 9, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

RFC 1/1 mac80211: Disable requests for new scans in AP mode

AP mode operations are seriously affected if mac80211 runs through a multi-second scan while the AP is trying to send Beacon frames on the operation channel. While this could be implemented in a way that does not cause too many problems, it is not very simple and will require synchronization with Beacon frame scheduling in the drivers (scan one channel at a time between Beacon frames). Furthermore, such scanning takes quite a bit longer time and existing userspace applications would be likely to timeout while waiting for the results.

For now, just refuse requests for new scans (SIOCSIWSCAN) when in AP mode. In practice, this moves the rejection from iwl* drivers into mac80211 to make it apply to every mac80211-based driver.

This issue shows up in associated stations getting disconnected when something (e.g., Network Manager) requests a scan while the interface is in AP mode. When doing this continuously (e.g., NM does it every 60 seconds), the network gets close to useless.

drivers/net/wireless/iwlwifi/iwl-agn.c +0 -6
Index: wireless-testing/drivers/net/wireless/iwlwifi/iwl-agn.c
===================================================================
@@ -2972,12 +2972,6 @@ static int iwl_mac_hw_scan(struct ieee80
 		goto out_unlock;
 	}
 
-	if (priv->iw_mode == NL80211_IFTYPE_AP) {	/* APs don't scan */
-		ret = -EIO;
-		IWL_ERROR("ERROR: APs don't scan\n");
-		goto out_unlock;
-	}
-
 	/* We don't schedule scan within next_scan_jiffies period.
 	 * Avoid scanning during possible EAPOL exchange, return
 	 * success immediately.
drivers/net/wireless/iwlwifi/iwl3945-base.c +0 -11
Index: wireless-testing/drivers/net/wireless/iwlwifi/iwl3945-base.c
===================================================================
@@ -2105,11 +2105,6 @@ static void iwl3945_setup_rxon_timing(st
 
 static int iwl3945_scan_initiate(struct iwl3945_priv *priv)
 {
-	if (priv->iw_mode == NL80211_IFTYPE_AP) {
-		IWL_ERROR("APs don't scan.\n");
-		return 0;
-	}
-
 	if (!iwl3945_is_ready_rf(priv)) {
 		IWL_DEBUG_SCAN("Aborting scan due to not ready.\n");
 		return -EIO;
@@ -6991,12 +6986,6 @@ static int iwl3945_mac_hw_scan(struct ie
 		goto out_unlock;
 	}
 
-	if (priv->iw_mode == NL80211_IFTYPE_AP) {	/* APs don't scan */
-		rc = -EIO;
-		IWL_ERROR("ERROR: APs don't scan\n");
-		goto out_unlock;
-	}
-
 	/* we don't schedule scan within next_scan_jiffies period */
 	if (priv->next_scan_jiffies &&
 			time_after(priv->next_scan_jiffies, jiffies)) {
net/mac80211/wext.c +1 -2
Index: wireless-testing/net/mac80211/wext.c
===================================================================
@@ -418,8 +418,7 @@ static int ieee80211_ioctl_siwscan(struc
 
 	if (sdata->vif.type != NL80211_IFTYPE_STATION &&
 	    sdata->vif.type != NL80211_IFTYPE_ADHOC &&
-	    sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
-	    sdata->vif.type != NL80211_IFTYPE_AP)
+	    sdata->vif.type != NL80211_IFTYPE_MESH_POINT)
 		return -EOPNOTSUPP;
 
 	/* if SSID was specified explicitly then use that */
Signature · 1 line
Jouni Malinen                                            PGP id EFC895FA
maintainer Acked-by on v1 1/1
#1 lore raw
Quoted 13 lines · Jouni Malinen

AP mode operations are seriously affected if mac80211 runs through a multi-second scan while the AP is trying to send Beacon frames on the operation channel. While this could be implemented in a way that does not cause too many problems, it is not very simple and will require synchronization with Beacon frame scheduling in the drivers (scan one channel at a time between Beacon frames). Furthermore, such scanning takes quite a bit longer time and existing userspace applications would be likely to timeout while waiting for the results.

For now, just refuse requests for new scans (SIOCSIWSCAN) when in AP mode. In practice, this moves the rejection from iwl* drivers into mac80211 to make it apply to every mac80211-based driver.

Quoted 6 lines

This issue shows up in associated stations getting disconnected when something (e.g., Network Manager) requests a scan while the interface is in AP mode. When doing this continuously (e.g., NM does it every 60 seconds), the network gets close to useless.

Quoted 62 lines

Index: wireless-testing/drivers/net/wireless/iwlwifi/iwl-agn.c
===================================================================

drivers/net/wireless/iwlwifi/iwl-agn.c +0 -6
@@ -2972,12 +2972,6 @@ static int iwl_mac_hw_scan(struct ieee80
 		goto out_unlock;
 	}
 
-	if (priv->iw_mode == NL80211_IFTYPE_AP) {	/* APs don't scan */
-		ret = -EIO;
-		IWL_ERROR("ERROR: APs don't scan\n");
-		goto out_unlock;
-	}
-
 	/* We don't schedule scan within next_scan_jiffies period.
 	 * Avoid scanning during possible EAPOL exchange, return
 	 * success immediately.

Index: wireless-testing/drivers/net/wireless/iwlwifi/iwl3945-base.c
===================================================================

drivers/net/wireless/iwlwifi/iwl3945-base.c +0 -11
@@ -2105,11 +2105,6 @@ static void iwl3945_setup_rxon_timing(st
 
 static int iwl3945_scan_initiate(struct iwl3945_priv *priv)
 {
-	if (priv->iw_mode == NL80211_IFTYPE_AP) {
-		IWL_ERROR("APs don't scan.\n");
-		return 0;
-	}
-
 	if (!iwl3945_is_ready_rf(priv)) {
 		IWL_DEBUG_SCAN("Aborting scan due to not ready.\n");
 		return -EIO;
@@ -6991,12 +6986,6 @@ static int iwl3945_mac_hw_scan(struct ie
 		goto out_unlock;
 	}
 
-	if (priv->iw_mode == NL80211_IFTYPE_AP) {	/* APs don't scan */
-		rc = -EIO;
-		IWL_ERROR("ERROR: APs don't scan\n");
-		goto out_unlock;
-	}
-
 	/* we don't schedule scan within next_scan_jiffies period */
 	if (priv->next_scan_jiffies &&
 			time_after(priv->next_scan_jiffies, jiffies)) {

Index: wireless-testing/net/mac80211/wext.c
===================================================================

net/mac80211/wext.c +1 -2
@@ -418,8 +418,7 @@ static int ieee80211_ioctl_siwscan(struc
 
 	if (sdata->vif.type != NL80211_IFTYPE_STATION &&
 	    sdata->vif.type != NL80211_IFTYPE_ADHOC &&
-	    sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
-	    sdata->vif.type != NL80211_IFTYPE_AP)
+	    sdata->vif.type != NL80211_IFTYPE_MESH_POINT)
 		return -EOPNOTSUPP;
 
 	/* if SSID was specified explicitly then use that */
#2 lore raw
In reply to Jouni Malinen
Quoted 9 lines · Jouni Malinen

AP mode operations are seriously affected if mac80211 runs through a multi-second scan while the AP is trying to send Beacon frames on the operation channel. While this could be implemented in a way that does not cause too many problems, it is not very simple and will require synchronization with Beacon frame scheduling in the drivers (scan one channel at a time between Beacon frames). Furthermore, such scanning takes quite a bit longer time and existing userspace applications would be likely to timeout while waiting for the results.

Quoted 8 lines

For now, just refuse requests for new scans (SIOCSIWSCAN) when in AP mode. In practice, this moves the rejection from iwl* drivers into mac80211 to make it apply to every mac80211-based driver.

This issue shows up in associated stations getting disconnected when something (e.g., Network Manager) requests a scan while the interface is in AP mode. When doing this continuously (e.g., NM does it every 60 seconds), the network gets close to useless.

Every 120 seconds usually (it uses a simple backoff algorithm), but yeah, this is a good thing to do. You probably want to make NM ignore the device if you're configuring it as an AP though, since obviously NM shouldn't be driving an AP mode interface.

Dan

Quoted 64 lines

Index: wireless-testing/drivers/net/wireless/iwlwifi/iwl-agn.c
===================================================================

drivers/net/wireless/iwlwifi/iwl-agn.c +0 -6
@@ -2972,12 +2972,6 @@ static int iwl_mac_hw_scan(struct ieee80
 		goto out_unlock;
 	}
 
-	if (priv->iw_mode == NL80211_IFTYPE_AP) {	/* APs don't scan */
-		ret = -EIO;
-		IWL_ERROR("ERROR: APs don't scan\n");
-		goto out_unlock;
-	}
-
 	/* We don't schedule scan within next_scan_jiffies period.
 	 * Avoid scanning during possible EAPOL exchange, return
 	 * success immediately.

Index: wireless-testing/drivers/net/wireless/iwlwifi/iwl3945-base.c
===================================================================

drivers/net/wireless/iwlwifi/iwl3945-base.c +0 -11
@@ -2105,11 +2105,6 @@ static void iwl3945_setup_rxon_timing(st
 
 static int iwl3945_scan_initiate(struct iwl3945_priv *priv)
 {
-	if (priv->iw_mode == NL80211_IFTYPE_AP) {
-		IWL_ERROR("APs don't scan.\n");
-		return 0;
-	}
-
 	if (!iwl3945_is_ready_rf(priv)) {
 		IWL_DEBUG_SCAN("Aborting scan due to not ready.\n");
 		return -EIO;
@@ -6991,12 +6986,6 @@ static int iwl3945_mac_hw_scan(struct ie
 		goto out_unlock;
 	}
 
-	if (priv->iw_mode == NL80211_IFTYPE_AP) {	/* APs don't scan */
-		rc = -EIO;
-		IWL_ERROR("ERROR: APs don't scan\n");
-		goto out_unlock;
-	}
-
 	/* we don't schedule scan within next_scan_jiffies period */
 	if (priv->next_scan_jiffies &&
 			time_after(priv->next_scan_jiffies, jiffies)) {

Index: wireless-testing/net/mac80211/wext.c
===================================================================

net/mac80211/wext.c +1 -2
@@ -418,8 +418,7 @@ static int ieee80211_ioctl_siwscan(struc
 
 	if (sdata->vif.type != NL80211_IFTYPE_STATION &&
 	    sdata->vif.type != NL80211_IFTYPE_ADHOC &&
-	    sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
-	    sdata->vif.type != NL80211_IFTYPE_AP)
+	    sdata->vif.type != NL80211_IFTYPE_MESH_POINT)
 		return -EOPNOTSUPP;
 
 	/* if SSID was specified explicitly then use that */
#3 lore raw
Quoted 4 lines · Dan Williams

Every 120 seconds usually (it uses a simple backoff algorithm), but yeah, this is a good thing to do. You probably want to make NM ignore the device if you're configuring it as an AP though, since obviously NM shouldn't be driving an AP mode interface.

Actually, I would like to be able to NM to set up a simple AP similarly to IBSS configuration.. If I'm setting up the interface manually (either for AP or even for client modes), I would like NM to ignore the device from that point on, but that is a separate point.

Signature · 1 line
Jouni Malinen                                            PGP id EFC895FA
#4 lore raw
Quoted 11 lines · Jouni Malinen
Quoted 4 lines · Dan Williams

Every 120 seconds usually (it uses a simple backoff algorithm), but yeah, this is a good thing to do. You probably want to make NM ignore the device if you're configuring it as an AP though, since obviously NM shouldn't be driving an AP mode interface.

Actually, I would like to be able to NM to set up a simple AP similarly to IBSS configuration.. If I'm setting up the interface manually (either for AP or even for client modes), I would like NM to ignore the device from that point on, but that is a separate point.

NM only knows about devices that NM controls, thus we can't have NM set up the device and then subsequently ignore it... However, at some point in the near future, if we can get reliable information as to whether the driver *does* in fact support AP mode, we can make NM drive the interface in AP mode instead of IBSS. The only reason it's using IBSS right now is that the driver support for AP mode was so inconsistent and buggy.

Dan

maintainer
#5 lore raw
Quoted 7 lines · Dan Williams

NM only knows about devices that NM controls, thus we can't have NM set up the device and then subsequently ignore it... However, at some point in the near future, if we can get reliable information as to whether the driver *does* in fact support AP mode, we can make NM drive the interface in AP mode instead of IBSS. The only reason it's using IBSS right now is that the driver support for AP mode was so inconsistent and buggy.

We can get that information now, iw already prints it:

johannes:~$ iw list
Wiphy phy0
	...
	Supported interface modes:
		 * IBSS
		 * Station
		 * AP
		 * AP(VLAN)
		 * WDS
		 * Monitor
		 * mesh point

johannes

maintainer
#6 lore raw
In reply to Dan Williams
Quoted 7 lines · Dan Williams

NM only knows about devices that NM controls, thus we can't have NM set up the device and then subsequently ignore it... However, at some point in the near future, if we can get reliable information as to whether the driver *does* in fact support AP mode, we can make NM drive the interface in AP mode instead of IBSS. The only reason it's using IBSS right now is that the driver support for AP mode was so inconsistent and buggy.

Somebody (Intel, I think? Or MS?) has also been showing off functionality like STA + IBSS (or AP) on one hardware. We totally should beat them to the market with that :) Needs driver work, though.

johannes