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