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
26 #define TDLS_STATE_NONE 0x00000000 //default state
\r
27 #define TDLS_INITIATOR_STATE 0x10000000
\r
28 #define TDLS_RESPONDER_STATE 0x20000000
\r
29 #define TDLS_LINKED_STATE 0x40000000
\r
30 #define TDLS_CH_SWITCH_ON_STATE 0x01000000
\r
31 #define TDLS_PEER_AT_OFF_STATE 0x02000000 //could send pkt on target ch
\r
32 #define TDLS_AT_OFF_CH_STATE 0x04000000
\r
33 #define TDLS_CH_SW_INITIATOR_STATE 0x08000000 //avoiding duplicated or unconditional ch. switch rsp.
\r
34 #define TDLS_APSD_CHSW_STATE 0x00100000 //in APSD and want to setup channel switch
\r
35 #define TDLS_PEER_SLEEP_STATE 0x00200000 //peer sta is sleeping //[TDLS] UAPSD: will not be used one day
\r
36 #define TDLS_SW_OFF_STATE 0x00400000 //terminate channel swithcing
\r
37 #define TDLS_ALIVE_STATE 0x00010000 //Check if peer sta is alived.
\r
38 #define TDLS_WAIT_PTR_STATE 0x00020000 //Waiting peer's TDLS_PEER_TRAFFIC_RESPONSE frame
\r
40 #define TPK_RESEND_COUNT 301
\r
41 #define CH_SWITCH_TIME 10
\r
42 #define CH_SWITCH_TIMEOUT 30
\r
43 #define TDLS_STAY_TIME 500
\r
44 #define TDLS_SIGNAL_THRESH 0x20
\r
45 #define TDLS_WATCHDOG_PERIOD 10 //Periodically sending tdls discovery request in TDLS_WATCHDOG_PERIOD * 2 sec
\r
46 #define TDLS_STAY_TIME 500
\r
47 #define TDLS_HANDSHAKE_TIME 3000
\r
48 #define TDLS_PTI_TIME 7000
\r
49 #define TDLS_ALIVE_COUNT 3
\r
50 #define TDLS_INI_MACID_ENTRY 6
\r
53 #define TDLS_MIC_LEN 16
\r
54 #define WPA_NONCE_LEN 32
\r
55 #define TDLS_TIMEOUT_LEN 4
\r
57 struct wpa_tdls_ftie {
\r
58 u8 ie_type; /* FTIE */
\r
61 u8 mic[TDLS_MIC_LEN];
\r
62 u8 Anonce[WPA_NONCE_LEN]; /* Responder Nonce in TDLS */
\r
63 u8 Snonce[WPA_NONCE_LEN]; /* Initiator Nonce in TDLS */
\r
64 /* followed by optional elements */
\r
67 struct wpa_tdls_lnkid {
\r
68 u8 ie_type; /* Link Identifier IE */
\r
71 u8 init_sta[ETH_ALEN];
\r
72 u8 resp_sta[ETH_ALEN];
\r
75 static u8 TDLS_RSNIE[]={ 0x01, 0x00, //version shall be set to 1
\r
76 0x00, 0x0f, 0xac, 0x07, //group sipher suite
\r
77 0x01, 0x00, //pairwise cipher suite count
\r
78 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only
\r
79 0x01, 0x00, //AKM suite count
\r
80 0x00, 0x0f, 0xac, 0x07, //TPK Handshake
\r
82 //PMKID shall not be present
\r
85 static u8 TDLS_WMMIE[]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; //Qos info all set zero
\r
87 static u8 TDLS_EXT_CAPIE[] = {0x00, 0x00, 0x00, 0x50, 0x20, 0x00, 0x00, 0x00}; //bit(28), bit(30), bit(37)
\r
89 // SRC: Supported Regulatory Classes
\r
90 static u8 TDLS_SRC[] = { 0x01, 0x01, 0x02, 0x03, 0x04, 0x0c, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21 };
\r
92 void rtw_reset_tdls_info(_adapter* padapter);
\r
93 int rtw_init_tdls_info(_adapter* padapter);
\r
94 void rtw_free_tdls_info(struct tdls_info *ptdlsinfo);
\r
95 int issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms);
\r
96 void rtw_init_tdls_timer(_adapter *padapter, struct sta_info *psta);
\r
97 void rtw_free_tdls_timer(struct sta_info *psta);
\r
98 void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta);
\r
100 int issue_tunneled_probe_req(_adapter *padapter);
\r
101 int issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame);
\r
102 #endif //CONFIG_WFD
\r
103 int issue_tdls_dis_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt);
\r
104 int issue_tdls_setup_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack);
\r
105 int issue_tdls_setup_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt);
\r
106 int issue_tdls_setup_cfm(_adapter *padapter, struct tdls_txmgmt *ptxmgmt);
\r
107 int issue_tdls_dis_rsp(_adapter * padapter, struct tdls_txmgmt *ptxmgmt, u8 privacy);
\r
108 int issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait_ack);
\r
109 int issue_tdls_peer_traffic_rsp(_adapter *padapter, struct sta_info *psta);
\r
110 int issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta);
\r
111 int issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr);
\r
112 int issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr);
\r
113 sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame);
\r
114 sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame);
\r
115 int On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame);
\r
116 int On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame);
\r
117 int On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame);
\r
118 int On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame);
\r
119 int On_TDLS_Peer_Traffic_Indication(_adapter *adapter, union recv_frame *precv_frame);
\r
120 int On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame);
\r
121 sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame);
\r
122 sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame);
\r
123 void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);
\r
124 void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);
\r
125 void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);
\r
126 void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);
\r
127 void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);
\r
128 void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog, u8 privacy);
\r
129 void rtw_build_tdls_peer_traffic_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);
\r
130 void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);
\r
131 void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);
\r
132 void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);
\r
133 void rtw_build_tunneled_probe_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);
\r
134 void rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);
\r
136 u8 update_sgi_tdls(_adapter *padapter, struct sta_info *psta);
\r
137 u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta);
\r
138 #endif //CONFIG_TDLS
\r