/* SPDX-License-Identifier: GPL-2.0-only */ /* * WFA NAN definitions * * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen * * Copyright (c) 2002-2003, Jouni Malinen * Copyright (c) 2005, Devicescape Software, Inc. * Copyright (c) 2006, Michael Wu * Copyright (c) 2013 - 2014 Intel Mobile Communications GmbH * Copyright (c) 2016 - 2017 Intel Deutschland GmbH * Copyright (c) 2018 - 2026 Intel Corporation */ #ifndef LINUX_IEEE80211_NAN_H #define LINUX_IEEE80211_NAN_H /* NAN operation mode, as defined in Wi-Fi Aware (TM) specification Table 81 */ #define NAN_OP_MODE_PHY_MODE_VHT 0x01 #define NAN_OP_MODE_PHY_MODE_HE 0x10 #define NAN_OP_MODE_PHY_MODE_MASK 0x11 #define NAN_OP_MODE_80P80MHZ 0x02 #define NAN_OP_MODE_160MHZ 0x04 #define NAN_OP_MODE_PNDL_SUPPRTED 0x08 #define NAN_DEV_CAPA_NUM_TX_ANT_POS 0 #define NAN_DEV_CAPA_NUM_TX_ANT_MASK 0x0f #define NAN_DEV_CAPA_NUM_RX_ANT_POS 4 #define NAN_DEV_CAPA_NUM_RX_ANT_MASK 0xf0 /* NAN Device capabilities, as defined in Wi-Fi Aware (TM) specification * Table 79 */ #define NAN_DEV_CAPA_DFS_OWNER 0x01 #define NAN_DEV_CAPA_EXT_KEY_ID_SUPPORTED 0x02 #define NAN_DEV_CAPA_SIM_NDP_RX_SUPPORTED 0x04 #define NAN_DEV_CAPA_NDPE_SUPPORTED 0x08 #define NAN_DEV_CAPA_S3_SUPPORTED 0x10 /* NAN attributes, as defined in Wi-Fi Aware (TM) specification 4.0 Table 42 */ #define NAN_ATTR_MASTER_INDICATION 0x00 #define NAN_ATTR_CLUSTER_INFO 0x01 #define NAN_ATTR_SERVICE_ID_LIST 0x02 #define NAN_ATTR_SUBSCRIBE_SERVICE_ID_LIST 0x28 struct ieee80211_nan_attr { u8 attr; __le16 length; u8 data[]; } __packed; struct ieee80211_nan_master_indication { u8 master_pref; u8 random_factor; } __packed; struct ieee80211_nan_anchor_master_info { union { __le64 master_rank; struct { u8 master_addr[ETH_ALEN]; u8 random_factor; u8 master_pref; } __packed; } __packed; u8 hop_count; __le32 ambtt; } __packed; #define for_each_nan_attr(_attr, _data, _datalen) \ for (_attr = (const struct ieee80211_nan_attr *)(_data); \ (const u8 *)(_data) + (_datalen) - (const u8 *)_attr >= \ (int)sizeof(*_attr) && \ (const u8 *)(_data) + (_datalen) - (const u8 *)_attr >= \ (int)sizeof(*_attr) + le16_to_cpu(_attr->length); \ _attr = (const struct ieee80211_nan_attr *) \ (_attr->data + le16_to_cpu(_attr->length))) static inline bool ieee80211_is_nan_beacon(const struct ieee80211_mgmt *mgmt, size_t len) { const struct element *elem; /* The NAN IE is at least 6 octets */ if (len < offsetofend(struct ieee80211_mgmt, u.beacon) + 6) return false; if (!ieee80211_is_beacon(mgmt->frame_control)) return false; /* NAN Cluster IDs range from 50-6F-9A-01-00-00 to 50-6F-9A-01-FF-FF */ if (get_unaligned_be32(mgmt->bssid) != ((WLAN_OUI_WFA << 8) | 0x01)) return false; elem = (const struct element *)mgmt->u.beacon.variable; if (elem->id != WLAN_EID_VENDOR_SPECIFIC || elem->datalen < 4 || get_unaligned_be32(elem->data) != (WLAN_OUI_WFA << 8 | WLAN_OUI_TYPE_WFA_NAN)) return false; return true; } #endif /* LINUX_IEEE80211_NAN_H */