blob: aa0835dfd9544e978aac9b3a8ba0812fc203c989 [file] [log] [blame]
/* 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];
/* peer id based rhashtable list pointer */
struct rhash_head rhash_id;
/* peer addr based rhashtable list pointer */
struct rhash_head rhash_addr;
/* 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);
int ath11k_peer_rhash_tbl_init(struct ath11k_base *ab);
void ath11k_peer_rhash_tbl_destroy(struct ath11k_base *ab);
int ath11k_peer_rhash_delete(struct ath11k_base *ab, struct ath11k_peer *peer);
#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_ */