summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2026-04-12 15:26:09 +0300
committerJohannes Berg <johannes.berg@intel.com>2026-07-06 12:41:44 +0200
commit25bc29ba671d0496b599149a0823b5dbb5409f94 (patch)
tree29fab990d19f9744ce99de245531c1b0f0a58f81 /include
parent2bb62a85aff6d4c14a62a476dfabaada3c1cc014 (diff)
downloadlinux-25bc29ba671d0496b599149a0823b5dbb5409f94.tar.gz
linux-25bc29ba671d0496b599149a0823b5dbb5409f94.zip
wifi: radiotap: add definitions for the new UHR TLVs
Add the necessary definitions to create radiotap UHR TLVs for UHR sniffers. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com> Link: https://patch.msgid.link/20260412152605.73e682d0c8c3.I5a0c858467c852b7a2a00f580bd073af29c37705@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'include')
-rw-r--r--include/net/ieee80211_radiotap.h190
1 files changed, 190 insertions, 0 deletions
diff --git a/include/net/ieee80211_radiotap.h b/include/net/ieee80211_radiotap.h
index c60867e7e43c..8bbaf77da7cf 100644
--- a/include/net/ieee80211_radiotap.h
+++ b/include/net/ieee80211_radiotap.h
@@ -95,6 +95,8 @@ enum ieee80211_radiotap_presence {
IEEE80211_RADIOTAP_EXT = 31,
IEEE80211_RADIOTAP_EHT_USIG = 33,
IEEE80211_RADIOTAP_EHT = 34,
+ IEEE80211_RADIOTAP_UHR_ELR = 37,
+ IEEE80211_RADIOTAP_UHR = 38,
};
/* for IEEE80211_RADIOTAP_FLAGS */
@@ -602,6 +604,194 @@ enum ieee80211_radiotap_eht_usig_tb {
IEEE80211_RADIOTAP_EHT_USIG2_TB_B20_B25_TAIL = 0xfc000000,
};
+/*
+ * ieee80211_radiotap_uhr_elr - content of UHR-ELR TLV (type 37)
+ * see https://www.radiotap.org/fields/UHR-ELR for details
+ */
+struct ieee80211_radiotap_uhr_elr {
+ __le32 known;
+ __le32 sig1, sig2, mark;
+} __packed;
+
+enum ieee80211_radiotap_uhr_elr_known {
+ IEEE80211_RADIOTAP_UHR_ELR_KNOWN_VERSION_ID = 0x00000001,
+ IEEE80211_RADIOTAP_UHR_ELR_KNOWN_UL_DL = 0x00000002,
+ IEEE80211_RADIOTAP_UHR_ELR_KNOWN_MCS = 0x00000004,
+ IEEE80211_RADIOTAP_UHR_ELR_KNOWN_CODING = 0x00000008,
+ IEEE80211_RADIOTAP_UHR_ELR_KNOWN_LENGTH = 0x00000010,
+ IEEE80211_RADIOTAP_UHR_ELR_KNOWN_LDPC_EXTRA_OFDM_SYM = 0x00000020,
+ IEEE80211_RADIOTAP_UHR_ELR_KNOWN_SIG_1_CRC = 0x00000040,
+ IEEE80211_RADIOTAP_UHR_ELR_KNOWN_SIG_1_TAIL = 0x00000080,
+ IEEE80211_RADIOTAP_UHR_ELR_KNOWN_STA_ID = 0x00000100,
+ IEEE80211_RADIOTAP_UHR_ELR_KNOWN_DISREGARD = 0x00000200,
+ IEEE80211_RADIOTAP_UHR_ELR_KNOWN_SIG_2_CRC = 0x00000400,
+ IEEE80211_RADIOTAP_UHR_ELR_KNOWN_SIG_2_TAIL = 0x00000800,
+ IEEE80211_RADIOTAP_UHR_ELR_KNOWN_SIG_1_CRC_CHECKED = 0x00001000,
+ IEEE80211_RADIOTAP_UHR_ELR_KNOWN_SIG_2_CRC_CHECKED = 0x00002000,
+ IEEE80211_RADIOTAP_UHR_ELR_KNOWN_MARK_BSS_COLOR = 0x00010000,
+};
+
+enum ieee80211_radiotap_uhr_elr_sig1 {
+ IEEE80211_RADIOTAP_UHR_ELR_SIG1_VERSION_ID = 0x00000001,
+ IEEE80211_RADIOTAP_UHR_ELR_SIG1_UL_DL = 0x00000002,
+ IEEE80211_RADIOTAP_UHR_ELR_SIG1_MCS = 0x00000004,
+ IEEE80211_RADIOTAP_UHR_ELR_SIG1_CODING = 0x00000008,
+ IEEE80211_RADIOTAP_UHR_ELR_SIG1_LENGTH = 0x00001FF0,
+ IEEE80211_RADIOTAP_UHR_ELR_SIG1_LDPC_EXTRA_OFDM_SYM = 0x00002000,
+ IEEE80211_RADIOTAP_UHR_ELR_SIG1_CRC = 0x0003C000,
+ IEEE80211_RADIOTAP_UHR_ELR_SIG1_TAIL = 0x00FC0000,
+ IEEE80211_RADIOTAP_UHR_ELR_SIG1_CRC_VALID = 0x80000000,
+};
+
+enum ieee80211_radiotap_uhr_elr_sig2 {
+ IEEE80211_RADIOTAP_UHR_ELR_SIG2_STA_ID = 0x000007FF,
+ IEEE80211_RADIOTAP_UHR_ELR_SIG2_DISREGARD = 0x00003800,
+ IEEE80211_RADIOTAP_UHR_ELR_SIG2_CRC = 0x0003C000,
+ IEEE80211_RADIOTAP_UHR_ELR_SIG2_TAIL = 0x00FC0000,
+ IEEE80211_RADIOTAP_UHR_ELR_SIG2_CRC_VALID = 0x80000000,
+};
+
+enum ieee80211_radiotap_uhr_elr_mark {
+ IEEE80211_RADIOTAP_UHR_ELR_MARK_BSS_COLOR = 0x0000003F,
+};
+
+/*
+ * ieee80211_radiotap_uhr - content of UHR TLV (type 38)
+ * see https://www.radiotap.org/fields/UHR for details
+ */
+struct ieee80211_radiotap_uhr {
+ __le32 known;
+ __le32 data[9];
+ struct {
+ __le32 known, info;
+ } user[];
+} __packed;
+
+enum ieee80211_radiotap_uhr_known {
+ IEEE80211_RADIOTAP_UHR_KNOWN_SPATIAL_REUSE = 0x00000001,
+ IEEE80211_RADIOTAP_UHR_KNOWN_GI_LTF_SIZE = 0x00000002,
+ IEEE80211_RADIOTAP_UHR_KNOWN_NUMBER_OF_UHR_LTF_SYMBOLS = 0x00000004,
+ IEEE80211_RADIOTAP_UHR_KNOWN_LDPC_EXTRA_SYMBOL_SEGMENT = 0x00000008,
+ IEEE80211_RADIOTAP_UHR_KNOWN_PRE_FEC_PADDING_FACTOR = 0x00000010,
+ IEEE80211_RADIOTAP_UHR_KNOWN_PE_DISAMBIGUITY = 0x00000020,
+ IEEE80211_RADIOTAP_UHR_KNOWN_DISREGARD_OFDMA = 0x00000040,
+ IEEE80211_RADIOTAP_UHR_KNOWN_CRC1 = 0x00000080,
+ IEEE80211_RADIOTAP_UHR_KNOWN_TAIL1 = 0x00000100,
+ IEEE80211_RADIOTAP_UHR_KNOWN_CRC2 = 0x00000200,
+ IEEE80211_RADIOTAP_UHR_KNOWN_TAIL2 = 0x00000400,
+ IEEE80211_RADIOTAP_UHR_KNOWN_INTERFERENCE_MITIGATION = 0x00000800,
+ IEEE80211_RADIOTAP_UHR_KNOWN_DISREGARD_NON_OFDMA = 0x00001000,
+ IEEE80211_RADIOTAP_UHR_KNOWN_NUMBER_OF_NON_OFDMA_USERS = 0x00002000,
+ IEEE80211_RADIOTAP_UHR_KNOWN_COMMON_ENCODING_BLOCK_CRC = 0x00004000,
+ IEEE80211_RADIOTAP_UHR_KNOWN_COMMON_ENCODING_BLOCK_TAIL = 0x00008000,
+ IEEE80211_RADIOTAP_UHR_KNOWN_RU_MRU_DRU_SIZE = 0x00010000,
+ IEEE80211_RADIOTAP_UHR_KNOWN_RU_MRU_INDEX = 0x00020000,
+ IEEE80211_RADIOTAP_UHR_KNOWN_DRU_RRU_ALLOC_TB_FMT = 0x00040000,
+ IEEE80211_RADIOTAP_UHR_KNOWN_PRI80_CHAN_POS = 0x00080000,
+};
+
+enum ieee80211_radiotap_uhr_data {
+ /* data[0] */
+ IEEE80211_RADIOTAP_UHR_DATA0_SPATIAL_REUSE = 0x0000000F,
+ IEEE80211_RADIOTAP_UHR_DATA0_GI_LTF_SIZE = 0x00000030,
+ IEEE80211_RADIOTAP_UHR_DATA0_NUMBER_OF_LTF_SYMBOLS = 0x00000700,
+ IEEE80211_RADIOTAP_UHR_DATA0_LDPC_EXTRA_SYMBOL_SEGMENT = 0x00000800,
+ IEEE80211_RADIOTAP_UHR_DATA0_PRE_FEC_PADDING_FACTOR = 0x00003000,
+ IEEE80211_RADIOTAP_UHR_DATA0_PE_DISAMBIGUITY = 0x00004000,
+ IEEE80211_RADIOTAP_UHR_DATA0_DISREGARD_OFDMA = 0x00078000,
+ IEEE80211_RADIOTAP_UHR_DATA0_CRC1 = 0x00780000,
+ IEEE80211_RADIOTAP_UHR_DATA0_TAIL1 = 0x1f800000,
+ /* data[1] */
+ IEEE80211_RADIOTAP_UHR_DATA1_RU_MRU_DRU_SIZE = 0x0000001f,
+ IEEE80211_RADIOTAP_UHR_DATA1_RU_MRU_INDEX = 0x00001fe0,
+ IEEE80211_RADIOTAP_UHR_DATA1_RU_ALLOC_CC_1_1_1 = 0x003fe000,
+ IEEE80211_RADIOTAP_UHR_DATA1_RU_ALLOC_CC_1_1_1_KNOWN = 0x00400000,
+ IEEE80211_RADIOTAP_UHR_DATA1_PRI80_CHAN_POS = 0xc0000000,
+ /* data[2] */
+ IEEE80211_RADIOTAP_UHR_DATA2_RU_ALLOC_CC_2_1_1 = 0x000001ff,
+ IEEE80211_RADIOTAP_UHR_DATA2_RU_ALLOC_CC_2_1_1_KNOWN = 0x00000200,
+ IEEE80211_RADIOTAP_UHR_DATA2_RU_ALLOC_CC_1_1_2 = 0x0007fc00,
+ IEEE80211_RADIOTAP_UHR_DATA2_RU_ALLOC_CC_1_1_2_KNOWN = 0x00080000,
+ IEEE80211_RADIOTAP_UHR_DATA2_RU_ALLOC_CC_2_1_2 = 0x1ff00000,
+ IEEE80211_RADIOTAP_UHR_DATA2_RU_ALLOC_CC_2_1_2_KNOWN = 0x20000000,
+ /* data[3] */
+ IEEE80211_RADIOTAP_UHR_DATA3_RU_ALLOC_CC_1_2_1 = 0x000001ff,
+ IEEE80211_RADIOTAP_UHR_DATA3_RU_ALLOC_CC_1_2_1_KNOWN = 0x00000200,
+ IEEE80211_RADIOTAP_UHR_DATA3_RU_ALLOC_CC_2_2_1 = 0x0007fc00,
+ IEEE80211_RADIOTAP_UHR_DATA3_RU_ALLOC_CC_2_2_1_KNOWN = 0x00080000,
+ IEEE80211_RADIOTAP_UHR_DATA3_RU_ALLOC_CC_1_2_2 = 0x1ff00000,
+ IEEE80211_RADIOTAP_UHR_DATA3_RU_ALLOC_CC_1_2_2_KNOWN = 0x20000000,
+ /* data[4] */
+ IEEE80211_RADIOTAP_UHR_DATA4_RU_ALLOC_CC_2_2_2 = 0x000001ff,
+ IEEE80211_RADIOTAP_UHR_DATA4_RU_ALLOC_CC_2_2_2_KNOWN = 0x00000200,
+ IEEE80211_RADIOTAP_UHR_DATA4_RU_ALLOC_CC_1_2_3 = 0x0007fc00,
+ IEEE80211_RADIOTAP_UHR_DATA4_RU_ALLOC_CC_1_2_3_KNOWN = 0x00080000,
+ IEEE80211_RADIOTAP_UHR_DATA4_RU_ALLOC_CC_2_2_3 = 0x1ff00000,
+ IEEE80211_RADIOTAP_UHR_DATA4_RU_ALLOC_CC_2_2_3_KNOWN = 0x20000000,
+ /* data[5] */
+ IEEE80211_RADIOTAP_UHR_DATA5_RU_ALLOC_CC_1_2_4 = 0x000001ff,
+ IEEE80211_RADIOTAP_UHR_DATA5_RU_ALLOC_CC_1_2_4_KNOWN = 0x00000200,
+ IEEE80211_RADIOTAP_UHR_DATA5_RU_ALLOC_CC_2_2_4 = 0x0007fc00,
+ IEEE80211_RADIOTAP_UHR_DATA5_RU_ALLOC_CC_2_2_4_KNOWN = 0x00080000,
+ IEEE80211_RADIOTAP_UHR_DATA5_RU_ALLOC_CC_1_2_5 = 0x1ff00000,
+ IEEE80211_RADIOTAP_UHR_DATA5_RU_ALLOC_CC_1_2_5_KNOWN = 0x20000000,
+ /* data[6] */
+ IEEE80211_RADIOTAP_UHR_DATA6_RU_ALLOC_CC_2_2_5 = 0x000001ff,
+ IEEE80211_RADIOTAP_UHR_DATA6_RU_ALLOC_CC_2_2_5_KNOWN = 0x00000200,
+ IEEE80211_RADIOTAP_UHR_DATA6_RU_ALLOC_CC_1_2_6 = 0x0007fc00,
+ IEEE80211_RADIOTAP_UHR_DATA6_RU_ALLOC_CC_1_2_6_KNOWN = 0x00080000,
+ IEEE80211_RADIOTAP_UHR_DATA6_RU_ALLOC_CC_2_2_6 = 0x1ff00000,
+ IEEE80211_RADIOTAP_UHR_DATA6_RU_ALLOC_CC_2_2_6_KNOWN = 0x20000000,
+ /* data[7] */
+ IEEE80211_RADIOTAP_UHR_DATA7_CRC2 = 0x0000000f,
+ IEEE80211_RADIOTAP_UHR_DATA7_TAIL2 = 0x000003f0,
+ IEEE80211_RADIOTAP_UHR_DATA7_INTERFERENCE_MITIGATION = 0x00000400,
+ IEEE80211_RADIOTAP_UHR_DATA7_DISREGARD_NON_OFDMA = 0x00001800,
+ IEEE80211_RADIOTAP_UHR_DATA7_NUMBER_OF_NON_OFDMA_USERS = 0x0000e000,
+ IEEE80211_RADIOTAP_UHR_DATA7_COMMON_ENCODING_BLOCK_CRC = 0x000f0000,
+ IEEE80211_RADIOTAP_UHR_DATA7_COMMON_ENCODING_BLOCK_TAIL = 0x03f00000,
+ /* data[8] */
+ IEEE80211_RADIOTAP_UHR_DATA8_DRU_RRU_ALLOC_TB_FMT_PS_160= 0x00000001,
+ IEEE80211_RADIOTAP_UHR_DATA8_DRU_RRU_ALLOC_TB_FMT_B0 = 0x00000002,
+ IEEE80211_RADIOTAP_UHR_DATA8_DRU_RRU_ALLOC_TB_FMT_B7_B1 = 0x000001fc,
+ IEEE80211_RADIOTAP_UHR_DATA8_DRU_RRU_INDICATION = 0x00000200,
+};
+
+enum ieee80211_radiotap_uhr_user_known {
+ IEEE80211_RADIOTAP_UHR_USER_KNOWN_STA_ID = 0x00000001,
+ IEEE80211_RADIOTAP_UHR_USER_KNOWN_MCS = 0x00000002,
+ IEEE80211_RADIOTAP_UHR_USER_KNOWN_NSS = 0x00000004,
+ IEEE80211_RADIOTAP_UHR_USER_KNOWN_UEQM = 0x00000008,
+ IEEE80211_RADIOTAP_UHR_USER_KNOWN_BF = 0x00000010,
+ IEEE80211_RADIOTAP_UHR_USER_KNOWN_CODING = 0x00000020,
+ IEEE80211_RADIOTAP_UHR_USER_KNOWN_UEQM_PATTERN = 0x00000040,
+ IEEE80211_RADIOTAP_UHR_USER_KNOWN_2X_LDPC = 0x00000080,
+ IEEE80211_RADIOTAP_UHR_USER_KNOWN_SPATIAL_CONFIG = 0x00000100,
+ IEEE80211_RADIOTAP_UHR_USER_KNOWN_DISREGARD = 0x00000200,
+ IEEE80211_RADIOTAP_UHR_USER_KNOWN_BSS_COLOR_INDICATION = 0x00000400,
+ IEEE80211_RADIOTAP_UHR_USER_KNOWN_USR_ENC_BLK_CRC = 0x00000800,
+ IEEE80211_RADIOTAP_UHR_USER_KNOWN_USR_ENC_BLK_TAIL = 0x00001000,
+ /* really 'known' but actual data */
+ IEEE80211_RADIOTAP_UHR_USER_KNOWN_DATA_USR_ENC_BLK_CRC = 0x000f0000,
+ IEEE80211_RADIOTAP_UHR_USER_KNOWN_DATA_USR_ENC_BLK_TAIL = 0x03f00000,
+ /* indicates this user was captured */
+ IEEE80211_RADIOTAP_UHR_USER_KNOWN_USER_CAPTURED = 0x80000000,
+};
+
+enum ieee80211_radiotap_uhr_user_info {
+ IEEE80211_RADIOTAP_UHR_USER_INFO_STA_ID = 0x000007ff,
+ IEEE80211_RADIOTAP_UHR_USER_INFO_MCS = 0x0000f800,
+ IEEE80211_RADIOTAP_UHR_USER_INFO_NSS = 0x00070000,
+ IEEE80211_RADIOTAP_UHR_USER_INFO_SPATIAL_CONFIG = 0x000f0000,
+ IEEE80211_RADIOTAP_UHR_USER_INFO_UEQM = 0x00100000,
+ IEEE80211_RADIOTAP_UHR_USER_INFO_DISREGARD = 0x00100000,
+ IEEE80211_RADIOTAP_UHR_USER_INFO_BF = 0x00200000,
+ IEEE80211_RADIOTAP_UHR_USER_INFO_BSS_COLOR_INDICATION = 0x00200000,
+ IEEE80211_RADIOTAP_UHR_USER_INFO_UEQM_PATTERN = 0x00c00000,
+ IEEE80211_RADIOTAP_UHR_USER_INFO_CODING = 0x01000000,
+ IEEE80211_RADIOTAP_UHR_USER_INFO_2X_LDPC = 0x02000000,
+};
+
/**
* ieee80211_get_radiotap_len - get radiotap header length
* @data: pointer to the header