/** @file  mlanwls.h
 *
 * @brief 11mc/11az Wifi location services application
 *
 *
 * Copyright 2022 NXP
 *
 * NXP CONFIDENTIAL
 * The source code contained or described herein and all documents related to
 * the source code (Materials) are owned by NXP, its
 * suppliers and/or its licensors. Title to the Materials remains with NXP,
 * its suppliers and/or its licensors. The Materials contain
 * trade secrets and proprietary and confidential information of NXP, its
 * suppliers and/or its licensors. The Materials are protected by worldwide
 * copyright and trade secret laws and treaty provisions. No part of the
 * Materials may be used, copied, reproduced, modified, published, uploaded,
 * posted, transmitted, distributed, or disclosed in any way without NXP's prior
 * express written permission.
 *
 * No license under any patent, copyright, trade secret or other intellectual
 * property right is granted to or conferred upon you by disclosure or delivery
 * of the Materials, either expressly, by implication, inducement, estoppel or
 * otherwise. Any license under such intellectual property rights must be
 * express and approved by NXP in writing.
 *
 */
/************************************************************************
Change log:
     01/24/2022: initial version
************************************************************************/
#ifndef _WLS_H_
#define _WLS_H_

/** Size of command buffer */
#define MRVDRV_SIZE_OF_CMD_BUFFER (3 * 1024)

/** MAC BROADCAST */
#define MAC_BROADCAST 0x1FF
/** MAC MULTICAST */
#define MAC_MULTICAST 0x1FE
/** Default scan interval in second*/
#define DEFAULT_SCAN_INTERVAL 300

/** Netlink protocol number */
#define NETLINK_NXP (MAX_LINKS - 1)
/** Netlink maximum payload size */
#define NL_MAX_PAYLOAD 1024
/** Default wait time in seconds for events */
#define UAP_RECV_WAIT_DEFAULT 10
#ifndef NLMSG_HDRLEN
/** NL message header length */
#define NLMSG_HDRLEN ((int)NLMSG_ALIGN(sizeof(struct nlmsghdr)))
#endif

/** Host Command ID : FTM session config and control */
#define HostCmd_CMD_FTM_SESSION_CFG 0x024d
#define HostCmd_CMD_FTM_SESSION_CTRL 0x024E
#define HostCmd_CMD_FTM_FEATURE_CTRL 0x024f
#define HostCmd_CMD_WLS_REQ_FTM_RANGE 0x0250

/** Events*/
#define EVENT_WLS_FTM_COMPLETE 0x00000086
#define WLS_SUB_EVENT_FTM_COMPLETE 0
#define WLS_SUB_EVENT_RADIO_RECEIVED 1
#define WLS_SUB_EVENT_RADIO_RPT_RECEIVED 2
#define WLS_SUB_EVENT_ANQP_RESP_RECEIVED 3
#define WLS_SUB_EVENT_RTT_RESULTS 4

/** Custom events definitions */
/** AP connected event */
#define CUS_EVT_AP_CONNECTED "EVENT=AP_CONNECTED"
/** Custom events definitions end */

/*TLVs*/
/** TLV  type ID definition */
#define PROPRIETARY_TLV_BASE_ID 0x0100
#define FTM_SESSION_CFG_INITATOR_TLV_ID (PROPRIETARY_TLV_BASE_ID + 273)
#define FTM_NTB_RANGING_CFG_TLV_ID (PROPRIETARY_TLV_BASE_ID + 343)
#define FTM_TB_RANGING_CFG_TLV_ID (PROPRIETARY_TLV_BASE_ID + 344)
#define FTM_RANGE_REPORT_TLV_ID                                                \
	(PROPRIETARY_TLV_BASE_ID + 0x10C) /* 0x0100 + 0x10C = 0x20C */
#define FTM_SESSION_CFG_LCI_TLV_ID (PROPRIETARY_TLV_BASE_ID + 270)
#define FTM_SESSION_CFG_LOCATION_CIVIC_TLV_ID (PROPRIETARY_TLV_BASE_ID + 271)

/** Structure of command table*/
typedef struct {
	/** User Command ID*/
	int cmd_id;
	/** Command name */
	char *cmd;
	/** Command function pointer */
	int (*func)(int argc, char *argv[], void *param);
	/** Command usuage */
	char **help;
} wls_app_command_table;

/** Structure of FTM_SESSION_CFG_NTB_RANGING / FTM_SESSION_CFG_TB_RANGING TLV
 * data*/
