dp_peer.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. /*
  2. * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for
  5. * any purpose with or without fee is hereby granted, provided that the
  6. * above copyright notice and this permission notice appear in all
  7. * copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  10. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  11. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  12. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  14. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  15. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  16. * PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. #ifndef _DP_PEER_H_
  19. #define _DP_PEER_H_
  20. #include <qdf_types.h>
  21. #include <qdf_lock.h>
  22. #include "dp_types.h"
  23. #define DP_INVALID_PEER_ID 0xffff
  24. #define DP_FW_PEER_STATS_CMP_TIMEOUT_MSEC 5000
  25. /**
  26. * dp_peer_get_ref() - Returns peer object given the peer id
  27. *
  28. * @soc : core DP soc context
  29. * @peer : DP peer
  30. * @mod_id : id of module requesting the reference
  31. *
  32. * Return: QDF_STATUS_SUCCESS if reference held successfully
  33. * else QDF_STATUS_E_INVAL
  34. */
  35. static inline
  36. QDF_STATUS dp_peer_get_ref(struct dp_soc *soc,
  37. struct dp_peer *peer,
  38. enum dp_peer_mod_id mod_id)
  39. {
  40. if (!qdf_atomic_inc_not_zero(&peer->ref_cnt))
  41. return QDF_STATUS_E_INVAL;
  42. if (mod_id > DP_MOD_ID_RX)
  43. qdf_atomic_inc(&peer->mod_refs[mod_id]);
  44. return QDF_STATUS_SUCCESS;
  45. }
  46. /**
  47. * __dp_peer_find_by_id() - Returns peer object given the peer id
  48. *
  49. * @soc : core DP soc context
  50. * @peer_id : peer id from peer object can be retrieved
  51. *
  52. * Return: struct dp_peer*: Pointer to DP peer object
  53. */
  54. static inline struct dp_peer *
  55. __dp_peer_find_by_id(struct dp_soc *soc,
  56. uint16_t peer_id)
  57. {
  58. struct dp_peer *peer;
  59. /* TODO: Hold lock */
  60. peer = (peer_id >= soc->max_peers) ? NULL :
  61. soc->peer_id_to_obj_map[peer_id];
  62. return peer;
  63. }
  64. /**
  65. * dp_peer_get_ref_by_id() - Returns peer object given the peer id
  66. * if delete_in_progress in not set for peer
  67. *
  68. * @soc : core DP soc context
  69. * @peer_id : peer id from peer object can be retrieved
  70. * @mod_id : ID ot module requesting reference
  71. *
  72. * Return: struct dp_peer*: Pointer to DP peer object
  73. */
  74. static inline
  75. struct dp_peer *dp_peer_get_ref_by_id(struct dp_soc *soc,
  76. uint16_t peer_id,
  77. enum dp_peer_mod_id mod_id)
  78. {
  79. struct dp_peer *peer;
  80. qdf_spin_lock_bh(&soc->peer_map_lock);
  81. peer = __dp_peer_find_by_id(soc, peer_id);
  82. if (!peer || peer->delete_in_progress ||
  83. (dp_peer_get_ref(soc, peer, mod_id) != QDF_STATUS_SUCCESS)) {
  84. qdf_spin_unlock_bh(&soc->peer_map_lock);
  85. return NULL;
  86. }
  87. qdf_spin_unlock_bh(&soc->peer_map_lock);
  88. return peer;
  89. }
  90. #ifdef PEER_CACHE_RX_PKTS
  91. /**
  92. * dp_rx_flush_rx_cached() - flush cached rx frames
  93. * @peer: peer
  94. * @drop: set flag to drop frames
  95. *
  96. * Return: None
  97. */
  98. void dp_rx_flush_rx_cached(struct dp_peer *peer, bool drop);
  99. #else
  100. static inline void dp_rx_flush_rx_cached(struct dp_peer *peer, bool drop)
  101. {
  102. }
  103. #endif
  104. static inline void
  105. dp_clear_peer_internal(struct dp_soc *soc, struct dp_peer *peer)
  106. {
  107. qdf_spin_lock_bh(&peer->peer_info_lock);
  108. peer->state = OL_TXRX_PEER_STATE_DISC;
  109. qdf_spin_unlock_bh(&peer->peer_info_lock);
  110. dp_rx_flush_rx_cached(peer, true);
  111. }
  112. void dp_print_ast_stats(struct dp_soc *soc);
  113. QDF_STATUS dp_rx_peer_map_handler(struct dp_soc *soc, uint16_t peer_id,
  114. uint16_t hw_peer_id, uint8_t vdev_id,
  115. uint8_t *peer_mac_addr, uint16_t ast_hash,
  116. uint8_t is_wds);
  117. void dp_rx_peer_unmap_handler(struct dp_soc *soc, uint16_t peer_id,
  118. uint8_t vdev_id, uint8_t *peer_mac_addr,
  119. uint8_t is_wds, uint32_t free_wds_count);
  120. void dp_rx_sec_ind_handler(struct dp_soc *soc, uint16_t peer_id,
  121. enum cdp_sec_type sec_type, int is_unicast,
  122. u_int32_t *michael_key, u_int32_t *rx_pn);
  123. QDF_STATUS dp_rx_delba_ind_handler(void *soc_handle, uint16_t peer_id,
  124. uint8_t tid, uint16_t win_sz);
  125. uint8_t dp_get_peer_mac_addr_frm_id(struct cdp_soc_t *soc_handle,
  126. uint16_t peer_id, uint8_t *peer_mac);
  127. QDF_STATUS dp_peer_add_ast(struct dp_soc *soc, struct dp_peer *peer,
  128. uint8_t *mac_addr, enum cdp_txrx_ast_entry_type type,
  129. uint32_t flags);
  130. void dp_peer_del_ast(struct dp_soc *soc, struct dp_ast_entry *ast_entry);
  131. void dp_peer_ast_unmap_handler(struct dp_soc *soc,
  132. struct dp_ast_entry *ast_entry);
  133. int dp_peer_update_ast(struct dp_soc *soc, struct dp_peer *peer,
  134. struct dp_ast_entry *ast_entry, uint32_t flags);
  135. struct dp_ast_entry *dp_peer_ast_hash_find_by_pdevid(struct dp_soc *soc,
  136. uint8_t *ast_mac_addr,
  137. uint8_t pdev_id);
  138. struct dp_ast_entry *dp_peer_ast_hash_find_by_vdevid(struct dp_soc *soc,
  139. uint8_t *ast_mac_addr,
  140. uint8_t vdev_id);
  141. struct dp_ast_entry *dp_peer_ast_hash_find_soc(struct dp_soc *soc,
  142. uint8_t *ast_mac_addr);
  143. uint8_t dp_peer_ast_get_pdev_id(struct dp_soc *soc,
  144. struct dp_ast_entry *ast_entry);
  145. uint8_t dp_peer_ast_get_next_hop(struct dp_soc *soc,
  146. struct dp_ast_entry *ast_entry);
  147. void dp_peer_ast_set_type(struct dp_soc *soc,
  148. struct dp_ast_entry *ast_entry,
  149. enum cdp_txrx_ast_entry_type type);
  150. void dp_peer_ast_send_wds_del(struct dp_soc *soc,
  151. struct dp_ast_entry *ast_entry,
  152. struct dp_peer *peer);
  153. void dp_peer_free_hmwds_cb(struct cdp_ctrl_objmgr_psoc *ctrl_psoc,
  154. struct cdp_soc *dp_soc,
  155. void *cookie,
  156. enum cdp_ast_free_status status);
  157. void dp_peer_ast_hash_remove(struct dp_soc *soc,
  158. struct dp_ast_entry *ase);
  159. void dp_peer_free_ast_entry(struct dp_soc *soc,
  160. struct dp_ast_entry *ast_entry);
  161. void dp_peer_unlink_ast_entry(struct dp_soc *soc,
  162. struct dp_ast_entry *ast_entry,
  163. struct dp_peer *peer);
  164. #define DP_AST_ASSERT(_condition) \
  165. do { \
  166. if (!(_condition)) { \
  167. dp_print_ast_stats(soc);\
  168. QDF_BUG(_condition); \
  169. } \
  170. } while (0)
  171. /**
  172. * dp_peer_update_inactive_time - Update inactive time for peer
  173. * @pdev: pdev object
  174. * @tag_type: htt_tlv_tag type
  175. * #tag_buf: buf message
  176. */
  177. void
  178. dp_peer_update_inactive_time(struct dp_pdev *pdev, uint32_t tag_type,
  179. uint32_t *tag_buf);
  180. #ifndef QCA_MULTIPASS_SUPPORT
  181. /**
  182. * dp_peer_set_vlan_id: set vlan_id for this peer
  183. * @cdp_soc: soc handle
  184. * @vdev_id: id of vdev object
  185. * @peer_mac: mac address
  186. * @vlan_id: vlan id for peer
  187. *
  188. * return: void
  189. */
  190. static inline
  191. void dp_peer_set_vlan_id(struct cdp_soc_t *cdp_soc,
  192. uint8_t vdev_id, uint8_t *peer_mac,
  193. uint16_t vlan_id)
  194. {
  195. }
  196. /**
  197. * dp_set_vlan_groupkey: set vlan map for vdev
  198. * @soc: pointer to soc
  199. * @vdev_id: id of vdev handle
  200. * @vlan_id: vlan_id
  201. * @group_key: group key for vlan
  202. *
  203. * return: set success/failure
  204. */
  205. static inline
  206. QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc, uint8_t vdev_id,
  207. uint16_t vlan_id, uint16_t group_key)
  208. {
  209. return QDF_STATUS_SUCCESS;
  210. }
  211. /**
  212. * dp_peer_multipass_list_init: initialize multipass peer list
  213. * @vdev: pointer to vdev
  214. *
  215. * return: void
  216. */
  217. static inline
  218. void dp_peer_multipass_list_init(struct dp_vdev *vdev)
  219. {
  220. }
  221. /**
  222. * dp_peer_multipass_list_remove: remove peer from special peer list
  223. * @peer: peer handle
  224. *
  225. * return: void
  226. */
  227. static inline
  228. void dp_peer_multipass_list_remove(struct dp_peer *peer)
  229. {
  230. }
  231. #else
  232. void dp_peer_set_vlan_id(struct cdp_soc_t *cdp_soc,
  233. uint8_t vdev_id, uint8_t *peer_mac,
  234. uint16_t vlan_id);
  235. QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc, uint8_t vdev_id,
  236. uint16_t vlan_id, uint16_t group_key);
  237. void dp_peer_multipass_list_init(struct dp_vdev *vdev);
  238. void dp_peer_multipass_list_remove(struct dp_peer *peer);
  239. #endif
  240. #ifndef QCA_PEER_MULTIQ_SUPPORT
  241. /**
  242. * dp_peer_reset_flowq_map() - reset peer flowq map table
  243. * @peer - dp peer handle
  244. *
  245. * Return: none
  246. */
  247. static inline
  248. void dp_peer_reset_flowq_map(struct dp_peer *peer)
  249. {
  250. }
  251. /**
  252. * dp_peer_ast_index_flow_queue_map_create() - create ast index flow queue map
  253. * @soc - genereic soc handle
  254. * @is_wds - flag to indicate if peer is wds
  255. * @peer_id - peer_id from htt peer map message
  256. * @peer_mac_addr - mac address of the peer
  257. * @ast_info - ast flow override information from peer map
  258. *
  259. * Return: none
  260. */
  261. static inline
  262. void dp_peer_ast_index_flow_queue_map_create(void *soc_hdl,
  263. bool is_wds, uint16_t peer_id, uint8_t *peer_mac_addr,
  264. struct dp_ast_flow_override_info *ast_info)
  265. {
  266. }
  267. #else
  268. void dp_peer_reset_flowq_map(struct dp_peer *peer);
  269. void dp_peer_ast_index_flow_queue_map_create(void *soc_hdl,
  270. bool is_wds, uint16_t peer_id, uint8_t *peer_mac_addr,
  271. struct dp_ast_flow_override_info *ast_info);
  272. #endif
  273. /**
  274. * dp_peer_update_pkt_capture_params: Set Rx & Tx Capture flags for a peer
  275. * @soc: DP SOC handle
  276. * @pdev_id: id of DP pdev handle
  277. * @is_rx_pkt_cap_enable: enable/disable Rx packet capture in monitor mode
  278. * @is_tx_pkt_cap_enable: enable/disable/delete/print
  279. * Tx packet capture in monitor mode
  280. * Tx packet capture in monitor mode
  281. * @peer_mac: MAC address for which the above need to be enabled/disabled
  282. *
  283. * Return: Success if Rx & Tx capture is enabled for peer, false otherwise
  284. */
  285. QDF_STATUS
  286. dp_peer_update_pkt_capture_params(ol_txrx_soc_handle soc,
  287. uint8_t pdev_id,
  288. bool is_rx_pkt_cap_enable,
  289. uint8_t is_tx_pkt_cap_enable,
  290. uint8_t *peer_mac);
  291. /*
  292. * dp_rx_tid_delete_cb() - Callback to flush reo descriptor HW cache
  293. * after deleting the entries (ie., setting valid=0)
  294. *
  295. * @soc: DP SOC handle
  296. * @cb_ctxt: Callback context
  297. * @reo_status: REO command status
  298. */
  299. void dp_rx_tid_delete_cb(struct dp_soc *soc,
  300. void *cb_ctxt,
  301. union hal_reo_status *reo_status);
  302. #ifndef WLAN_TX_PKT_CAPTURE_ENH
  303. /**
  304. * dp_peer_tid_queue_init() – Initialize ppdu stats queue per TID
  305. * @peer: Datapath peer
  306. *
  307. */
  308. static inline void dp_peer_tid_queue_init(struct dp_peer *peer)
  309. {
  310. }
  311. /**
  312. * dp_peer_tid_peer_id_update() – update peer_id to tid structure
  313. * @peer: Datapath peer
  314. * @peer_id: peer_id
  315. *
  316. */
  317. static inline
  318. void dp_peer_tid_peer_id_update(struct dp_peer *peer, uint16_t peer_id)
  319. {
  320. }
  321. /**
  322. * dp_peer_tid_queue_cleanup() – remove ppdu stats queue per TID
  323. * @peer: Datapath peer
  324. *
  325. */
  326. static inline void dp_peer_tid_queue_cleanup(struct dp_peer *peer)
  327. {
  328. }
  329. /**
  330. * dp_peer_update_80211_hdr() – dp peer update 80211 hdr
  331. * @vdev: Datapath vdev
  332. * @peer: Datapath peer
  333. *
  334. */
  335. static inline void
  336. dp_peer_update_80211_hdr(struct dp_vdev *vdev, struct dp_peer *peer)
  337. {
  338. }
  339. #endif
  340. #ifdef QCA_PEER_EXT_STATS
  341. QDF_STATUS dp_peer_ext_stats_ctx_alloc(struct dp_soc *soc,
  342. struct dp_peer *peer);
  343. void dp_peer_ext_stats_ctx_dealloc(struct dp_soc *soc,
  344. struct dp_peer *peer);
  345. #else
  346. static inline QDF_STATUS dp_peer_ext_stats_ctx_alloc(struct dp_soc *soc,
  347. struct dp_peer *peer)
  348. {
  349. return QDF_STATUS_SUCCESS;
  350. }
  351. static inline void dp_peer_ext_stats_ctx_dealloc(struct dp_soc *soc,
  352. struct dp_peer *peer)
  353. {
  354. }
  355. #endif
  356. struct dp_peer *dp_vdev_bss_peer_ref_n_get(struct dp_soc *soc,
  357. struct dp_vdev *vdev,
  358. enum dp_peer_mod_id mod_id);
  359. struct dp_peer *dp_sta_vdev_self_peer_ref_n_get(struct dp_soc *soc,
  360. struct dp_vdev *vdev,
  361. enum dp_peer_mod_id mod_id);
  362. #endif /* _DP_PEER_H_ */