lkml.org 
[lkml]   [2019]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 025/267] iwlwifi: mvm: Send non offchannel traffic via AP sta
    Date
    From: Andrei Otcheretianski <andrei.otcheretianski@intel.com>

    [ Upstream commit dc1aca22f8f38b7e2ad7b118db87404d11e68771 ]

    TDLS discovery response frame is a unicast direct frame to the peer.
    Since we don't have a STA for this peer, this frame goes through
    iwl_tx_skb_non_sta(). As the result aux_sta and some completely
    arbitrary queue would be selected for this frame, resulting in a queue
    hang. Fix that by sending such frames through AP sta instead.

    Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
    Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 15 +++++++++++++++
    1 file changed, 15 insertions(+)

    diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
    index 77ed6ecf5ee54..b86c7a36d3f17 100644
    --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
    +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
    @@ -822,6 +822,21 @@ static void iwl_mvm_mac_tx(struct ieee80211_hw *hw,
    !ieee80211_is_bufferable_mmpdu(hdr->frame_control))
    sta = NULL;

    + /* If there is no sta, and it's not offchannel - send through AP */
    + if (info->control.vif->type == NL80211_IFTYPE_STATION &&
    + info->hw_queue != IWL_MVM_OFFCHANNEL_QUEUE && !sta) {
    + struct iwl_mvm_vif *mvmvif =
    + iwl_mvm_vif_from_mac80211(info->control.vif);
    + u8 ap_sta_id = READ_ONCE(mvmvif->ap_sta_id);
    +
    + if (ap_sta_id < IWL_MVM_STATION_COUNT) {
    + /* mac80211 holds rcu read lock */
    + sta = rcu_dereference(mvm->fw_id_to_mac_id[ap_sta_id]);
    + if (IS_ERR_OR_NULL(sta))
    + goto drop;
    + }
    + }
    +
    if (sta) {
    if (iwl_mvm_defer_tx(mvm, sta, skb))
    return;
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-12-16 19:50    [W:2.888 / U:0.128 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site