linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
To: linux-wireless@vger.kernel.org
Cc: Sara Sharon <sara.sharon@intel.com>,
	Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Subject: [PATCH 25/43] iwlwifi: mvm: add duplicate packet detection per rx queue
Date: Wed,  2 Mar 2016 09:56:26 +0200	[thread overview]
Message-ID: <1456905404-14435-25-git-send-email-emmanuel.grumbach@intel.com> (raw)
In-Reply-To: <0BA3FCBA62E2DC44AF3030971E174FB32EA50146@hasmsx107.ger.corp.intel.com>

From: Sara Sharon <sara.sharon@intel.com>

Next hardware will direct TCP/UDP streams to different cores.
Packets belonging to the same stream will be directed to the same
core.
The result is that duplicates will be always directed to the same
rx queue were the first packet was received.
This enabled parallelizing the duplicate packet detection across
the different cores, without sharing data between the rx queues.

Signed-off-by: Sara Sharon <sara.sharon@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
---
 drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | 66 +++++++++++++++++++++++++++
 drivers/net/wireless/intel/iwlwifi/mvm/sta.c  | 14 ++++++
 drivers/net/wireless/intel/iwlwifi/mvm/sta.h  | 13 +++++-
 3 files changed, 92 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
index a9180b0..d891942 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
@@ -285,6 +285,66 @@ static void iwl_mvm_rx_csum(struct ieee80211_sta *sta,
 		skb->ip_summed = CHECKSUM_UNNECESSARY;
 }
 
