mac80211: add to bss_conf if broadcast TWT is supported
authorShaul Triebitz <shaul.triebitz@intel.com>
Fri, 18 Jun 2021 10:41:35 +0000 (13:41 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 23 Jun 2021 09:29:14 +0000 (11:29 +0200)
Add to struct ieee80211_bss_conf a twt_broadcast field.
Set it to true if both STA and AP support broadcast TWT.

Signed-off-by: Shaul Triebitz <shaul.triebitz@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20210618133832.f7c105237541.I50b302044e2b35e5ed4d3fb8bc7bd3d8bb89b1e1@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/mac80211.h
net/mac80211/mlme.c

index c09cd0e..5d3ce1b 100644 (file)
@@ -7,7 +7,7 @@
  * Copyright 2007-2010 Johannes Berg <johannes@sipsolutions.net>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
  * Copyright (C) 2015 - 2017 Intel Deutschland GmbH
- * Copyright (C) 2018 - 2020 Intel Corporation
+ * Copyright (C) 2018 - 2021 Intel Corporation
  */
 
 #ifndef MAC80211_H
@@ -526,6 +526,7 @@ struct ieee80211_fils_discovery {
  * @twt_responder: does this BSS support TWT requester (relevant for managed
  *     mode only, set if the AP advertises TWT responder role)
  * @twt_protected: does this BSS support protected TWT frames
+ * @twt_broadcast: does this BSS support broadcast TWT
  * @assoc: association status
  * @ibss_joined: indicates whether this station is part of an IBSS
  *     or not
@@ -642,6 +643,7 @@ struct ieee80211_bss_conf {
        bool twt_requester;
        bool twt_responder;
        bool twt_protected;
+       bool twt_broadcast;
        /* association related data */
        bool assoc, ibss_joined;
        bool ibss_creator;
index 97efc20..5e9f79b 100644 (file)
@@ -3218,6 +3218,21 @@ static int ieee80211_recalc_twt_req(struct ieee80211_sub_if_data *sdata,
        return 0;
 }
 
+static bool ieee80211_twt_bcast_support(struct ieee80211_bss_conf *bss_conf,
+                                       struct ieee80211_supported_band *sband,
+                                       struct sta_info *sta)
+{
+       const struct ieee80211_sta_he_cap *own_he_cap =
+               ieee80211_get_he_sta_cap(sband);
+
+       return bss_conf->he_support &&
+               (sta->sta.he_cap.he_cap_elem.mac_cap_info[2] &
+                       IEEE80211_HE_MAC_CAP2_BCAST_TWT) &&
+               own_he_cap &&
+               (own_he_cap->he_cap_elem.mac_cap_info[2] &
+                       IEEE80211_HE_MAC_CAP2_BCAST_TWT);
+}
+
 static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
                                    struct cfg80211_bss *cbss,
                                    struct ieee80211_mgmt *mgmt, size_t len,
@@ -3433,6 +3448,9 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
                bss_conf->twt_protected = false;
        }
 
+       bss_conf->twt_broadcast =
+               ieee80211_twt_bcast_support(bss_conf, sband, sta);
+
        if (bss_conf->he_support) {
                bss_conf->he_bss_color.color =
                        le32_get_bits(elems->he_operation->he_oper_params,