/* SPDX-License-Identifier: BSD-3-Clause-Clear */
/*
 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
 */

#ifndef ATH11K_PEER_H
#define ATH11K_PEER_H

struct ppdu_user_delayba {
	u8 reserved0;
	u16 sw_peer_id;
	u32 info0;
	u16 ru_end;
	u16 ru_start;
	u32 info1;
	u32 rate_flags;
	u32 resp_rate_flags;
};

enum ath11k_ast_entry_type {
	ATH11K_AST_TYPE_NONE, /* static ast entry for connected peer */
	ATH11K_AST_TYPE_STATIC, /* static ast entry for connected peer */
	ATH11K_AST_TYPE_SELF, /* static ast entry for self peer (STA mode) */
	ATH11K_AST_TYPE_WDS,  /* WDS peer ast entry type*/
	ATH11K_AST_TYPE_MEC,  /* Multicast echo ast entry type */
	ATH11K_AST_TYPE_WDS_HM, /* HM WDS entry */
	ATH11K_AST_TYPE_STA_BSS,       /* BSS entry(STA mode) */
	ATH11K_AST_TYPE_DA,   /* AST entry based on Destination address */
	ATH11K_AST_TYPE_WDS_HM_SEC, /* HM WDS entry for secondary radio */
	ATH11K_AST_TYPE_MAX
};

enum ath11k_wds_wmi_action {
	ATH11K_WDS_WMI_ADD = 1,
	ATH11K_WDS_WMI_UPDATE,
	ATH11K_WDS_WMI_REMOVE,

	ATH11K_WDS_WMI_MAX
};

struct ath11k_ast_entry {
	u16 ast_idx;
	u8 addr[ETH_ALEN];
	enum ath11k_wds_wmi_action action;
	struct ath11k_peer *peer;
	struct ath11k *ar;
	bool next_hop;
	bool is_active;
	bool is_mapped;
	u8 pdev_idx;
	u8 vdev_id;
	u16 ast_hash_value;
	int ref_cnt;
	enum ath11k_ast_entry_type type;
	bool delete_in_progress;
	void *cookie;
	struct list_head ase_list;
	struct list_head wmi_list;
};

struct ath11k_peer {
	struct list_head list;
	struct ieee80211_sta *sta;
	struct ieee80211_vif *vif;
	int vdev_id;
	u8 addr[ETH_ALEN];
	int peer_id;
	u16 ast_hash;
	u8 pdev_idx;
	u16 hw_peer_id;
	struct ath11k_nss_peer nss;
	struct ath11k_ast_entry *self_ast_entry;
	struct list_head ast_entry_list;

	/* protected by ab->data_lock */
	struct ieee80211_key_conf *keys[WMI_MAX_KEY_INDEX + 1];
	struct dp_rx_tid rx_tid[IEEE80211_NUM_TIDS + 1];

	/* Info used in MMIC verification of
	 * RX fragments
	 */
	struct crypto_shash *tfm_mmic;
	u8 mcast_keyidx;
	u8 ucast_keyidx;
	u16 sec_type;
	u16 sec_type_grp;

	struct ppdu_user_delayba ppdu_stats_delayba;
	bool delayba_flag;
	bool is_authorized;
	bool delete_in_progress;
};

void ath11k_peer_unmap_event(struct ath11k_base *ab, u16 peer_id);
void ath11k_peer_unmap_v2_event(struct ath11k_base *ab, u16 peer_id, bool is_wds,
			        u32 free_wds_count);
void ath11k_peer_map_event(struct ath11k_base *ab, u8 vdev_id, u16 peer_id,
			   u8 *mac_addr, u16 ast_hash, u16 hw_peer_id);
void ath11k_peer_map_v2_event(struct ath11k_base *ab, u8 vdev_id, u16 peer_id,
			      u8 *mac_addr, u16 ast_hash, u16 hw_peer_id,
			      bool is_wds);
struct ath11k_peer *ath11k_peer_find(struct ath11k_base *ab, int vdev_id,
				     const u8 *addr);
