blob: 38e1fed2a39fec19a3ee8a87fcc8715a29af6628 [file] [log] [blame]
/******************************************************************************
*
* Copyright(c) 2015-2017 Intel Deutschland GmbH
* Copyright(c) 2018 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * 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.
* * Neither the name Intel Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
* OWNER 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.
*
*****************************************************************************/
#ifndef SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_FW_API_NAN_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_FW_API_NAN_H_
#include <stdint.h>
#include "third_party/iwlwifi/fw/api/phy-ctxt.h"
#include "third_party/iwlwifi/platform/compiler.h"
/* TODO: read it from tlv */
#define NAN_MAX_SUPPORTED_DE_ENTRIES 10
/**
* enum iwl_nan_subcmd_ids - Neighbor Awareness Networking (NaN) commands IDS
*/
enum iwl_nan_subcmd_ids {
/**
* @NAN_CONFIG_CMD:
* &struct iwl_nan_cfg_cmd_v2 or &struct iwl_nan_cfg_cmd
*/
NAN_CONFIG_CMD = 0,
/**
* @NAN_DISCOVERY_FUNC_CMD:
* &struct iwl_nan_add_func_cmd or &struct iwl_nan_add_func_cmd_v2
*/
NAN_DISCOVERY_FUNC_CMD = 0x1,
/**
* @NAN_FAW_CONFIG_CMD:
* &struct iwl_nan_faw_config
*/
NAN_FAW_CONFIG_CMD = 0x2,
/**
* @NAN_DISCOVERY_EVENT_NOTIF:
* &struct iwl_nan_disc_evt_notify_v1 or
* &struct iwl_nan_disc_evt_notify_v2
*/
NAN_DISCOVERY_EVENT_NOTIF = 0xFD,
/**
* @NAN_DISCOVERY_TERMINATE_NOTIF:
* &struct iwl_nan_de_term
*/
NAN_DISCOVERY_TERMINATE_NOTIF = 0xFE,
/**
* @NAN_FAW_START_NOTIF:
* Further availability window started.
*/
NAN_FAW_START_NOTIF = 0xFF,
};
/**
* struct iwl_fw_chan_avail - Defines per op. class channel availability
*
* @op_class: operating class
* @chan_bitmap: channel bitmap
*/
struct iwl_fw_chan_avail {
uint8_t op_class;
__le16 chan_bitmap;
} __packed;
/**
* struct iwl_nan_umac_cfg - NAN umac config parameters
*
* @action: one of the FW_CTXT_ACTION_*
* @tsf_id: tsf id to use in beacons
* @sta_id: STA used for NAN operations. Currently it is AUX STA.
* @node_addr: our address
* @reserved1: reserved
* @master_pref: master preference value
* @master_rand: random factor to override fw's decision (DEBUG)
* @cluster_id: cluster id, if 0 the fw will choose one for us.
* @dual_band: enables dual band operation.
* @beacon_template_id: beacon template id for NAN
*/
struct iwl_nan_umac_cfg {
__le32 action;
__le32 tsf_id;
__le32 sta_id;
uint8_t node_addr[6];
__le16 reserved1;
uint8_t master_pref;
uint8_t master_rand;
__le16 cluster_id;
__le32 dual_band;
__le32 beacon_template_id;
} __packed; /* _NAN_UMAC_CONFIG_CMD_API_S_VER_1 */
/**
* struct iwl_nan_testbed_cfg - NAN testbed specific config parameters
*
* @chan24: override default 2.4GHz channel (DEBUG)
* @chan52: override default 5.2GHz channel (DEBUG)
* @hop_count: fake hop count (DEBUG)
* @op_bands: band bit mask (DEBUG)
* @warmup_timer: warmup_timer in us (DEBUG)
* @custom_tsf: fake tsf value (DEBUG)
* @action_delay: usecs to delay SDFs (DEBUG)
*/
struct iwl_nan_testbed_cfg {
uint8_t chan24;
uint8_t chan52;
uint8_t hop_count;
uint8_t op_bands;
__le32 warmup_timer;
__le64 custom_tsf;
__le32 action_delay;
} __packed; /* NAN_TEST_BED_SPECIFIC_CONFIG_S_VER_1 */
/*
* struct iwl_nan_nan2_cfg - NAN2 specific configuration
*
* @cdw: committed DW interval as defined in NAN2 spec (NAN2)
* @op_mode: operation mode as defined in NAN2 spec (NAN2)
* @pot_avail_len: length of pot_avail array (NAN2)
* @pot_avail: potential availability per op. class (NAN2)
*/
struct iwl_nan_nan2_cfg {
__le16 cdw;
uint8_t op_mode;
uint8_t pot_avail_len;
struct iwl_fw_chan_avail pot_avail[20];
} __packed; /* NAN_CONFIG_CMD_API_S_VER_1 */
/**
* struct iwl_nan_cfg_cmd - NAN configuration command
*
* This command starts/stops/modifies NAN sync engine.
*
* @umac_cfg: umac specific configuration
* @tb_cfg: testbed specific configuration
* @nan2_cfg: nan2 specific configuration
*/
struct iwl_nan_cfg_cmd {
struct iwl_nan_umac_cfg umac_cfg;
struct iwl_nan_testbed_cfg tb_cfg;
/* NAN 2 specific configuration */
struct iwl_nan_nan2_cfg nan2_cfg;
} __packed; /* NAN_CONFIG_CMD_API_S_VER_1 */
/**
* struct iwl_nan_cfg_cmd_v2 - NAN configuration command, version 2
*
* This command starts/stops/modifies NAN sync engine.
*
* @umac_cfg: umac specific configuration
* @tb_cfg: testbed specific configuration
* @unavailable_slots: Force this amount of slots to be unavailable in potential
* map
* @nan2_cfg: nan2 specific configuration
*/
struct iwl_nan_cfg_cmd_v2 {
struct iwl_nan_umac_cfg umac_cfg;
struct iwl_nan_testbed_cfg tb_cfg;
__le32 unavailable_slots;
/* NAN 2 specific configuration */
struct iwl_nan_nan2_cfg nan2_cfg;
} __packed; /* NAN_CONFIG_CMD_API_S_VER_2 */
/* NAN DE function type */
enum iwl_fw_nan_func_type {
IWL_NAN_DE_FUNC_PUBLISH = 0,
IWL_NAN_DE_FUNC_SUBSCRIBE = 1,
IWL_NAN_DE_FUNC_FOLLOW_UP = 2,
/* keep last */
IWL_NAN_DE_FUNC_NOT_VALID,
};
/* NAN DE function flags */
enum iwl_fw_nan_func_flags {
IWL_NAN_DE_FUNC_FLAG_UNSOLICITED_OR_ACTIVE = BIT(0),
IWL_NAN_DE_FUNC_FLAG_SOLICITED = BIT(1),
IWL_NAN_DE_FUNC_FLAG_UNICAST = BIT(2),
IWL_NAN_DE_FUNC_FLAG_CLOSE_RANGE = BIT(3),
IWL_NAN_DE_FUNC_FLAG_FAW_PRESENT = BIT(4),
IWL_NAN_DE_FUNC_FLAG_FAW_TYPE = BIT(5),
IWL_NAN_DE_FUNC_FLAG_FAW_NOTIFY = BIT(6),
IWL_NAN_DE_FUNC_FLAG_RAISE_EVENTS = BIT(7),
};
/**
* struct iwl_nan_add_func_common - NAN add/remove function, common part
*
* @action: one of the FW_CTXT_ACTION_ADD/REMOVE
* @instance_id: instance id of the DE function to remove
* @type: enum %iwl_fw_nan_func_type
* @service_id: service id
* @flags: a combination of &enum iwl_fw_nan_func_flags
* @flw_up_id: follow up id
* @flw_up_req_id: follow up requestor id
* @flw_up_addr: follow up destination address
* @reserved1: reserved
* @ttl: ttl in DW's or 0 for infinite
* @faw_ci: &struct iwl_fw_channel_info for further availability
* @faw_attrtype: further availability bitmap
* @serv_info_len: length of service specific information
* @srf_len: length of the srf
* @rx_filter_len: length of rx filter
* @tx_filter_len: length of tx filter
* @dw_interval: awake dw interval
*/
struct iwl_nan_add_func_common {
__le32 action;
uint8_t instance_id;
uint8_t type;
uint8_t service_id[6];
__le16 flags;
uint8_t flw_up_id;
uint8_t flw_up_req_id;
uint8_t flw_up_addr[6];
__le16 reserved1;
__le32 ttl;
struct iwl_fw_channel_info faw_ci;
uint8_t faw_attrtype;
uint8_t serv_info_len;
uint8_t srf_len;
uint8_t rx_filter_len;
uint8_t tx_filter_len;
uint8_t dw_interval;
} __packed; /* NAN_DISCO_FUNC_FIXED_CMD_API_S_VER_1 */
/**
* struct iwl_nan_add_func_cmd_v2 - NAN add/remove function command, version 2
*
* @cmn: nan add function common part
* @cipher_capa: Cipher suite information capabilities
* @cipher_suite_id: Bitmap of the list of cipher suite IDs
* @security_ctx_len: length of tx security context attributes
* @sdea_ctrl: SDEA control field
* @data: dw aligned fields: service_info, srf, rxFilter, txFilter,
* security_ctx
*/
struct iwl_nan_add_func_cmd_v2 {
struct iwl_nan_add_func_common cmn;
uint8_t cipher_capa;
uint8_t cipher_suite_id;
__le16 security_ctx_len;
__le16 sdea_ctrl;
uint8_t data[0];
} __packed; /* NAN_DISCO_FUNC_FIXED_CMD_API_S_VER_2 */
/**
* struct iwl_nan_add_func_cmd - NAN add/remove function command
*
* @cmn: nan add function common part
* @reserved: reserved
* @data: dw aligned fields -service_info, srf, rxFilter, txFilter
*/
struct iwl_nan_add_func_cmd {
struct iwl_nan_add_func_common cmn;
uint8_t reserved[2];
uint8_t data[0];
} __packed; /* NAN_DISCO_FUNC_FIXED_CMD_API_S_VER_1 */
enum iwl_nan_add_func_resp_status {
IWL_NAN_DE_FUNC_STATUS_SUCCESSFUL,
IWL_NAN_DE_FUNC_STATUS_INSUFFICIENT_ENTRIES,
IWL_NAN_DE_FUNC_STATUS_INSUFFICIENT_MEMORY,
IWL_NAN_DE_FUNC_STATUS_INVALID_INSTANCE,
IWL_NAN_DE_FUNC_STATUS_UNSPECIFIED,
};
/**
* struct iwl_nan_add_func_res - Add NAN function response
*
* @instance_id: assigned instance_id (if added)
* @status: status of the command (&enum iwl_nan_add_func_resp_status)
* @reserved: reserved
*/
struct iwl_nan_add_func_res {
uint8_t instance_id;
uint8_t status;
__le16 reserved;
} __packed; /* NAN_DISCO_FUNC_CMD_API_S_VER_1 */
/* Shared key cipher suite with CCMP with a 128 bit TK */
#define IWL_NAN_DE_FUNC_CS_SK_CCM_128 BIT(0)
/* Shared key cipher suite with GCMP with a 256 bit TK */
#define IWL_NAN_DE_FUNC_CS_SK_GCM_256 BIT(1)
/**
* enum iwl_nan_de_func_sdea_flags - NAN func SDEA flags
* @IWL_NAN_DE_FUNC_SDEA_FSD_REQ: Further Service Discovery (FSD) is required
* for the service
* @IWL_NAN_DE_FUNC_SDEA_FSD_GAS: GAS is used for FSD
* @IWL_NAN_DE_FUNC_SDEA_DP_REQ: Data path required for the service
* @IWL_NAN_DE_FUNC_SDEA_DP_MCAST: If data path is required, the type is
* multicast
* @IWL_NAN_DE_FUNC_SDEA_DP_MCAST_M_TO_M:if multicast data path is required then
* it is many to many
* @IWL_NAN_DE_FUNC_SDEA_QOS_REQ: QoS is required for the service
* @IWL_NAN_DE_FUNC_SDEA_SEC_REQ: Security is required for the service
* @IWL_NAN_DE_FUNC_SDEA_RANGIGN_REQ: Ranging is required prior to subscription
* to the service
*/
enum iwl_nan_de_func_sdea_flags {
IWL_NAN_DE_FUNC_SDEA_FSD_REQ = BIT(0),
IWL_NAN_DE_FUNC_SDEA_FSD_GAS = BIT(1),
IWL_NAN_DE_FUNC_SDEA_DP_REQ = BIT(2),
IWL_NAN_DE_FUNC_SDEA_DP_MCAST = BIT(3),
IWL_NAN_DE_FUNC_SDEA_DP_MCAST_M_TO_M = BIT(4),
IWL_NAN_DE_FUNC_SDEA_QOS_REQ = BIT(5),
IWL_NAN_DE_FUNC_SDEA_SEC_REQ = BIT(6),
IWL_NAN_DE_FUNC_SDEA_RANGIGN_REQ = BIT(7),
};
/**
* struct iwl_nan_disc_evt_notify_v1 - NaN discovery event
*
* @peer_mac_addr: peer address
* @reserved1: reserved
* @type: Type of matching function
* @instance_id: local matching instance id
* @peer_instance: peer matching instance id
* @service_info_len: service specific information length
* @attrs_len: additional peer attributes length
* @buf: service specific information followed by attributes
*/
struct iwl_nan_disc_evt_notify_v1 {
uint8_t peer_mac_addr[6];
__le16 reserved1;
uint8_t type;
uint8_t instance_id;
uint8_t peer_instance;
uint8_t service_info_len;
__le32 attrs_len;
uint8_t buf[0];
} __packed; /* NAN_DISCO_EVENT_NTFY_API_S_VER_1 */
/**
* struct iwl_nan_sec_ctxt_info - NaN security context information
*
* @type: the security context type
* @reserved: for alignment
* @len: the length of the security context
* @buf: security context data
*/
struct iwl_nan_sec_ctxt_info {
uint8_t type;
uint8_t reserved;
__le16 len;
uint8_t buf[0];
} __packed; /* NAN_DISCO_SEC_CTXT_ID_API_S_VER_1 */
/**
* struct iwl_nan_disc_info - NaN match information
*
* @type: Type of matching function
* @instance_id: local matching instance id
* @peer_instance: peer matching instance id
* @service_info_len: service specific information length
* @sdea_control: bit mask of &enum iwl_nan_de_func_sdea_flags_
* @sdea_service_info_len: sdea service specific information length
* @sec_ctxt_len: security context information length
* @cipher_suite_ids: bit mask of cipher suite IDs
* @sdea_update_indicator: update indicator from the sdea attribute
* @buf: service specific information followed by sdea service specific
* information and by security context information which encapsulates 0 or
* more iwl_nan_sec_ctxt_info entries.
*/
struct iwl_nan_disc_info {
uint8_t type;
uint8_t instance_id;
uint8_t peer_instance;
uint8_t service_info_len;
__le16 sdea_control;
__le16 sdea_service_info_len;
__le16 sec_ctxt_len;
uint8_t cipher_suite_ids;
uint8_t sdea_update_indicator;
uint8_t buf[0];
} __packed; /* NAN_DISCO_INFO_API_S_VER_1 */
/**
* struct iwl_nan_disc_evt_notify_v2 - NaN discovery information
*
* @peer_mac_addr: peer address
* @reserved1: reserved
* @match_len: Length of the match data
* @avail_attrs_len: Length of the availability attributes associated with the
* peer
* @buf: aggregation of matches, each starting on a dword aligned address,
* followed by the peer availability attributes, which also start on a
* dword aligned address.
*/
struct iwl_nan_disc_evt_notify_v2 {
uint8_t peer_mac_addr[6];
__le16 reserved1;
__le32 match_len;
__le32 avail_attrs_len;
uint8_t buf[0];
} __packed; /* NAN_DISCO_EVENT_NTFY_API_S_VER_2 */
/* NAN function termination reasons */
enum iwl_fw_nan_de_term_reason {
IWL_NAN_DE_TERM_FAILURE = 0,
IWL_NAN_DE_TERM_TTL_REACHED,
IWL_NAN_DE_TERM_USER_REQUEST,
};
/**
* struct iwl_nan_de_term - NAN function termination event
*
* @type: type of terminated function (&enum iwl_fw_nan_func_type)
* @instance_id: instance id
* @reason: termination reason (&enum iwl_fw_nan_de_term_reason)
* @reserved1: reserved
*/
struct iwl_nan_de_term {
uint8_t type;
uint8_t instance_id;
uint8_t reason;
uint8_t reserved1;
} __packed; /* NAN_DISCO_TERM_NTFY_API_S_VER_1 */
enum iwl_fw_post_nan_type {
IWL_NAN_POST_NAN_ATTR_WLAN = 0,
IWL_NAN_POST_NAN_ATTR_P2P,
IWL_NAN_POST_NAN_ATTR_IBSS,
IWL_NAN_POST_NAN_ATTR_MESH,
IWL_NAN_POST_NAN_ATTR_FURTHER_NAN,
};
enum iwl_fw_config_flags {
NAN_FAW_FLAG_NOTIFY_HOST = BIT(0),
};
/**
* struct iwl_nan_faw_config - NAN further availability configuration command
*
* @id_n_color: id and color of the mac used for further availability
* @faw_ci: channel to be available on
* @type: type of post NAN availability (enum %iwl_fw_post_nan_type)
* @slots: number of 16TU slots to be available on (should be < 32)
* @flags: NAN_FAW_FLAG_*
* @op_class: operating class which corresponds to faw_ci
*/
struct iwl_nan_faw_config {
__le32 id_n_color;
struct iwl_fw_channel_info faw_ci;
uint8_t type;
uint8_t slots;
uint8_t flags;
uint8_t op_class;
} __packed; /* _NAN_DISCO_FAW_CMD_API_S_VER_1 */
#endif // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_FW_API_NAN_H_