1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /****************************************************************************** 3 * 4 * Copyright(c) 2007 - 2017 Realtek Corporation. 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of version 2 of the GNU General Public License as 8 * published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 * more details. 14 * 15 *****************************************************************************/ 16 #ifndef __RTW_TDLS_H_ 17 #define __RTW_TDLS_H_ 18 19 20 #ifdef CONFIG_TDLS 21 /* TDLS STA state */ 22 23 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 40 41 #define TDLS_TPK_RESEND_COUNT 86400 /*Unit: seconds */ 42 #define TDLS_CH_SWITCH_TIME 15 43 #define TDLS_CH_SWITCH_TIMEOUT 30 44 #define TDLS_CH_SWITCH_OPER_OFFLOAD_TIMEOUT 10 45 #define TDLS_SIGNAL_THRESH 0x20 46 #define TDLS_WATCHDOG_PERIOD 10 /* Periodically sending tdls discovery request in TDLS_WATCHDOG_PERIOD * 2 sec */ 47 #define TDLS_HANDSHAKE_TIME 3000 48 #define TDLS_PTI_TIME 7000 49 50 #define TDLS_CH_SW_STAY_ON_BASE_CHNL_TIMEOUT 20 /* ms */ 51 #define TDLS_CH_SW_MONITOR_TIMEOUT 2000 /*ms */ 52 53 #define TDLS_MIC_LEN 16 54 #define WPA_NONCE_LEN 32 55 #define TDLS_TIMEOUT_LEN 4 56 57 enum TDLS_CH_SW_CHNL { 58 TDLS_CH_SW_BASE_CHNL = 0, 59 TDLS_CH_SW_OFF_CHNL 60 }; 61 62 #define TDLS_MIC_CTRL_LEN 2 63 #define TDLS_FTIE_DATA_LEN (TDLS_MIC_CTRL_LEN + TDLS_MIC_LEN + \ 64 WPA_NONCE_LEN + WPA_NONCE_LEN) 65 struct wpa_tdls_ftie { 66 u8 ie_type; /* FTIE */ 67 u8 ie_len; 68 union { 69 struct { 70 u8 mic_ctrl[TDLS_MIC_CTRL_LEN]; 71 u8 mic[TDLS_MIC_LEN]; 72 u8 Anonce[WPA_NONCE_LEN]; /* Responder Nonce in TDLS */ 73 u8 Snonce[WPA_NONCE_LEN]; /* Initiator Nonce in TDLS */ 74 }; 75 struct { 76 u8 data[TDLS_FTIE_DATA_LEN]; 77 }; 78 }; 79 /* followed by optional elements */ 80 } ; 81 82 struct wpa_tdls_lnkid { 83 u8 ie_type; /* Link Identifier IE */ 84 u8 ie_len; 85 u8 bssid[ETH_ALEN]; 86 u8 init_sta[ETH_ALEN]; 87 u8 resp_sta[ETH_ALEN]; 88 } ; 89 90 static u8 TDLS_RSNIE[20] = { 0x01, 0x00, /* Version shall be set to 1 */ 91 0x00, 0x0f, 0xac, 0x07, /* Group sipher suite */ 92 0x01, 0x00, /* Pairwise cipher suite count */ 93 0x00, 0x0f, 0xac, 0x04, /* Pairwise cipher suite list; CCMP only */ 94 0x01, 0x00, /* AKM suite count */ 95 0x00, 0x0f, 0xac, 0x07, /* TPK Handshake */ 96 0x0c, 0x02, 97 /* PMKID shall not be present */ 98 }; 99 100 static u8 TDLS_WMMIE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; /* Qos info all set zero */ 101 102 static u8 TDLS_WMM_PARAM_IE[] = {0x00, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00}; 103 104 static u8 TDLS_EXT_CAPIE[] = {0x00, 0x00, 0x00, 0x50, 0x20, 0x00, 0x00, 0x00}; /* bit(28), bit(30), bit(37) */ 105 106 /* SRC: Supported Regulatory Classes */ 107 static u8 TDLS_SRC[] = { 0x01, 0x01, 0x02, 0x03, 0x04, 0x0c, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21 }; 108 109 int check_ap_tdls_prohibited(u8 *pframe, u8 pkt_len); 110 int check_ap_tdls_ch_switching_prohibited(u8 *pframe, u8 pkt_len); 111 112 void rtw_set_tdls_enable(_adapter *padapter, u8 enable); 113 u8 rtw_is_tdls_enabled(_adapter *padapter); 114 u8 rtw_is_tdls_sta_existed(_adapter *padapter); 115 u8 rtw_tdls_is_setup_allowed(_adapter *padapter); 116 #ifdef CONFIG_TDLS_CH_SW 117 u8 rtw_tdls_is_chsw_allowed(_adapter *padapter); 118 #endif 119 120 void rtw_tdls_set_link_established(_adapter *adapter, bool en); 121 void rtw_reset_tdls_info(_adapter *padapter); 122 int rtw_init_tdls_info(_adapter *padapter); 123 void rtw_free_tdls_info(struct tdls_info *ptdlsinfo); 124 void rtw_free_all_tdls_sta(_adapter *padapter, u8 enqueue_cmd); 125 void rtw_enable_tdls_func(_adapter *padapter); 126 void rtw_disable_tdls_func(_adapter *padapter, u8 enqueue_cmd); 127 int issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms); 128 void rtw_init_tdls_timer(_adapter *padapter, struct sta_info *psta); 129 void rtw_cancel_tdls_timer(struct sta_info *psta); 130 void rtw_tdls_teardown_pre_hdl(_adapter *padapter, struct sta_info *psta); 131 void rtw_tdls_teardown_post_hdl(_adapter *padapter, struct sta_info *psta, u8 enqueue_cmd); 132 133 #ifdef CONFIG_TDLS_CH_SW 134 void rtw_tdls_set_ch_sw_oper_control(_adapter *padapter, u8 enable); 135 void rtw_tdls_ch_sw_back_to_base_chnl(_adapter *padapter); 136 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); 137 void rtw_tdls_chsw_oper_done(_adapter *padapter); 138 #endif 139 140 #ifdef CONFIG_WFD 141 int issue_tunneled_probe_req(_adapter *padapter); 142 int issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame); 143 #endif /* CONFIG_WFD */ 144 int issue_tdls_dis_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt); 145 int issue_tdls_setup_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack); 146 int issue_tdls_setup_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt); 147 int issue_tdls_setup_cfm(_adapter *padapter, struct tdls_txmgmt *ptxmgmt); 148 int issue_tdls_dis_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 privacy); 149 int issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait_ack); 150 int issue_tdls_peer_traffic_rsp(_adapter *padapter, struct sta_info *psta, struct tdls_txmgmt *ptxmgmt); 151 int issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta); 152 #ifdef CONFIG_TDLS_CH_SW 153 int issue_tdls_ch_switch_req(_adapter *padapter, struct sta_info *ptdls_sta); 154 int issue_tdls_ch_switch_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack); 155 #endif 156 sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame); 157 sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame, struct sta_info *ptdls_sta); 158 int On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame, struct sta_info *ptdls_sta); 159 int On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame, struct sta_info *ptdls_sta); 160 int On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame); 161 int On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame, struct sta_info *ptdls_sta); 162 int On_TDLS_Peer_Traffic_Indication(_adapter *adapter, union recv_frame *precv_frame, struct sta_info *ptdls_sta); 163 int On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame, struct sta_info *ptdls_sta); 164 #ifdef CONFIG_TDLS_CH_SW 165 sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame, struct sta_info *ptdls_sta); 166 sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame, struct sta_info *ptdls_sta); 167 void rtw_build_tdls_ch_switch_req_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta); 168 void rtw_build_tdls_ch_switch_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta); 169 #endif 170 void rtw_build_tdls_setup_req_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta); 171 void rtw_build_tdls_setup_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta); 172 void rtw_build_tdls_setup_cfm_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta); 173 void rtw_build_tdls_teardown_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta); 174 void rtw_build_tdls_dis_req_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt); 175 void rtw_build_tdls_dis_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, u8 privacy); 176 void rtw_build_tdls_peer_traffic_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta); 177 void rtw_build_tdls_peer_traffic_indication_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta); 178 void rtw_build_tunneled_probe_req_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe); 179 void rtw_build_tunneled_probe_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe); 180 181 int rtw_tdls_is_driver_setup(_adapter *padapter); 182 void rtw_tdls_set_key(_adapter *padapter, struct sta_info *ptdls_sta); 183 const char *rtw_tdls_action_txt(enum TDLS_ACTION_FIELD action); 184 #endif /* CONFIG_TDLS */ 185 186 #endif 187