Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp4155401pxk; Tue, 8 Sep 2020 12:05:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxg61fqigwCuFhMX7kNE1JcVpaPPVKawEvGGG1XhUWNeU+M51kAnQKKQ//TLTHLOnPecOYt X-Received: by 2002:a17:907:432b:: with SMTP id ob19mr27576076ejb.400.1599591945735; Tue, 08 Sep 2020 12:05:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1599591945; cv=none; d=google.com; s=arc-20160816; b=H0fOiKx0rnP24x3XxfYDlhgrClt4e/YpPOgqdOU59gxN3TJFBySegFmz/ERRCsg2ef ruTsPncIP4C2uyEX+R6wzcaMBPavKWLQgQ2b6r4vqRxH2+g8JB4W24LouCLn+A8GRG2J IQKdE6BiLrqfQ4awF3foQbrb8Vbhg5rLPws8NQtK/232XOsJm1cfVDBJlemvBybV56Uq kExyBBR3FKnk7yAx+/8WKYvajXFuEUHIeQILHFfdpzXiQ8b1aCrI+tscYcB+cfNHq10M Q6X2dhEexO4ArSe11MiWLPTQ90HoXJcK5U3B4I5oidTg1371qzhNkjna7gVa1Nfm8+66 7tgw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from; bh=uy0JtzeUPQSmu1IvVAuhkD5HA4zvwIeL5JeDaXm1Pys=; b=SVlxoGcLLHFkFMCCFj9SACsZhpaK+LkZDw6J6tACBMTOP8jkE3jSx3TAv4SFwl8HFb QTkk6PtW7qrnSLCgLRh9NaO42U3bRm4CK/yyvruorVfDQDdj1ehu9iDuRUB4q/EMklfQ lLSlMa5V7BWEifCDVSlKv18HTXKzuj5pnGob/prVXx+kY6Dhb6e0O2mwpDJteznaryZb ZTPPDiIGGYjifqx2m3o8iE1BVoxjkp/6N6wwGxDX+Z/bFerLrCTLlacjByc3dbiQO2Ck ChHrsYq63b00vUfz7uCsK1GmYloEppoDj7OLz/v/8AAS+KzFjAwGdZ7+2GtBihA42uOI MSKQ== 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 t7si12205081edc.145.2020.09.08.12.05.22; Tue, 08 Sep 2020 12:05:45 -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 S1731742AbgIHTDx (ORCPT + 99 others); Tue, 8 Sep 2020 15:03:53 -0400 Received: from mail.adapt-ip.com ([173.164.178.19]:52742 "EHLO web.adapt-ip.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728585AbgIHTDl (ORCPT ); Tue, 8 Sep 2020 15:03:41 -0400 Received: from localhost (localhost [127.0.0.1]) by web.adapt-ip.com (Postfix) with ESMTP id 1C0F94F9B00; Tue, 8 Sep 2020 19:03:37 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at web.adapt-ip.com Received: from web.adapt-ip.com ([127.0.0.1]) by localhost (web.adapt-ip.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id f5J0afErPmom; Tue, 8 Sep 2020 19:03:34 +0000 (UTC) Received: from atlas.ibsgaard.io (c-73-223-60-234.hsd1.ca.comcast.net [73.223.60.234]) (Authenticated sender: thomas@adapt-ip.com) by web.adapt-ip.com (Postfix) with ESMTPSA id C979E4F9B03; Tue, 8 Sep 2020 19:03:22 +0000 (UTC) From: Thomas Pedersen To: Johannes Berg Cc: linux-wireless , Thomas Pedersen Subject: [PATCH v3 09/22] mac80211: support S1G STA capabilities Date: Tue, 8 Sep 2020 12:03:10 -0700 Message-Id: <20200908190323.15814-10-thomas@adapt-ip.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200908190323.15814-1-thomas@adapt-ip.com> References: <20200908190323.15814-1-thomas@adapt-ip.com> 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 Include the S1G Capabilities element in an association request, and support the cfg80211 capability overrides. Signed-off-by: Thomas Pedersen --- net/mac80211/ieee80211_i.h | 4 ++++ net/mac80211/mlme.c | 8 +++++++ net/mac80211/util.c | 45 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 6bf879660a93..9363f43887b4 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h @@ -530,6 +530,8 @@ struct ieee80211_if_managed { struct ieee80211_ht_cap ht_capa_mask; /* Valid parts of ht_capa */ struct ieee80211_vht_cap vht_capa; /* configured VHT overrides */ struct ieee80211_vht_cap vht_capa_mask; /* Valid parts of vht_capa */ + struct ieee80211_s1g_cap s1g_capa; /* configured S1G overrides */ + struct ieee80211_s1g_cap s1g_capa_mask; /* valid s1g_capa bits */ /* TDLS support */ u8 tdls_peer[ETH_ALEN] __aligned(2); @@ -2193,6 +2195,8 @@ int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb, bool need_basic, enum nl80211_band band); u8 *ieee80211_add_wmm_info_ie(u8 *buf, u8 qosinfo); +u8 *ieee80211_add_s1g_capab_ie(struct ieee80211_sub_if_data *sdata, + struct ieee80211_sta_s1g_cap *caps, u8 *buf); /* channel management */ bool ieee80211_chandef_ht_oper(const struct ieee80211_ht_operation *ht_oper, diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index ac870309b911..b69889563457 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c @@ -1018,6 +1018,10 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata) pos = ieee80211_add_wmm_info_ie(skb_put(skb, 9), qos_info); } + if (sband->band == NL80211_BAND_S1GHZ) + pos = ieee80211_add_s1g_capab_ie(sdata, &sband->s1g_cap, + skb_put(skb, 17)); + /* add any remaining custom (i.e. vendor specific here) IEs */ if (assoc_data->ie_len) { noffset = assoc_data->ie_len; @@ -5461,6 +5465,10 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, memcpy(&ifmgd->vht_capa_mask, &req->vht_capa_mask, sizeof(ifmgd->vht_capa_mask)); + memcpy(&ifmgd->s1g_capa, &req->s1g_capa, sizeof(ifmgd->s1g_capa)); + memcpy(&ifmgd->s1g_capa_mask, &req->s1g_capa_mask, + sizeof(ifmgd->s1g_capa_mask)); + if (req->ie && req->ie_len) { memcpy(assoc_data->ie, req->ie, req->ie_len); assoc_data->ie_len = req->ie_len; diff --git a/net/mac80211/util.c b/net/mac80211/util.c index c8504ffc71a1..27b2f1ceca69 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c @@ -4276,6 +4276,51 @@ int ieee80211_max_num_channels(struct ieee80211_local *local) return max_num_different_channels; } +u8 *ieee80211_add_s1g_capab_ie(struct ieee80211_sub_if_data *sdata, + struct ieee80211_sta_s1g_cap *own_cap, u8 *buf) +{ + struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; + struct ieee80211_s1g_cap s1g_capab; + u8 *pos = buf; + int i; + + if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) + return pos; + + if (!own_cap->s1g) + return pos; + + memcpy(s1g_capab.capab_info, own_cap->cap, sizeof(own_cap->cap)); + memcpy(s1g_capab.supp_mcs_nss, own_cap->nss_mcs, + sizeof(own_cap->nss_mcs)); + + /* override the capability info */ + for (i = 0; i < sizeof(ifmgd->s1g_capa.capab_info); i++) { + u8 mask = ifmgd->s1g_capa_mask.capab_info[i]; + + s1g_capab.capab_info[i] &= ~mask; + s1g_capab.capab_info[i] |= (ifmgd->s1g_capa.capab_info[i] & + mask); + } + + /* then MCS and NSS set */ + for (i = 0; i < sizeof(ifmgd->s1g_capa.supp_mcs_nss); i++) { + u8 mask = ifmgd->s1g_capa_mask.supp_mcs_nss[i]; + + s1g_capab.supp_mcs_nss[i] &= ~mask; + s1g_capab.supp_mcs_nss[i] |= (ifmgd->s1g_capa.supp_mcs_nss[i] & + mask); + } + + *pos++ = WLAN_EID_S1G_CAPABILITIES; + *pos++ = sizeof(s1g_capab); + + memcpy(pos, &s1g_capab, sizeof(s1g_capab)); + pos += sizeof(s1g_capab); + + return pos; +} + u8 *ieee80211_add_wmm_info_ie(u8 *buf, u8 qosinfo) { *buf++ = WLAN_EID_VENDOR_SPECIFIC; -- 2.20.1