git: 2e183d999c60 - main - LinuxKPI: 802.11 header updates and add/adjust source dependencies.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 16 Feb 2022 00:38:27 UTC
The branch main has been updated by bz:
URL: https://cgit.FreeBSD.org/src/commit/?id=2e183d999c6033e876602ddbbc5cb538bb41e4b3
commit 2e183d999c6033e876602ddbbc5cb538bb41e4b3
Author: Bjoern A. Zeeb <bz@FreeBSD.org>
AuthorDate: 2022-02-15 23:45:15 +0000
Commit: Bjoern A. Zeeb <bz@FreeBSD.org>
CommitDate: 2022-02-15 23:45:15 +0000
LinuxKPI: 802.11 header updates and add/adjust source dependencies.
This update is for more/newer versions of drivers:
- add and properly place more structs, enums, defines needed by drivers.
- correct types of struct fields.
- make various function arguments const.
- move REG_RULE() macro to its own file regulatory.h and
use macros for calculations.
- add linuxkpi_ieee80211_get_channel() implementation.
- change linuxkpi_ieee80211_ifattach() to return int for error checking.
No intended functional changes for iwlwifi.
Sponsored by: The FreeBSD Foundation (partially)
MFC after: 3 days
---
.../linuxkpi/common/include/linux/ieee80211.h | 37 ++++++
sys/compat/linuxkpi/common/include/linux/nl80211.h | 49 +++++++-
sys/compat/linuxkpi/common/include/net/cfg80211.h | 139 ++++++++++++++-------
sys/compat/linuxkpi/common/include/net/mac80211.h | 113 ++++++++++++-----
.../linuxkpi/common/include/net/regulatory.h | 45 +++++++
sys/compat/linuxkpi/common/src/linux_80211.c | 34 ++++-
6 files changed, 339 insertions(+), 78 deletions(-)
diff --git a/sys/compat/linuxkpi/common/include/linux/ieee80211.h b/sys/compat/linuxkpi/common/include/linux/ieee80211.h
index 1fe295c2ae96..4b8c3243b26a 100644
--- a/sys/compat/linuxkpi/common/include/linux/ieee80211.h
+++ b/sys/compat/linuxkpi/common/include/linux/ieee80211.h
@@ -42,10 +42,22 @@
extern int debug_80211;
+/* 9.4.2.55 Management MIC element (CMAC-256, GMAC-128, and GMAC-256). */
+struct ieee80211_mmie_16 {
+ uint8_t element_id;
+ uint8_t length;
+ uint16_t key_id;
+ uint8_t ipn[6];
+ uint8_t mic[16];
+};
+
#define IEEE80211_CCMP_HDR_LEN 8 /* 802.11i .. net80211 comment */
#define IEEE80211_CCMP_PN_LEN 6
#define IEEE80211_CCMP_MIC_LEN 8 /* || 16 */
+#define IEEE80211_CCMP_256_HDR_LEN 8
+#define IEEE80211_CCMP_256_MIC_LEN 16
#define IEEE80211_GCMP_HDR_LEN 8
+#define IEEE80211_GCMP_MIC_LEN 16
#define IEEE80211_GCMP_PN_LEN 6
#define IEEE80211_GMAC_PN_LEN 6
@@ -56,6 +68,7 @@ extern int debug_80211;
#define IEEE80211_MAX_AMPDU_BUF_HT 0x40
#define IEEE80211_MAX_AMPDU_BUF 256 /* for HE? */
+#define IEEE80211_MAX_FRAME_LEN 2352
#define IEEE80211_MAX_DATA_LEN (2300 + IEEE80211_CRC_LEN)
#define IEEE80211_MAX_MPDU_LEN_HT_BA 4095 /* 9.3.2.1 Format of Data frames; non-VHT non-DMG STA */
@@ -73,6 +86,7 @@ extern int debug_80211;
#define IEEE80211_P2P_OPPPS_ENABLE_BIT BIT(7)
#define IEEE80211_QOS_CTL_TAG1D_MASK 0x0007
+#define IEEE80211_QOS_CTL_TID_MASK IEEE80211_QOS_TID
#define IEEE80211_QOS_CTL_EOSP 0x0010
#define IEEE80211_QOS_CTL_A_MSDU_PRESENT 0x0080 /* 9.2.4.5.1, Table 9-6 QoS Control Field */
@@ -82,6 +96,7 @@ enum ieee80211_rate_control_changed_flags {
IEEE80211_RC_BW_CHANGED = BIT(0),
IEEE80211_RC_NSS_CHANGED = BIT(1),
IEEE80211_RC_SUPP_RATES_CHANGED = BIT(2),
+ IEEE80211_RC_SMPS_CHANGED = BIT(3),
};
#define IEEE80211_SCTL_FRAG IEEE80211_SEQ_FRAG_MASK
@@ -102,10 +117,18 @@ enum ieee80211_rate_control_changed_flags {
#define WLAN_CAPABILITY_SHORT_PREAMBLE __LINE__ /* TODO FIXME brcmfmac */
#define WLAN_CAPABILITY_SHORT_SLOT_TIME __LINE__ /* TODO FIXME brcmfmac */
+enum wlan_ht_cap_sm_ps {
+ WLAN_HT_CAP_SM_PS_STATIC = 0,
+ WLAN_HT_CAP_SM_PS_DYNAMIC,
+ WLAN_HT_CAP_SM_PS_INVALID,
+ WLAN_HT_CAP_SM_PS_DISABLED,
+};
#define WLAN_MAX_KEY_LEN 32 /* TODO FIXME brcmfmac */
#define WLAN_PMKID_LEN 16 /* TODO FIXME brcmfmac */
+#define WLAN_KEY_LEN_WEP40 5
+#define WLAN_KEY_LEN_WEP104 13
#define WLAN_KEY_LEN_CCMP 16
#define WLAN_KEY_LEN_GCMP_256 32
@@ -113,14 +136,17 @@ enum ieee80211_rate_control_changed_flags {
enum ieee80211_min_mpdu_start_spacing {
IEEE80211_HT_MPDU_DENSITY_NONE = 0,
IEEE80211_HT_MPDU_DENSITY_4 = 5, /* 4us */
+ IEEE80211_HT_MPDU_DENSITY_8 = 6, /* 8us */
IEEE80211_HT_MPDU_DENSITY_16 = 7, /* 16us */
};
/* 9.4.2.57, Table 9-168, HT Operation element fields and subfields */
#define IEEE80211_HT_STBC_PARAM_DUAL_CTS_PROT 0x0080 /* B24.. */
+#define IEEE80211_FCTL_FTYPE IEEE80211_FC0_TYPE_MASK
#define IEEE80211_FCTL_STYPE IEEE80211_FC0_SUBTYPE_MASK
#define IEEE80211_FCTL_ORDER (IEEE80211_FC1_ORDER << 8)
+#define IEEE80211_FCTL_PROTECTED (IEEE80211_FC1_PROTECTED << 8)
#define IEEE80211_STYPE_ASSOC_REQ IEEE80211_FC0_SUBTYPE_ASSOC_REQ
#define IEEE80211_STYPE_REASSOC_REQ IEEE80211_FC0_SUBTYPE_REASSOC_REQ
@@ -129,6 +155,7 @@ enum ieee80211_min_mpdu_start_spacing {
#define IEEE80211_STYPE_AUTH IEEE80211_FC0_SUBTYPE_AUTH
#define IEEE80211_STYPE_DEAUTH IEEE80211_FC0_SUBTYPE_DEAUTH
#define IEEE80211_STYPE_ACTION IEEE80211_FC0_SUBTYPE_ACTION
+#define IEEE80211_STYPE_QOS_DATA IEEE80211_FC0_SUBTYPE_QOS
#define IEEE80211_NUM_ACS 4 /* net8021::WME_NUM_AC */
@@ -205,6 +232,8 @@ struct ieee80211_vht_cap {
__le32 vht_cap_info;
};
+#define IEEE80211_HT_MAX_AMPDU_FACTOR 13
+
enum ieee80211_ht_max_ampdu_len {
IEEE80211_HT_MAX_AMPDU_64K
};
@@ -231,6 +260,7 @@ enum ieee80211_chanctx_change_flags {
IEEE80211_CHANCTX_CHANGE_RADAR = BIT(1),
IEEE80211_CHANCTX_CHANGE_RX_CHAINS = BIT(2),
IEEE80211_CHANCTX_CHANGE_WIDTH = BIT(3),
+ IEEE80211_CHANCTX_CHANGE_CHANNEL = BIT(4),
};
enum ieee80211_frame_release_type {
@@ -243,6 +273,7 @@ enum ieee80211_p2p_attr_ids {
IEEE80211_P2P_ATTR_DEVICE_INFO,
IEEE80211_P2P_ATTR_GROUP_ID,
IEEE80211_P2P_ATTR_LISTEN_CHANNEL,
+ IEEE80211_P2P_ATTR_ABSENCE_NOTICE,
};
enum ieee80211_reconfig_type {
@@ -294,6 +325,10 @@ enum ieee80211_tx_info_flags {
IEEE80211_TX_STAT_AMPDU_NO_BACK = BIT(9),
IEEE80211_TX_STAT_TX_FILTERED = BIT(10),
IEEE80211_TX_STAT_NOACK_TRANSMITTED = BIT(11),
+ IEEE80211_TX_CTL_FIRST_FRAGMENT = BIT(12),
+ IEEE80211_TX_INTFL_DONT_ENCRYPT = BIT(13),
+ IEEE80211_TX_CTL_NO_CCK_RATE = BIT(14),
+ IEEE80211_TX_CTL_INJECTED = BIT(15),
};
enum ieee80211_tx_control_flags {
@@ -310,6 +345,7 @@ enum ieee80211_tx_rate_flags {
IEEE80211_TX_RC_MCS = BIT(4),
IEEE80211_TX_RC_SHORT_GI = BIT(5),
IEEE80211_TX_RC_VHT_MCS = BIT(6),
+ IEEE80211_TX_RC_USE_SHORT_PREAMBLE = BIT(7),
};
#define IEEE80211_HT_CTL_LEN 4
@@ -414,6 +450,7 @@ enum ieee80211_reason_code {
/* reserved = 0, */
WLAN_REASON_UNSPECIFIED = 1,
WLAN_REASON_DEAUTH_LEAVING = 3, /* LEAVING_NETWORK_DEAUTH */
+ WLAN_REASON_TDLS_TEARDOWN_UNREACHABLE = 25,
WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED = 26,
};
diff --git a/sys/compat/linuxkpi/common/include/linux/nl80211.h b/sys/compat/linuxkpi/common/include/linux/nl80211.h
index d9d9ba4edba9..3a97879e2fd4 100644
--- a/sys/compat/linuxkpi/common/include/linux/nl80211.h
+++ b/sys/compat/linuxkpi/common/include/linux/nl80211.h
@@ -50,6 +50,7 @@ enum nl80211_feature_flags {
NL80211_FEATURE_TDLS_CHANNEL_SWITCH = BIT(13),
NL80211_FEATURE_TX_POWER_INSERTION = BIT(14),
NL80211_FEATURE_WFA_TPC_IE_IN_PROBES = BIT(15),
+ NL80211_FEATURE_AP_SCAN = BIT(16),
};
enum nl80211_pmsr_ftm_failure_flags {
@@ -77,6 +78,7 @@ enum nl80211_reg_rule_flags {
NL80211_RRF_NO_80MHZ = BIT(7),
NL80211_RRF_NO_160MHZ = BIT(8),
NL80211_RRF_NO_HE = BIT(9),
+ NL80211_RRF_NO_OFDM = BIT(10),
};
#define NL80211_RRF_NO_HT40 (NL80211_RRF_NO_HT40MINUS|NL80211_RRF_NO_HT40PLUS)
@@ -89,9 +91,6 @@ enum nl80211_scan_flags {
NL80211_SCAN_FLAG_RANDOM_SN = BIT(5),
};
-#define NL80211_REGDOM_SET_BY_USER 1
-#define NL80211_REGDOM_SET_BY_DRIVER 2
-
#define NL80211_MAX_SUPP_REG_RULES 512 /* TODO FIXME, random */
#define NL80211_BSS_CHAN_WIDTH_20 __LINE__ /* TODO FIXME, brcmfmac */
@@ -210,6 +209,11 @@ enum nl80211_ext_feature {
NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK,
NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT,
NL80211_EXT_FEATURE_SCAN_RANDOM_SN,
+ NL80211_EXT_FEATURE_STA_TX_PWR,
+ NL80211_EXT_FEATURE_CQM_RSSI_LIST,
+ NL80211_EXT_FEATURE_AQL,
+ NL80211_EXT_FEATURE_AIRTIME_FAIRNESS,
+ NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT,
/* Keep this last. */
NUM_NL80211_EXT_FEATURES
@@ -234,6 +238,8 @@ enum nl80211_sta_info {
NL80211_STA_INFO_TX_PACKETS,
NL80211_STA_INFO_TX_BYTES,
NL80211_STA_INFO_TX_FAILED,
+ NL80211_STA_INFO_TX_RETRIES,
+ NL80211_STA_INFO_RX_DURATION,
};
enum nl80211_ftm_stats {
@@ -251,7 +257,10 @@ enum nl80211_ftm_stats {
enum nl80211_reg_initiator {
/* XXX TODO */
- _XXX_FXIME_RTW88_USES_ENUM,
+ NL80211_REGDOM_SET_BY_USER,
+ NL80211_REGDOM_SET_BY_DRIVER,
+ NL80211_REGDOM_SET_BY_CORE,
+ NL80211_REGDOM_SET_BY_COUNTRY_IE,
};
struct nl80211_sta_flag_update {
@@ -311,4 +320,36 @@ enum nl80211_sar_type {
NL80211_SAR_TYPE_POWER,
};
+#define NL80211_VHT_NSS_MAX 8
+
+enum nl80211_tid_cfg_attr {
+ NL80211_TID_CONFIG_ATTR_NOACK,
+ NL80211_TID_CONFIG_ATTR_RETRY_SHORT,
+ NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE,
+ NL80211_TID_CONFIG_ATTR_TX_RATE,
+ NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL,
+ NL80211_TID_CONFIG_ATTR_RETRY_LONG,
+ NL80211_TID_CONFIG_ATTR_AMPDU_CTRL,
+};
+
+enum nl80211_tid_config {
+ NL80211_TID_CONFIG_ENABLE,
+};
+
+enum nl80211_tx_rate_setting {
+ NL80211_TX_RATE_AUTOMATIC,
+ NL80211_TX_RATE_FIXED,
+ NL80211_TX_RATE_LIMITED,
+};
+
+enum nl80211_txrate_gi {
+ NL80211_TXRATE_FORCE_LGI,
+};
+
+enum nl80211_probe_resp_offload_support {
+ NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2,
+ NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS,
+ NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P,
+};
+
#endif /* _LINUXKPI_LINUX_NL80211_H */
diff --git a/sys/compat/linuxkpi/common/include/net/cfg80211.h b/sys/compat/linuxkpi/common/include/net/cfg80211.h
index 8ec051e173a7..d8b852ec7a6d 100644
--- a/sys/compat/linuxkpi/common/include/net/cfg80211.h
+++ b/sys/compat/linuxkpi/common/include/net/cfg80211.h
@@ -36,10 +36,12 @@
#include <linux/nl80211.h>
#include <linux/ieee80211.h>
#include <linux/if_ether.h>
+#include <linux/ethtool.h>
#include <linux/device.h>
#include <linux/netdevice.h>
#include <linux/random.h>
#include <linux/skbuff.h>
+#include <net/regulatory.h>
/* linux_80211.c */
extern int debug_80211;
@@ -74,8 +76,18 @@ enum cfg80211_rate_info_flags {
extern const uint8_t rfc1042_header[6];
-enum cfg80211_bss_ftypes {
+enum ieee80211_privacy {
+ IEEE80211_PRIVACY_ANY,
+};
+
+enum ieee80211_bss_type {
+ IEEE80211_BSS_TYPE_ANY,
+};
+
+enum cfg80211_bss_frame_type {
CFG80211_BSS_FTYPE_UNKNOWN,
+ CFG80211_BSS_FTYPE_BEACON,
+ CFG80211_BSS_FTYPE_PRESP,
};
enum ieee80211_channel_flags {
@@ -88,6 +100,7 @@ enum ieee80211_channel_flags {
IEEE80211_CHAN_NO_HT40PLUS = BIT(6),
IEEE80211_CHAN_NO_80MHZ = BIT(7),
IEEE80211_CHAN_NO_160MHZ = BIT(8),
+ IEEE80211_CHAN_NO_OFDM = BIT(9),
};
#define IEEE80211_CHAN_NO_HT40 (IEEE80211_CHAN_NO_HT40MINUS|IEEE80211_CHAN_NO_HT40PLUS)
@@ -107,8 +120,30 @@ struct linuxkpi_ieee80211_channel {
bool beacon_found;
int max_antenna_gain, max_reg_power;
int orig_flags;
+ int dfs_cac_ms, dfs_state;
};
+/* XXX net80211 calls these IEEE80211_HTCAP_* */
+#define IEEE80211_HT_CAP_LDPC_CODING 0x0001 /* IEEE80211_HTCAP_LDPC */
+#define IEEE80211_HT_CAP_SUP_WIDTH_20_40 0x0002 /* IEEE80211_HTCAP_CHWIDTH40 */
+#define IEEE80211_HT_CAP_GRN_FLD 0x0010 /* IEEE80211_HTCAP_GREENFIELD */
+#define IEEE80211_HT_CAP_SGI_20 0x0020 /* IEEE80211_HTCAP_SHORTGI20 */
+#define IEEE80211_HT_CAP_SGI_40 0x0040 /* IEEE80211_HTCAP_SHORTGI40 */
+#define IEEE80211_HT_CAP_TX_STBC 0x0080 /* IEEE80211_HTCAP_TXSTBC */
+#define IEEE80211_HT_CAP_RX_STBC 0x0100 /* IEEE80211_HTCAP_RXSTBC */
+#define IEEE80211_HT_CAP_RX_STBC_SHIFT 8 /* IEEE80211_HTCAP_RXSTBC_S */
+#define IEEE80211_HT_CAP_MAX_AMSDU 0x0800 /* IEEE80211_HTCAP_MAXAMSDU */
+#define IEEE80211_HT_CAP_DSSSCCK40 0x1000 /* IEEE80211_HTCAP_DSSSCCK40 */
+#define IEEE80211_HT_CAP_SM_PS 0x000c /* IEEE80211_HTCAP_SMPS */
+#define IEEE80211_HT_CAP_SM_PS_SHIFT 2
+#define IEEE80211_HT_CAP_LSIG_TXOP_PROT 0x8000 /* IEEE80211_HTCAP_LSIGTXOPPROT */
+
+#define IEEE80211_HT_MCS_TX_DEFINED 0x0001
+#define IEEE80211_HT_MCS_TX_RX_DIFF 0x0002
+#define IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT 2
+#define IEEE80211_HT_MCS_RX_HIGHEST_MASK 0x3FF
+#define IEEE80211_HT_MCS_MASK_LEN 10
+
enum ieee80211_vht_mcs_support {
LKPI_IEEE80211_VHT_MCS_SUPPORT_0_7,
LKPI_IEEE80211_VHT_MCS_SUPPORT_0_8,
@@ -119,11 +154,11 @@ struct cfg80211_bitrate_mask {
/* TODO FIXME */
/* This is so weird but nothing else works out...*/
struct {
- uint64_t legacy; /* XXX? */
- uint8_t ht_mcs[16]; /* XXX? */
- uint16_t vht_mcs[16]; /* XXX? */
- uint16_t he_mcs[16]; /* XXX? */
- uint8_t gi; /* NL80211_TXRATE_FORCE_LGI enum? */
+ uint64_t legacy; /* XXX? */
+ uint8_t ht_mcs[IEEE80211_HT_MCS_MASK_LEN];
+ uint16_t vht_mcs[16]; /* XXX? */
+ uint16_t he_mcs[16]; /* XXX? */
+ enum nl80211_txrate_gi gi;
} control[NUM_NL80211_BANDS];
};
@@ -140,30 +175,13 @@ struct ieee80211_rate {
uint32_t flags;
};
-/* XXX net80211 calls these IEEE80211_HTCAP_* */
-#define IEEE80211_HT_CAP_LDPC_CODING 0x0001 /* IEEE80211_HTCAP_LDPC */
-#define IEEE80211_HT_CAP_SUP_WIDTH_20_40 0x0002 /* IEEE80211_HTCAP_CHWIDTH40 */
-#define IEEE80211_HT_CAP_GRN_FLD 0x0010 /* IEEE80211_HTCAP_GREENFIELD */
-#define IEEE80211_HT_CAP_SGI_20 0x0020 /* IEEE80211_HTCAP_SHORTGI20 */
-#define IEEE80211_HT_CAP_SGI_40 0x0040 /* IEEE80211_HTCAP_SHORTGI40 */
-#define IEEE80211_HT_CAP_TX_STBC 0x0080 /* IEEE80211_HTCAP_TXSTBC */
-#define IEEE80211_HT_CAP_RX_STBC 0x0100 /* IEEE80211_HTCAP_RXSTBC */
-#define IEEE80211_HT_CAP_RX_STBC_SHIFT 8 /* IEEE80211_HTCAP_RXSTBC_S */
-#define IEEE80211_HT_CAP_MAX_AMSDU 0x0800 /* IEEE80211_HTCAP_MAXAMSDU */
-#define IEEE80211_HT_CAP_DSSSCCK40 0x1000 /* IEEE80211_HTCAP_DSSSCCK40 */
-
-#define IEEE80211_HT_MCS_TX_DEFINED 0x0001
-#define IEEE80211_HT_MCS_TX_RX_DIFF 0x0002
-#define IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT 2
-#define IEEE80211_HT_MCS_RX_HIGHEST_MASK 0x3FF
-
struct ieee80211_sta_ht_cap {
/* TODO FIXME */
int ampdu_density, ampdu_factor;
bool ht_supported;
uint16_t cap;
struct mcs {
- uint16_t rx_mask[16]; /* XXX ? > 4 (rtw88) */
+ uint16_t rx_mask[IEEE80211_HT_MCS_MASK_LEN]; /* XXX ? > 4 (rtw88) */
int rx_highest;
uint32_t tx_params;
} mcs;
@@ -175,7 +193,9 @@ struct ieee80211_sta_ht_cap {
#define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 0x00000002 /* IEEE80211_VHTCAP_MAX_MPDU_LENGTH_11454 */
#define IEEE80211_VHT_CAP_MAX_MPDU_MASK 0x00000003 /* IEEE80211_VHTCAP_MAX_MPDU_MASK */
-#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ (IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_160MHZ << IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK_S)
+#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ (IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_160MHZ << IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK_S)
+#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ (IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_160_80P80MHZ << IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK_S)
+#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK 0x0000000c /* IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK */
#define IEEE80211_VHT_CAP_RXLDPC 0x00000010 /* IEEE80211_VHTCAP_RXLDPC */
@@ -196,6 +216,7 @@ struct ieee80211_sta_ht_cap {
#define IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE 0x00100000 /* IEEE80211_VHTCAP_MU_BEAMFORMEE_CAPABLE */
#define IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT 13 /* IEEE80211_VHTCAP_BEAMFORMEE_STS_SHIFT */
+#define IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK (7 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT) /* IEEE80211_VHTCAP_BEAMFORMEE_STS_MASK */
#define IEEE80211_VHT_CAP_HTC_VHT 0x00400000 /* IEEE80211_VHTCAP_HTC_VHT */
@@ -212,6 +233,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 */
+
struct ieee80211_sta_vht_cap {
/* TODO FIXME */
bool vht_supported;
@@ -578,17 +600,6 @@ struct mac_address {
uint8_t addr[ETH_ALEN];
};
-#define REG_RULE(_begin, _end, _bw, _gain, _eirp, _x) \
-{ \
- .freq_range.start_freq_khz = (_begin) * 1000, \
- .freq_range.end_freq_khz = (_end) * 1000, \
- .freq_range.max_bandwidth_khz = (_bw) * 1000, \
- .power_rule.max_antenna_gain = DBI_TO_MBI(_gain), \
- .power_rule.max_eirp = DBM_TO_MBM(_eirp), \
- .flags = (_x), /* ? */ \
- /* XXX TODO FIXME */ \
-}
-
struct ieee80211_reg_rule {
/* TODO FIXME */
uint32_t flags;
@@ -606,6 +617,7 @@ struct ieee80211_reg_rule {
struct linuxkpi_ieee80211_regdomain {
/* TODO FIXME */
uint8_t alpha2[2];
+ int dfs_region;
int n_reg_rules;
struct ieee80211_reg_rule reg_rules[];
};
@@ -812,6 +824,19 @@ struct cfg80211_gtk_rekey_data {
int kck, kek, replay_ctr;
};
+struct cfg80211_tid_cfg {
+ /* XXX TODO */
+ int mask, noack, retry_long, rtscts, tids;
+ enum nl80211_tx_rate_setting txrate_type;
+ struct cfg80211_bitrate_mask txrate_mask;
+};
+
+struct cfg80211_tid_config {
+ /* XXX TODO */
+ int n_tid_conf;
+ struct cfg80211_tid_cfg tid_conf[0];
+};
+
struct ieee80211_iface_limit {
/* TODO FIXME */
int max, types;
@@ -861,6 +886,12 @@ struct wiphy_iftype_ext_capab {
};
+struct tid_config_support {
+ /* TODO FIXME */
+ uint64_t vif; /* enum nl80211_tid_cfg_attr */
+ uint64_t peer; /* enum nl80211_tid_cfg_attr */
+};
+
enum cfg80211_regulatory {
REGULATORY_CUSTOM_REG = BIT(0),
REGULATORY_STRICT_REG = BIT(1),
@@ -868,6 +899,7 @@ enum cfg80211_regulatory {
REGULATORY_ENABLE_RELAX_NO_IR = BIT(3),
REGULATORY_WIPHY_SELF_MANAGED = BIT(4),
REGULATORY_COUNTRY_IE_IGNORE = BIT(5),
+ REGULATORY_COUNTRY_IE_FOLLOW_POWER = BIT(6),
};
#define WIPHY_FLAG_AP_UAPSD 0x00000001
@@ -883,6 +915,7 @@ enum cfg80211_regulatory {
#define WIPHY_FLAG_SUPPORTS_FW_ROAM 0x00000400
#define WIPHY_FLAG_SUPPORTS_TDLS 0x00000800
#define WIPHY_FLAG_TDLS_EXTERNAL_SETUP 0x00001000
+#define WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD 0x00002000
struct wiphy {
@@ -898,7 +931,7 @@ struct wiphy {
const struct cfg80211_sar_capa *sar_capa;
const struct wiphy_iftype_ext_capab *iftype_ext_capab;
const struct linuxkpi_ieee80211_regdomain *regd;
- char fw_version[64]; /* XXX TODO */
+ char fw_version[ETHTOOL_FWVERS_LEN];
const struct ieee80211_iface_combination *iface_combinations;
const uint32_t *cipher_suites;
int n_iface_combinations;
@@ -910,6 +943,7 @@ struct wiphy {
const struct ieee80211_txrx_stypes *mgmt_stypes;
uint32_t rts_threshold;
uint32_t frag_threshold;
+ struct tid_config_support tid_config_support;
int available_antennas_rx, available_antennas_tx;
int features, hw_version;
@@ -917,6 +951,8 @@ struct wiphy {
int num_iftype_ext_capab;
int max_ap_assoc_sta, probe_resp_offload, software_iftypes;
int bss_select_support, max_num_pmkids, retry_long, retry_short, signal_type;
+ int max_data_retry_count;
+ int tx_queue_len;
unsigned long ext_features[BITS_TO_LONGS(NUM_NL80211_EXT_FEATURES)];
struct dentry *debugfsdir;
@@ -994,6 +1030,8 @@ int linuxkpi_regulatory_set_wiphy_regd_sync(struct wiphy *wiphy,
struct linuxkpi_ieee80211_regdomain *regd);
uint32_t linuxkpi_ieee80211_channel_to_frequency(uint32_t, enum nl80211_band);
uint32_t linuxkpi_ieee80211_frequency_to_channel(uint32_t, uint32_t);
+struct linuxkpi_ieee80211_channel *
+ linuxkpi_ieee80211_get_channel(struct wiphy *, uint32_t);
/* -------------------------------------------------------------------------- */
@@ -1196,6 +1234,13 @@ regulatory_hint(struct wiphy *wiphy, const uint8_t *alpha2)
return (-ENXIO);
}
+static __inline const char *
+reg_initiator_name(enum nl80211_reg_initiator initiator)
+{
+ TODO();
+ return (NULL);
+}
+
static __inline struct linuxkpi_ieee80211_regdomain *
rtnl_dereference(const struct linuxkpi_ieee80211_regdomain *regd)
{
@@ -1236,8 +1281,10 @@ wiphy_name(struct wiphy *wiphy)
{
if (wiphy != NULL && wiphy->dev != NULL)
return dev_name(wiphy->dev);
- else
+ else {
+ IMPROVE("wlanNA");
return ("wlanNA");
+ }
}
static __inline void
@@ -1342,7 +1389,7 @@ cfg80211_ibss_joined(struct net_device *ndev, const uint8_t *addr,
static __inline struct cfg80211_bss *
cfg80211_inform_bss(struct wiphy *wiphy,
struct linuxkpi_ieee80211_channel *channel,
- enum cfg80211_bss_ftypes bss_ftype, const uint8_t *bss, int _x,
+ enum cfg80211_bss_frame_type bss_ftype, const uint8_t *bss, int _x,
uint16_t cap, uint16_t intvl, const uint8_t *ie, size_t ie_len,
int signal, gfp_t gfp)
{
@@ -1353,7 +1400,7 @@ cfg80211_inform_bss(struct wiphy *wiphy,
static __inline struct cfg80211_bss *
cfg80211_inform_bss_data(struct wiphy *wiphy,
struct cfg80211_inform_bss *bss_data,
- enum cfg80211_bss_ftypes bss_ftype, const uint8_t *bss, int _x,
+ enum cfg80211_bss_frame_type bss_ftype, const uint8_t *bss, int _x,
uint16_t cap, uint16_t intvl, const uint8_t *ie, size_t ie_len, gfp_t gfp)
{
TODO();
@@ -1471,8 +1518,8 @@ cfg80211_vendor_cmd_reply(struct sk_buff *skb)
static __inline struct linuxkpi_ieee80211_channel *
ieee80211_get_channel(struct wiphy *wiphy, uint32_t freq)
{
- TODO();
- return (NULL);
+
+ return (linuxkpi_ieee80211_get_channel(wiphy, freq));
}
static __inline size_t
@@ -1501,6 +1548,14 @@ cfg80211_channel_is_psc(struct linuxkpi_ieee80211_channel *channel)
return (false);
}
+static __inline int
+cfg80211_get_ies_channel_number(const uint8_t *ie, size_t len,
+ enum nl80211_band band, enum cfg80211_bss_frame_type ftype)
+{
+
+ TODO();
+ return (-1);
+}
/* Used for scanning at least. */
static __inline void
diff --git a/sys/compat/linuxkpi/common/include/net/mac80211.h b/sys/compat/linuxkpi/common/include/net/mac80211.h
index 7c3afebb19f8..d2e2f1412b7e 100644
--- a/sys/compat/linuxkpi/common/include/net/mac80211.h
+++ b/sys/compat/linuxkpi/common/include/net/mac80211.h
@@ -37,6 +37,7 @@
#include <asm/atomic64.h>
#include <linux/bitops.h>
#include <linux/etherdevice.h>
+#include <linux/ethtool.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/workqueue.h>
@@ -45,6 +46,7 @@
#define ARPHRD_IEEE80211_RADIOTAP __LINE__ /* XXX TODO brcmfmac */
#define WLAN_OUI_MICROSOFT (0x0050F2)
+#define WLAN_OUI_TYPE_MICROSOFT_WPA (1)
#define WLAN_OUI_TYPE_MICROSOFT_TPC (8)
#define WLAN_OUI_TYPE_WFA_P2P (9)
#define WLAN_OUI_WFA (0x506F9A)
@@ -53,6 +55,7 @@
enum ieee80211_hw_conf_flags {
IEEE80211_CONF_IDLE = BIT(0),
IEEE80211_CONF_PS = BIT(1),
+ IEEE80211_CONF_MONITOR = BIT(2),
};
/* (*ops->config()) */
@@ -60,6 +63,7 @@ enum ieee80211_hw_conf_changed_flags {
IEEE80211_CONF_CHANGE_CHANNEL = BIT(0),
IEEE80211_CONF_CHANGE_IDLE = BIT(1),
IEEE80211_CONF_CHANGE_PS = BIT(2),
+ IEEE80211_CONF_CHANGE_MONITOR = BIT(3),
};
#define CFG80211_TESTMODE_CMD(_x) /* XXX TODO */
@@ -73,6 +77,8 @@ enum mcast_filter_flags {
FIF_BCN_PRBRESP_PROMISC = BIT(2),
FIF_FCSFAIL = BIT(3),
FIF_OTHER_BSS = BIT(4),
+ FIF_PSPOLL = BIT(5),
+ FIF_CONTROL = BIT(6),
};
enum ieee80211_bss_changed {
@@ -96,6 +102,12 @@ enum ieee80211_bss_changed {
BSS_CHANGED_QOS = BIT(17),
BSS_CHANGED_TXPOWER = BIT(18),
BSS_CHANGED_HE_BSS_COLOR = BIT(19),
+ BSS_CHANGED_AP_PROBE_RESP = BIT(20),
+ BSS_CHANGED_BASIC_RATES = BIT(21),
+ BSS_CHANGED_ERP_PREAMBLE = BIT(22),
+ BSS_CHANGED_IBSS = BIT(23),
+ BSS_CHANGED_MCAST_RATE = BIT(24),
+ BSS_CHANGED_SSID = BIT(25),
};
/* 802.11 Figure 9-256 Suite selector format. [OUI(3), SUITE TYPE(1)] */
@@ -158,10 +170,23 @@ struct ieee80211_bar {
uint16_t frame_control;
};
+struct ieee80211_p2p_noa_desc {
+ uint32_t count; /* uint8_t ? */
+ uint32_t duration;
+ uint32_t interval;
+ uint32_t start_time;
+};
+
struct ieee80211_p2p_noa_attr {
+ uint8_t index;
+ uint8_t oppps_ctwindow;
+ struct ieee80211_p2p_noa_desc desc[4];
+};
+
+struct ieee80211_mutable_offsets {
/* TODO FIXME */
- int oppps_ctwindow;
- int desc, index;
+ uint16_t tim_offset;
+ int cntdwn_counter_offs;
};
#define WLAN_MEMBERSHIP_LEN (8)
@@ -203,13 +228,15 @@ struct ieee80211_bss_conf {
uint64_t sync_tsf;
uint8_t sync_dtim_count;
int16_t txpower;
+ int mcast_rate[NUM_NL80211_BANDS];
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;
int multi_sta_back_32bit, nontransmitted;
int profile_periodicity;
int twt_requester, uora_exists, uora_ocw_range;
- int assoc_capability, enable_beacon, hidden_ssid, ibss_joined, mcast_rate, twt_protected;
+ int assoc_capability, enable_beacon, hidden_ssid, ibss_joined, twt_protected;
+ int fils_discovery, he_obss_pd, he_oper, twt_responder, unsol_bcast_probe_resp_interval;
unsigned long basic_rates;
bool he_support;
};
@@ -299,6 +326,13 @@ struct ieee80211_he_mu_edca_param_ac_rec {
int aifsn, ecw_min_max, mu_edca_timer;
};
+struct ieee80211_conf {
+ int dynamic_ps_timeout;
+ uint32_t listen_interval;
+ enum ieee80211_hw_conf_flags flags;
+ struct cfg80211_chan_def chandef;
+};
+
enum ieee80211_hw_flags {
IEEE80211_HW_AMPDU_AGGREGATION,
IEEE80211_HW_AP_LINK_PS,
@@ -331,6 +365,12 @@ enum ieee80211_hw_flags {
IEEE80211_HW_TX_FRAG_LIST,
IEEE80211_HW_USES_RSS,
IEEE80211_HW_WANT_MONITOR_VIF,
+ IEEE80211_HW_SW_CRYPTO_CONTROL,
+ IEEE80211_HW_SUPPORTS_TX_FRAG,
+ IEEE80211_HW_SUPPORTS_TDLS_BUFFER_STA,
+ IEEE80211_HW_SUPPORTS_PER_STA_GTK,
+ IEEE80211_HW_REPORTS_LOW_ACK,
+ IEEE80211_HW_QUEUE_CONTROL,
/* Keep last. */
NUM_IEEE80211_HW_FLAGS
@@ -365,11 +405,7 @@ struct ieee80211_hw {
uint16_t max_listen_interval;
netdev_features_t netdev_features;
unsigned long flags[BITS_TO_LONGS(NUM_IEEE80211_HW_FLAGS)];
- struct {
- uint32_t listen_interval;
- enum ieee80211_hw_conf_flags flags;
- struct cfg80211_chan_def chandef;
- } conf;
+ struct ieee80211_conf conf;
#if 0 /* leave here for documentation purposes. This does NOT work. */
/* Must stay last. */
@@ -386,6 +422,7 @@ enum ieee802111_key_flag {
IEEE80211_KEY_FLAG_PUT_IV_SPACE = BIT(3),
IEEE80211_KEY_FLAG_PUT_MIC_SPACE = BIT(4),
IEEE80211_KEY_FLAG_SW_MGMT_TX = BIT(5),
+ IEEE80211_KEY_FLAG_GENERATE_IV_MGMT = BIT(6),
};
struct ieee80211_key_conf {
@@ -421,10 +458,6 @@ struct ieee80211_key_seq {
};
-struct ieee80211_p2p_noa_desc {
- /* TODO FIXME */
-};
-
enum ieee80211_rx_status_flags {
RX_FLAG_ALLOW_SAME_PN = BIT(0),
RX_FLAG_AMPDU_DETAILS = BIT(1),
@@ -446,6 +479,13 @@ enum ieee80211_rx_status_flags {
RX_FLAG_RADIOTAP_LSIG = BIT(17),
RX_FLAG_RADIOTAP_VENDOR_DATA = BIT(18),
RX_FLAG_NO_SIGNAL_VAL = BIT(19),
+ RX_FLAG_IV_STRIPPED = BIT(20),
+ RX_FLAG_AMPDU_IS_LAST = BIT(21),
+ RX_FLAG_AMPDU_LAST_KNOWN = BIT(22),
+ RX_FLAG_AMSDU_MORE = BIT(23),
+ RX_FLAG_MACTIME_END = BIT(24),
+ RX_FLAG_ONLY_MONITOR = BIT(25),
+ RX_FLAG_SKIP_MONITOR = BIT(26),
};
struct ieee80211_rx_status {
@@ -512,11 +552,17 @@ struct ieee80211_sta_rates {
} rate[1]; /* XXX what is the real number? */
};
+struct ieee80211_sta_txpwr {
+ /* XXX TODO */
+ enum nl80211_tx_power_setting type;
+ short power;
+};
+
#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, max_sp;
- int mfp, rx_nss, smps_mode, tdls, tdls_initiator, uapsd_queues, wme, txpwr;
+ int mfp, rx_nss, smps_mode, tdls, tdls_initiator, uapsd_queues, wme;
enum ieee80211_sta_rx_bw bandwidth;
struct ieee80211_sta_ht_cap ht_cap;
struct ieee80211_sta_vht_cap vht_cap;
@@ -524,6 +570,7 @@ struct ieee80211_sta {
struct ieee80211_sta_he_6ghz_capa he_6ghz_capa;
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? */
+ struct ieee80211_sta_txpwr txpwr;
uint32_t max_tid_amsdu_len[IEEE80211_NUM_TIDS];
uint32_t supp_rates[NUM_NL80211_BANDS];
uint8_t addr[ETH_ALEN];
@@ -574,7 +621,8 @@ struct ieee80211_vif {
/* TODO FIXME */
enum nl80211_iftype type;
int csa_active, mu_mimo_owner;
- int cab_queue, hw_queue;
+ int cab_queue;
+ int color_change_active, offload_flags;
enum ieee80211_vif_driver_flags driver_flags;
bool p2p;
bool probe_req_reg;
@@ -582,6 +630,7 @@ struct ieee80211_vif {
struct ieee80211_chanctx_conf *chanctx_conf;
struct ieee80211_txq *txq;
struct ieee80211_bss_conf bss_conf;
+ uint8_t hw_queue[IEEE80211_NUM_ACS];
/* Must stay last. */
uint8_t drv_priv[0] __aligned(CACHE_LINE_SIZE);
@@ -623,20 +672,19 @@ struct ieee80211_tx_info {
bool is_valid_ack_signal;
void *status_driver_data[2]; /* XXX TODO */
} status;
- void *driver_data[5]; /* XXX TODO */
+#define IEEE80211_TX_INFO_DRIVER_DATA_SIZE (5 * sizeof(void *)) /* XXX TODO 5? */
+ void *driver_data[IEEE80211_TX_INFO_DRIVER_DATA_SIZE / sizeof(void *)];
};
};
/* net80211 conflict */
-#ifdef FIXME_TODO
-struct ieee80211_tim_ie {
- /* TODO FIXME */
+struct linuxkpi_ieee80211_tim_ie {
uint8_t dtim_count;
uint8_t dtim_period;
uint8_t bitmap_ctrl;
- uint8_t virtual_map;
+ uint8_t *virtual_map;
};
-#endif
+#define ieee80211_tim_ie linuxkpi_ieee80211_tim_ie
struct survey_info { /* net80211::struct ieee80211_channel_survey */
/* TODO FIXME */
@@ -662,6 +710,7 @@ struct survey_info { /* net80211::struct ieee80211_channel_survey */
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 */
/* Internal flags only. */
/* ieee80211_iterate_active_interfaces*(). */
@@ -734,6 +783,7 @@ struct ieee80211_ops {
void (*sta_notify)(struct ieee80211_hw *, struct ieee80211_vif *, enum sta_notify_cmd, struct ieee80211_sta *);
void (*sta_rc_update)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, u32);
void (*sta_rate_tbl_update)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *);
+ void (*sta_set_4addr)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, bool);
u64 (*prepare_multicast)(struct ieee80211_hw *, struct netdev_hw_addr_list *);
@@ -790,7 +840,14 @@ struct ieee80211_ops {
int (*set_sar_specs)(struct ieee80211_hw *, const struct cfg80211_sar_specs *);
- /* XXX TODO: get_et_sset_count, get_et_stats, get_et_strings */
+ int (*set_tid_config)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, struct cfg80211_tid_config *);
+ int (*reset_tid_config)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, u8);
+
+ int (*get_et_sset_count)(struct ieee80211_hw *, struct ieee80211_vif *, int);
+ void (*get_et_stats)(struct ieee80211_hw *, struct ieee80211_vif *, struct ethtool_stats *, u64 *);
+ void (*get_et_strings)(struct ieee80211_hw *, struct ieee80211_vif *, u32, u8 *);
+
+ void (*update_vif_offload)(struct ieee80211_hw *, struct ieee80211_vif *);
};
@@ -803,7 +860,7 @@ struct ieee80211_hw *linuxkpi_ieee80211_alloc_hw(size_t,
const struct ieee80211_ops *);
void linuxkpi_ieee80211_iffree(struct ieee80211_hw *);
void linuxkpi_set_ieee80211_dev(struct ieee80211_hw *, char *);
-void linuxkpi_ieee80211_ifattach(struct ieee80211_hw *);
+int linuxkpi_ieee80211_ifattach(struct ieee80211_hw *);
void linuxkpi_ieee80211_ifdetach(struct ieee80211_hw *);
struct ieee80211_hw * linuxkpi_wiphy_to_ieee80211_hw(struct wiphy *);
void linuxkpi_ieee80211_iterate_interfaces(
@@ -829,7 +886,7 @@ uint8_t linuxkpi_ieee80211_get_tid(struct ieee80211_hdr *);
struct ieee80211_sta *linuxkpi_ieee80211_find_sta(struct ieee80211_vif *,
const u8 *);
struct ieee80211_sta *linuxkpi_ieee80211_find_sta_by_ifaddr(
- struct ieee80211_hw *, uint8_t *, uint8_t *);
+ struct ieee80211_hw *, const uint8_t *, const uint8_t *);
struct sk_buff *linuxkpi_ieee80211_tx_dequeue(struct ieee80211_hw *,
struct ieee80211_txq *);
bool linuxkpi_ieee80211_is_ie_id_in_ie_buf(const u8, const u8 *, size_t);
@@ -924,11 +981,11 @@ ieee80211_register_hw(struct ieee80211_hw *hw)
* setup is done.
* We need to replicate a lot of information from here into net80211.
*/
- linuxkpi_ieee80211_ifattach(hw);
+ error = linuxkpi_ieee80211_ifattach(hw);
IMPROVE();
- return (0);
+ return (error);
}
static __inline void
@@ -1337,7 +1394,7 @@ ieee80211_vif_to_wdev(struct ieee80211_vif *vif)
static __inline struct sk_buff *
ieee80211_beacon_get_template(struct ieee80211_hw *hw,
- struct ieee80211_vif *vif, void *p /* XXX TODO */)
+ struct ieee80211_vif *vif, struct ieee80211_mutable_offsets *offs)
{
TODO();
return (NULL);
@@ -1431,8 +1488,8 @@ ieee80211_find_sta(struct ieee80211_vif *vif, const u8 *peer)
}
static __inline struct ieee80211_sta *
-ieee80211_find_sta_by_ifaddr(struct ieee80211_hw *hw, uint8_t *addr,
- uint8_t *ourvifaddr)
+ieee80211_find_sta_by_ifaddr(struct ieee80211_hw *hw, const uint8_t *addr,
+ const uint8_t *ourvifaddr)
{
return (linuxkpi_ieee80211_find_sta_by_ifaddr(hw, addr, ourvifaddr));
diff --git a/sys/compat/linuxkpi/common/include/net/regulatory.h b/sys/compat/linuxkpi/common/include/net/regulatory.h
new file mode 100644
index 000000000000..a7b31812e308
--- /dev/null
+++ b/sys/compat/linuxkpi/common/include/net/regulatory.h
@@ -0,0 +1,45 @@
+/*-
+ * Copyright (c) 2020-2021 The FreeBSD Foundation
+ * Copyright (c) 2021-2022 Bjoern A. Zeeb
+ *
+ * This software was developed by Björn Zeeb under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _LINUXKPI_NET_REGULATORY_H
+#define _LINUXKPI_NET_REGULATORY_H
+
+#define REG_RULE(_begin, _end, _bw, _mag, _meirp, _flags) \
+{ \
+ .flags = (_flags), \
+ .freq_range.start_freq_khz = MHZ_TO_KHZ(_begin), \
*** 78 LINES SKIPPED ***