diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 4284e16c51..a111d93898 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -1171,70 +1171,69 @@ struct cdp_ocb_ops { * struct cdp_peer_ops - mcl peer related ops * @register_peer: * @clear_peer: - * @cfg_attach: - * @find_peer_by_addr: - * @find_peer_by_addr_and_vdev: - * @local_peer_id: - * @peer_find_by_local_id: + * @find_peer_exist + * @find_peer_exist_on_vdev + * @find_peer_exist_on_other_vdev * @peer_state_update: * @get_vdevid: - * @get_vdev_by_sta_id: * @register_ocb_peer: * @peer_get_peer_mac_addr: * @get_peer_state: - * @get_vdev_for_peer: * @update_ibss_add_peer_num_of_vdev: - * @remove_peers_for_vdev: - * @remove_peers_for_vdev_no_lock: * @copy_mac_addr_raw: * @add_last_real_peer: * @is_vdev_restore_last_peer: * @update_last_real_peer: */ struct cdp_peer_ops { - QDF_STATUS (*register_peer)(struct cdp_pdev *pdev, - struct ol_txrx_desc_type *sta_desc); - QDF_STATUS (*clear_peer)(struct cdp_pdev *pdev, + QDF_STATUS (*register_peer)(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, + struct ol_txrx_desc_type *sta_desc); + QDF_STATUS (*clear_peer)(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, struct qdf_mac_addr peer_addr); - QDF_STATUS (*change_peer_state)(uint8_t sta_id, - enum ol_txrx_peer_state sta_state, - bool roam_synch_in_progress); - void * (*peer_get_ref_by_addr)(struct cdp_pdev *pdev, - uint8_t *peer_addr, - enum peer_debug_id_type debug_id); - void (*peer_release_ref)(void *peer, enum peer_debug_id_type debug_id); - void * (*find_peer_by_addr)(struct cdp_pdev *pdev, - uint8_t *peer_addr); - void * (*find_peer_by_addr_and_vdev)(struct cdp_pdev *pdev, - struct cdp_vdev *vdev, - uint8_t *peer_addr); - QDF_STATUS (*peer_state_update)(struct cdp_pdev *pdev, - uint8_t *peer_addr, - enum ol_txrx_peer_state state); - QDF_STATUS (*get_vdevid)(void *peer, uint8_t *vdev_id); + bool (*find_peer_exist)(struct cdp_soc_t *soc, uint8_t pdev_id, + uint8_t *peer_addr); + bool (*find_peer_exist_on_vdev)(struct cdp_soc_t *soc, uint8_t vdev_id, + uint8_t *peer_addr); + bool (*find_peer_exist_on_other_vdev)(struct cdp_soc_t *soc, + uint8_t vdev_id, + uint8_t *peer_addr, + uint16_t max_bssid); + QDF_STATUS (*peer_state_update)(struct cdp_soc_t *soc, + uint8_t *peer_addr, + enum ol_txrx_peer_state state); + QDF_STATUS (*get_vdevid)(struct cdp_soc_t *soc_hdl, uint8_t *peer_mac, + uint8_t *vdev_id); struct cdp_vdev * (*get_vdev_by_peer_addr)(struct cdp_pdev *pdev, struct qdf_mac_addr peer_addr); QDF_STATUS (*register_ocb_peer)(uint8_t *mac_addr); uint8_t * (*peer_get_peer_mac_addr)(void *peer); - int (*get_peer_state)(void *peer); + int (*get_peer_state)(struct cdp_soc_t *soc, uint8_t vdev_id, + uint8_t *peer_mac); struct cdp_vdev * (*get_vdev_for_peer)(void *peer); - int16_t (*update_ibss_add_peer_num_of_vdev)(struct cdp_vdev *vdev, - int16_t peer_num_delta); + int16_t (*update_ibss_add_peer_num_of_vdev)(struct cdp_soc_t *soc, + uint8_t vdev_id, + int16_t peer_num_delta); void (*remove_peers_for_vdev)(struct cdp_vdev *vdev, ol_txrx_vdev_peer_remove_cb callback, void *callback_context, bool remove_last_peer); void (*remove_peers_for_vdev_no_lock)(struct cdp_vdev *vdev, ol_txrx_vdev_peer_remove_cb callback, void *callback_context); - void (*copy_mac_addr_raw)(struct cdp_vdev *vdev, uint8_t *bss_addr); - void (*add_last_real_peer)(struct cdp_pdev *pdev, - struct cdp_vdev *vdev); - bool (*is_vdev_restore_last_peer)(void *peer); - void (*update_last_real_peer)(struct cdp_pdev *pdev, void *vdev, - bool restore_last_peer); - void (*peer_detach_force_delete)(void *peer); - void (*set_tdls_offchan_enabled)(void *peer, bool val); - void (*set_peer_as_tdls_peer)(void *peer, bool val); + void (*copy_mac_addr_raw)(struct cdp_soc_t *soc, uint8_t vdev_id, + uint8_t *bss_addr); + void (*add_last_real_peer)(struct cdp_soc_t *soc, uint8_t pdev_id, + uint8_t vdev_id); + bool (*is_vdev_restore_last_peer)(struct cdp_soc_t *soc, + uint8_t vdev_id, + uint8_t *peer_mac); + void (*update_last_real_peer)(struct cdp_soc_t *soc, uint8_t pdev_id, + uint8_t vdev_id, bool restore_last_peer); + void (*peer_detach_force_delete)(struct cdp_soc_t *soc_hdl, + uint8_t vdev_id, uint8_t *peer_addr); + void (*set_tdls_offchan_enabled)(struct cdp_soc_t *soc, uint8_t vdev_id, + uint8_t *peer_mac, bool val); + void (*set_peer_as_tdls_peer)(struct cdp_soc_t *soc, uint8_t vdev_id, + uint8_t *peer_mac, bool val); }; /** diff --git a/dp/inc/cdp_txrx_peer_ops.h b/dp/inc/cdp_txrx_peer_ops.h index 69c26ebe7e..9a11a5a588 100644 --- a/dp/inc/cdp_txrx_peer_ops.h +++ b/dp/inc/cdp_txrx_peer_ops.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -29,7 +29,7 @@ /** * cdp_peer_register() - Register peer into physical device * @soc - data path soc handle - * @pdev - data path device instance + * @pdev_id - data path device instance id * @sta_desc - peer description * * Register peer into physical device @@ -38,8 +38,8 @@ * QDF_STATUS_E_NOSUPPORT not support this feature */ static inline QDF_STATUS -cdp_peer_register(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, - struct ol_txrx_desc_type *sta_desc) +cdp_peer_register(ol_txrx_soc_handle soc, uint8_t pdev_id, + struct ol_txrx_desc_type *sta_desc) { if (!soc || !soc->ops || !soc->ops->peer_ops) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, @@ -48,7 +48,8 @@ cdp_peer_register(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, } if (soc->ops->peer_ops->register_peer) - return soc->ops->peer_ops->register_peer(pdev, sta_desc); + return soc->ops->peer_ops->register_peer(soc, pdev_id, + sta_desc); return QDF_STATUS_E_NOSUPPORT; } @@ -56,7 +57,7 @@ cdp_peer_register(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, /** * cdp_clear_peer() - remove peer from physical device * @soc - data path soc handle - * @pdev - data path device instance + * @pdev_id - data path device instance id * @peer_addr - peer mac address * * remove peer from physical device @@ -65,7 +66,7 @@ cdp_peer_register(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, * QDF_STATUS_E_NOSUPPORT not support this feature */ static inline QDF_STATUS -cdp_clear_peer(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, +cdp_clear_peer(ol_txrx_soc_handle soc, uint8_t pdev_id, struct qdf_mac_addr peer_addr) { if (!soc || !soc->ops || !soc->ops->peer_ops) { @@ -75,7 +76,7 @@ cdp_clear_peer(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, } if (soc->ops->peer_ops->clear_peer) - return soc->ops->peer_ops->clear_peer(pdev, peer_addr); + return soc->ops->peer_ops->clear_peer(soc, pdev_id, peer_addr); return QDF_STATUS_E_NOSUPPORT; } @@ -108,176 +109,88 @@ cdp_peer_register_ocb_peer(ol_txrx_soc_handle soc, } /** - * cdp_peer_remove_for_vdev() - remove peer instance from virtual interface + * cdp_find_peer_exist - Find if peer already exists * @soc - data path soc handle - * @vdev - virtual interface instance - * @callback - remove done notification callback function pointer - * @callback_context - callback caller context - * @remove_last_peer - removed peer is last peer or not + * @pdev_id - data path device instance id + * @peer_addr - peer mac address * - * remove peer instance from virtual interface - * - * Return: NONE + * Return: true or false */ -static inline void -cdp_peer_remove_for_vdev(ol_txrx_soc_handle soc, - struct cdp_vdev *vdev, ol_txrx_vdev_peer_remove_cb callback, - void *callback_context, bool remove_last_peer) +static inline bool +cdp_find_peer_exist(ol_txrx_soc_handle soc, uint8_t pdev_id, + uint8_t *peer_addr) { if (!soc || !soc->ops || !soc->ops->peer_ops) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, "%s invalid instance", __func__); - return; + return false; } - if (soc->ops->peer_ops->remove_peers_for_vdev) - return soc->ops->peer_ops->remove_peers_for_vdev( - vdev, callback, callback_context, remove_last_peer); + if (soc->ops->peer_ops->find_peer_exist) + return soc->ops->peer_ops->find_peer_exist(soc, pdev_id, + peer_addr); - return; + return false; } /** - * cdp_peer_remove_for_vdev_no_lock() - remove peer instance from vdev + * cdp_find_peer_exist_on_vdev - Find if duplicate peer exists + * on the given vdev * @soc - data path soc handle - * @vdev - virtual interface instance - * @callback - remove done notification callback function pointer - * @callback_context - callback caller context - * - * remove peer instance from virtual interface without lock - * - * Return: NONE - */ -static inline void -cdp_peer_remove_for_vdev_no_lock(ol_txrx_soc_handle soc, - struct cdp_vdev *vdev, - ol_txrx_vdev_peer_remove_cb callback, - void *callback_context) -{ - if (!soc || !soc->ops || !soc->ops->peer_ops) { - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, - "%s invalid instance", __func__); - return; - } - - if (soc->ops->peer_ops->remove_peers_for_vdev_no_lock) - return soc->ops->peer_ops->remove_peers_for_vdev_no_lock( - vdev, callback, callback_context); -} - -/** - * cdp_peer_get_ref_by_addr() - Find peer by peer mac address and inc peer ref - * @soc - data path soc handle - * @pdev - data path device instance - * @peer_addr - peer mac address - * @debug_id - debug_id to track caller - * - * To release the peer ref, cdp_peer_release_ref needs to be called. - * - * Return: peer instance void pointer - * NULL cannot find target peer - */ -static inline void -*cdp_peer_get_ref_by_addr(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, - uint8_t *peer_addr, - enum peer_debug_id_type debug_id) -{ - if (!soc || !soc->ops || !soc->ops->peer_ops) { - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, - "%s invalid instance", __func__); - return NULL; - } - - if (soc->ops->peer_ops->peer_get_ref_by_addr) - return soc->ops->peer_ops->peer_get_ref_by_addr( - pdev, peer_addr, debug_id); - - return NULL; -} - -/** - * cdp_peer_release_ref() - Release peer reference - * @soc - data path soc handle - * @peer - peer pointer - * @debug_id - debug_id to track caller - * - * Return:void - */ -static inline void -cdp_peer_release_ref(ol_txrx_soc_handle soc, void *peer, - enum peer_debug_id_type debug_id) -{ - if (!soc || !soc->ops || !soc->ops->peer_ops) { - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, - "%s invalid instance", __func__); - return; - } - - if (soc->ops->peer_ops->peer_release_ref) - soc->ops->peer_ops->peer_release_ref(peer, debug_id); -} - -/** - * cdp_peer_find_by_addr() - Find peer by peer mac address - * @soc - data path soc handle - * @pdev - data path device instance + * @vdev_id - data path virtual interface id * @peer_addr - peer mac address * - * Find peer and local peer id by peer mac address - * - * Return: peer instance void pointer - * NULL cannot find target peer + * Return: true or false */ -static inline void -*cdp_peer_find_by_addr(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, - uint8_t *peer_addr) +static inline bool +cdp_find_peer_exist_on_vdev(ol_txrx_soc_handle soc, uint8_t vdev_id, + uint8_t *peer_addr) { if (!soc || !soc->ops || !soc->ops->peer_ops) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, "%s invalid instance", __func__); - return NULL; + return false; } - if (soc->ops->peer_ops->find_peer_by_addr) - return soc->ops->peer_ops->find_peer_by_addr( - pdev, peer_addr); + if (soc->ops->peer_ops->find_peer_exist_on_vdev) + return soc->ops->peer_ops->find_peer_exist_on_vdev(soc, vdev_id, + peer_addr); - return NULL; + return false; } /** - * cdp_peer_find_by_addr_and_vdev() - Find peer by peer mac address within vdev + * cdp_find_peer_exist_on_other_vdev - Find if duplicate peer exists + * on other than the given vdev * @soc - data path soc handle - * @pdev - data path device instance - * @vdev - virtual interface instance + * @vdev_id - data path virtual interface id * @peer_addr - peer mac address + * @max_bssid - max number of bssids * - * Find peer by peer mac address within vdev - * - * Return: peer instance void pointer - * NULL cannot find target peer + * Return: true or false */ -static inline void -*cdp_peer_find_by_addr_and_vdev(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, - struct cdp_vdev *vdev, uint8_t *peer_addr) +static inline bool +cdp_find_peer_exist_on_other_vdev(ol_txrx_soc_handle soc, uint8_t vdev_id, + uint8_t *peer_addr, uint16_t max_bssid) { if (!soc || !soc->ops || !soc->ops->peer_ops) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, "%s invalid instance", __func__); - return NULL; + return false; } - if (soc->ops->peer_ops->find_peer_by_addr_and_vdev) - return soc->ops->peer_ops->find_peer_by_addr_and_vdev( - pdev, vdev, peer_addr); + if (soc->ops->peer_ops->find_peer_exist_on_other_vdev) + return soc->ops->peer_ops->find_peer_exist_on_other_vdev( + soc, vdev_id, + peer_addr, + max_bssid); - return NULL; + return false; } /** * cdp_peer_state_update() - update peer local state * @soc - data path soc handle - * @pdev - data path device instance * @peer_addr - peer mac address * @state - new peer local state * @@ -287,8 +200,8 @@ static inline void * QDF_STATUS_E_NOSUPPORT not support this feature */ static inline QDF_STATUS -cdp_peer_state_update(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, - uint8_t *peer_addr, enum ol_txrx_peer_state state) +cdp_peer_state_update(ol_txrx_soc_handle soc, uint8_t *peer_addr, + enum ol_txrx_peer_state state) { if (!soc || !soc->ops || !soc->ops->peer_ops) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, @@ -297,8 +210,8 @@ cdp_peer_state_update(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, } if (soc->ops->peer_ops->peer_state_update) - return soc->ops->peer_ops->peer_state_update( - pdev, peer_addr, state); + return soc->ops->peer_ops->peer_state_update(soc, peer_addr, + state); return QDF_STATUS_E_NOSUPPORT; } @@ -306,14 +219,15 @@ cdp_peer_state_update(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, /** * cdp_peer_state_get() - Get local peer state * @soc - data path soc handle - * @peer - peer instance + * @vdev_id - virtual interface id + * @peer_mac - peer mac addr * * Get local peer state * * Return: peer status */ static inline int -cdp_peer_state_get(ol_txrx_soc_handle soc, void *peer) +cdp_peer_state_get(ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *peer_mac) { if (!soc || !soc->ops || !soc->ops->peer_ops) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, @@ -322,7 +236,8 @@ cdp_peer_state_get(ol_txrx_soc_handle soc, void *peer) } if (soc->ops->peer_ops->get_peer_state) - return soc->ops->peer_ops->get_peer_state(peer); + return soc->ops->peer_ops->get_peer_state(soc, vdev_id, + peer_mac); return 0; } @@ -330,7 +245,7 @@ cdp_peer_state_get(ol_txrx_soc_handle soc, void *peer) /** * cdp_peer_get_vdevid() - Get virtual interface id which peer registered * @soc - data path soc handle - * @peer - peer instance + * @peer_mac - peer mac address * @vdev_id - virtual interface id which peer registered * * Get virtual interface id which peer registered @@ -339,7 +254,8 @@ cdp_peer_state_get(ol_txrx_soc_handle soc, void *peer) * QDF_STATUS_E_NOSUPPORT not support this feature */ static inline QDF_STATUS -cdp_peer_get_vdevid(ol_txrx_soc_handle soc, void *peer, uint8_t *vdev_id) +cdp_peer_get_vdevid(ol_txrx_soc_handle soc, + uint8_t *peer_mac, uint8_t *vdev_id) { if (!soc || !soc->ops || !soc->ops->peer_ops) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, @@ -348,7 +264,7 @@ cdp_peer_get_vdevid(ol_txrx_soc_handle soc, void *peer, uint8_t *vdev_id) } if (soc->ops->peer_ops->get_vdevid) - return soc->ops->peer_ops->get_vdevid(peer, vdev_id); + return soc->ops->peer_ops->get_vdevid(soc, peer_mac, vdev_id); return QDF_STATUS_E_NOSUPPORT; } @@ -406,35 +322,10 @@ static inline uint8_t return NULL; } -/** - * cdp_peer_get_vdev() - Get virtual interface instance which peer belongs - * @soc - data path soc handle - * @peer - peer instance - * - * Get virtual interface instance which peer belongs - * - * Return: virtual interface instance pointer - * NULL in case cannot find - */ -static inline struct cdp_vdev -*cdp_peer_get_vdev(ol_txrx_soc_handle soc, void *peer) -{ - if (!soc || !soc->ops || !soc->ops->peer_ops) { - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, - "%s invalid instance", __func__); - return NULL; - } - - if (soc->ops->peer_ops->get_vdev_for_peer) - return soc->ops->peer_ops->get_vdev_for_peer(peer); - - return NULL; -} - /** * cdp_peer_update_ibss_add_peer_num_of_vdev() - update number of peer * @soc - data path soc handle - * @vdev - virtual interface instance + * @vdev_id - virtual interface instance id * @peer_num_delta - number of peer should be updated * * update number of peer @@ -444,7 +335,8 @@ static inline struct cdp_vdev */ static inline int16_t cdp_peer_update_ibss_add_peer_num_of_vdev(ol_txrx_soc_handle soc, - struct cdp_vdev *vdev, int16_t peer_num_delta) + uint8_t vdev_id, + int16_t peer_num_delta) { if (!soc || !soc->ops || !soc->ops->peer_ops) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, @@ -454,7 +346,8 @@ cdp_peer_update_ibss_add_peer_num_of_vdev(ol_txrx_soc_handle soc, if (soc->ops->peer_ops->update_ibss_add_peer_num_of_vdev) return soc->ops->peer_ops->update_ibss_add_peer_num_of_vdev( - vdev, peer_num_delta); + soc, vdev_id, + peer_num_delta); return 0; } @@ -462,7 +355,7 @@ cdp_peer_update_ibss_add_peer_num_of_vdev(ol_txrx_soc_handle soc, /** * cdp_peer_copy_mac_addr_raw() - copy peer mac address * @soc - data path soc handle - * @vdev - virtual interface instance + * @vdev_id - virtual interface instance id * @bss_addr - mac address should be copied * * copy peer mac address @@ -471,7 +364,7 @@ cdp_peer_update_ibss_add_peer_num_of_vdev(ol_txrx_soc_handle soc, */ static inline void cdp_peer_copy_mac_addr_raw(ol_txrx_soc_handle soc, - struct cdp_vdev *vdev, uint8_t *bss_addr) + uint8_t vdev_id, uint8_t *bss_addr) { if (!soc || !soc->ops || !soc->ops->peer_ops) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, @@ -480,7 +373,8 @@ cdp_peer_copy_mac_addr_raw(ol_txrx_soc_handle soc, } if (soc->ops->peer_ops->copy_mac_addr_raw) - return soc->ops->peer_ops->copy_mac_addr_raw(vdev, bss_addr); + return soc->ops->peer_ops->copy_mac_addr_raw(soc, vdev_id, + bss_addr); return; } @@ -488,16 +382,16 @@ cdp_peer_copy_mac_addr_raw(ol_txrx_soc_handle soc, /** * cdp_peer_add_last_real_peer() - Add peer with last peer marking * @soc - data path soc handle - * @pdev - data path device instance - * @vdev - virtual interface instance + * @pdev_id - data path device instance id + * @vdev_id - virtual interface instance id * * copy peer mac address * * Return: none */ static inline void -cdp_peer_add_last_real_peer(ol_txrx_soc_handle soc, - struct cdp_pdev *pdev, struct cdp_vdev *vdev) +cdp_peer_add_last_real_peer(ol_txrx_soc_handle soc, uint8_t pdev_id, + uint8_t vdev_id) { if (!soc || !soc->ops || !soc->ops->peer_ops) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, @@ -506,15 +400,16 @@ cdp_peer_add_last_real_peer(ol_txrx_soc_handle soc, } if (soc->ops->peer_ops->add_last_real_peer) - return soc->ops->peer_ops->add_last_real_peer( - pdev, vdev); + return soc->ops->peer_ops->add_last_real_peer(soc, pdev_id, + vdev_id); return; } /** * cdp_peer_is_vdev_restore_last_peer() - restore last peer * @soc - data path soc handle - * @peer - peer instance pointer + * @vdev_id - virtual interface id + * @peer_mac - peer mac address * * restore last peer * @@ -522,7 +417,8 @@ cdp_peer_add_last_real_peer(ol_txrx_soc_handle soc, * fasle, restore fail */ static inline bool -cdp_peer_is_vdev_restore_last_peer(ol_txrx_soc_handle soc, void *peer) +cdp_peer_is_vdev_restore_last_peer(ol_txrx_soc_handle soc, uint8_t vdev_id, + uint8_t *peer_mac) { if (!soc || !soc->ops || !soc->ops->peer_ops) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, @@ -531,7 +427,9 @@ cdp_peer_is_vdev_restore_last_peer(ol_txrx_soc_handle soc, void *peer) } if (soc->ops->peer_ops->is_vdev_restore_last_peer) - return soc->ops->peer_ops->is_vdev_restore_last_peer(peer); + return soc->ops->peer_ops->is_vdev_restore_last_peer(soc, + vdev_id, + peer_mac); return false; } @@ -539,8 +437,8 @@ cdp_peer_is_vdev_restore_last_peer(ol_txrx_soc_handle soc, void *peer) /** * cdp_peer_update_last_real_peer() - update last real peer * @soc - data path soc handle - * @pdev - data path device instance - * @peer - peer instance pointer + * @pdev_id - data path device instance id + * @vdev_id - virtual interface id * @restore_last_peer - restore last peer or not * * update last real peer @@ -548,8 +446,8 @@ cdp_peer_is_vdev_restore_last_peer(ol_txrx_soc_handle soc, void *peer) * Return: none */ static inline void -cdp_peer_update_last_real_peer(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, - void *vdev, bool restore_last_peer) +cdp_peer_update_last_real_peer(ol_txrx_soc_handle soc, uint8_t pdev_id, + uint8_t vdev_id, bool restore_last_peer) { if (!soc || !soc->ops || !soc->ops->peer_ops) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, @@ -558,8 +456,9 @@ cdp_peer_update_last_real_peer(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, } if (soc->ops->peer_ops->update_last_real_peer) - return soc->ops->peer_ops->update_last_real_peer(pdev, vdev, - restore_last_peer); + return soc->ops->peer_ops->update_last_real_peer( + soc, pdev_id, vdev_id, + restore_last_peer); return; } @@ -576,7 +475,8 @@ cdp_peer_update_last_real_peer(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, * Return: None */ static inline void cdp_peer_detach_force_delete(ol_txrx_soc_handle soc, - void *peer) + uint8_t vdev_id, + uint8_t *peer_mac) { if (!soc || !soc->ops || !soc->ops->peer_ops) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, @@ -585,7 +485,9 @@ static inline void cdp_peer_detach_force_delete(ol_txrx_soc_handle soc, } if (soc->ops->peer_ops->peer_detach_force_delete) - return soc->ops->peer_ops->peer_detach_force_delete(peer); + return soc->ops->peer_ops->peer_detach_force_delete(soc, + vdev_id, + peer_mac); return; } @@ -620,13 +522,15 @@ is_cdp_peer_detach_force_delete_supported(ol_txrx_soc_handle soc) /* * cdp_peer_set_peer_as_tdls() - To set peer as tdls peer * @soc: pointer to SOC handle - * @peer: dp peer + * @vdev_id: virtual interface id + * @peer_mac: peer mac address * @var: true or false * * Return: void */ static inline void -cdp_peer_set_peer_as_tdls(ol_txrx_soc_handle soc, void *peer, bool val) +cdp_peer_set_peer_as_tdls(ol_txrx_soc_handle soc, uint8_t vdev_id, + uint8_t *peer_mac, bool val) { if (!soc || !soc->ops || !soc->ops->peer_ops) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, @@ -635,21 +539,24 @@ cdp_peer_set_peer_as_tdls(ol_txrx_soc_handle soc, void *peer, bool val) } if (soc->ops->peer_ops->set_peer_as_tdls_peer) - soc->ops->peer_ops->set_peer_as_tdls_peer(peer, val); + soc->ops->peer_ops->set_peer_as_tdls_peer(soc, vdev_id, + peer_mac, val); } /** * cdp_peer_set_tdls_offchan_enabled() - Set tdls offchan operation as enabled - * @soc - data path soc handle - * @peer - peer instance pointer - * @val - true or false + * @soc: pointer to SOC handle + * @vdev_id: virtual interface id + * @peer_mac: peer mac address + * @val: true or false * * update tdls_offchan_enabled * * Return: none */ static inline void -cdp_peer_set_tdls_offchan_enabled(ol_txrx_soc_handle soc, void *peer, bool val) +cdp_peer_set_tdls_offchan_enabled(ol_txrx_soc_handle soc, uint8_t vdev_id, + uint8_t *peer_mac, bool val) { if (!soc || !soc->ops || !soc->ops->peer_ops) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, @@ -658,7 +565,8 @@ cdp_peer_set_tdls_offchan_enabled(ol_txrx_soc_handle soc, void *peer, bool val) } if (soc->ops->peer_ops->set_tdls_offchan_enabled) - soc->ops->peer_ops->set_tdls_offchan_enabled(peer, val); + soc->ops->peer_ops->set_tdls_offchan_enabled(soc, vdev_id, + peer_mac, val); } #endif /* _CDP_TXRX_PEER_H_ */ diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 22ac79292e..b60bf02272 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -910,27 +910,133 @@ extern struct dp_peer *dp_peer_find_hash_find(struct dp_soc *soc, uint8_t *peer_mac_addr, int mac_addr_is_aligned, uint8_t vdev_id); #ifdef DP_PEER_EXTENDED_API -QDF_STATUS dp_register_peer(struct cdp_pdev *pdev_handle, - struct ol_txrx_desc_type *sta_desc); -QDF_STATUS dp_clear_peer(struct cdp_pdev *pdev_handle, +/** + * dp_register_peer() - Register peer into physical device + * @soc_hdl - data path soc handle + * @pdev_id - device instance id + * @sta_desc - peer description + * + * Register peer into physical device + * + * Return: QDF_STATUS_SUCCESS registration success + * QDF_STATUS_E_FAULT peer not found + */ +QDF_STATUS dp_register_peer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, + struct ol_txrx_desc_type *sta_desc); + +/** + * dp_clear_peer() - remove peer from physical device + * @soc_hdl - data path soc handle + * @pdev_id - device instance id + * @peer_addr - peer mac address + * + * remove peer from physical device + * + * Return: QDF_STATUS_SUCCESS registration success + * QDF_STATUS_E_FAULT peer not found + */ +QDF_STATUS dp_clear_peer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, struct qdf_mac_addr peer_addr); + +/* + * dp_find_peer_exist - find peer if already exists + * @soc: datapath soc handle + * @pdev_id: physical device instance id + * @peer_mac_addr: peer mac address + * + * Return: true or false + */ +bool dp_find_peer_exist(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, + uint8_t *peer_addr); + +/* + * dp_find_peer_exist_on_vdev - find if peer exists on the given vdev + * @soc: datapath soc handle + * @vdev_id: vdev instance id + * @peer_mac_addr: peer mac address + * + * Return: true or false + */ +bool dp_find_peer_exist_on_vdev(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, + uint8_t *peer_addr); + +/* + * dp_find_peer_exist_on_other_vdev - find if peer exists + * on other than the given vdev + * @soc: datapath soc handle + * @vdev_id: vdev instance id + * @peer_mac_addr: peer mac address + * @max_bssid: max number of bssids + * + * Return: true or false + */ +bool dp_find_peer_exist_on_other_vdev(struct cdp_soc_t *soc_hdl, + uint8_t vdev_id, uint8_t *peer_addr, + uint16_t max_bssid); + void *dp_find_peer_by_addr_and_vdev(struct cdp_pdev *pdev_handle, struct cdp_vdev *vdev, uint8_t *peer_addr); -QDF_STATUS dp_peer_state_update(struct cdp_pdev *pdev_handle, uint8_t *peer_mac, - enum ol_txrx_peer_state state); -QDF_STATUS dp_get_vdevid(void *peer_handle, uint8_t *vdev_id); + +/** + * dp_peer_state_update() - update peer local state + * @pdev - data path device instance + * @peer_addr - peer mac address + * @state - new peer local state + * + * update peer local state + * + * Return: QDF_STATUS_SUCCESS registration success + */ +QDF_STATUS dp_peer_state_update(struct cdp_soc_t *soc, uint8_t *peer_mac, + enum ol_txrx_peer_state state); + +/** + * dp_get_vdevid() - Get virtual interface id which peer registered + * @soc - datapath soc handle + * @peer_mac - peer mac address + * @vdev_id - virtual interface id which peer registered + * + * Get virtual interface id which peer registered + * + * Return: QDF_STATUS_SUCCESS registration success + */ +QDF_STATUS dp_get_vdevid(struct cdp_soc_t *soc_hdl, uint8_t *peer_mac, + uint8_t *vdev_id); struct cdp_vdev *dp_get_vdev_by_peer_addr(struct cdp_pdev *pdev_handle, struct qdf_mac_addr peer_addr); struct cdp_vdev *dp_get_vdev_for_peer(void *peer); uint8_t *dp_peer_get_peer_mac_addr(void *peer); -int dp_get_peer_state(void *peer_handle); + +/** + * dp_get_peer_state() - Get local peer state + * @soc - datapath soc handle + * @vdev_id - vdev id + * @peer_mac - peer mac addr + * + * Get local peer state + * + * Return: peer status + */ +int dp_get_peer_state(struct cdp_soc_t *soc, uint8_t vdev_id, + uint8_t *peer_mac); void dp_local_peer_id_pool_init(struct dp_pdev *pdev); void dp_local_peer_id_alloc(struct dp_pdev *pdev, struct dp_peer *peer); void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer); #else +/** + * dp_get_vdevid() - Get virtual interface id which peer registered + * @soc - datapath soc handle + * @peer_mac - peer mac address + * @vdev_id - virtual interface id which peer registered + * + * Get virtual interface id which peer registered + * + * Return: QDF_STATUS_SUCCESS registration success + */ static inline -QDF_STATUS dp_get_vdevid(void *peer_handle, uint8_t *vdev_id) +QDF_STATUS dp_get_vdevid(struct cdp_soc_t *soc_hdl, uint8_t *peer_mac, + uint8_t *vdev_id) { return QDF_STATUS_E_NOSUPPORT; } diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index c748262c66..e21f34d30f 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -10587,56 +10587,16 @@ static struct cdp_mob_stats_ops dp_ops_mob_stats = { .clear_stats = dp_txrx_clear_dump_stats, }; -/* - * dp_peer_get_ref_find_by_addr - get peer with addr by ref count inc - * @dev: physical device instance - * @peer_mac_addr: peer mac address - * @debug_id: to track enum peer access - * - * Return: peer instance pointer - */ -static inline void * -dp_peer_get_ref_find_by_addr(struct cdp_pdev *dev, uint8_t *peer_mac_addr, - enum peer_debug_id_type debug_id) -{ - struct dp_pdev *pdev = (struct dp_pdev *)dev; - struct dp_peer *peer; - - peer = dp_peer_find_hash_find(pdev->soc, peer_mac_addr, 0, DP_VDEV_ALL); - - if (!peer) - return NULL; - - dp_info_rl("peer %pK mac: %pM", peer, peer->mac_addr.raw); - - return peer; -} - -/* - * dp_peer_release_ref - release peer ref count - * @peer: peer handle - * @debug_id: to track enum peer access - * - * Return: None - */ -static inline -void dp_peer_release_ref(void *peer, enum peer_debug_id_type debug_id) -{ - dp_peer_unref_delete(peer); -} - static struct cdp_peer_ops dp_ops_peer = { .register_peer = dp_register_peer, .clear_peer = dp_clear_peer, - .find_peer_by_addr = dp_find_peer_by_addr, - .find_peer_by_addr_and_vdev = dp_find_peer_by_addr_and_vdev, - .peer_get_ref_by_addr = dp_peer_get_ref_find_by_addr, - .peer_release_ref = dp_peer_release_ref, + .find_peer_exist = dp_find_peer_exist, + .find_peer_exist_on_vdev = dp_find_peer_exist_on_vdev, + .find_peer_exist_on_other_vdev = dp_find_peer_exist_on_other_vdev, .peer_state_update = dp_peer_state_update, .get_vdevid = dp_get_vdevid, .get_vdev_by_peer_addr = dp_get_vdev_by_peer_addr, .peer_get_peer_mac_addr = dp_peer_get_peer_mac_addr, - .get_vdev_for_peer = dp_get_vdev_for_peer, .get_peer_state = dp_get_peer_state, }; #endif diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 9a1556b7e1..242e88c832 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -1701,15 +1701,18 @@ static bool dp_get_peer_vdev_roaming_in_progress(struct dp_peer *peer) struct ol_if_ops *ol_ops = NULL; bool is_roaming = false; uint8_t vdev_id = -1; + struct cdp_soc_t *soc; if (!peer) { dp_info("Peer is NULL. No roaming possible"); return false; } + + soc = dp_soc_to_cdp_soc_t(peer->vdev->pdev->soc); ol_ops = peer->vdev->pdev->soc->cdp_soc.ol_ops; if (ol_ops && ol_ops->is_roam_inprogress) { - dp_get_vdevid(peer, &vdev_id); + dp_get_vdevid(soc, peer->mac_addr.raw, &vdev_id); is_roaming = ol_ops->is_roam_inprogress(vdev_id); } @@ -3117,25 +3120,19 @@ dp_rx_sec_ind_handler(struct dp_soc *soc, uint16_t peer_id, } #ifdef DP_PEER_EXTENDED_API -/** - * dp_register_peer() - Register peer into physical device - * @pdev - data path device instance - * @sta_desc - peer description - * - * Register peer into physical device - * - * Return: QDF_STATUS_SUCCESS registration success - * QDF_STATUS_E_FAULT peer not found - */ -QDF_STATUS dp_register_peer(struct cdp_pdev *pdev_handle, - struct ol_txrx_desc_type *sta_desc) +QDF_STATUS dp_register_peer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, + struct ol_txrx_desc_type *sta_desc) { struct dp_peer *peer; - struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; + struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); + struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); peer = dp_find_peer_by_addr((struct cdp_pdev *)pdev, sta_desc->peer_addr.bytes); + if (!pdev) + return QDF_STATUS_E_FAULT; + if (!peer) return QDF_STATUS_E_FAULT; @@ -3148,21 +3145,16 @@ QDF_STATUS dp_register_peer(struct cdp_pdev *pdev_handle, return QDF_STATUS_SUCCESS; } -/** - * dp_clear_peer() - remove peer from physical device - * @pdev - data path device instance - * @peer_addr - peer mac address - * - * remove peer from physical device - * - * Return: QDF_STATUS_SUCCESS registration success - * QDF_STATUS_E_FAULT peer not found - */ QDF_STATUS -dp_clear_peer(struct cdp_pdev *pdev_handle, struct qdf_mac_addr peer_addr) +dp_clear_peer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, + struct qdf_mac_addr peer_addr) { struct dp_peer *peer; - struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; + struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); + struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); + + if (!pdev) + return QDF_STATUS_E_FAULT; peer = dp_find_peer_by_addr((struct cdp_pdev *)pdev, peer_addr.bytes); if (!peer) @@ -3214,23 +3206,13 @@ void *dp_find_peer_by_addr_and_vdev(struct cdp_pdev *pdev_handle, return peer; } -/** - * dp_peer_state_update() - update peer local state - * @pdev - data path device instance - * @peer_addr - peer mac address - * @state - new peer local state - * - * update peer local state - * - * Return: QDF_STATUS_SUCCESS registration success - */ -QDF_STATUS dp_peer_state_update(struct cdp_pdev *pdev_handle, uint8_t *peer_mac, - enum ol_txrx_peer_state state) +QDF_STATUS dp_peer_state_update(struct cdp_soc_t *soc_hdl, uint8_t *peer_mac, + enum ol_txrx_peer_state state) { struct dp_peer *peer; - struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; + struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); - peer = dp_peer_find_hash_find(pdev->soc, peer_mac, 0, DP_VDEV_ALL); + peer = dp_peer_find_hash_find(soc, peer_mac, 0, DP_VDEV_ALL); if (!peer) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "Failed to find peer for: [%pM]", peer_mac); @@ -3247,22 +3229,24 @@ QDF_STATUS dp_peer_state_update(struct cdp_pdev *pdev_handle, uint8_t *peer_mac, return QDF_STATUS_SUCCESS; } -/** - * dp_get_vdevid() - Get virtual interface id which peer registered - * @peer - peer instance - * @vdev_id - virtual interface id which peer registered - * - * Get virtual interface id which peer registered - * - * Return: QDF_STATUS_SUCCESS registration success - */ -QDF_STATUS dp_get_vdevid(void *peer_handle, uint8_t *vdev_id) +QDF_STATUS dp_get_vdevid(struct cdp_soc_t *soc_hdl, uint8_t *peer_mac, + uint8_t *vdev_id) { - struct dp_peer *peer = peer_handle; + struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); + struct dp_peer *peer = + dp_peer_find_hash_find(soc, peer_mac, 0, DP_VDEV_ALL); + + if (!peer) + return QDF_STATUS_E_FAILURE; dp_info("peer %pK vdev %pK vdev id %d", peer, peer->vdev, peer->vdev->vdev_id); *vdev_id = peer->vdev->vdev_id; + /* ref_cnt is incremented inside dp_peer_find_hash_find(). + * Decrement it here. + */ + dp_peer_unref_delete(peer); + return QDF_STATUS_SUCCESS; } @@ -3328,20 +3312,22 @@ uint8_t *dp_peer_get_peer_mac_addr(void *peer_handle) return peer->mac_addr.raw; } -/** - * dp_get_peer_state() - Get local peer state - * @peer - peer instance - * - * Get local peer state - * - * Return: peer status - */ -int dp_get_peer_state(void *peer_handle) +int dp_get_peer_state(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, + uint8_t *peer_mac) { - struct dp_peer *peer = peer_handle; + enum ol_txrx_peer_state peer_state; + struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); + struct dp_peer *peer = dp_peer_find_hash_find(soc, peer_mac, 0, + vdev_id); + + if (!peer) + return QDF_STATUS_E_FAILURE; DP_TRACE(DEBUG, "peer %pK stats %d", peer, peer->state); - return peer->state; + peer_state = peer->state; + dp_peer_unref_delete(peer); + + return peer_state; } /** @@ -3425,6 +3411,60 @@ void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer) pdev->local_peer_ids.map[i] = NULL; qdf_spin_unlock_bh(&pdev->local_peer_ids.lock); } + +bool dp_find_peer_exist_on_vdev(struct cdp_soc_t *soc_hdl, + uint8_t vdev_id, uint8_t *peer_addr) +{ + struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); + struct dp_vdev *vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id); + + if (!vdev) + return false; + + return !!dp_find_peer_by_addr_and_vdev( + dp_pdev_to_cdp_pdev(vdev->pdev), + dp_vdev_to_cdp_vdev(vdev), + peer_addr); +} + +bool dp_find_peer_exist_on_other_vdev(struct cdp_soc_t *soc_hdl, + uint8_t vdev_id, uint8_t *peer_addr, + uint16_t max_bssid) +{ + int i; + struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); + struct dp_vdev *vdev; + + for (i = 0; i < max_bssid; i++) { + vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id); + /* Need to check vdevs other than the vdev_id */ + if (vdev_id == i || !vdev) + continue; + if (dp_find_peer_by_addr_and_vdev( + dp_pdev_to_cdp_pdev(vdev->pdev), + dp_vdev_to_cdp_vdev(vdev), + peer_addr)) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, + "%s: Duplicate peer %pM already exist on vdev %d", + __func__, peer_addr, i); + return true; + } + } + + return false; +} + +bool dp_find_peer_exist(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, + uint8_t *peer_addr) +{ + struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); + struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); + + if (!pdev) + return false; + + return !!dp_find_peer_by_addr(dp_pdev_to_cdp_pdev(pdev), peer_addr); +} #endif /** diff --git a/target_if/crypto/src/target_if_crypto.c b/target_if/crypto/src/target_if_crypto.c index 95cd3a320a..1460ab4043 100644 --- a/target_if/crypto/src/target_if_crypto.c +++ b/target_if/crypto/src/target_if_crypto.c @@ -113,9 +113,8 @@ QDF_STATUS target_if_crypto_set_key(struct wlan_objmgr_vdev *vdev, struct wlan_objmgr_pdev *pdev; enum cdp_sec_type sec_type = cdp_sec_type_none; void *soc = cds_get_context(QDF_MODULE_ID_SOC); - struct cdp_pdev *txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX); uint32_t pn[4] = {0, 0, 0, 0}; - struct cdp_peer *peer = NULL; + bool peer_exist = false; uint8_t def_tx_idx; wmi_unified_t pdev_wmi_handle; bool pairwise; @@ -157,13 +156,14 @@ QDF_STATUS target_if_crypto_set_key(struct wlan_objmgr_vdev *vdev, qdf_mem_copy(¶ms.key_rsc_ctr, &req->keyrsc[0], sizeof(uint64_t)); - peer = cdp_peer_find_by_addr(soc, txrx_pdev, req->macaddr); + peer_exist = cdp_find_peer_exist(soc, pdev->pdev_objmgr.wlan_pdev_id, + req->macaddr); target_if_debug("key_type %d, mac: %02x:%02x:%02x:%02x:%02x:%02x", key_type, req->macaddr[0], req->macaddr[1], req->macaddr[2], req->macaddr[3], req->macaddr[4], req->macaddr[5]); - if ((key_type == WLAN_CRYPTO_KEY_TYPE_UNICAST) && !peer) { + if ((key_type == WLAN_CRYPTO_KEY_TYPE_UNICAST) && !peer_exist) { target_if_err("Invalid peer"); return QDF_STATUS_E_FAILURE; }