typedef struct _ranging_cfg {
	/** Indicates the channel BW for session*/
	/*0: HE20, 1: HE40, 2: HE80, 3: HE80+80, 4: HE160, 5:HE160_SRF*/
	t_u8 format_bw;
	/** indicates for bandwidths less than or equal to 80 MHz the maximum
	 * number of space-time streams to be used in DL/UL NDP frames in the
	 * session*/
	t_u8 max_i2r_sts_upto80;
	/**indicates for bandwidths less than or equal to 80 MHz the maximum
	 * number of space-time streams to be used in DL/UL NDP frames in the
	 * session*/
	t_u8 max_r2i_sts_upto80;
	/**Specify measurement freq in Hz to calculate measurement interval*/
	t_u8 az_measurement_freq;
	/**Indicates the number of measurements to be done for session*/
	t_u8 az_number_of_measurements;
	/** Initator lmr feedback */
	t_u8 i2r_lmr_feedback;
	/**Include location civic request (Expect location civic from
	 * responder)*/
	t_u8 civic_req;
	/**Include LCI request (Expect LCI info from responder)*/
	t_u8 lci_req;
} __ATTRIB_PACK__ ranging_cfg_t;

/** Structure of FTM_SESSION_CFG TLV data*/
typedef struct _ftm_session_cfg {
	/** Indicates how many burst instances are requested for the FTM
	 * session*/
	t_u8 burst_exponent;
	/** Indicates the duration of a burst instance*/
	t_u8 burst_duration;
	/**Minimum time between consecutive FTM frames*/
	t_u8 min_delta_FTM;
	/**ASAP/non-ASAP casel*/
	t_u8 is_ASAP;
	/**Number of FTMs per burst*/
	t_u8 per_burst_FTM;
	/**FTM channel spacing: HT20/HT40/VHT80/�*/
	t_u8 channel_spacing;
	/**Indicates the interval between two consecutive burst instances*/
	t_u16 burst_period;
} __ATTRIB_PACK__ ftm_session_cfg_t;

/** Structure for FTM_SESSION_CFG_LOCATION_CIVIC TLV data*/
typedef struct _civic_loc_cfg {
	/**Civic location type*/
	t_u8 civic_location_type;
	/**Country code*/
	t_u16 country_code;
	/**Civic address type*/
	t_u8 civic_address_type;
	/**Civic address length*/
	t_u8 civic_address_length;
	/**Civic Address*/
	t_u8 civic_address[256];
} __ATTRIB_PACK__ civic_loc_cfg_t;

/** Structure for FTM_SESSION_CFG_LCI TLV data*/
typedef struct _lci_cfg {
	/** known longitude*/
	double longitude;
	/** known Latitude*/
	double latitude;
	/** known altitude*/
	double altitude;
	/** known Latitude uncertainty*/
	t_u8 lat_unc;
	/** known Longitude uncertainty*/
	t_u8 long_unc;
	/** Known Altitude uncertainty*/
	t_u8 alt_unc;
	/** 1 word for additional Z information */
	t_u32 z_info;
} __ATTRIB_PACK__ lci_cfg_t;

/** Structure for FTM_SESSION_CFG_NTB_RANGING TLV*/
typedef struct _ranging_cfg_tlv {
	/** Type*/
	t_u16 type;
	/** Length*/
	t_u16 len;
	/** Value*/
	ranging_cfg_t val;
} __ATTRIB_PACK__ ranging_cfg_tlv_t;

/** Structure for FTM_SESSION_CFG  TLV*/
typedef struct _ftm_session_cfg_tlv {
	/** Type*/
	t_u16 type;
	/** Length*/
	t_u16 len;
	/** Value*/
	ftm_session_cfg_t val;
	t_u8 civic_req;
	t_u8 lci_req;
} __ATTRIB_PACK__ ftm_session_cfg_tlv_t;

/** Structure for FTM_SESSION_CFG_LOCATION_CIVIC TLV*/
typedef struct _civic_loc_tlv {
	/** Type*/
	t_u16 type;
	/** Length*/
	t_u16 len;
	/** Value*/
	civic_loc_cfg_t val;
} __ATTRIB_PACK__ civic_loc_tlv_t;

/** Structure for FTM_SESSION_CFG_LCI TLV*/
typedef struct _lci_tlv {
	/** Type*/
	t_u16 type;
	/** Length*/
	t_u16 len;
	/** Value*/
	lci_cfg_t val;
} __ATTRIB_PACK__ lci_tlv_t;

/** Structure for DOT11MC FTM_SESSION_CFG */
typedef struct _dot11mc_ftm_cfg {
	/** FTM session cfg*/
	ftm_session_cfg_tlv_t sess_tlv;
	/** Location Request cfg*/
	lci_tlv_t lci_tlv;
	/** Civic location cfg*/
	civic_loc_tlv_t civic_tlv;

} __ATTRIB_PACK__ dot11mc_ftm_cfg_t;

/** Structure for DOT11AZ FTM_SESSION_CFG */
typedef struct _dot11az_ftmcfg_ntb_t {
	/** NTB session cfg */
	ranging_cfg_tlv_t range_tlv;
} __ATTRIB_PACK__ dot11az_ftm_cfg_t;

/** Type definition for hostcmd_ftm_session_cfg */
typedef struct _hostcmd_ftm_session_cfg {
	/** 0:Get, 1:Set */
	t_u16 action;
	/** FTM_SESSION_CFG_TLVs*/
	union {
		/**11az cfg*/
		dot11az_ftm_cfg_t cfg_11az;
		/** 11mc cfg*/
		dot11mc_ftm_cfg_t cfg_11mc;
	} tlv;
} __ATTRIB_PACK__ hostcmd_ftm_session_cfg;

