* [RFT/RFC 1/5] ath10k: amsdu rx, buid one big frame
2014-07-10 11:45 [RFT/RFC 0/5] ath10k: handle/report A-MSDU as a skb list Janusz Dziedzic
@ 2014-07-10 11:45 ` Janusz Dziedzic
2014-07-10 11:45 ` [RFT/RFC 2/5] mac80211: add option to handle amsdu as a list of skb Janusz Dziedzic
` (4 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Janusz Dziedzic @ 2014-07-10 11:45 UTC (permalink / raw)
To: ath10k; +Cc: Janusz Dziedzic, denton.gentry
Temporary patch, to check if will solve ampdu reordering issue.
Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
---
drivers/net/wireless/ath/ath10k/htt_rx.c | 71 +++++++++++++++++++++---------
1 file changed, 50 insertions(+), 21 deletions(-)
diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c
index 57d5a97..2a0526b 100644
--- a/drivers/net/wireless/ath/ath10k/htt_rx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_rx.c
@@ -874,12 +874,15 @@ static void ath10k_htt_rx_amsdu(struct ath10k_htt *htt,
{
struct htt_rx_desc *rxd;
struct sk_buff *skb = skb_in;
- struct sk_buff *first;
+ struct sk_buff *first, *frame = NULL, *tmp;
enum rx_msdu_decap_format fmt;
enum htt_rx_mpdu_encrypt_type enctype;
struct ieee80211_hdr *hdr;
- u8 hdr_buf[64], addr[ETH_ALEN], *qos;
+ u8 hdr_buf[64], addr[ETH_ALEN];
unsigned int hdr_len;
+ struct amsdu_subframe_hdr subframe_hdr;
+ unsigned int size = 0;
+ u8 padding;
rxd = (void *)skb->data - sizeof(*rxd);
enctype = MS(__le32_to_cpu(rxd->mpdu_start.info0),
@@ -890,6 +893,21 @@ static void ath10k_htt_rx_amsdu(struct ath10k_htt *htt,
memcpy(hdr_buf, hdr, hdr_len);
hdr = (struct ieee80211_hdr *)hdr_buf;
+ /* Check size we will need */
+ tmp = skb_in;
+ while (tmp) {
+ size = size + tmp->len;
+ tmp = tmp->next;
+ }
+
+ frame = dev_alloc_skb(size + skb_headroom(skb_in));
+ if (!frame) {
+ dev_kfree_skb_any(skb_in);
+ return;
+ }
+
+ skb_reserve(frame, skb_headroom(skb_in));
+
first = skb;
while (skb) {
void *decap_hdr;
@@ -922,19 +940,28 @@ static void ath10k_htt_rx_amsdu(struct ath10k_htt *htt,
memcpy(addr, ieee80211_get_DA(hdr), ETH_ALEN);
skb_pull(skb, hdr_len);
- /* push original 802.11 header */
- hdr = (struct ieee80211_hdr *)hdr_buf;
- hdr_len = ieee80211_hdrlen(hdr->frame_control);
- memcpy(skb_push(skb, hdr_len), hdr, hdr_len);
+ /* cfg80211 expect this padding */
+ padding = (4 - (skb->len + sizeof(subframe_hdr))) & 0x3;
+ skb_put(skb, padding);
- /* original A-MSDU header has the bit set but we're
- * not including A-MSDU subframe header */
- hdr = (struct ieee80211_hdr *)skb->data;
- qos = ieee80211_get_qos_ctl(hdr);
- qos[0] &= ~IEEE80211_QOS_CTL_A_MSDU_PRESENT;
+ /* build amsdu subframe header */
+ memcpy(&subframe_hdr.dst, addr, ETH_ALEN);
+ memcpy(&subframe_hdr.src, ieee80211_get_SA(hdr), ETH_ALEN);
+ subframe_hdr.len = __cpu_to_be16(skb->len) ;
- /* original 802.11 header has a different DA */
- memcpy(ieee80211_get_DA(hdr), addr, ETH_ALEN);
+ /* push back amsdu hdr */
+ memcpy(skb_push(skb, sizeof(subframe_hdr)), &subframe_hdr,
+ sizeof(subframe_hdr));
+
+ if (skb == first) {
+ /* push back orginal 80211 header */
+ hdr = (struct ieee80211_hdr *)hdr_buf;
+ hdr_len = ieee80211_hdrlen(hdr->frame_control);
+ memcpy(skb_push(skb, hdr_len), hdr, hdr_len);
+
+ /* original 802.11 header has a different DA */
+ memcpy(ieee80211_get_DA(hdr), addr, ETH_ALEN);
+ }
break;
case RX_MSDU_DECAP_ETHERNET2_DIX:
/* strip ethernet header and insert decapped 802.11
@@ -956,19 +983,21 @@ static void ath10k_htt_rx_amsdu(struct ath10k_htt *htt,
}
skb_in = skb;
- ath10k_htt_rx_h_protected(htt, rx_status, skb_in, enctype, fmt,
- false);
+
+ if (skb_in == first)
+ ath10k_htt_rx_h_protected(htt, rx_status, skb_in,
+ enctype, fmt, false);
+
+ memcpy(skb_put(frame, skb_in->len), skb_in->data, skb_in->len);
+
skb = skb->next;
skb_in->next = NULL;
- if (skb)
- rx_status->flag |= RX_FLAG_AMSDU_MORE;
- else
- rx_status->flag &= ~RX_FLAG_AMSDU_MORE;
-
- ath10k_process_rx(htt->ar, rx_status, skb_in);
+ /* We don't need this skb anymore */
+ dev_kfree_skb(skb_in);
}
+ ath10k_process_rx(htt->ar, rx_status, frame);
/* FIXME: It might be nice to re-assemble the A-MSDU when there's a
* monitor interface active for sniffing purposes. */
}
--
1.7.9.5
_______________________________________________
ath10k mailing list
ath10k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath10k
^ permalink raw reply related [flat|nested] 8+ messages in thread* [RFT/RFC 2/5] mac80211: add option to handle amsdu as a list of skb
2014-07-10 11:45 [RFT/RFC 0/5] ath10k: handle/report A-MSDU as a skb list Janusz Dziedzic
2014-07-10 11:45 ` [RFT/RFC 1/5] ath10k: amsdu rx, buid one big frame Janusz Dziedzic
@ 2014-07-10 11:45 ` Janusz Dziedzic
2014-07-10 11:45 ` [RFT/RFC 3/5] cfg80211: allow RX amsdu to be reported as a list Janusz Dziedzic
` (3 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Janusz Dziedzic @ 2014-07-10 11:45 UTC (permalink / raw)
To: ath10k; +Cc: Janusz Dziedzic, denton.gentry
Initial version.
Allow to report amsdu frames as a skb list.
Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
---
include/net/mac80211.h | 4 +++
net/mac80211/ieee80211_i.h | 1 +
net/mac80211/main.c | 2 +-
net/mac80211/rx.c | 70 +++++++++++++++++++++++++++++++++++++++++---
4 files changed, 72 insertions(+), 5 deletions(-)
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index e7362f0..9ec8ad1 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -873,6 +873,9 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)
* subframes share the same sequence number. Reported subframes can be
* either regular MSDU or singly A-MSDUs. Subframes must not be
* interleaved with other frames.
+ * @RX_FLAG_AMSDU_LIST: Some drivers report A-MSDU subframes as a skb list,
+ * with skb->next set. In such case we have one skb that will describe
+ * mpdu frame. All, but last MSDU from A-MSDU should have this flag set.
*/
enum mac80211_rx_flags {
RX_FLAG_MMIC_ERROR = BIT(0),
@@ -902,6 +905,7 @@ enum mac80211_rx_flags {
RX_FLAG_10MHZ = BIT(28),
RX_FLAG_5MHZ = BIT(29),
RX_FLAG_AMSDU_MORE = BIT(30),
+ RX_FLAG_AMSDU_LIST = BIT(31),
};
#define RX_FLAG_STBC_SHIFT 26
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index ae35bf1..3dd3133 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -1862,6 +1862,7 @@ int ieee80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev,
int ieee80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev,
const u8 *peer, enum nl80211_tdls_operation oper);
+struct sk_buff * ieee80211_dequeue_mpdu(struct sk_buff_head *frames);
#ifdef CONFIG_MAC80211_NOINLINE
#define debug_noinline noinline
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index d17c26d..6ac1af4 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -222,7 +222,7 @@ static void ieee80211_tasklet_handler(unsigned long data)
struct ieee80211_local *local = (struct ieee80211_local *) data;
struct sk_buff *skb;
- while ((skb = skb_dequeue(&local->skb_queue)) ||
+ while ((skb = ieee80211_dequeue_mpdu(&local->skb_queue)) ||
(skb = skb_dequeue(&local->skb_queue_unreliable))) {
switch (skb->pkt_type) {
case IEEE80211_RX_MSG:
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 394e201..9034a65 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -683,6 +683,68 @@ static ieee80211_rx_result ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx)
return RX_CONTINUE;
}
+static void __ieee80211_queue_mpdu(struct sk_buff_head *frames,
+ struct sk_buff *skb)
+{
+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
+ struct sk_buff *next = skb->next;
+
+ __skb_queue_tail(frames, skb);
+
+ if (status->flag & RX_FLAG_AMSDU_LIST) {
+ /* Check if amsdu list and queue frames */
+ while (next) {
+ skb = next;
+ next = next->next;
+ __skb_queue_tail(frames, skb);
+ }
+ }
+}
+
+static void ieee80211_queue_mpdu(struct sk_buff_head *frames,
+ struct sk_buff *skb)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&frames->lock, flags);
+ __ieee80211_queue_mpdu(frames, skb);
+ spin_unlock_irqrestore(&frames->lock, flags);
+}
+
+static struct sk_buff * __ieee80211_dequeue_mpdu(struct sk_buff_head *frames)
+{
+ struct sk_buff *first, *next;
+
+ first = __skb_dequeue(frames);
+
+ if (!first)
+ goto out;
+
+ next = first;
+ if (IEEE80211_SKB_RXCB(next)->flag & RX_FLAG_AMSDU_LIST) {
+ do {
+ /* Dequeue frames when amsdu list */
+ next->next = __skb_dequeue(frames);
+ next = next->next;
+ } while (next && IEEE80211_SKB_RXCB(next)->flag & RX_FLAG_AMSDU_LIST);
+ }
+
+out:
+ return first;
+}
+
+struct sk_buff * ieee80211_dequeue_mpdu(struct sk_buff_head *frames)
+{
+ struct sk_buff *mpdu;
+ unsigned long flags;
+
+ spin_lock_irqsave(&frames->lock, flags);
+ mpdu = __ieee80211_dequeue_mpdu(frames);
+ spin_unlock_irqrestore(&frames->lock, flags);
+
+ return mpdu;
+}
+
static void ieee80211_release_reorder_frame(struct ieee80211_sub_if_data *sdata,
struct tid_ampdu_rx *tid_agg_rx,
int index,
@@ -701,7 +763,7 @@ static void ieee80211_release_reorder_frame(struct ieee80211_sub_if_data *sdata,
tid_agg_rx->reorder_buf[index] = NULL;
status = IEEE80211_SKB_RXCB(skb);
status->rx_flags |= IEEE80211_RX_DEFERRED_RELEASE;
- __skb_queue_tail(frames, skb);
+ __ieee80211_queue_mpdu(frames, skb);
no_frame:
tid_agg_rx->head_seq_num = ieee80211_sn_inc(tid_agg_rx->head_seq_num);
@@ -951,7 +1013,7 @@ static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx,
return;
dont_reorder:
- __skb_queue_tail(frames, skb);
+ __ieee80211_queue_mpdu(frames, skb);
}
static ieee80211_rx_result debug_noinline
@@ -2950,7 +3012,7 @@ static void ieee80211_rx_handlers(struct ieee80211_rx_data *rx,
spin_lock_bh(&rx->local->rx_path_lock);
- while ((skb = __skb_dequeue(frames))) {
+ while ((skb = __ieee80211_dequeue_mpdu(frames))) {
/*
* all the other fields are valid across frames
* that belong to an aMPDU since they are on the
@@ -3426,7 +3488,7 @@ void ieee80211_rx_irqsafe(struct ieee80211_hw *hw, struct sk_buff *skb)
BUILD_BUG_ON(sizeof(struct ieee80211_rx_status) > sizeof(skb->cb));
skb->pkt_type = IEEE80211_RX_MSG;
- skb_queue_tail(&local->skb_queue, skb);
+ ieee80211_queue_mpdu(&local->skb_queue, skb);
tasklet_schedule(&local->tasklet);
}
EXPORT_SYMBOL(ieee80211_rx_irqsafe);
--
1.7.9.5
_______________________________________________
ath10k mailing list
ath10k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath10k
^ permalink raw reply related [flat|nested] 8+ messages in thread* [RFT/RFC 3/5] cfg80211: allow RX amsdu to be reported as a list
2014-07-10 11:45 [RFT/RFC 0/5] ath10k: handle/report A-MSDU as a skb list Janusz Dziedzic
2014-07-10 11:45 ` [RFT/RFC 1/5] ath10k: amsdu rx, buid one big frame Janusz Dziedzic
2014-07-10 11:45 ` [RFT/RFC 2/5] mac80211: add option to handle amsdu as a list of skb Janusz Dziedzic
@ 2014-07-10 11:45 ` Janusz Dziedzic
2014-07-10 11:45 ` [RFT/RFC 4/5] ath10k: report amsdu as a skb list Janusz Dziedzic
` (2 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Janusz Dziedzic @ 2014-07-10 11:45 UTC (permalink / raw)
To: ath10k; +Cc: Janusz Dziedzic, denton.gentry
ath10k hw report amsdu frames as a separate frames.
mac80211 before this patch expect one big frame
with msdu subframes included. Next split this big
frame into smaller ethernet frames and report to
the stack.
To skip this not needed memcpy, allow driver to report
amsdu as a list of frames using skb->next.
Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
---
net/wireless/util.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/net/wireless/util.c b/net/wireless/util.c
index 728f1c0..72e9ae7 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -617,6 +617,50 @@ void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list,
eth = (struct ethhdr *) skb->data;
}
+ if (skb->next) {
+ /* Seems we already get list of msdu frames */
+ do {
+ __be16 len;
+ eth = (struct ethhdr *) skb->data;
+
+ frame = skb;
+
+ memcpy(dst, eth->h_dest, ETH_ALEN);
+ memcpy(src, eth->h_source, ETH_ALEN);
+ len = eth->h_proto;
+
+ skb_pull(skb, sizeof(struct ethhdr));
+
+ skb_reset_network_header(frame);
+ frame->dev = skb->dev;
+ frame->priority = skb->priority;
+
+ payload = frame->data;
+ ethertype = (payload[6] << 8) | payload[7];
+
+ if (likely((ether_addr_equal(payload, rfc1042_header) &&
+ ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) ||
+ ether_addr_equal(payload, bridge_tunnel_header))) {
+ /* remove RFC1042 or Bridge-Tunnel
+ * encapsulation and replace EtherType */
+ skb_pull(frame, 6);
+ memcpy(skb_push(frame, ETH_ALEN), src, ETH_ALEN);
+ memcpy(skb_push(frame, ETH_ALEN), dst, ETH_ALEN);
+ } else {
+ memcpy(skb_push(frame, sizeof(__be16)), &len,
+ sizeof(__be16));
+ memcpy(skb_push(frame, ETH_ALEN), src, ETH_ALEN);
+ memcpy(skb_push(frame, ETH_ALEN), dst, ETH_ALEN);
+ }
+
+ skb = skb->next;
+ frame->next = NULL;
+ __skb_queue_tail(list, frame);
+ } while (skb);
+
+ return;
+ }
+
while (skb != frame) {
u8 padding;
__be16 len = eth->h_proto;
--
1.7.9.5
_______________________________________________
ath10k mailing list
ath10k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath10k
^ permalink raw reply related [flat|nested] 8+ messages in thread* [RFT/RFC 4/5] ath10k: report amsdu as a skb list
2014-07-10 11:45 [RFT/RFC 0/5] ath10k: handle/report A-MSDU as a skb list Janusz Dziedzic
` (2 preceding siblings ...)
2014-07-10 11:45 ` [RFT/RFC 3/5] cfg80211: allow RX amsdu to be reported as a list Janusz Dziedzic
@ 2014-07-10 11:45 ` Janusz Dziedzic
2014-07-10 11:45 ` [RFT/RFC 5/5] ath10k: rx, don't pass frames with invalid FCS Janusz Dziedzic
2014-07-18 12:32 ` [RFT/RFC 0/5] ath10k: handle/report A-MSDU as a skb list Kalle Valo
5 siblings, 0 replies; 8+ messages in thread
From: Janusz Dziedzic @ 2014-07-10 11:45 UTC (permalink / raw)
To: ath10k; +Cc: Janusz Dziedzic, denton.gentry
Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
---
drivers/net/wireless/ath/ath10k/htt_rx.c | 48 +++++++++++-------------------
1 file changed, 18 insertions(+), 30 deletions(-)
diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c
index 2a0526b..702653e 100644
--- a/drivers/net/wireless/ath/ath10k/htt_rx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_rx.c
@@ -874,15 +874,14 @@ static void ath10k_htt_rx_amsdu(struct ath10k_htt *htt,
{
struct htt_rx_desc *rxd;
struct sk_buff *skb = skb_in;
- struct sk_buff *first, *frame = NULL, *tmp;
+ struct sk_buff *first;
enum rx_msdu_decap_format fmt;
enum htt_rx_mpdu_encrypt_type enctype;
struct ieee80211_hdr *hdr;
u8 hdr_buf[64], addr[ETH_ALEN];
unsigned int hdr_len;
struct amsdu_subframe_hdr subframe_hdr;
- unsigned int size = 0;
- u8 padding;
+ struct ieee80211_rx_status *status;
rxd = (void *)skb->data - sizeof(*rxd);
enctype = MS(__le32_to_cpu(rxd->mpdu_start.info0),
@@ -893,21 +892,6 @@ static void ath10k_htt_rx_amsdu(struct ath10k_htt *htt,
memcpy(hdr_buf, hdr, hdr_len);
hdr = (struct ieee80211_hdr *)hdr_buf;
- /* Check size we will need */
- tmp = skb_in;
- while (tmp) {
- size = size + tmp->len;
- tmp = tmp->next;
- }
-
- frame = dev_alloc_skb(size + skb_headroom(skb_in));
- if (!frame) {
- dev_kfree_skb_any(skb_in);
- return;
- }
-
- skb_reserve(frame, skb_headroom(skb_in));
-
first = skb;
while (skb) {
void *decap_hdr;
@@ -940,10 +924,6 @@ static void ath10k_htt_rx_amsdu(struct ath10k_htt *htt,
memcpy(addr, ieee80211_get_DA(hdr), ETH_ALEN);
skb_pull(skb, hdr_len);
- /* cfg80211 expect this padding */
- padding = (4 - (skb->len + sizeof(subframe_hdr))) & 0x3;
- skb_put(skb, padding);
-
/* build amsdu subframe header */
memcpy(&subframe_hdr.dst, addr, ETH_ALEN);
memcpy(&subframe_hdr.src, ieee80211_get_SA(hdr), ETH_ALEN);
@@ -984,20 +964,26 @@ static void ath10k_htt_rx_amsdu(struct ath10k_htt *htt,
skb_in = skb;
- if (skb_in == first)
- ath10k_htt_rx_h_protected(htt, rx_status, skb_in,
+ if (skb == first) {
+ ath10k_htt_rx_h_protected(htt, rx_status, skb,
enctype, fmt, false);
+ if (skb->next)
+ rx_status->flag |= RX_FLAG_AMSDU_LIST;
+ else
+ rx_status->flag &= ~RX_FLAG_AMSDU_LIST;
+ }
- memcpy(skb_put(frame, skb_in->len), skb_in->data, skb_in->len);
+ /* Setup AMSDU flag in skb->next ... subframes */
+ status = IEEE80211_SKB_RXCB(skb);
+ memset(status, 0, sizeof(*status));
- skb = skb->next;
- skb_in->next = NULL;
+ if (skb->next)
+ status->flag |= RX_FLAG_AMSDU_LIST;
- /* We don't need this skb anymore */
- dev_kfree_skb(skb_in);
+ skb = skb->next;
}
- ath10k_process_rx(htt->ar, rx_status, frame);
+ ath10k_process_rx(htt->ar, rx_status, first);
/* FIXME: It might be nice to re-assemble the A-MSDU when there's a
* monitor interface active for sniffing purposes. */
}
@@ -1307,6 +1293,8 @@ static void ath10k_htt_rx_handler(struct ath10k_htt *htt,
else
rx_status->flag &= ~RX_FLAG_MMIC_ERROR;
+ rx_status->flag &= ~RX_FLAG_AMSDU_LIST;
+
hdr = ath10k_htt_rx_skb_get_hdr(msdu_head);
if (ath10k_htt_rx_hdr_is_amsdu(hdr))
--
1.7.9.5
_______________________________________________
ath10k mailing list
ath10k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath10k
^ permalink raw reply related [flat|nested] 8+ messages in thread* [RFT/RFC 5/5] ath10k: rx, don't pass frames with invalid FCS
2014-07-10 11:45 [RFT/RFC 0/5] ath10k: handle/report A-MSDU as a skb list Janusz Dziedzic
` (3 preceding siblings ...)
2014-07-10 11:45 ` [RFT/RFC 4/5] ath10k: report amsdu as a skb list Janusz Dziedzic
@ 2014-07-10 11:45 ` Janusz Dziedzic
2014-07-18 12:32 ` [RFT/RFC 0/5] ath10k: handle/report A-MSDU as a skb list Kalle Valo
5 siblings, 0 replies; 8+ messages in thread
From: Janusz Dziedzic @ 2014-07-10 11:45 UTC (permalink / raw)
To: ath10k; +Cc: Janusz Dziedzic, Janusz Dziedzic, denton.gentry
In case of bridged network, don't pass frames with
invalid FCS to the upper layer.
TODO: pass all frames in standalone monitor mode.
Signed-off-by: Janusz Dziedzic <janusz.dziedzi@tieto.com>
---
drivers/net/wireless/ath/ath10k/htt_rx.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c
index 702653e..efcee32 100644
--- a/drivers/net/wireless/ath/ath10k/htt_rx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_rx.c
@@ -1173,8 +1173,7 @@ static bool ath10k_htt_rx_amsdu_allowed(struct ath10k_htt *htt,
if (status != HTT_RX_IND_MPDU_STATUS_OK &&
status != HTT_RX_IND_MPDU_STATUS_TKIP_MIC_ERR &&
- status != HTT_RX_IND_MPDU_STATUS_ERR_INV_PEER &&
- !htt->ar->monitor_started) {
+ status != HTT_RX_IND_MPDU_STATUS_ERR_INV_PEER) {
ath10k_dbg(ATH10K_DBG_HTT,
"htt rx ignoring frame w/ status %d\n",
status);
--
1.7.9.5
_______________________________________________
ath10k mailing list
ath10k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath10k
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [RFT/RFC 0/5] ath10k: handle/report A-MSDU as a skb list
2014-07-10 11:45 [RFT/RFC 0/5] ath10k: handle/report A-MSDU as a skb list Janusz Dziedzic
` (4 preceding siblings ...)
2014-07-10 11:45 ` [RFT/RFC 5/5] ath10k: rx, don't pass frames with invalid FCS Janusz Dziedzic
@ 2014-07-18 12:32 ` Kalle Valo
2014-07-18 12:40 ` Janusz Dziedzic
5 siblings, 1 reply; 8+ messages in thread
From: Kalle Valo @ 2014-07-18 12:32 UTC (permalink / raw)
To: Janusz Dziedzic; +Cc: ath10k, denton.gentry
Janusz Dziedzic <janusz.dziedzic@tieto.com> writes:
> This is prototype, how we can handle A-MSDU as a skb list in mac80211.
> No changes in mac80211 reordering code required in such case, also we
> don't need to build one big frame using memcpy ...
>
> With such prototype tid_agg_rx->reorder_buf[sn] will describe exactly
> one MPDU (with included A-MSDU subframes if skb->next) and detection of
> duplicated frames will work correctly. So, reordering should works
> correctly.
>
> I tested this with A-MPDU and A-MSDU run together (A-MSDU frame up to
> 10k) - TCP STA -> AP. I used ath10k STA with unlocked A-MSDU limit in
> RC in firmware. Didn't notice any problems.
So what are you exactly fixing here? It would be nice to get some
background and motivations for the changes in the cover letter.
Also we have so many reordering patches that I'm confused now. For
example, how is this related to patch "ath10k: handle attention flags
correctly when A-MSDU"?
--
Kalle Valo
_______________________________________________
ath10k mailing list
ath10k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath10k
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [RFT/RFC 0/5] ath10k: handle/report A-MSDU as a skb list
2014-07-18 12:32 ` [RFT/RFC 0/5] ath10k: handle/report A-MSDU as a skb list Kalle Valo
@ 2014-07-18 12:40 ` Janusz Dziedzic
0 siblings, 0 replies; 8+ messages in thread
From: Janusz Dziedzic @ 2014-07-18 12:40 UTC (permalink / raw)
To: Kalle Valo; +Cc: ath10k@lists.infradead.org, Denton Gentry
On 18 July 2014 14:32, Kalle Valo <kvalo@qca.qualcomm.com> wrote:
> Janusz Dziedzic <janusz.dziedzic@tieto.com> writes:
>
>> This is prototype, how we can handle A-MSDU as a skb list in mac80211.
>> No changes in mac80211 reordering code required in such case, also we
>> don't need to build one big frame using memcpy ...
>>
>> With such prototype tid_agg_rx->reorder_buf[sn] will describe exactly
>> one MPDU (with included A-MSDU subframes if skb->next) and detection of
>> duplicated frames will work correctly. So, reordering should works
>> correctly.
>>
>> I tested this with A-MPDU and A-MSDU run together (A-MSDU frame up to
>> 10k) - TCP STA -> AP. I used ath10k STA with unlocked A-MSDU limit in
>> RC in firmware. Didn't notice any problems.
>
> So what are you exactly fixing here? It would be nice to get some
> background and motivations for the changes in the cover letter.
>
> Also we have so many reordering patches that I'm confused now. For
> example, how is this related to patch "ath10k: handle attention flags
> correctly when A-MSDU"?
>
We should skip this patchset, while we decide to change reordering
code in mac80211 instead of passing skb list.
ath10k: handle attention flags correctly when A-MSDU is required
while fix generic FCS reporting issue.
BR
Janusz
_______________________________________________
ath10k mailing list
ath10k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath10k
^ permalink raw reply [flat|nested] 8+ messages in thread