Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp2726322ybt; Mon, 22 Jun 2020 05:39:16 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxxe10s5zn0HvOwAf1v20qZ02NkKqdEJvy4MGVggaTuWsTnU6PpCVlzrQCVp6zKggNJT2HB X-Received: by 2002:a50:c181:: with SMTP id m1mr16319751edf.27.1592829556211; Mon, 22 Jun 2020 05:39:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592829556; cv=none; d=google.com; s=arc-20160816; b=fQtJ9lgl3udWpO+j/Le6BehcyEUJDYU3hARx3CqW0eV6Drdvq+HF7YCrVdLdwhidfe XXNesgOp1wZuueAEqIk0whi1YuAkVQCMhW07Us4C9HAYR+mTeT4ZlgNnHqtxfh6nJSwA w/B0ssHdpYaWeM15CxkYPwCuH3mBZI4Y/3y7c6ZmCZ88oiR8hk+P6rCftli/Wj8C2DgW +mKHsM4sGXg8mujXm55+w3WjbJqQ4Mb7T7SLmuxdt2vU6I2wUCoUM0mg2dTL84ljaf33 E1O83DynHidPvwI5u/mrvd5nZupvMiCRyLuhAjFQwfrPEQdeaVVdKNmEOCDeUJKK/XCp V+2w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=SUITtf56yZ2eTP0T2qv4gGJuUxeYPwdKVjLWdLnJReE=; b=RK9HlDUZ/tMorzhTPZkxHkFAflcrG4TnW7EN57+VApBLy50s4HRBRjiT3WpRnhZCm8 gJmjNGH15u3WHeBscX7g3jupd+d9vjDCfqsP2cc+D0K3Iwf/jmh+bgBr4IAgGGpHhhb+ Pz6HZQmy1ZNo7d4TjuLfSoIVcHaKEAp8Q8OziKQlQ/XomiIG+vrLYzRaXT6s/jpot9aQ PnWHx8EfPeH3iCx6wkjdU3id9KWnw7KjuewkctgA16J+Y702d8QjR7x4s4qghm94PkKL oX9fhMeHg21CqLm+oa7Qbsx1ogavQFs0MAt8ZVarqRSTlHvhmsEvJLrzjsMXsedPurnc sdrg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w5si4259400ejb.404.2020.06.22.05.38.38; Mon, 22 Jun 2020 05:39:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728189AbgFVMfq (ORCPT + 99 others); Mon, 22 Jun 2020 08:35:46 -0400 Received: from smail.rz.tu-ilmenau.de ([141.24.186.67]:57732 "EHLO smail.rz.tu-ilmenau.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728139AbgFVMfp (ORCPT ); Mon, 22 Jun 2020 08:35:45 -0400 Received: from legolas.fritz.box (unknown [79.211.69.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smail.rz.tu-ilmenau.de (Postfix) with ESMTPSA id E7A04580060; Mon, 22 Jun 2020 14:35:43 +0200 (CEST) From: Markus Theil To: johannes@sipsolutions.net Cc: linux-wireless@vger.kernel.org, j@w1.fi, Markus Theil Subject: [PATCH v3] mac80211: fix control port tx status check Date: Mon, 22 Jun 2020 14:35:42 +0200 Message-Id: <20200622123542.173695-1-markus.theil@tu-ilmenau.de> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org 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: Jouni Malinen Signed-off-by: Markus Theil --- 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..7d1bc3ca389a 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 = 0xffff; + + if (skb->len >= ETH_HLEN && skb->protocol == cpu_to_be16(ETH_P_802_3)) + skb_copy_bits(skb, 2 * ETH_ALEN, ðertype, 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