root/include/linux/ieee80211-nan.h
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * WFA NAN definitions
 *
 * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
 * <jkmaline@cc.hut.fi>
 * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
 * Copyright (c) 2005, Devicescape Software, Inc.
 * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net>
 * 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

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)))

#endif /* LINUX_IEEE80211_NAN_H */