linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4] mac80211: fix control port tx status check
@ 2020-06-25  8:48 Markus Theil
  2020-06-25  8:49 ` Johannes Berg
  0 siblings, 1 reply; 3+ messages in thread
From: Markus Theil @ 2020-06-25  8:48 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, j, Markus Theil, kernel test robot

The initial control port tx status patch assumed, that
we have IEEE 802.11 frames, but actually ethernet frames
are stored in the ack skb. Fix this by checking for the
correct ethertype and skb protocol 802.3.

Also allow tx status reports for ETH_P_PREAUTH, as preauth
frames can also be send over the nl80211 control port.

Fixes: a7528198add8 ("mac80211: support control port TX status reporting")
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Jouni Malinen <j@w1.fi>
Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
---
v4: add cast, reported by Intel kernel test robot
v3: also check for ETH_P_PREAUTH
v2: use __be16, as suggested by Johannes Berg
 net/mac80211/status.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/net/mac80211/status.c b/net/mac80211/status.c
index 7b1bacac39c6..d6edd3acda0a 100644
--- a/net/mac80211/status.c
+++ b/net/mac80211/status.c
@@ -639,11 +639,23 @@ static void ieee80211_report_ack_skb(struct ieee80211_local *local,
 		u64 cookie = IEEE80211_SKB_CB(skb)->ack.cookie;
 		struct ieee80211_sub_if_data *sdata;
 		struct ieee80211_hdr *hdr = (void *)skb->data;
+		__be16 ethertype = (__be16)0xffff;
+
+		if (skb->len >= ETH_HLEN && skb->protocol == cpu_to_be16(ETH_P_802_3))
+			skb_copy_bits(skb, 2 * ETH_ALEN, &ethertype, ETH_TLEN);
 
 		rcu_read_lock();
 		sdata = ieee80211_sdata_from_skb(local, skb);
 		if (sdata) {
-			if (ieee80211_is_any_nullfunc(hdr->frame_control))
+			if (ethertype == sdata->control_port_protocol ||
+			    ethertype == cpu_to_be16(ETH_P_PREAUTH))
+				cfg80211_control_port_tx_status(&sdata->wdev,
+								cookie,
+								skb->data,
+								skb->len,
+								acked,
+								GFP_ATOMIC);
+			else if (ieee80211_is_any_nullfunc(hdr->frame_control))
 				cfg80211_probe_status(sdata->dev, hdr->addr1,
 						      cookie, acked,
 						      info->status.ack_signal,
@@ -654,12 +666,8 @@ static void ieee80211_report_ack_skb(struct ieee80211_local *local,
 							skb->data, skb->len,
 							acked, GFP_ATOMIC);
 			else
-				cfg80211_control_port_tx_status(&sdata->wdev,
-								cookie,
-								skb->data,
-								skb->len,
-								acked,
-								GFP_ATOMIC);
+				pr_warn("Unknown status report in ack skb\n");
+
 		}
 		rcu_read_unlock();
 
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v4] mac80211: fix control port tx status check
  2020-06-25  8:48 [PATCH v4] mac80211: fix control port tx status check Markus Theil
@ 2020-06-25  8:49 ` Johannes Berg
  2020-06-25  8:50   ` Markus Theil
  0 siblings, 1 reply; 3+ messages in thread
From: Johannes Berg @ 2020-06-25  8:49 UTC (permalink / raw)
  To: Markus Theil; +Cc: linux-wireless, j, kernel test robot

On Thu, 2020-06-25 at 10:48 +0200, Markus Theil wrote:
> The initial control port tx status patch assumed, that
> we have IEEE 802.11 frames, but actually ethernet frames
> are stored in the ack skb. Fix this by checking for the
> correct ethertype and skb protocol 802.3.
> 
> Also allow tx status reports for ETH_P_PREAUTH, as preauth
> frames can also be send over the nl80211 control port.
> 
> Fixes: a7528198add8 ("mac80211: support control port TX status reporting")
> Reported-by: kernel test robot <lkp@intel.com>
> Reported-by: Jouni Malinen <j@w1.fi>
> Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
> ---
> v4: add cast, reported by Intel kernel test robot
> v3: also check for ETH_P_PREAUTH
> v2: use __be16, as suggested by Johannes Berg
>  net/mac80211/status.c | 22 +++++++++++++++-------
>  1 file changed, 15 insertions(+), 7 deletions(-)
> 
> diff --git a/net/mac80211/status.c b/net/mac80211/status.c
> index 7b1bacac39c6..d6edd3acda0a 100644
> --- a/net/mac80211/status.c
> +++ b/net/mac80211/status.c
> @@ -639,11 +639,23 @@ static void ieee80211_report_ack_skb(struct ieee80211_local *local,
>  		u64 cookie = IEEE80211_SKB_CB(skb)->ack.cookie;
>  		struct ieee80211_sub_if_data *sdata;
>  		struct ieee80211_hdr *hdr = (void *)skb->data;
> +		__be16 ethertype = (__be16)0xffff;

If anything, that should've been "cpu_to_be16(0xffff)" but I was just
applying this and changing it to 0 instead (which sparse knows about).

johannes


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v4] mac80211: fix control port tx status check
  2020-06-25  8:49 ` Johannes Berg
@ 2020-06-25  8:50   ` Markus Theil
  0 siblings, 0 replies; 3+ messages in thread
From: Markus Theil @ 2020-06-25  8:50 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless, j, kernel test robot


> If anything, that should've been "cpu_to_be16(0xffff)" but I was just
> applying this and changing it to 0 instead (which sparse knows about).
>
Ok, thanks for the hint!

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-06-25  8:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-25  8:48 [PATCH v4] mac80211: fix control port tx status check Markus Theil
2020-06-25  8:49 ` Johannes Berg
2020-06-25  8:50   ` Markus Theil

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).