struct ath11k_peer *ath11k_peer_find_by_addr(struct ath11k_base *ab,
					     const u8 *addr);
struct ath11k_peer *ath11k_peer_find_by_id(struct ath11k_base *ab, int peer_id);
struct ath11k_peer *ath11k_peer_find_by_ast(struct ath11k_base *ab, int ast_hash);
void ath11k_peer_cleanup(struct ath11k *ar, u32 vdev_id);
int ath11k_peer_delete(struct ath11k *ar, u32 vdev_id, u8 *addr);
int ath11k_peer_create(struct ath11k *ar, struct ath11k_vif *arvif,
		       struct ieee80211_sta *sta, struct peer_create_params *param);
int ath11k_wait_for_peer_delete_done(struct ath11k *ar, u32 vdev_id,
				     const u8 *addr);
struct ath11k_peer *ath11k_peer_find_by_vdev_id(struct ath11k_base *ab,
						int vdev_id);

#ifdef CONFIG_ATH11K_NSS_SUPPORT
struct ath11k_ast_entry *ath11k_peer_ast_find_by_addr(struct ath11k_base *ab,
						      u8* addr);
struct ath11k_ast_entry *ath11k_peer_ast_find_by_pdev_idx(struct ath11k *ar,
							  u8* addr);
int ath11k_peer_add_ast(struct ath11k *ar, struct ath11k_peer *peer,
			u8* mac_addr, enum ath11k_ast_entry_type type);
int ath11k_peer_update_ast(struct ath11k *ar, struct ath11k_peer *peer,
			   struct ath11k_ast_entry *ast_entry);
void ath11k_peer_map_ast(struct ath11k *ar, struct ath11k_peer *peer,
			 u8* mac_addr, u16 hw_peer_id, u16 ast_hash);
void ath11k_peer_del_ast(struct ath11k *ar, struct ath11k_ast_entry *ast_entry);
void ath11k_peer_ast_cleanup(struct ath11k *ar, struct ath11k_peer *peer,
			     bool is_wds, u32 free_wds_count);
void ath11k_peer_ast_wds_wmi_wk(struct work_struct *wk);
struct ath11k_ast_entry *ath11k_peer_ast_find_by_peer(struct ath11k_base *ab,
						      struct ath11k_peer *peer,
						      u8* addr);
#else
static inline struct ath11k_ast_entry *ath11k_peer_ast_find_by_addr(struct ath11k_base *ab,
								    u8* addr)
{
	return NULL;
}

static inline struct ath11k_ast_entry *ath11k_peer_ast_find_by_pdev_idx(struct ath11k *ar,
									u8* addr)
{
	return NULL;
}

static inline int ath11k_peer_add_ast(struct ath11k *ar, struct ath11k_peer *peer,
				      u8* mac_addr, enum ath11k_ast_entry_type type)
{
	return 0;
}

static inline int ath11k_peer_update_ast(struct ath11k *ar, struct ath11k_peer *peer,
					 struct ath11k_ast_entry *ast_entry)
{

	return 0;
}

static inline void ath11k_peer_map_ast(struct ath11k *ar, struct ath11k_peer *peer,
				       u8* mac_addr, u16 hw_peer_id, u16 ast_hash)
{
	return;
}

static inline void ath11k_peer_del_ast(struct ath11k *ar,
				       struct ath11k_ast_entry *ast_entry)
{
	return;
}

static inline void ath11k_peer_ast_cleanup(struct ath11k *ar,
					   struct ath11k_peer *peer,
					   bool is_wds, u32 free_wds_count)
{
	return;
}

static inline void ath11k_peer_ast_wds_wmi_wk(struct work_struct *wk)
{
	return;
}

static inline struct ath11k_ast_entry *ath11k_peer_ast_find_by_peer(struct ath11k_base *ab,
								    struct ath11k_peer *peer,
								    u8* addr)
{
	return NULL;
}

#endif /* CONFIG_ATH11K_NSS_SUPPORT */
#endif /* _PEER_H_ */