+/*
+ * returns true if a packet outside BA session is a duplicate and
+ * should be dropped
+ */
+static bool iwl_mvm_is_nonagg_dup(struct ieee80211_sta *sta, int queue,
+				  struct ieee80211_rx_status *rx_status,
+				  struct ieee80211_hdr *hdr,
+				  struct iwl_rx_mpdu_desc *desc)
+{
+	struct iwl_mvm_sta *mvm_sta;
+	struct iwl_mvm_rxq_dup_data *dup_data;
+	u8 baid, tid, sub_frame_idx;
+
+	if (WARN_ON(IS_ERR_OR_NULL(sta)))
+		return false;
+
+	baid = (le32_to_cpu(desc->reorder_data) &
+		IWL_RX_MPDU_REORDER_BAID_MASK) >>
+		IWL_RX_MPDU_REORDER_BAID_SHIFT;
+
+	if (baid != IWL_RX_REORDER_DATA_INVALID_BAID)
+		return false;
+
+	mvm_sta = iwl_mvm_sta_from_mac80211(sta);
+	dup_data = &mvm_sta->dup_data[queue];
+
+	/*
+	 * Drop duplicate 802.11 retransmissions
+	 * (IEEE 802.11-2012: 9.3.2.10 "Duplicate detection and recovery")
+	 */
+	if (ieee80211_is_ctl(hdr->frame_control) ||
+	    ieee80211_is_qos_nullfunc(hdr->frame_control) ||
+	    is_multicast_ether_addr(hdr->addr1)) {
+		rx_status->flag |= RX_FLAG_DUP_VALIDATED;
+		return false;
+	}
+
+	if (ieee80211_is_data_qos(hdr->frame_control))
+		/* frame has qos control */
+		tid = *ieee80211_get_qos_ctl(hdr) &
+			IEEE80211_QOS_CTL_TID_MASK;
+	else
+		tid = IWL_MAX_TID_COUNT;
+
+	/* If this wasn't a part of an A-MSDU the sub-frame index will be 0 */
+	sub_frame_idx = desc->amsdu_info & IWL_RX_MPDU_AMSDU_SUBFRAME_IDX_MASK;
+
+	if (unlikely(ieee80211_has_retry(hdr->frame_control) &&
+		     dup_data->last_seq[tid] == hdr->seq_ctrl &&
+		     dup_data->last_sub_frame[tid] >= sub_frame_idx))
+		return true;
+
+	dup_data->last_seq[tid] = hdr->seq_ctrl;
+	dup_data->last_sub_frame[tid] = sub_frame_idx;
+
+	rx_status->flag |= RX_FLAG_DUP_VALIDATED;
+
+	return false;
+}
+
 void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
 			struct iwl_rx_cmd_buffer *rxb, int queue)
 {
@@ -389,6 +449,12 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
 
 		if (ieee80211_is_data(hdr->frame_control))
 			iwl_mvm_rx_csum(sta, skb, desc);
+
+		if (iwl_mvm_is_nonagg_dup(sta, queue, rx_status, hdr, desc)) {
+			kfree_skb(skb);
+			rcu_read_unlock();
+			return;
+		}
 	}
 
 	/*
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
index b2123ce..4717b18 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
@@ -280,6 +280,7 @@ int iwl_mvm_add_sta(struct iwl_mvm *mvm,
 {
 	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
 	struct iwl_mvm_sta *mvm_sta = iwl_mvm_sta_from_mac80211(sta);
+	struct iwl_mvm_rxq_dup_data *dup_data;
 	int i, ret, sta_id;
 
 	lockdep_assert_held(&mvm->mutex);
@@ -327,6 +328,16 @@ int iwl_mvm_add_sta(struct iwl_mvm *mvm,
 	}
 	mvm_sta->agg_tids = 0;
 
+	if (iwl_mvm_has_new_rx_api(mvm) &&
+	    !test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
+		dup_data = kcalloc(mvm->trans->num_rx_queues,
+				   sizeof(*dup_data),
+				   GFP_KERNEL);
+		if (!dup_data)
+			return -ENOMEM;
+		mvm_sta->dup_data = dup_data;
+	}
+
 	ret = iwl_mvm_sta_send_to_fw(mvm, sta, false);
 	if (ret)
 		goto err;
@@ -508,6 +519,9 @@ int iwl_mvm_rm_sta(struct iwl_mvm *mvm,
 
 	lockdep_assert_held(&mvm->mutex);
 
+	if (iwl_mvm_has_new_rx_api(mvm))
+		kfree(mvm_sta->dup_data);
+
 	if (vif->type == NL80211_IFTYPE_STATION &&
 	    mvmvif->ap_sta_id == mvm_sta->sta_id) {
 		ret = iwl_mvm_drain_sta(mvm, mvm_sta, true);
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h
index f95f603..db701ca 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h
@@ -296,6 +296,16 @@ struct iwl_mvm_key_pn {
 };
 
 /**
+ * struct iwl_mvm_rxq_dup_data - per station per rx queue data
+ * @last_seq: last sequence per tid for duplicate packet detection
+ * @last_sub_frame: last subframe packet
+ */
+struct iwl_mvm_rxq_dup_data {
+	__le16 last_seq[IWL_MAX_TID_COUNT + 1];
+	u8 last_sub_frame[IWL_MAX_TID_COUNT + 1];
+} ____cacheline_aligned_in_smp;
+
+/**
  * struct iwl_mvm_sta - representation of a station in the driver
  * @sta_id: the index of the station in the fw (will be replaced by id_n_color)
  * @tfd_queue_msk: the tfd queues used by the station
@@ -321,6 +331,7 @@ struct iwl_mvm_key_pn {
  *	we are sending frames from an AMPDU queue and there was a hole in
  *	the BA window. To be used for UAPSD only.
  * @ptk_pn: per-queue PTK PN data structures
+ * @dup_data: per queue duplicate packet detection data
  *
  * When mac80211 creates a station it reserves some space (hw->sta_data_size)
  * in the structure for use by driver. This structure is placed in that
@@ -340,8 +351,8 @@ struct iwl_mvm_sta {
 	struct iwl_mvm_tid_data tid_data[IWL_MAX_TID_COUNT];
 	struct iwl_lq_sta lq_sta;
 	struct ieee80211_vif *vif;
-
 	struct iwl_mvm_key_pn __rcu *ptk_pn[4];
+	struct iwl_mvm_rxq_dup_data *dup_data;
 
 	/* Temporary, until the new TLC will control the Tx protection */
 	s8 tx_protection;
