diff mbox

[RFC] mac80211: ignore AP power level when tx power type is "fixed"

Message ID 1449324423-99589-1-git-send-email-nbd@openwrt.org (mailing list archive)
State RFC
Delegated to: Johannes Berg
Headers show

Commit Message

Felix Fietkau Dec. 5, 2015, 2:07 p.m. UTC
In some cases a user might want to connect to a far away access point,
which announces a low tx power limit. Using the AP's power limit can
make the connection significantly more unstable or even impossible, and
mac80211 currently provides no way to disable this behavior.

To fix this, use the currently unused distinction between limited and
fixed tx power to decide whether a remote AP's power limit should be
accepted.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
 net/mac80211/iface.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Johannes Berg Dec. 11, 2015, 2:13 p.m. UTC | #1
On Sat, 2015-12-05 at 15:07 +0100, Felix Fietkau wrote:
> In some cases a user might want to connect to a far away access
> point,
> which announces a low tx power limit. Using the AP's power limit can
> make the connection significantly more unstable or even impossible,
> and
> mac80211 currently provides no way to disable this behavior.
> 
> To fix this, use the currently unused distinction between limited and
> fixed tx power to decide whether a remote AP's power limit should be
> accepted.
> 
This seems reasonable. Maybe we should document it though?

johannes
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index d6a1a46..f3ee9ab 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -61,7 +61,8 @@  bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata)
 	if (sdata->user_power_level != IEEE80211_UNSET_POWER_LEVEL)
 		power = min(power, sdata->user_power_level);
 
-	if (sdata->ap_power_level != IEEE80211_UNSET_POWER_LEVEL)
+	if (sdata->ap_power_level != IEEE80211_UNSET_POWER_LEVEL &&
+	    sdata->vif.bss_conf.txpower_type != NL80211_TX_POWER_FIXED)
 		power = min(power, sdata->ap_power_level);
 
 	if (power != sdata->vif.bss_conf.txpower) {