aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjoern A. Zeeb <bz@FreeBSD.org>2023-05-16 22:07:53 +0000
committerBjoern A. Zeeb <bz@FreeBSD.org>2023-08-21 00:39:57 +0000
commitadff403fe7a870c5b7a2d7e003d445c3b409bc0c (patch)
treef4b56eeddd8b46421f164e504addfa31f0745b8c
parent89e17c6ea03f27dfe4734b024d807d12840db226 (diff)
downloadsrc-adff403fe7a870c5b7a2d7e003d445c3b409bc0c.tar.gz
src-adff403fe7a870c5b7a2d7e003d445c3b409bc0c.zip
LinuxKPI: 802.11: update compat code for updated drivers
Adjust and add structs, fields, functions to make more modern versions of LinuxKPI based wireless drivers (based on wireless-testing ( wt-2023-06-09, wt-2023-07-24, and later)) compile. Some of these changes can only be applied once all drivers get updated to not break the old versions currently in the tree. Mark those changes with __FOR_LATER_DRV_UPDATE for now and flip the switch at a later point. Sponsored by: The FreeBSD Foundation MFC after: 20 days
-rw-r--r--sys/compat/linuxkpi/common/include/linux/ieee80211.h60
-rw-r--r--sys/compat/linuxkpi/common/include/linux/nl80211.h38
-rw-r--r--sys/compat/linuxkpi/common/include/net/cfg80211.h161
-rw-r--r--sys/compat/linuxkpi/common/include/net/mac80211.h280
-rw-r--r--sys/compat/linuxkpi/common/src/linux_80211.c15
-rw-r--r--sys/compat/linuxkpi/dummy/include/net/gso.h0
6 files changed, 509 insertions, 45 deletions
diff --git a/sys/compat/linuxkpi/common/include/linux/ieee80211.h b/sys/compat/linuxkpi/common/include/linux/ieee80211.h
index 4e37ee612921..4648a12ec889 100644
--- a/sys/compat/linuxkpi/common/include/linux/ieee80211.h
+++ b/sys/compat/linuxkpi/common/include/linux/ieee80211.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2020-2021 The FreeBSD Foundation
+ * Copyright (c) 2020-2023 The FreeBSD Foundation
*
* This software was developed by Björn Zeeb under sponsorship from
* the FreeBSD Foundation.
@@ -60,9 +60,10 @@ struct ieee80211_mmie_16 {
#define IEEE80211_INVAL_HW_QUEUE ((uint8_t)-1)
-#define IEEE80211_MAX_AMPDU_BUF_HT 0x40
#define IEEE80211_MAX_AMPDU_BUF 256 /* for HE? */
+#define IEEE80211_MAX_AMPDU_BUF_HT 64
#define IEEE80211_MAX_AMPDU_BUF_HE 256
+#define IEEE80211_MAX_AMPDU_BUF_EHT 1024
#define IEEE80211_MAX_FRAME_LEN 2352
#define IEEE80211_MAX_DATA_LEN (2300 + IEEE80211_CRC_LEN)
@@ -140,8 +141,8 @@ enum ieee80211_min_mpdu_start_spacing {
IEEE80211_HT_MPDU_DENSITY_NONE = 0,
#if 0
IEEE80211_HT_MPDU_DENSITY_XXX = 1, /* 1/4 us */
- IEEE80211_HT_MPDU_DENSITY_YYY = 2, /* 1/2 us */
#endif
+ IEEE80211_HT_MPDU_DENSITY_0_5 = 2, /* 1/2 us */
IEEE80211_HT_MPDU_DENSITY_1 = 3, /* 1 us */
IEEE80211_HT_MPDU_DENSITY_2 = 4, /* 2 us */
IEEE80211_HT_MPDU_DENSITY_4 = 5, /* 4us */
@@ -159,6 +160,7 @@ enum ieee80211_min_mpdu_start_spacing {
#define IEEE80211_FCTL_FROMDS (IEEE80211_FC1_DIR_FROMDS << 8)
#define IEEE80211_FCTL_TODS (IEEE80211_FC1_DIR_TODS << 8)
#define IEEE80211_FCTL_MOREFRAGS (IEEE80211_FC1_MORE_FRAG << 8)
+#define IEEE80211_FCTL_PM (IEEE80211_FC1_PWR_MGT << 8)
#define IEEE80211_FTYPE_MGMT IEEE80211_FC0_TYPE_MGT
#define IEEE80211_FTYPE_CTL IEEE80211_FC0_TYPE_CTL
@@ -170,8 +172,12 @@ enum ieee80211_min_mpdu_start_spacing {
#define IEEE80211_STYPE_DISASSOC IEEE80211_FC0_SUBTYPE_DISASSOC
#define IEEE80211_STYPE_AUTH IEEE80211_FC0_SUBTYPE_AUTH
#define IEEE80211_STYPE_DEAUTH IEEE80211_FC0_SUBTYPE_DEAUTH
+#define IEEE80211_STYPE_CTS IEEE80211_FC0_SUBTYPE_CTS
+#define IEEE80211_STYPE_RTS IEEE80211_FC0_SUBTYPE_RTS
#define IEEE80211_STYPE_ACTION IEEE80211_FC0_SUBTYPE_ACTION
#define IEEE80211_STYPE_QOS_DATA IEEE80211_FC0_SUBTYPE_QOS_DATA
+#define IEEE80211_STYPE_QOS_NULLFUNC IEEE80211_FC0_SUBTYPE_QOS_NULL
+#define IEEE80211_STYPE_QOS_CFACK 0xd0 /* XXX-BZ reserved? */
#define IEEE80211_NUM_ACS 4 /* net8021::WME_NUM_AC */
@@ -211,15 +217,19 @@ enum ieee80211_tdls_action_code {
/* 11-255 reserved */
};
-/* 9.4.2.27, Table 9-135. Extended Capabilities field. */
+/* 802.11-2020 9.4.2.26, Table 9-153. Extended Capabilities field. */
/* This is split up into octets CAPA1 = octet 1, ... */
#define WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING BIT(2 % 8)
#define WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT BIT(22 % 8)
+#define WLAN_EXT_CAPA3_TIMING_MEASUREMENT_SUPPORT BIT(23 % 8)
#define WLAN_EXT_CAPA8_OPMODE_NOTIF BIT(62 % 8)
+#define WLAN_EXT_CAPA8_MAX_MSDU_IN_AMSDU_LSB BIT(63 % 8)
+#define WLAN_EXT_CAPA9_MAX_MSDU_IN_AMSDU_MSB BIT(64 % 8)
+#define WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT BIT(77 % 8)
+#define WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT BIT(78 % 8)
+#define WLAN_EXT_CAPA10_OBSS_NARROW_BW_RU_TOLERANCE_SUPPORT BIT(79 % 8)
-#define WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT BIT(5) /* XXX */
-#define WLAN_EXT_CAPA10_OBSS_NARROW_BW_RU_TOLERANCE_SUPPORT BIT(7) /* XXX */
-#define WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT BIT(6) /* XXX */
+#define WLAN_EXT_CAPA11_EMA_SUPPORT 0x00 /* XXX TODO FIXME */
/* iwlwifi/mvm/utils:: for (ac = IEEE80211_AC_VO; ac <= IEEE80211_AC_VI; ac++) */
@@ -262,6 +272,8 @@ enum ieee80211_ac_numbers {
#define IEEE80211_HT_MCS_RX_HIGHEST_MASK 0x3ff
#define IEEE80211_HT_MCS_MASK_LEN 10
+#define IEEE80211_MLD_MAX_NUM_LINKS 15
+
struct ieee80211_mcs_info {
uint8_t rx_mask[IEEE80211_HT_MCS_MASK_LEN];
uint16_t rx_highest;
@@ -384,12 +396,20 @@ enum ieee80211_tx_info_flags {
IEEE80211_TX_CTL_HW_80211_ENCAP = BIT(16),
IEEE80211_TX_CTL_USE_MINRATE = BIT(17),
IEEE80211_TX_CTL_RATE_CTRL_PROBE = BIT(18),
+ IEEE80211_TX_CTL_LDPC = BIT(19),
+ IEEE80211_TX_CTL_STBC = BIT(20),
+};
+
+enum ieee80211_tx_status_flags {
+ IEEE80211_TX_STATUS_ACK_SIGNAL_VALID = BIT(0),
};
enum ieee80211_tx_control_flags {
/* XXX TODO .. right shift numbers */
IEEE80211_TX_CTRL_PORT_CTRL_PROTO = BIT(0),
IEEE80211_TX_CTRL_PS_RESPONSE = BIT(1),
+ IEEE80211_TX_CTRL_RATE_INJECT = BIT(2),
+ IEEE80211_TX_CTRL_MLO_LINK = 0xF0000000, /* This is IEEE80211_LINK_UNSPECIFIED on the high bits. */
};
enum ieee80211_tx_rate_flags {
@@ -404,6 +424,8 @@ enum ieee80211_tx_rate_flags {
IEEE80211_TX_RC_USE_SHORT_PREAMBLE = BIT(7),
};
+#define IEEE80211_RNR_TBTT_PARAMS_PSD_RESERVED -128
+
#define IEEE80211_HT_CTL_LEN 4
struct ieee80211_hdr { /* net80211::ieee80211_frame_addr4 */
@@ -511,11 +533,28 @@ struct ieee80211_mgmt {
/* Optional follows... */
uint8_t variable[0];
} addba_req;
+ /* XXX */
+ struct {
+ uint8_t dialog_token;
+ } wnm_timing_msr;
} u;
} action;
} u;
};
+struct ieee80211_cts { /* net80211::ieee80211_frame_cts */
+ __le16 frame_control;
+ __le16 duration;
+ uint8_t ra[ETH_ALEN];
+} __packed;
+
+struct ieee80211_rts { /* net80211::ieee80211_frame_rts */
+ __le16 frame_control;
+ __le16 duration;
+ uint8_t ra[ETH_ALEN];
+ uint8_t ta[ETH_ALEN];
+} __packed;
+
#define MHZ_TO_KHZ(_f) ((_f) * 1000)
#define DBI_TO_MBI(_g) ((_g) * 100)
#define MBI_TO_DBI(_x) ((_x) / 100)
@@ -546,6 +585,7 @@ enum ieee80211_eid {
WLAN_EID_HT_CAPABILITY = 45, /* IEEE80211_ELEMID_HTCAP */
WLAN_EID_RSN = 48, /* IEEE80211_ELEMID_RSN */
WLAN_EID_EXT_SUPP_RATES = 50,
+ WLAN_EID_EXT_NON_INHERITANCE = 56,
WLAN_EID_EXT_CHANSWITCH_ANN = 60,
WLAN_EID_MULTIPLE_BSSID = 71, /* IEEE80211_ELEMID_MULTIBSSID */
WLAN_EID_MULTI_BSSID_IDX = 85,
@@ -650,6 +690,12 @@ struct ieee80211_bssid_index {
int bssid_index;
};
+enum ieee80211_reg_ap_power {
+ IEEE80211_REG_LPI_AP,
+ IEEE80211_REG_SP_AP,
+ IEEE80211_REG_VLP_AP,
+};
+
/* net80211: IEEE80211_IS_CTL() */
static __inline bool
ieee80211_is_ctl(__le16 fc)
diff --git a/sys/compat/linuxkpi/common/include/linux/nl80211.h b/sys/compat/linuxkpi/common/include/linux/nl80211.h
index 93b40361202d..5b43ff675e19 100644
--- a/sys/compat/linuxkpi/common/include/linux/nl80211.h
+++ b/sys/compat/linuxkpi/common/include/linux/nl80211.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2020-2021 The FreeBSD Foundation
+ * Copyright (c) 2020-2023 The FreeBSD Foundation
*
* This software was developed by Björn Zeeb under sponsorship from
* the FreeBSD Foundation.
@@ -78,6 +78,8 @@ enum nl80211_reg_rule_flags {
NL80211_RRF_NO_160MHZ = BIT(8),
NL80211_RRF_NO_HE = BIT(9),
NL80211_RRF_NO_OFDM = BIT(10),
+ NL80211_RRF_NO_320MHZ = BIT(11),
+ NL80211_RRF_NO_EHT = BIT(12),
};
#define NL80211_RRF_NO_HT40 (NL80211_RRF_NO_HT40MINUS|NL80211_RRF_NO_HT40PLUS)
@@ -143,6 +145,7 @@ enum nl80211_chan_width {
NL80211_CHAN_WIDTH_160,
NL80211_CHAN_WIDTH_5,
NL80211_CHAN_WIDTH_10,
+ NL80211_CHAN_WIDTH_320,
};
enum nl80211_iftype {
@@ -159,6 +162,7 @@ enum nl80211_iftype {
NL80211_IFTYPE_MESH_POINT,
NL80211_IFTYPE_WDS,
NL80211_IFTYPE_OCB,
+ NL80211_IFTYPE_NAN,
/* Keep this last. */
NUM_NL80211_IFTYPES
@@ -223,6 +227,9 @@ enum nl80211_ext_feature {
NL80211_EXT_FEATURE_FILS_DISCOVERY,
NL80211_EXT_FEATURE_RADAR_BACKGROUND,
NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP,
+ NL80211_EXT_FEATURE_BEACON_PROTECTION,
+ NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT,
+ NL80211_EXT_FEATURE_PUNCT,
/* Keep this last. */
NUM_NL80211_EXT_FEATURES
@@ -247,10 +254,13 @@ enum nl80211_sta_info {
NL80211_STA_INFO_TX_PACKETS,
NL80211_STA_INFO_TX_BYTES,
NL80211_STA_INFO_TX_BYTES64,
+ NL80211_STA_INFO_RX_BYTES64,
NL80211_STA_INFO_TX_FAILED,
NL80211_STA_INFO_TX_RETRIES,
NL80211_STA_INFO_RX_DURATION,
NL80211_STA_INFO_TX_DURATION,
+ NL80211_STA_INFO_ACK_SIGNAL,
+ NL80211_STA_INFO_ACK_SIGNAL_AVG,
};
enum nl80211_ftm_stats {
@@ -326,6 +336,31 @@ enum nl80211_he_ltf {
NL80211_RATE_INFO_HE_4XLTF,
};
+enum nl80211_eht_gi {
+ NL80211_RATE_INFO_EHT_GI_0_8,
+ NL80211_RATE_INFO_EHT_GI_1_6,
+ NL80211_RATE_INFO_EHT_GI_3_2,
+};
+
+enum nl80211_eht_ru_alloc {
+ NL80211_RATE_INFO_EHT_RU_ALLOC_26,
+ NL80211_RATE_INFO_EHT_RU_ALLOC_52,
+ NL80211_RATE_INFO_EHT_RU_ALLOC_52P26,
+ NL80211_RATE_INFO_EHT_RU_ALLOC_106,
+ NL80211_RATE_INFO_EHT_RU_ALLOC_106P26,
+ NL80211_RATE_INFO_EHT_RU_ALLOC_242,
+ NL80211_RATE_INFO_EHT_RU_ALLOC_484,
+ NL80211_RATE_INFO_EHT_RU_ALLOC_484P242,
+ NL80211_RATE_INFO_EHT_RU_ALLOC_996,
+ NL80211_RATE_INFO_EHT_RU_ALLOC_996P484,
+ NL80211_RATE_INFO_EHT_RU_ALLOC_996P484P242,
+ NL80211_RATE_INFO_EHT_RU_ALLOC_2x996,
+ NL80211_RATE_INFO_EHT_RU_ALLOC_2x996P484,
+ NL80211_RATE_INFO_EHT_RU_ALLOC_3x996,
+ NL80211_RATE_INFO_EHT_RU_ALLOC_3x996P484,
+ NL80211_RATE_INFO_EHT_RU_ALLOC_4x996,
+};
+
enum nl80211_dfs_regions {
NL80211_DFS_UNSET,
NL80211_DFS_FCC,
@@ -352,6 +387,7 @@ enum nl80211_tid_cfg_attr {
NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL,
NL80211_TID_CONFIG_ATTR_RETRY_LONG,
NL80211_TID_CONFIG_ATTR_AMPDU_CTRL,
+ NL80211_TID_CONFIG_ATTR_AMSDU_CTRL,
};
enum nl80211_tid_config {
diff --git a/sys/compat/linuxkpi/common/include/net/cfg80211.h b/sys/compat/linuxkpi/common/include/net/cfg80211.h
index 43d4cd662c97..56ca9a231d2d 100644
--- a/sys/compat/linuxkpi/common/include/net/cfg80211.h
+++ b/sys/compat/linuxkpi/common/include/net/cfg80211.h
@@ -70,10 +70,11 @@ enum rfkill_hard_block_reasons {
#define IEEE80211_MAX_CHAINS 4 /* net80211: IEEE80211_MAX_CHAINS copied */
enum cfg80211_rate_info_flags {
- RATE_INFO_FLAGS_SHORT_GI = BIT(0),
- RATE_INFO_FLAGS_MCS = BIT(1),
- RATE_INFO_FLAGS_VHT_MCS = BIT(2),
- RATE_INFO_FLAGS_HE_MCS = BIT(3),
+ RATE_INFO_FLAGS_MCS = BIT(0),
+ RATE_INFO_FLAGS_VHT_MCS = BIT(1),
+ RATE_INFO_FLAGS_SHORT_GI = BIT(2),
+ RATE_INFO_FLAGS_HE_MCS = BIT(4),
+ RATE_INFO_FLAGS_EHT_MCS = BIT(7),
/* Max 8 bits as used in struct rate_info. */
};
@@ -149,6 +150,8 @@ enum rate_info_bw {
RATE_INFO_BW_80,
RATE_INFO_BW_160,
RATE_INFO_BW_HE_RU,
+ RATE_INFO_BW_320,
+ RATE_INFO_BW_EHT_RU,
};
struct rate_info {
@@ -160,6 +163,7 @@ struct rate_info {
uint8_t he_dcm;
uint8_t he_gi;
uint8_t he_ru_alloc;
+ uint8_t eht_gi;
};
struct ieee80211_rate {
@@ -224,6 +228,7 @@ struct ieee80211_sta_ht_cap {
#define IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK \
(7 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT) /* IEEE80211_VHTCAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK */
+#define IEEE80211_VHT_CAP_EXT_NSS_BW_MASK 0xc0000000
struct ieee80211_sta_vht_cap {
/* TODO FIXME */
@@ -362,7 +367,7 @@ struct cfg80211_ssid {
struct cfg80211_scan_6ghz_params {
/* XXX TODO */
uint8_t *bssid;
- int channel_idx, psc_no_listen, short_ssid, short_ssid_valid, unsolicited_probe;
+ int channel_idx, psc_no_listen, short_ssid, short_ssid_valid, unsolicited_probe, psd_20;
};
struct cfg80211_match_set {
@@ -529,6 +534,7 @@ struct station_info {
int generation, inactive_time, rx_bytes, rx_dropped_misc, rx_packets, signal, tx_bytes, tx_packets;
int filled, rx_beacon, rx_beacon_signal_avg, signal_avg;
int rx_duration, tx_duration, tx_failed, tx_retries;
+ int ack_signal, avg_ack_signal;
int chains;
uint8_t chain_signal[IEEE80211_MAX_CHAINS];
@@ -656,6 +662,7 @@ struct linuxkpi_ieee80211_regdomain {
#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G 0x10
#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G 0x20
#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK 0x40
+#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK_ALL 0xff
#define IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A 0x1
#define IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD 0x2
@@ -753,12 +760,95 @@ struct linuxkpi_ieee80211_regdomain {
#define IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED 0x1
#define IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET 0x2
+#define IEEE80211_HE_OPERATION_ER_SU_DISABLE 0x4
#define IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED 0x01
#define IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED 0x02
#define IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT 0x04
#define IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT 0x08
+#define IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS 0x01
+#define IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_11454 0x02
+#define IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_MASK 0x03
+#define IEEE80211_EHT_MAC_CAP0_OM_CONTROL 0x04
+#define IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 0x05
+#define IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2 0x06
+#define IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_7991 0x07
+
+#define IEEE80211_EHT_MAC_CAP1_MAX_AMPDU_LEN_MASK 0x01
+
+#define IEEE80211_EHT_MCS_NSS_RX 0x01
+#define IEEE80211_EHT_MCS_NSS_TX 0x02
+
+#define IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ 0x01
+#define IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ 0x02
+#define IEEE80211_EHT_PHY_CAP0_BEAMFORMEE_SS_80MHZ_MASK 0x03
+#define IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI 0x04
+#define IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO 0x05
+#define IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE 0x06
+#define IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER 0x07
+
+#define IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK 0x01
+#define IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK 0x02
+#define IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK 0x03
+
+#define IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK 0x01
+#define IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK 0x02
+#define IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK 0x03
+
+#define IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK 0x01
+#define IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK 0x02
+#define IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK 0x03
+#define IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK 0x04
+#define IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK 0x05
+#define IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK 0x06
+#define IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK 0x07
+#define IEEE80211_EHT_PHY_CAP3_SOUNDING_DIM_320MHZ_MASK 0x08
+
+#define IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI 0x01
+#define IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO 0x02
+#define IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP 0x03
+#define IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK 0x04
+
+#define IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_0US 0x01
+#define IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_16US 0x02
+#define IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_20US 0x03
+#define IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_8US 0x04
+#define IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK 0x05
+#define IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK 0x06
+#define IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT 0x07
+#define IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP 0x08
+#define IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP 0x09
+#define IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK 0x0a
+#define IEEE80211_EHT_PHY_CAP5_SUPP_EXTRA_EHT_LTF 0x0b
+
+#define IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP 0x01
+#define IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK 0x02
+#define IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK 0x03
+
+#define IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ 0x01
+#define IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ 0x02
+#define IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ 0x03
+#define IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ 0x04
+#define IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ 0x05
+#define IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ 0x06
+
+#define IEEE80211_EHT_PHY_CAP8_RX_1024QAM_WIDER_BW_DL_OFDMA 0x01
+#define IEEE80211_EHT_PHY_CAP8_RX_4096QAM_WIDER_BW_DL_OFDMA 0x02
+
+#define IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE 0x01
+#define IEEE80211_EHT_PPE_THRES_NSS_MASK 0x02
+#define IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK 0x03
+#define IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE 0x04
+
+#define IEEE80211_EML_CAP_EMLSR_SUPP 0x01
+#define IEEE80211_EML_CAP_TRANSITION_TIMEOUT 0x02
+#define IEEE80211_EML_CAP_TRANSITION_TIMEOUT_128TU 0x04
+#define IEEE80211_EML_CAP_EMLSR_PADDING_DELAY 0x08
+#define IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_32US 0x10
+#define IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY 0x20
+#define IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_64US 0x40
+
#define VENDOR_CMD_RAW_DATA (void *)(uintptr_t)(-ENOENT)
struct ieee80211_he_cap_elem {
@@ -804,11 +894,51 @@ struct ieee80211_sta_he_6ghz_capa {
int capa;
};
+struct ieee80211_eht_mcs_nss_supp_20mhz_only {
+ uint8_t rx_tx_mcs7_max_nss;
+ uint8_t rx_tx_mcs9_max_nss;
+ uint8_t rx_tx_mcs11_max_nss;
+ uint8_t rx_tx_mcs13_max_nss;
+};
+
+struct ieee80211_eht_mcs_nss_supp_bw {
+ uint8_t rx_tx_mcs9_max_nss;
+ uint8_t rx_tx_mcs11_max_nss;
+ uint8_t rx_tx_mcs13_max_nss;
+};
+
+struct ieee80211_eht_cap_elem_fixed {
+ uint8_t mac_cap_info[2];
+ uint8_t phy_cap_info[9];
+};
+
+struct ieee80211_eht_mcs_nss_supp {
+ /* TODO FIXME */
+ /* Can only have either or... */
+ union {
+ struct ieee80211_eht_mcs_nss_supp_20mhz_only only_20mhz;
+ struct {
+ struct ieee80211_eht_mcs_nss_supp_bw _80;
+ struct ieee80211_eht_mcs_nss_supp_bw _160;
+ struct ieee80211_eht_mcs_nss_supp_bw _320;
+ } bw;
+ };
+};
+
+#define IEEE80211_STA_EHT_PPE_THRES_MAX 32
+struct ieee80211_sta_eht_cap {
+ bool has_eht;
+ struct ieee80211_eht_cap_elem_fixed eht_cap_elem;
+ struct ieee80211_eht_mcs_nss_supp eht_mcs_nss_supp;
+ uint8_t eht_ppe_thres[IEEE80211_STA_EHT_PPE_THRES_MAX];
+};
+
struct ieee80211_sband_iftype_data {
/* TODO FIXME */
enum nl80211_iftype types_mask;
struct ieee80211_sta_he_cap he_cap;
struct ieee80211_sta_he_6ghz_capa he_6ghz_capa;
+ struct ieee80211_sta_eht_cap eht_cap;
struct {
const uint8_t *data;
size_t len;
@@ -900,7 +1030,7 @@ struct cfg80211_gtk_rekey_data {
struct cfg80211_tid_cfg {
/* XXX TODO */
- int mask, noack, retry_long, rtscts, tids;
+ int mask, noack, retry_long, rtscts, tids, amsdu, ampdu;
enum nl80211_tx_rate_setting txrate_type;
struct cfg80211_bitrate_mask txrate_mask;
};
@@ -938,6 +1068,11 @@ struct regulatory_request {
int user_reg_hint_type;
};
+struct cfg80211_set_hw_timestamp {
+ const uint8_t *macaddr;
+ bool enable;
+};
+
enum wiphy_vendor_cmd_need_flags {
WIPHY_VENDOR_CMD_NEED_NETDEV = 0x01,
WIPHY_VENDOR_CMD_NEED_RUNNING = 0x02,
@@ -960,6 +1095,7 @@ struct wiphy_iftype_ext_capab {
const uint8_t *extended_capabilities;
const uint8_t *extended_capabilities_mask;
uint8_t extended_capabilities_len;
+ uint16_t eml_capabilities;
};
@@ -996,6 +1132,7 @@ enum wiphy_flags {
WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD = BIT(13),
WIPHY_FLAG_4ADDR_AP = BIT(14),
WIPHY_FLAG_4ADDR_STATION = BIT(15),
+ WIPHY_FLAG_SUPPORTS_MLO = BIT(16),
};
struct wiphy {
@@ -1037,6 +1174,8 @@ struct wiphy {
int max_data_retry_count;
int tx_queue_len, rfkill;
int mbssid_max_interfaces;
+ int hw_timestamp_max_peers;
+ int ema_max_profile_periodicity;
unsigned long ext_features[BITS_TO_LONGS(NUM_NL80211_EXT_FEATURES)];
struct dentry *debugfsdir;
@@ -1816,7 +1955,7 @@ cfg80211_background_radar_event(struct wiphy *wiphy,
}
static __inline const u8 *
-cfg80211_find_ext_ie(uint8_t eid, uint8_t *p, size_t len)
+cfg80211_find_ext_ie(uint8_t eid, const uint8_t *p, size_t len)
{
TODO();
return (NULL);
@@ -1829,6 +1968,14 @@ cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef)
return (false);
}
+static __inline const struct ieee80211_sta_eht_cap *
+ieee80211_get_eht_iftype_cap(const struct ieee80211_supported_band *band,
+ enum nl80211_iftype iftype)
+{
+ TODO();
+ return (NULL);
+}
+
#define wiphy_info(wiphy, fmt, ...) \
printf("%s:%d XXX TODO " fmt, __func__, __LINE__, __VA_ARGS__)
diff --git a/sys/compat/linuxkpi/common/include/net/mac80211.h b/sys/compat/linuxkpi/common/include/net/mac80211.h
index 5597300e18c9..cacf9d652fd0 100644
--- a/sys/compat/linuxkpi/common/include/net/mac80211.h
+++ b/sys/compat/linuxkpi/common/include/net/mac80211.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2020-2022 The FreeBSD Foundation
+ * Copyright (c) 2020-2023 The FreeBSD Foundation
* Copyright (c) 2020-2022 Bjoern A. Zeeb
*
* This software was developed by Björn Zeeb under sponsorship from
@@ -50,6 +50,8 @@
#define WLAN_OUI_TYPE_WFA_P2P (9)
#define WLAN_OUI_WFA (0x506F9A)
+#define IEEE80211_LINK_UNSPECIFIED 0x0f
+
/* hw->conf.flags */
enum ieee80211_hw_conf_flags {
IEEE80211_CONF_IDLE = BIT(0),
@@ -114,6 +116,7 @@ enum ieee80211_bss_changed {
BSS_CHANGED_HE_OBSS_PD = BIT(27),
BSS_CHANGED_TWT = BIT(28),
BSS_CHANGED_UNSOL_BCAST_PROBE_RESP = BIT(30),
+ BSS_CHANGED_EHT_PUNCTURING = BIT(31),
};
/* 802.11 Figure 9-256 Suite selector format. [OUI(3), SUITE TYPE(1)] */
@@ -224,6 +227,15 @@ struct ieee80211_chanctx_conf {
struct ieee80211_rate_status {
struct rate_info rate_idx;
+ uint8_t try_count;
+};
+
+struct ieee80211_ema_beacons {
+ uint8_t cnt;
+ struct {
+ struct sk_buff *skb;
+ struct ieee80211_mutable_offsets offs;
+ } bcn[0];
};
#define WLAN_MEMBERSHIP_LEN (8)
@@ -231,7 +243,11 @@ struct ieee80211_rate_status {
struct ieee80211_bss_conf {
/* TODO FIXME */
+ struct ieee80211_vif *vif;
const uint8_t *bssid;
+ uint8_t addr[ETH_ALEN];
+ uint8_t link_id;
+ uint8_t _pad0;
uint8_t transmitter_bssid[ETH_ALEN];
struct ieee80211_ftm_responder_params *ftmr_params;
struct ieee80211_p2p_noa_attr p2p_noa_attr;
@@ -248,11 +264,28 @@ struct ieee80211_bss_conf {
} he_oper;
struct cfg80211_he_bss_color he_bss_color;
struct ieee80211_he_obss_pd he_obss_pd;
+
+ bool ht_ldpc;
+ bool vht_ldpc;
+ bool he_ldpc;
+ bool vht_mu_beamformee;
+ bool vht_mu_beamformer;
+ bool vht_su_beamformee;
+ bool vht_su_beamformer;
+ bool he_mu_beamformer;
+ bool he_su_beamformee;
+ bool he_su_beamformer;
+ bool he_full_ul_mumimo;
+ bool eht_su_beamformee;
+ bool eht_su_beamformer;
+ bool eht_mu_beamformer;
+
size_t ssid_len;
uint8_t ssid[IEEE80211_NWID_LEN];
uint16_t aid;
uint16_t ht_operation_mode;
int arp_addr_cnt;
+ uint16_t eht_puncturing;
uint8_t dtim_period;
uint8_t sync_dtim_count;
@@ -265,16 +298,20 @@ struct ieee80211_bss_conf {
bool use_short_preamble;
bool use_short_slot;
bool he_support;
+ bool eht_support;
bool csa_active;
+ bool mu_mimo_owner;
uint32_t sync_device_ts;
uint64_t sync_tsf;
uint16_t beacon_int;
int16_t txpower;
uint32_t basic_rates;
int mcast_rate[NUM_NL80211_BANDS];
+ enum ieee80211_reg_ap_power power_type;
struct cfg80211_bitrate_mask beacon_tx_rate;
struct mac80211_fils_discovery fils_discovery;
struct ieee80211_chanctx_conf *chanctx_conf;
+ struct ieee80211_vif *mbssid_tx_vif;
int ack_enabled, bssid_index, bssid_indicator, cqm_rssi_hyst, cqm_rssi_thold, ema_ap, frame_time_rts_th, ftm_responder;
int htc_trig_based_pkt_ext;
@@ -410,6 +447,7 @@ enum ieee80211_hw_flags {
IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD,
IEEE80211_HW_SUPPORTS_TX_ENCAP_OFFLOAD,
IEEE80211_HW_SUPPORTS_RC_TABLE,
+ IEEE80211_HW_DETECTS_COLOR_COLLISION,
/* Keep last. */
NUM_IEEE80211_HW_FLAGS
@@ -477,6 +515,7 @@ struct ieee80211_key_conf {
uint16_t flags;
uint8_t keylen;
uint8_t key[0];
+ int8_t link_id; /* signed! */
};
struct ieee80211_key_seq {
@@ -529,31 +568,47 @@ enum ieee80211_rx_status_flags {
RX_FLAG_ONLY_MONITOR = BIT(25),
RX_FLAG_SKIP_MONITOR = BIT(26),
RX_FLAG_8023 = BIT(27),
+ RX_FLAG_RADIOTAP_TLV_AT_END = BIT(28),
};
enum mac80211_rx_encoding {
RX_ENC_LEGACY = 0,
RX_ENC_HT,
RX_ENC_VHT,
- RX_ENC_HE
+ RX_ENC_HE,
+ RX_ENC_EHT,
};
struct ieee80211_rx_status {
/* TODO FIXME, this is too large. Over-reduce types to u8 where possible. */
- uint64_t boottime_ns;
+ union {
+ uint64_t boottime_ns;
+ int64_t ack_tx_hwtstamp;
+ };
uint64_t mactime;
uint32_t device_timestamp;
enum ieee80211_rx_status_flags flag;
uint16_t freq;
- uint8_t encoding:2, bw:3, he_ru:3; /* enum mac80211_rx_encoding, rate_info_bw */ /* See mt76.h */
+ uint8_t encoding:3, bw:4; /* enum mac80211_rx_encoding, rate_info_bw */ /* See mt76.h */
uint8_t ampdu_reference;
uint8_t band;
uint8_t chains;
int8_t chain_signal[IEEE80211_MAX_CHAINS];
int8_t signal;
uint8_t enc_flags;
- uint8_t he_dcm;
- uint8_t he_gi;
+ union {
+ struct {
+ uint8_t he_ru:3; /* nl80211::enum nl80211_he_ru_alloc */
+ uint8_t he_gi:2; /* nl80211::enum nl80211_he_gi */
+ uint8_t he_dcm:1;
+ };
+ struct {
+ uint8_t ru:4; /* nl80211::enum nl80211_eht_ru_alloc */
+ uint8_t gi:2; /* nl80211::enum nl80211_eht_gi */
+ } eht;
+ };
+ bool link_valid;
+ uint8_t link_id; /* very incosistent sizes? */
uint8_t zero_length_psdu_type;
uint8_t nss;
uint8_t rate_idx;
@@ -562,6 +617,7 @@ struct ieee80211_rx_status {
struct ieee80211_tx_status {
struct ieee80211_sta *sta;
struct ieee80211_tx_info *info;
+ int64_t ack_hwtstamp;
u8 n_rates;
struct ieee80211_rate_status *rates;
@@ -608,17 +664,22 @@ struct ieee80211_sta_txpwr {
short power;
};
+#define IEEE80211_NUM_TIDS 16 /* net80211::WME_NUM_TID */
struct ieee80211_sta_agg {
- /* XXX TODO */
- int max_amsdu_len;
+ uint16_t max_amsdu_len;
+ uint16_t max_rc_amsdu_len;
+ uint16_t max_tid_amsdu_len[IEEE80211_NUM_TIDS];
};
struct ieee80211_link_sta {
+ uint8_t addr[ETH_ALEN];
+ uint8_t link_id;
uint32_t supp_rates[NUM_NL80211_BANDS];
struct ieee80211_sta_ht_cap ht_cap;
struct ieee80211_sta_vht_cap vht_cap;
struct ieee80211_sta_he_cap he_cap;
struct ieee80211_sta_he_6ghz_capa he_6ghz_capa;
+ struct ieee80211_sta_eht_cap eht_cap;
uint8_t rx_nss;
enum ieee80211_sta_rx_bw bandwidth;
enum ieee80211_smps_mode smps_mode;
@@ -626,21 +687,27 @@ struct ieee80211_link_sta {
struct ieee80211_sta_txpwr txpwr;
};
-#define IEEE80211_NUM_TIDS 16 /* net80211::WME_NUM_TID */
struct ieee80211_sta {
/* TODO FIXME */
- int max_amsdu_len, max_amsdu_subframes, max_rc_amsdu_len;
+ int max_amsdu_subframes;
int mfp, smps_mode, tdls, tdls_initiator;
struct ieee80211_txq *txq[IEEE80211_NUM_TIDS + 1]; /* iwlwifi: 8 and adds +1 to tid_data, net80211::IEEE80211_TID_SIZE */
struct ieee80211_sta_rates *rates; /* some rcu thing? */
- uint32_t max_tid_amsdu_len[IEEE80211_NUM_TIDS];
uint8_t addr[ETH_ALEN];
uint16_t aid;
bool wme;
uint8_t max_sp;
uint8_t uapsd_queues;
+ uint16_t valid_links;
struct ieee80211_link_sta deflink;
+ struct ieee80211_link_sta *link[IEEE80211_MLD_MAX_NUM_LINKS]; /* rcu? */
+
+#ifndef __FOR_LATER_DRV_UPDATE
+ uint16_t max_rc_amsdu_len;
+ uint16_t max_amsdu_len;
+ uint16_t max_tid_amsdu_len[IEEE80211_NUM_TIDS];
+#endif
/* Must stay last. */
uint8_t drv_priv[0] __aligned(CACHE_LINE_SIZE);
@@ -681,16 +748,24 @@ enum ieee80211_vif_driver_flags {
IEEE80211_VIF_BEACON_FILTER = BIT(0),
IEEE80211_VIF_SUPPORTS_CQM_RSSI = BIT(1),
IEEE80211_VIF_SUPPORTS_UAPSD = BIT(2),
+ IEEE80211_VIF_DISABLE_SMPS_OVERRIDE = BIT(3),
};
#define IEEE80211_BSS_ARP_ADDR_LIST_LEN 4
struct ieee80211_vif_cfg {
uint16_t aid;
+ uint16_t eml_cap;
+ uint16_t eml_med_sync_delay;
bool assoc;
bool ps;
+ bool idle;
+ bool ibss_joined;
int arp_addr_cnt;
+ size_t ssid_len;
uint32_t arp_addr_list[IEEE80211_BSS_ARP_ADDR_LIST_LEN]; /* big endian */
+ uint8_t ssid[IEEE80211_NWID_LEN];
+ uint8_t ap_addr[ETH_ALEN];
};
struct ieee80211_vif {
@@ -707,7 +782,11 @@ struct ieee80211_vif {
struct ieee80211_chanctx_conf *chanctx_conf;
struct ieee80211_txq *txq;
struct ieee80211_bss_conf bss_conf;
+ struct ieee80211_bss_conf *link_conf[IEEE80211_MLD_MAX_NUM_LINKS]; /* rcu? */
uint8_t hw_queue[IEEE80211_NUM_ACS];
+ uint16_t active_links;
+ uint16_t valid_links;
+ struct ieee80211_vif *mbssid_tx_vif;
/* #ifdef CONFIG_MAC80211_DEBUGFS */ /* Do not change structure depending on compile-time option. */
struct dentry *debugfs_dir;
@@ -720,6 +799,7 @@ struct ieee80211_vif {
struct ieee80211_vif_chanctx_switch {
struct ieee80211_chanctx_conf *old_ctx, *new_ctx;
struct ieee80211_vif *vif;
+ struct ieee80211_bss_conf *link_conf;
};
struct ieee80211_prep_tx_info {
@@ -750,7 +830,7 @@ struct ieee80211_tx_info {
uint8_t ampdu_len;
uint8_t antenna;
uint16_t tx_time;
- bool is_valid_ack_signal;
+ uint8_t flags;
void *status_driver_data[16 / sizeof(void *)]; /* XXX TODO */
} status;
#define IEEE80211_TX_INFO_DRIVER_DATA_SIZE 40
@@ -792,11 +872,10 @@ enum ieee80211_iface_iter {
IEEE80211_IFACE_ITER_NORMAL = BIT(0),
IEEE80211_IFACE_ITER_RESUME_ALL = BIT(1),
IEEE80211_IFACE_SKIP_SDATA_NOT_IN_DRIVER = BIT(2), /* seems to be an iter flag */
+ IEEE80211_IFACE_ITER_ACTIVE = BIT(3),
/* Internal flags only. */
- /* ieee80211_iterate_active_interfaces*(). */
IEEE80211_IFACE_ITER__ATOMIC = BIT(6),
- IEEE80211_IFACE_ITER__ACTIVE = BIT(7),
IEEE80211_IFACE_ITER__MTX = BIT(8),
};
@@ -864,6 +943,7 @@ struct ieee80211_ops {
void (*mgd_protect_tdls_discover)(struct ieee80211_hw *, struct ieee80211_vif *);
void (*flush)(struct ieee80211_hw *, struct ieee80211_vif *, u32, bool);
+ void (*flush_sta)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *);
int (*set_frag_threshold)(struct ieee80211_hw *, u32);
@@ -933,6 +1013,7 @@ struct ieee80211_ops {
int (*set_key)(struct ieee80211_hw *, enum set_key_cmd, struct ieee80211_vif *, struct ieee80211_sta *, struct ieee80211_key_conf *);
void (*set_default_unicast_key)(struct ieee80211_hw *, struct ieee80211_vif *, int);
void (*update_tkip_key)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_key_conf *, struct ieee80211_sta *, u32, u16 *);
+ void (*set_rekey_data)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_gtk_rekey_data *);
int (*start_pmsr)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_pmsr_request *);
void (*abort_pmsr)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_pmsr_request *);
@@ -961,6 +1042,14 @@ struct ieee80211_ops {
void (*add_twt_setup)(struct ieee80211_hw *, struct ieee80211_sta *, struct ieee80211_twt_setup *);
void (*twt_teardown_request)(struct ieee80211_hw *, struct ieee80211_sta *, u8);
+ int (*set_hw_timestamp)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_set_hw_timestamp *);
+
+ void (*link_info_changed)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *, u64);
+ void (*vif_cfg_changed)(struct ieee80211_hw *, struct ieee80211_vif *, u64);
+
+ int (*change_vif_links)(struct ieee80211_hw *, struct ieee80211_vif *, u16, u16, struct ieee80211_bss_conf *[IEEE80211_MLD_MAX_NUM_LINKS]);
+ int (*change_sta_links)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, u16, u16);
+
/* #ifdef CONFIG_MAC80211_DEBUGFS */ /* Do not change depending on compile-time option. */
void (*sta_add_debugfs)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, struct dentry *);
/* #endif */
@@ -1017,7 +1106,7 @@ void linuxkpi_ieee80211_queue_work(struct ieee80211_hw *, struct work_struct *);
struct sk_buff *linuxkpi_ieee80211_pspoll_get(struct ieee80211_hw *,
struct ieee80211_vif *);
struct sk_buff *linuxkpi_ieee80211_nullfunc_get(struct ieee80211_hw *,
- struct ieee80211_vif *, bool);
+ struct ieee80211_vif *, int, bool);
void linuxkpi_ieee80211_txq_get_depth(struct ieee80211_txq *, unsigned long *,
unsigned long *);
struct wireless_dev *linuxkpi_ieee80211_vif_to_wdev(struct ieee80211_vif *);
@@ -1140,6 +1229,37 @@ ieee80211_restart_hw(struct ieee80211_hw *hw)
linuxkpi_ieee80211_restart_hw(hw);
}
+static inline void
+ieee80211_hw_restart_disconnect(struct ieee80211_vif *vif)
+{
+ TODO();
+}
+
+/* -------------------------------------------------------------------------- */
+
+#define link_conf_dereference_check(_vif, _linkid) \
+ rcu_dereference_check((_vif)->link_conf[_linkid], true)
+
+#define link_conf_dereference_protected(_vif, _linkid) \
+ rcu_dereference_protected((_vif)->link_conf[_linkid], true)
+
+#define link_sta_dereference_check(_sta, _linkid) \
+ rcu_dereference_check((_sta)->link[_linkid], true)
+
+#define link_sta_dereference_protected(_sta, _linkid) \
+ rcu_dereference_protected((_sta)->link[_linkid], true)
+
+#define for_each_vif_active_link(_vif, _link, _linkid) \
+ for (_linkid = 0; _linkid < nitems((_vif)->link_conf); _linkid++) \
+ if ( ((_vif)->active_links == 0 /* no MLO */ || \
+ ((_vif)->active_links & BIT(_linkid)) != 0) && \
+ (_link = rcu_dereference((_vif)->link_conf[_linkid])) )
+
+#define for_each_sta_active_link(_vif, _sta, _linksta, _linkid) \
+ for (_linkid = 0; _linkid < nitems((_vif)->link_conf); _linkid++) \
+ if ( ((_vif)->active_links == 0 /* no MLO */ || \
+ ((_vif)->active_links & BIT(_linkid)) != 0) && \
+ (_linksta = link_sta_dereference_protected((_sta), (_linkid))) )
/* -------------------------------------------------------------------------- */
@@ -1301,8 +1421,18 @@ ieee80211_is_back_req(__le16 fc)
}
static __inline bool
+#ifdef __FOR_LATER_DRV_UPDATE
+ieee80211_is_bufferable_mmpdu(struct sk_buff *skb)
+{
+ struct ieee80211_mgmt *mgmt;
+ __le16 fc;
+
+ mgmt = (struct ieee80211_mgmt *)skb->data;
+ fc = mgmt->frame_control;
+#else
ieee80211_is_bufferable_mmpdu(__le16 fc)
{
+#endif
/* 11.2.2 Bufferable MMPDUs, 80211-2020. */
/* XXX we do not care about IBSS yet. */
@@ -1310,12 +1440,14 @@ ieee80211_is_bufferable_mmpdu(__le16 fc)
if (!ieee80211_is_mgmt(fc))
return (false);
if (ieee80211_is_action(fc)) /* XXX FTM? */
- return (true);
+ return (true); /* XXX false? */
if (ieee80211_is_disassoc(fc))
return (true);
if (ieee80211_is_deauth(fc))
return (true);
+ TODO();
+
return (false);
}
@@ -1388,6 +1520,20 @@ ieee80211_is_robust_mgmt_frame(struct sk_buff *skb)
}
static __inline bool
+ieee80211_is_ftm(struct sk_buff *skb)
+{
+ TODO();
+ return (false);
+}
+
+static __inline bool
+ieee80211_is_timing_measurement(struct sk_buff *skb)
+{
+ TODO();
+ return (false);
+}
+
+static __inline bool
ieee80211_has_pm(__le16 fc)
{
TODO();
@@ -1569,6 +1715,13 @@ ieee80211_next_txq(struct ieee80211_hw *hw, uint8_t ac)
return (linuxkpi_ieee80211_next_txq(hw, ac));
}
+static inline void
+ieee80211_handle_wake_tx_queue(struct ieee80211_hw *hw,
+ struct ieee80211_txq *txq)
+{
+ TODO();
+}
+
/* -------------------------------------------------------------------------- */
static __inline uint8_t
@@ -1599,7 +1752,7 @@ ieee80211_iterate_active_interfaces_atomic(struct ieee80211_hw *hw,
{
flags |= IEEE80211_IFACE_ITER__ATOMIC;
- flags |= IEEE80211_IFACE_ITER__ACTIVE;
+ flags |= IEEE80211_IFACE_ITER_ACTIVE;
linuxkpi_ieee80211_iterate_interfaces(hw, flags, iterfunc, arg);
}
@@ -1610,7 +1763,7 @@ ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw,
void *arg)
{
- flags |= IEEE80211_IFACE_ITER__ACTIVE;
+ flags |= IEEE80211_IFACE_ITER_ACTIVE;
linuxkpi_ieee80211_iterate_interfaces(hw, flags, iterfunc, arg);
}
@@ -1620,7 +1773,7 @@ ieee80211_iterate_active_interfaces_mtx(struct ieee80211_hw *hw,
void(*iterfunc)(void *, uint8_t *, struct ieee80211_vif *),
void *arg)
{
- flags |= IEEE80211_IFACE_ITER__ACTIVE;
+ flags |= IEEE80211_IFACE_ITER_ACTIVE;
flags |= IEEE80211_IFACE_ITER__MTX;
linuxkpi_ieee80211_iterate_interfaces(hw, flags, iterfunc, arg);
}
@@ -1869,7 +2022,11 @@ ieee80211_ie_split(const u8 *ies, size_t ies_len,
}
static __inline void
-ieee80211_request_smps(struct ieee80211_vif *vif, enum ieee80211_smps_mode smps)
+ieee80211_request_smps(struct ieee80211_vif *vif,
+#ifdef __FOR_LATER_DRV_UPDATE
+ u_int link_id,
+#endif
+ enum ieee80211_smps_mode smps)
{
static const char *smps_mode_name[] = {
"SMPS_OFF",
@@ -1971,6 +2128,20 @@ ieee80211_rate_set_vht(struct ieee80211_tx_rate *r, uint32_t f1, uint32_t f2)
TODO();
}
+static __inline uint8_t
+ieee80211_rate_get_vht_nss(struct ieee80211_tx_rate *r)
+{
+ TODO();
+ return (0);
+}
+
+static __inline uint8_t
+ieee80211_rate_get_vht_mcs(struct ieee80211_tx_rate *r)
+{
+ TODO();
+ return (0);
+}
+
static __inline void
ieee80211_reserve_tid(struct ieee80211_sta *sta, uint8_t tid)
{
@@ -2024,6 +2195,12 @@ ieee80211_sta_pspoll(struct ieee80211_sta *sta)
}
static __inline void
+ieee80211_sta_recalc_aggregates(struct ieee80211_sta *sta)
+{
+ TODO();
+}
+
+static __inline void
ieee80211_sta_uapsd_trigger(struct ieee80211_sta *sta, int ntids)
{
TODO();
@@ -2044,7 +2221,11 @@ ieee80211_tx_dequeue(struct ieee80211_hw *hw, struct ieee80211_txq *txq)
}
static __inline void
-ieee80211_update_mu_groups(struct ieee80211_vif *vif, uint8_t *ms, uint8_t *up)
+ieee80211_update_mu_groups(struct ieee80211_vif *vif,
+#ifdef __FOR_LATER_DRV_UPDATE
+ u_int _i,
+#endif
+ uint8_t *ms, uint8_t *up)
{
TODO();
}
@@ -2164,14 +2345,20 @@ ieee80211_proberesp_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
static __inline struct sk_buff *
ieee80211_nullfunc_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+#ifdef __FOR_LATER_DRV_UPDATE
+ int linkid,
+#endif
bool qos)
{
+#ifndef __FOR_LATER_DRV_UPDATE
+ int linkid = 0;
+#endif
/* Only STA needs this. Otherwise return NULL and panic bad drivers. */
if (vif->type != NL80211_IFTYPE_STATION)
return (NULL);
- return (linuxkpi_ieee80211_nullfunc_get(hw, vif, qos));
+ return (linuxkpi_ieee80211_nullfunc_get(hw, vif, linkid, qos));
}
static __inline struct sk_buff *
@@ -2489,12 +2676,57 @@ ieee80211_report_wowlan_wakeup(struct ieee80211_vif *vif,
}
static __inline void
-ieeee80211_obss_color_collision_notify(struct ieee80211_vif *vif,
- uint64_t obss_color_bitmap)
+ieee80211_obss_color_collision_notify(struct ieee80211_vif *vif,
+ uint64_t obss_color_bitmap, gfp_t gfp)
{
TODO();
}
+static __inline void
+ieee80211_refresh_tx_agg_session_timer(struct ieee80211_sta *sta,
+ uint8_t tid)
+{
+ TODO();
+}
+
+static __inline struct ieee80211_ema_beacons *
+ieee80211_beacon_get_template_ema_list(struct ieee80211_hw *hw,
+ struct ieee80211_vif *vif, uint32_t link_id)
+{
+ TODO();
+ return (NULL);
+}
+
+static __inline void
+ieee80211_beacon_free_ema_list(struct ieee80211_ema_beacons *bcns)
+{
+ TODO();
+}
+
+static inline bool
+ieee80211_vif_is_mld(const struct ieee80211_vif *vif)
+{
+
+ /* If valid_links is non-zero, the vif is an MLD. */
+ return (vif->valid_links != 0);
+}
+
+static __inline const struct ieee80211_sta_he_cap *
+ieee80211_get_he_iftype_cap_vif(const struct ieee80211_supported_band *band,
+ struct ieee80211_vif *vif)
+{
+ TODO();
+ return (NULL);
+}
+
+static __inline const struct ieee80211_sta_eht_cap *
+ieee80211_get_eht_iftype_cap_vif(const struct ieee80211_supported_band *band,
+ struct ieee80211_vif *vif)
+{
+ TODO();
+ return (NULL);
+}
+
#define ieee80211_send_bar(_v, _r, _t, _s) \
linuxkpi_ieee80211_send_bar(_v, _r, _t, _s)
diff --git a/sys/compat/linuxkpi/common/src/linux_80211.c b/sys/compat/linuxkpi/common/src/linux_80211.c
index 15c33b1e344e..51d5bc2c4fc1 100644
--- a/sys/compat/linuxkpi/common/src/linux_80211.c
+++ b/sys/compat/linuxkpi/common/src/linux_80211.c
@@ -2273,6 +2273,7 @@ lkpi_ic_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ],
/* XXX-BZ hardcoded for now! */
#if 1
vif->chanctx_conf = NULL;
+ vif->bss_conf.vif = vif;
vif->bss_conf.idle = true;
vif->bss_conf.ps = false;
vif->bss_conf.chandef.width = NL80211_CHAN_WIDTH_20_NOHT;
@@ -3845,12 +3846,12 @@ linuxkpi_ieee80211_iterate_interfaces(struct ieee80211_hw *hw,
if (flags & ~(IEEE80211_IFACE_ITER_NORMAL|
IEEE80211_IFACE_ITER_RESUME_ALL|
IEEE80211_IFACE_SKIP_SDATA_NOT_IN_DRIVER|
- IEEE80211_IFACE_ITER__ACTIVE|IEEE80211_IFACE_ITER__ATOMIC)) {
+ IEEE80211_IFACE_ITER_ACTIVE|IEEE80211_IFACE_ITER__ATOMIC)) {
ic_printf(lhw->ic, "XXX TODO %s flags(%#x) not yet supported.\n",
__func__, flags);
}
- active = (flags & IEEE80211_IFACE_ITER__ACTIVE) != 0;
+ active = (flags & IEEE80211_IFACE_ITER_ACTIVE) != 0;
atomic = (flags & IEEE80211_IFACE_ITER__ATOMIC) != 0;
nin_drv = (flags & IEEE80211_IFACE_SKIP_SDATA_NOT_IN_DRIVER) != 0;
@@ -4515,7 +4516,7 @@ linuxkpi_ieee80211_tx_status_ext(struct ieee80211_hw *hw,
txs.final_rate = info->status.rates[0].idx;
txs.flags |= IEEE80211_RATECTL_STATUS_FINAL_RATE;
#endif
- if (info->status.is_valid_ack_signal) {
+ if (info->status.flags & IEEE80211_TX_STATUS_ACK_SIGNAL_VALID) {
txs.rssi = info->status.ack_signal; /* XXX-BZ CONVERT? */
txs.flags |= IEEE80211_RATECTL_STATUS_RSSI;
}
@@ -4540,7 +4541,7 @@ linuxkpi_ieee80211_tx_status_ext(struct ieee80211_hw *hw,
"band %u hw_queue %u tx_time_est %d : "
"rates [ %u %u %#x, %u %u %#x, %u %u %#x, %u %u %#x ] "
"ack_signal %u ampdu_ack_len %u ampdu_len %u antenna %u "
- "tx_time %u is_valid_ack_signal %u "
+ "tx_time %u flags %#x "
"status_driver_data [ %p %p ]\n",
__func__, hw, skb, status, info->flags,
info->band, info->hw_queue, info->tx_time_est,
@@ -4554,7 +4555,7 @@ linuxkpi_ieee80211_tx_status_ext(struct ieee80211_hw *hw,
info->status.rates[3].flags,
info->status.ack_signal, info->status.ampdu_ack_len,
info->status.ampdu_len, info->status.antenna,
- info->status.tx_time, info->status.is_valid_ack_signal,
+ info->status.tx_time, info->status.flags,
info->status.status_driver_data[0],
info->status.status_driver_data[1]);
#endif
@@ -4698,13 +4699,15 @@ linuxkpi_ieee80211_pspoll_get(struct ieee80211_hw *hw,
struct sk_buff *
linuxkpi_ieee80211_nullfunc_get(struct ieee80211_hw *hw,
- struct ieee80211_vif *vif, bool qos)
+ struct ieee80211_vif *vif, int linkid, bool qos)
{
struct lkpi_vif *lvif;
struct ieee80211vap *vap;
struct sk_buff *skb;
struct ieee80211_frame *nullf;
+ IMPROVE("linkid");
+
skb = dev_alloc_skb(hw->extra_tx_headroom + sizeof(*nullf));
if (skb == NULL)
return (NULL);
diff --git a/sys/compat/linuxkpi/dummy/include/net/gso.h b/sys/compat/linuxkpi/dummy/include/net/gso.h
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/sys/compat/linuxkpi/dummy/include/net/gso.h