git: 6ddbe66d0259 - stable/13 - LinuxKPI: 802.11 header updates and add/adjust source dependencies.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 20 Feb 2022 18:15:51 UTC
The branch stable/13 has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=6ddbe66d02591bacbedd8c26c086621ea27c1d2c commit 6ddbe66d02591bacbedd8c26c086621ea27c1d2c 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-20 16:25:43 +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) (cherry picked from commit 2e183d999c6033e876602ddbbc5cb538bb41e4b3) --- .../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 4c558e42da24..e6aac3639299 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), \ *** 79 LINES SKIPPED ***