ieee80211: add code to obtain and parse 6 GHz operation field
[carl9170fw.git] / include / linux / ieee80211.h
index e4d7488b63a52dc28f354efbc4df6aa3690d5336..dc6fd5374ba6084189a0719610972bdead648d2b 100644 (file)
@@ -2228,6 +2228,28 @@ ieee80211_he_ppe_size(u8 ppe_thres_hdr, const u8 *phy_cap_info)
 #define IEEE80211_HE_OPERATION_PARTIAL_BSS_COLOR               0x40000000
 #define IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED              0x80000000
 
+/**
+ * ieee80211_he_6ghz_oper - HE 6 GHz operation Information field
+ * @primary: primary channel
+ * @control: control flags
+ * @ccfs0: channel center frequency segment 0
+ * @ccfs1: channel center frequency segment 1
+ * @minrate: minimum rate (in 1 Mbps units)
+ */
+struct ieee80211_he_6ghz_oper {
+       u8 primary;
+#define IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH  0x3
+#define                IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_20MHZ     0
+#define                IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_40MHZ     1
+#define                IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_80MHZ     2
+#define                IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ    3
+#define IEEE80211_HE_6GHZ_OPER_CTRL_DUP_BEACON 0x4
+       u8 control;
+       u8 ccfs0;
+       u8 ccfs1;
+       u8 minrate;
+} __packed;
+
 /*
  * ieee80211_he_oper_size - calculate 802.11ax HE Operations IE size
  * @he_oper_ie: byte data of the He Operations IE, stating from the byte
@@ -2254,7 +2276,7 @@ ieee80211_he_oper_size(const u8 *he_oper_ie)
        if (he_oper_params & IEEE80211_HE_OPERATION_CO_HOSTED_BSS)
                oper_len++;
        if (he_oper_params & IEEE80211_HE_OPERATION_6GHZ_OP_INFO)
-               oper_len += 4;
+               oper_len += sizeof(struct ieee80211_he_6ghz_oper);
 
        /* Add the first byte (extension ID) to the total length */
        oper_len++;
@@ -2262,6 +2284,34 @@ ieee80211_he_oper_size(const u8 *he_oper_ie)
        return oper_len;
 }
 
+/**
+ * ieee80211_he_6ghz_oper - obtain 6 GHz operation field
+ * @he_oper: HE operation element (must be pre-validated for size)
+ *     but may be %NULL
+ *
+ * Return: a pointer to the 6 GHz operation field, or %NULL
+ */
+static inline const struct ieee80211_he_6ghz_oper *
+ieee80211_he_6ghz_oper(const struct ieee80211_he_operation *he_oper)
+{
+       const u8 *ret = (void *)&he_oper->optional;
+       u32 he_oper_params;
+
+       if (!he_oper)
+               return NULL;
+
+       he_oper_params = le32_to_cpu(he_oper->he_oper_params);
+
+       if (!(he_oper_params & IEEE80211_HE_OPERATION_6GHZ_OP_INFO))
+               return NULL;
+       if (he_oper_params & IEEE80211_HE_OPERATION_VHT_OPER_INFO)
+               ret += 3;
+       if (he_oper_params & IEEE80211_HE_OPERATION_CO_HOSTED_BSS)
+               ret++;
+
+       return (void *)ret;
+}
+
 /* HE Spatial Reuse defines */
 #define IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT                        0x4
 #define IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT               0x8
@@ -2773,6 +2823,8 @@ enum ieee80211_eid {
        WLAN_EID_QUIET_CHANNEL = 198,
        WLAN_EID_OPMODE_NOTIF = 199,
 
+       WLAN_EID_REDUCED_NEIGHBOR_REPORT = 201,
+
        WLAN_EID_S1G_BCN_COMPAT = 213,
        WLAN_EID_S1G_SHORT_BCN_INTERVAL = 214,
        WLAN_EID_S1G_CAPABILITIES = 217,
@@ -3605,4 +3657,30 @@ static inline bool for_each_element_completed(const struct element *element,
 #define WLAN_RSNX_CAPA_PROTECTED_TWT BIT(4)
 #define WLAN_RSNX_CAPA_SAE_H2E BIT(5)
 
+/*
+ * reduced neighbor report, based on Draft P802.11ax_D5.0,
+ * section 9.4.2.170
+ */
+#define IEEE80211_AP_INFO_TBTT_HDR_TYPE                                0x03
+#define IEEE80211_AP_INFO_TBTT_HDR_FILTERED                    0x04
+#define IEEE80211_AP_INFO_TBTT_HDR_COLOC                       0x08
+#define IEEE80211_AP_INFO_TBTT_HDR_COUNT                       0xF0
+#define IEEE80211_TBTT_INFO_OFFSET_BSSID_BSS_PARAM             8
+#define IEEE80211_TBTT_INFO_OFFSET_BSSID_SSSID_BSS_PARAM       12
+
+#define IEEE80211_RNR_TBTT_PARAMS_OCT_RECOMMENDED              0x01
+#define IEEE80211_RNR_TBTT_PARAMS_SAME_SSID                    0x02
+#define IEEE80211_RNR_TBTT_PARAMS_MULTI_BSSID                  0x04
+#define IEEE80211_RNR_TBTT_PARAMS_TRANSMITTED_BSSID            0x08
+#define IEEE80211_RNR_TBTT_PARAMS_COLOC_ESS                    0x10
+#define IEEE80211_RNR_TBTT_PARAMS_PROBE_ACTIVE                 0x20
+#define IEEE80211_RNR_TBTT_PARAMS_COLOC_AP                     0x40
+
+struct ieee80211_neighbor_ap_info {
+       u8 tbtt_info_hdr;
+       u8 tbtt_info_len;
+       u8 op_class;
+       u8 channel;
+} __packed;
+
 #endif /* __LINUX_IEEE80211_H */