提交 9926a675 编写于 作者: C Christian Lamparter 提交者: John W. Linville

carl9170: fix frame delivery if sta is in powersave mode

Nicolas Cavallari discovered that carl9170 has some
serious problems delivering data to sleeping stations.

It turns out that the driver was not honoring two
important flags (IEEE80211_TX_CTL_POLL_RESPONSE and
IEEE80211_TX_CTL_CLEAR_PS_FILT) which are set on
frames that should be sent although the receiving
station is still in powersave mode.

Cc: stable <stable@vger.kernel.org>
Reported-by: NNicolas Cavallari <Nicolas.Cavallari@lri.fr>
Signed-off-by: NChristian Lamparter <chunkeey@googlemail.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 992d5252
...@@ -1234,6 +1234,7 @@ static bool carl9170_tx_ps_drop(struct ar9170 *ar, struct sk_buff *skb) ...@@ -1234,6 +1234,7 @@ static bool carl9170_tx_ps_drop(struct ar9170 *ar, struct sk_buff *skb)
{ {
struct ieee80211_sta *sta; struct ieee80211_sta *sta;
struct carl9170_sta_info *sta_info; struct carl9170_sta_info *sta_info;
struct ieee80211_tx_info *tx_info;
rcu_read_lock(); rcu_read_lock();
sta = __carl9170_get_tx_sta(ar, skb); sta = __carl9170_get_tx_sta(ar, skb);
...@@ -1241,12 +1242,13 @@ static bool carl9170_tx_ps_drop(struct ar9170 *ar, struct sk_buff *skb) ...@@ -1241,12 +1242,13 @@ static bool carl9170_tx_ps_drop(struct ar9170 *ar, struct sk_buff *skb)
goto out_rcu; goto out_rcu;
sta_info = (void *) sta->drv_priv; sta_info = (void *) sta->drv_priv;
if (unlikely(sta_info->sleeping)) { tx_info = IEEE80211_SKB_CB(skb);
struct ieee80211_tx_info *tx_info;
if (unlikely(sta_info->sleeping) &&
!(tx_info->flags & (IEEE80211_TX_CTL_POLL_RESPONSE |
IEEE80211_TX_CTL_CLEAR_PS_FILT))) {
rcu_read_unlock(); rcu_read_unlock();
tx_info = IEEE80211_SKB_CB(skb);
if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) if (tx_info->flags & IEEE80211_TX_CTL_AMPDU)
atomic_dec(&ar->tx_ampdu_upload); atomic_dec(&ar->tx_ampdu_upload);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册