/** Type definition for hostcmd_ftm_session_ctrl */
typedef struct _hostcmd_ftm_session_ctrl {
	/** 0: Not used, 1: Start, 2: Stop*/
	t_u16 action;
	/*FTM for ranging*/
	t_u8 for_ranging;
	/** Mac address of the peer with whom FTM session is required*/
	t_u8 peer_mac[ETH_ALEN];
	/** Channel on which FTM must be started */
	t_u8 chan;
} __ATTRIB_PACK__ hostcmd_ftm_session_ctrl;

/** Type definition for generic Hostcmd for 11AZ FTM Session */
typedef struct _hostcmd_ds_ftm_session_cmd {
	/** HostCmd_DS_GEN */
	HostCmd_DS_GEN cmd_hdr;
	/** Command Body */
	union {
		/** hostcmd for session_ctrl user command */
		hostcmd_ftm_session_ctrl ftm_session_ctrl;
		/** hostcmd for session_cfg user command */
		hostcmd_ftm_session_cfg ftm_session_cfg;
	} cmd;
} __ATTRIB_PACK__ hostcmd_ds_ftm_session_cmd;

/** Type definition for FTM Session Events */

/** Event ID length */
#define EVENT_ID_LEN 4

/**Structure for RTT results subevent*/
typedef struct _wls_subevent_rtt_results_t {
	/** complete */
	t_u8 complete;
	/** tlv buffer */
	/** MrvlIEtypes_RTTResult_t */
	t_u8 tlv_buffer[];
} __ATTRIB_PACK__ wls_subevent_rtt_results_t;

/**Structure for FTM complete subevent*/
typedef struct _wls_subevent_ftm_complete {
	/** BSS Number */
	t_u8 bssNum;
	/** BSS Type */
	t_u8 bssType;
	/** MAC address of the responder */
	t_u8 mac[ETH_ALEN];
	/** Average RTT */
	t_u32 avg_rtt;
	/** Average Clock offset */
	t_u32 avg_clk_offset;
	/** Measure start timestamp */
	t_u32 meas_start_tsf;
} __ATTRIB_PACK__ wls_subevent_ftm_complete_t;

/** TLV for FTM Range Report */
typedef struct _range_report_tlv_t {
	/**Type*/
	t_u16 type;
	/**Length*/
	t_u16 len;
	/** MAC address of the responder */
	t_u8 mac[ETH_ALEN];
	/** Average RTT */
	t_u32 avg_rtt;
	/** Average Clock offset */
	t_u32 avg_clk_offset;
	/** LCI and Location Civic TLV */
} __ATTRIB_PACK__ range_report_tlv_t;

/** Structure for FTM events*/
typedef struct _wls_event_t {
	/** Event ID */
	t_u16 event_id;
	/** BSS index number for multiple BSS support */
	t_u8 bss_index;
	/** BSS type */
	t_u8 bss_type;
	/** sub event id */
	t_u8 sub_event_id;
	union {
		/** FTM Complete Sub event*/
		wls_subevent_ftm_complete_t ftm_complete;
	} e;
} __ATTRIB_PACK__ wls_event_t;

/*Application Global Data*/
typedef struct {
	/** Average RTT */
	t_u32 avg_rtt;
	/** Average Clock offset */
	t_u32 avg_clk_offset;
	/*Range*/
	t_s64 range;
} range_results_t;

/** Structure for ftm command private data*/
typedef struct _wls_app_data {
	/** 0 : 80211mc, 1:80211az*/
	t_u8 protocol_type;
	/** num of times to run FTM*/
	t_u8 loop_cnt;
	/** flag to run nonstop*/
	t_u8 run_nonstop;
	/** flag is associated */
	t_u8 associated;
	/** 0 - STA, 1- AP*/
	t_u8 bss_type;
	/**flag for ftm started */
	t_u8 ftm_started;
	/** flag for app to terminate ftm session*/
	t_u8 terminate_app;
	/**flag for debug print level */
	t_u8 debug_level;
	/**peer mac address */
	t_u8 peer_mac[ETH_ALEN];
	/**AP mac address */
	t_u8 ap_mac[ETH_ALEN];
	/** Channel number for FTM session*/
	t_u8 channel;
	/**SET/GET action */
	t_u8 hostcmd_action;
	/**Is LCI data available in cfg*/
	t_u8 lci_request;
	/** Is civic data available in cfg*/
	t_u8 civic_request;
	/**ntb cfg param*/
	ranging_cfg_t range_cfg;
	/** 11mc session cfg param*/
	ftm_session_cfg_t session_cfg;
	/** lci cfg data*/
	lci_cfg_t lci_cfg;
	/** civic cfg data - this should be last field*/
	civic_loc_cfg_t civic_cfg;
} __ATTRIB_PACK__ wls_app_data_t;

int mlanwls_main(int argc, char *argv[]);
#endif /* _WLS_H_ */