-- 
2.5.0


  parent reply	other threads:[~2016-03-02  7:57 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-02  7:51 pull request: iwlwifi-next 2016-03-02 Grumbach, Emmanuel
2016-03-02  7:56 ` [PATCH 01/43] iwlwifi: mvm: add CT-KILL notification Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 02/43] iwlwifi: mvm: add registration to thermal zone Emmanuel Grumbach
2016-03-04 18:39   ` Bjørn Mork
2016-03-04 18:53     ` Bjørn Mork
2016-03-04 19:57       ` Coelho, Luciano
2016-03-04 20:22         ` Bjørn Mork
2016-03-04 20:30           ` Coelho, Luciano
2016-03-04 19:52     ` Coelho, Luciano
2016-03-02  7:56 ` [PATCH 03/43] iwlwifi: mvm: add registration to cooling device Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 04/43] iwlwifi: mvm: set the correct descriptor size for tracing Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 05/43] iwlwifi: mvm: fix RSS key sizing Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 06/43] iwlwifi: mvm: handle pass all scan reporting Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 07/43] iwlwifi: mvm: rs: fix a theoretical access to uninitialized array elements Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 08/43] iwlwifi: mvm: bump firmware API to 21 Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 09/43] iwlwifi: pcie: aggregate Flow Handler configuration writes Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 10/43] iwlwifi: pcie: Add new configuration to enable MSIX Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 11/43] iwlwifi: pcie: fix identation in trans.c Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 12/43] iwlwifi: mvm: enable VHT MU-MIMO for supported hardware Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 13/43] iwlwifi: mvm: update firmware of VHT MU-MIMO groups status on restart Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 14/43] iwlwifi: mvm: send large SKBs to the transport Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 15/43] iwlwifi: mvm: add Tx A-MSDU inside A-MPDU Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 16/43] iwlwifi: mvm: allow to limit the A-MSDU from debugfs Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 17/43] iwlwifi: mvm: don't enable A-MSDU when the rates are too low Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 18/43] iwlwifi: mvm: don't send an A-MSDU that is larger than the TXF Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 19/43] iwlwifi: support tracing wide commands Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 20/43] iwlwifi: mvm: update rx_status with mactime flag Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 21/43] iwlwifi: mvm: support filtered frames notification Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 22/43] iwlwifi: pcie: configure more RFH settings Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 23/43] iwlwifi: pcie: add pm_prepare and pm_complete ops Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 24/43] iwlwifi: pcie: prevent skbs shadowing in iwl_trans_pcie_reclaim Emmanuel Grumbach
2016-03-02  7:56 ` Emmanuel Grumbach [this message]
2016-03-02  7:56 ` [PATCH 26/43] iwlwifi: mvm: add RSS queues notification infrastructure Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 27/43] iwlwifi: mvm: remove unused field in iwl_mvm_tid_data Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 28/43] iwlwifi: mvm: support VHT MU-MIMO notification Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 29/43] iwlwifi: mvm: various trivial cleanups Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 30/43] iwlwifi: mvm: Set global RRM capability Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 31/43] iwlwifi: mvm: forbid U-APSD for P2P Client if the firmware doesn't support it Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 32/43] iwlwifi: mvm: Send power command on BSS_CHANGED_BEACON_INFO if needed Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 33/43] iwlwifi: mvm: take care of padded packets Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 34/43] iwlwifi: mvm: kill iwl_mvm_enable_agg_txq Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 35/43] iwlwifi: mvm: Disable beacon storing in D3 when WOWLAN configured Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 36/43] iwlwifi: support ucode with d0 unified image - regular and usniffer Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 37/43] iwlwifi: mvm: update ucode status before stopping device Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 38/43] iwlwifi: pcie: detect and workaround invalid write ptr behavior Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 39/43] iwlwifi: mvm: disable DQA support Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 40/43] iwlwifi: mvm: only release the trans ref if d0i3 is supported in fw Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 41/43] iwlwifi: add disable_11ac module param Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 42/43] iwlwifi: mvm: take the transport ref back when leaving Emmanuel Grumbach
2016-03-02  7:56 ` [PATCH 43/43] iwlwifi: mvm: support sw queue start/stop from mvm Emmanuel Grumbach
2016-03-07 13:50 ` pull request: iwlwifi-next 2016-03-02 Kalle Valo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1456905404-14435-25-git-send-email-emmanuel.grumbach@intel.com \
    --to=emmanuel.grumbach@intel.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=sara.sharon@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).