wlan_cfg80211_tdls.h 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. /*
  2. * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
  3. * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for
  6. * any purpose with or without fee is hereby granted, provided that the
  7. * above copyright notice and this permission notice appear in all
  8. * copies.
  9. *
  10. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  11. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  12. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  13. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  14. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  15. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  16. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  17. * PERFORMANCE OF THIS SOFTWARE.
  18. */
  19. /**
  20. * DOC: declares driver functions interfacing with linux kernel
  21. */
  22. #ifndef _WLAN_CFG80211_TDLS_H_
  23. #define _WLAN_CFG80211_TDLS_H_
  24. #include <linux/version.h>
  25. #include <linux/netdevice.h>
  26. #include <linux/completion.h>
  27. #include <net/cfg80211.h>
  28. #include <qca_vendor.h>
  29. #include <wlan_tdls_public_structs.h>
  30. #include <qdf_list.h>
  31. #include <qdf_types.h>
  32. #include <wlan_hdd_main.h>
  33. #include <wlan_tdls_ucfg_api.h>
  34. #ifdef FEATURE_WLAN_TDLS
  35. #define TDLS_VDEV_MAGIC 0x54444c53 /* "TDLS" */
  36. /**
  37. * struct osif_tdls_vdev - OS tdls vdev private structure
  38. * @tdls_add_peer_comp: Completion to add tdls peer
  39. * @tdls_del_peer_comp: Completion to delete tdls peer
  40. * @tdls_mgmt_comp: Completion to send tdls mgmt packets
  41. * @tdls_link_establish_req_comp: Completion to establish link, sync to
  42. * send establish params to firmware, not used today.
  43. * @tdls_teardown_comp: Completion to teardown tdls peer
  44. * @tdls_user_cmd_comp: tdls user command completion event
  45. * @tdls_antenna_switch_comp: Completion to switch antenna
  46. * @tdls_add_peer_status: Peer status after add peer
  47. * @mgmt_tx_completion_status: Tdls mgmt frames TX completion status code
  48. * @tdls_user_cmd_len: tdls user command written buffer length
  49. * @tdls_antenna_switch_status: return status after antenna switch
  50. * @tdls_user_cmd_in_progress: tdls user command progress status.
  51. */
  52. struct osif_tdls_vdev {
  53. struct completion tdls_add_peer_comp;
  54. struct completion tdls_del_peer_comp;
  55. struct completion tdls_mgmt_comp;
  56. struct completion tdls_link_establish_req_comp;
  57. struct completion tdls_teardown_comp;
  58. struct completion tdls_user_cmd_comp;
  59. struct completion tdls_antenna_switch_comp;
  60. QDF_STATUS tdls_add_peer_status;
  61. uint32_t mgmt_tx_completion_status;
  62. uint32_t tdls_user_cmd_len;
  63. int tdls_antenna_switch_status;
  64. bool tdls_user_cmd_in_progress;
  65. };
  66. /**
  67. * enum qca_wlan_vendor_tdls_trigger_mode_vdev_map: Maps the user space TDLS
  68. * trigger mode in the host driver.
  69. * @WLAN_VENDOR_TDLS_TRIGGER_MODE_EXPLICIT: TDLS Connection and
  70. * disconnection handled by user space.
  71. * @WLAN_VENDOR_TDLS_TRIGGER_MODE_IMPLICIT: TDLS connection and
  72. * disconnection controlled by host driver based on data traffic.
  73. * @WLAN_VENDOR_TDLS_TRIGGER_MODE_EXTERNAL: TDLS connection and
  74. * disconnection jointly controlled by user space and host driver.
  75. */
  76. enum qca_wlan_vendor_tdls_trigger_mode_vdev_map {
  77. WLAN_VENDOR_TDLS_TRIGGER_MODE_EXPLICIT =
  78. QCA_WLAN_VENDOR_TDLS_TRIGGER_MODE_EXPLICIT,
  79. WLAN_VENDOR_TDLS_TRIGGER_MODE_IMPLICIT =
  80. QCA_WLAN_VENDOR_TDLS_TRIGGER_MODE_IMPLICIT,
  81. WLAN_VENDOR_TDLS_TRIGGER_MODE_EXTERNAL =
  82. ((QCA_WLAN_VENDOR_TDLS_TRIGGER_MODE_EXPLICIT |
  83. QCA_WLAN_VENDOR_TDLS_TRIGGER_MODE_IMPLICIT) << 1),
  84. };
  85. /**
  86. * wlan_cfg80211_tdls_osif_priv_init() - API to initialize tdls os private
  87. * @vdev: vdev object
  88. *
  89. * API to initialize tdls os private
  90. *
  91. * Return: QDF_STATUS
  92. */
  93. QDF_STATUS wlan_cfg80211_tdls_osif_priv_init(struct wlan_objmgr_vdev *vdev);
  94. /**
  95. * wlan_cfg80211_tdls_osif_priv_deinit() - API to deinitialize tdls os private
  96. * @vdev: vdev object
  97. *
  98. * API to deinitialize tdls os private
  99. *
  100. * Return: None
  101. */
  102. void wlan_cfg80211_tdls_osif_priv_deinit(struct wlan_objmgr_vdev *vdev);
  103. /**
  104. * wlan_cfg80211_tdls_add_peer_mlo() - process cfg80211 add TDLS peer request
  105. * @adapter: adapter pointer
  106. * @mac: MAC address for TDLS peer
  107. * @link_id: link id
  108. *
  109. * Return: 0 for success; negative errno otherwise
  110. */
  111. int wlan_cfg80211_tdls_add_peer_mlo(struct hdd_adapter *adapter,
  112. const uint8_t *mac, uint8_t link_id);
  113. /**
  114. * wlan_cfg80211_tdls_update_peer() - process cfg80211 update TDLS peer request
  115. * @vdev: vdev object
  116. * @mac: MAC address for TDLS peer
  117. * @params: Pointer to station parameters
  118. *
  119. * Return: 0 for success; negative errno otherwise
  120. */
  121. int wlan_cfg80211_tdls_update_peer(struct wlan_objmgr_vdev *vdev,
  122. const uint8_t *mac,
  123. struct station_parameters *params);
  124. /**
  125. * wlan_cfg80211_tdls_configure_mode() - configure tdls mode
  126. * @vdev: vdev obj manager
  127. * @trigger_mode: tdls trgger mode
  128. *
  129. * Return: 0 for success; negative errno otherwise
  130. */
  131. int wlan_cfg80211_tdls_configure_mode(struct wlan_objmgr_vdev *vdev,
  132. uint32_t trigger_mode);
  133. /**
  134. * wlan_cfg80211_tdls_oper() - process cfg80211 operation on an TDLS peer
  135. * @vdev: vdev object
  136. * @peer: MAC address of the TDLS peer
  137. * @oper: cfg80211 TDLS operation
  138. *
  139. * Return: 0 on success; negative errno otherwise
  140. */
  141. int wlan_cfg80211_tdls_oper(struct wlan_objmgr_vdev *vdev,
  142. const uint8_t *peer,
  143. enum nl80211_tdls_operation oper);
  144. /**
  145. * wlan_cfg80211_tdls_get_all_peers() - get all the TDLS peers from the list
  146. * @vdev: vdev object
  147. * @buf: output buffer
  148. * @buflen: valid length of the output error
  149. *
  150. * Return: length of the output buffer
  151. */
  152. int wlan_cfg80211_tdls_get_all_peers(struct wlan_objmgr_vdev *vdev,
  153. char *buf, int buflen);
  154. /**
  155. * wlan_cfg80211_tdls_is_fw_wideband_capable() - Check whether fw supports
  156. * wideband TDLS
  157. * @vdev: Pointer to vdev
  158. *
  159. * Return: true if fw supports wideband TDLS connection
  160. */
  161. bool wlan_cfg80211_tdls_is_fw_wideband_capable(struct wlan_objmgr_vdev *vdev);
  162. #ifdef WLAN_FEATURE_11AX
  163. /**
  164. * wlan_cfg80211_tdls_is_fw_6ghz_capable() - Check whether fw supports 6 GHz
  165. * band TDLS
  166. * @vdev: Pointer to vdev
  167. *
  168. * Return: true if fw supports 6 GHz TDLS connection
  169. */
  170. bool wlan_cfg80211_tdls_is_fw_6ghz_capable(struct wlan_objmgr_vdev *vdev);
  171. #endif
  172. /**
  173. * wlan_cfg80211_tdls_mgmt_mlo() - process TDLS management frames from
  174. * the supplicant
  175. * @adapter: adapter object
  176. * @peer: MAC address of the TDLS peer
  177. * @action_code: type of TDLS mgmt frame to be sent
  178. * @dialog_token: dialog token used in the frame
  179. * @status_code: status to be included in the frame
  180. * @peer_capability: peer capability information
  181. * @buf: additional IEs to be included
  182. * @len: length of additional Ies
  183. * @link_id: link id
  184. *
  185. * Return: 0 on success; negative errno otherwise
  186. */
  187. int wlan_cfg80211_tdls_mgmt_mlo(struct hdd_adapter *adapter,
  188. const uint8_t *peer,
  189. uint8_t action_code, uint8_t dialog_token,
  190. uint16_t status_code, uint32_t peer_capability,
  191. const uint8_t *buf, size_t len, int link_id);
  192. /**
  193. * wlan_tdls_antenna_switch() - process TDLS antenna switch
  194. * @vdev: vdev object
  195. * @mode: antenna mode
  196. *
  197. * Return: 0 on success; -EAGAIN to retry
  198. */
  199. int wlan_tdls_antenna_switch(struct wlan_objmgr_vdev *vdev, uint32_t mode);
  200. /**
  201. * wlan_cfg80211_tdls_event_callback() - callback for TDLS module
  202. * @userdata: user data
  203. * @type: request callback type
  204. * @param: passed parameter
  205. *
  206. * This is used by TDLS to sync with os interface
  207. *
  208. * Return: None
  209. */
  210. void wlan_cfg80211_tdls_event_callback(void *userdata,
  211. enum tdls_event_type type,
  212. struct tdls_osif_indication *param);
  213. /**
  214. * wlan_cfg80211_tdls_rx_callback() - Callback for rx mgmt frame
  215. * @user_data: pointer to soc object
  216. * @rx_frame: RX mgmt frame information
  217. *
  218. * This callback will be used to rx frames in os interface.
  219. *
  220. * Return: None
  221. */
  222. void wlan_cfg80211_tdls_rx_callback(void *user_data,
  223. struct tdls_rx_mgmt_frame *rx_frame);
  224. /**
  225. * hdd_notify_tdls_reset_adapter() - notify reset adapter to TDLS
  226. * @vdev: vdev object manager
  227. *
  228. * Notify hdd reset adapter to TDLS component
  229. *
  230. * Return: None
  231. */
  232. void hdd_notify_tdls_reset_adapter(struct wlan_objmgr_vdev *vdev);
  233. #else /* FEATURE_WLAN_TDLS */
  234. static inline
  235. QDF_STATUS wlan_cfg80211_tdls_osif_priv_init(struct wlan_objmgr_vdev *vdev)
  236. {
  237. return QDF_STATUS_SUCCESS;
  238. }
  239. static inline
  240. void wlan_cfg80211_tdls_osif_priv_deinit(struct wlan_objmgr_vdev *vdev)
  241. {
  242. }
  243. static inline void
  244. hdd_notify_tdls_reset_adapter(struct wlan_objmgr_vdev *vdev)
  245. {
  246. }
  247. static inline
  248. int wlan_cfg80211_tdls_configure_mode(struct wlan_objmgr_vdev *vdev,
  249. uint32_t trigger_mode)
  250. {
  251. return 0;
  252. }
  253. #endif /* FEATURE_WLAN_TDLS */
  254. #endif /* _WLAN_CFG80211_TDLS_H_ */