rtw_tdls.h 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * You should have received a copy of the GNU General Public License along with
  15. * this program; if not, write to the Free Software Foundation, Inc.,
  16. * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  17. *
  18. *
  19. ******************************************************************************/
  20. #ifndef __RTW_TDLS_H_
  21. #define __RTW_TDLS_H_
  22. #ifdef CONFIG_TDLS
  23. /* TDLS STA state */
  24. /* TDLS Diect Link Establishment */
  25. #define TDLS_STATE_NONE 0x00000000 /* Default state */
  26. #define TDLS_INITIATOR_STATE BIT(28) /* 0x10000000 */
  27. #define TDLS_RESPONDER_STATE BIT(29) /* 0x20000000 */
  28. #define TDLS_LINKED_STATE BIT(30) /* 0x40000000 */
  29. /* TDLS PU Buffer STA */
  30. #define TDLS_WAIT_PTR_STATE BIT(24) /* 0x01000000 */ /* Waiting peer's TDLS_PEER_TRAFFIC_RESPONSE frame */
  31. /* TDLS Check ALive */
  32. #define TDLS_ALIVE_STATE BIT(20) /* 0x00100000 */ /* Check if peer sta is alived. */
  33. /* TDLS Channel Switch */
  34. #define TDLS_CH_SWITCH_PREPARE_STATE BIT(15) /* 0x00008000 */
  35. #define TDLS_CH_SWITCH_ON_STATE BIT(16) /* 0x00010000 */
  36. #define TDLS_PEER_AT_OFF_STATE BIT(17) /* 0x00020000 */ /* Could send pkt on target ch */
  37. #define TDLS_CH_SW_INITIATOR_STATE BIT(18) /* 0x00040000 */ /* Avoid duplicated or unconditional ch. switch rsp. */
  38. #define TDLS_WAIT_CH_RSP_STATE BIT(19) /* 0x00080000 */ /* Wait Ch. response as we are TDLS channel switch initiator */
  39. #define TDLS_TPK_RESEND_COUNT 86400 /*Unit: seconds */
  40. #define TDLS_CH_SWITCH_TIME 15
  41. #define TDLS_CH_SWITCH_TIMEOUT 30
  42. #define TDLS_CH_SWITCH_OPER_OFFLOAD_TIMEOUT 10
  43. #define TDLS_SIGNAL_THRESH 0x20
  44. #define TDLS_WATCHDOG_PERIOD 10 /* Periodically sending tdls discovery request in TDLS_WATCHDOG_PERIOD * 2 sec */
  45. #define TDLS_HANDSHAKE_TIME 3000
  46. #define TDLS_PTI_TIME 7000
  47. #define TDLS_CH_SW_STAY_ON_BASE_CHNL_TIMEOUT 20 /* ms */
  48. #define TDLS_CH_SW_MONITOR_TIMEOUT 2000 /*ms */
  49. #define TDLS_MIC_LEN 16
  50. #define WPA_NONCE_LEN 32
  51. #define TDLS_TIMEOUT_LEN 4
  52. enum TDLS_CH_SW_CHNL {
  53. TDLS_CH_SW_BASE_CHNL = 0,
  54. TDLS_CH_SW_OFF_CHNL
  55. };
  56. struct wpa_tdls_ftie {
  57. u8 ie_type; /* FTIE */
  58. u8 ie_len;
  59. u8 mic_ctrl[2];
  60. u8 mic[TDLS_MIC_LEN];
  61. u8 Anonce[WPA_NONCE_LEN]; /* Responder Nonce in TDLS */
  62. u8 Snonce[WPA_NONCE_LEN]; /* Initiator Nonce in TDLS */
  63. /* followed by optional elements */
  64. } ;
  65. struct wpa_tdls_lnkid {
  66. u8 ie_type; /* Link Identifier IE */
  67. u8 ie_len;
  68. u8 bssid[ETH_ALEN];
  69. u8 init_sta[ETH_ALEN];
  70. u8 resp_sta[ETH_ALEN];
  71. } ;
  72. static u8 TDLS_RSNIE[20] = { 0x01, 0x00, /* Version shall be set to 1 */
  73. 0x00, 0x0f, 0xac, 0x07, /* Group sipher suite */
  74. 0x01, 0x00, /* Pairwise cipher suite count */
  75. 0x00, 0x0f, 0xac, 0x04, /* Pairwise cipher suite list; CCMP only */
  76. 0x01, 0x00, /* AKM suite count */
  77. 0x00, 0x0f, 0xac, 0x07, /* TPK Handshake */
  78. 0x0c, 0x02,
  79. /* PMKID shall not be present */
  80. };
  81. static u8 TDLS_WMMIE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; /* Qos info all set zero */
  82. static u8 TDLS_WMM_PARAM_IE[] = {0x00, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00};
  83. static u8 TDLS_EXT_CAPIE[] = {0x00, 0x00, 0x00, 0x50, 0x20, 0x00, 0x00, 0x00}; /* bit(28), bit(30), bit(37) */
  84. /* SRC: Supported Regulatory Classes */
  85. static u8 TDLS_SRC[] = { 0x01, 0x01, 0x02, 0x03, 0x04, 0x0c, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21 };
  86. int check_ap_tdls_prohibited(u8 *pframe, u8 pkt_len);
  87. int check_ap_tdls_ch_switching_prohibited(u8 *pframe, u8 pkt_len);
  88. u8 rtw_tdls_is_setup_allowed(_adapter *padapter);
  89. #ifdef CONFIG_TDLS_CH_SW
  90. u8 rtw_tdls_is_chsw_allowed(_adapter *padapter);
  91. #endif
  92. void rtw_reset_tdls_info(_adapter *padapter);
  93. int rtw_init_tdls_info(_adapter *padapter);
  94. void rtw_free_tdls_info(struct tdls_info *ptdlsinfo);
  95. int issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms);
  96. void rtw_init_tdls_timer(_adapter *padapter, struct sta_info *psta);
  97. void rtw_free_tdls_timer(struct sta_info *psta);
  98. void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta);
  99. #ifdef CONFIG_TDLS_CH_SW
  100. void rtw_tdls_set_ch_sw_oper_control(_adapter *padapter, u8 enable);
  101. void rtw_tdls_ch_sw_back_to_base_chnl(_adapter *padapter);
  102. s32 rtw_tdls_do_ch_sw(_adapter *padapter, struct sta_info *ptdls_sta, u8 chnl_type, u8 channel, u8 channel_offset, u16 bwmode, u16 ch_switch_time);
  103. void rtw_tdls_chsw_oper_done(_adapter *padapter);
  104. #endif
  105. #ifdef CONFIG_WFD
  106. int issue_tunneled_probe_req(_adapter *padapter);
  107. int issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame);
  108. #endif /* CONFIG_WFD */
  109. int issue_tdls_dis_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt);
  110. int issue_tdls_setup_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack);
  111. int issue_tdls_setup_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt);
  112. int issue_tdls_setup_cfm(_adapter *padapter, struct tdls_txmgmt *ptxmgmt);
  113. int issue_tdls_dis_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 privacy);
  114. int issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait_ack);
  115. int issue_tdls_peer_traffic_rsp(_adapter *padapter, struct sta_info *psta, struct tdls_txmgmt *ptxmgmt);
  116. int issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta);
  117. #ifdef CONFIG_TDLS_CH_SW
  118. int issue_tdls_ch_switch_req(_adapter *padapter, struct sta_info *ptdls_sta);
  119. int issue_tdls_ch_switch_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack);
  120. #endif
  121. sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame);
  122. sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame);
  123. int On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame);
  124. int On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame);
  125. int On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame);
  126. int On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame);
  127. int On_TDLS_Peer_Traffic_Indication(_adapter *adapter, union recv_frame *precv_frame);
  128. int On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame);
  129. #ifdef CONFIG_TDLS_CH_SW
  130. sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame);
  131. sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame);
  132. void rtw_build_tdls_ch_switch_req_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);
  133. void rtw_build_tdls_ch_switch_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);
  134. #endif
  135. void rtw_build_tdls_setup_req_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);
  136. void rtw_build_tdls_setup_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);
  137. void rtw_build_tdls_setup_cfm_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);
  138. void rtw_build_tdls_teardown_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);
  139. void rtw_build_tdls_dis_req_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);
  140. void rtw_build_tdls_dis_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, u8 privacy);
  141. void rtw_build_tdls_peer_traffic_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);
  142. void rtw_build_tdls_peer_traffic_indication_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);
  143. void rtw_build_tunneled_probe_req_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe);
  144. void rtw_build_tunneled_probe_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe);
  145. u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta);
  146. int rtw_tdls_is_driver_setup(_adapter *padapter);
  147. void rtw_tdls_set_key(_adapter *padapter, struct sta_info *ptdls_sta);
  148. const char *rtw_tdls_action_txt(enum TDLS_ACTION_FIELD action);
  149. #endif /* CONFIG_TDLS */
  150. #endif