xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852bs/include/rtw_ft.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2017 Realtek Corporation.
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  *****************************************************************************/
15 
16 #ifndef __RTW_FT_H_
17 #define __RTW_FT_H_
18 
19 enum rtw_ieee80211_ft_actioncode {
20 	RTW_WLAN_ACTION_FT_RESV,
21 	RTW_WLAN_ACTION_FT_REQ,
22 	RTW_WLAN_ACTION_FT_RSP,
23 	RTW_WLAN_ACTION_FT_CONF,
24 	RTW_WLAN_ACTION_FT_ACK,
25 	RTW_WLAN_ACTION_FT_MAX,
26 };
27 
28 enum _rtw_ft_sta_status {
29 	RTW_FT_UNASSOCIATED_STA = 0,
30 	RTW_FT_AUTHENTICATING_STA,
31 	RTW_FT_AUTHENTICATED_STA,
32 	RTW_FT_ASSOCIATING_STA,
33 	RTW_FT_ASSOCIATED_STA,
34 	RTW_FT_REQUESTING_STA,
35 	RTW_FT_REQUESTED_STA,
36 	RTW_FT_CONFIRMED_STA,
37 	RTW_FT_UNSPECIFIED_STA
38 };
39 
40 #define RTW_FT_ACTION_REQ_LMT	4
41 
42 #define RTW_FT_MAX_IE_SZ	256
43 
44 #define rtw_ft_chk_status(a, s) \
45 	((a)->mlmepriv.ft_roam.ft_status == (s))
46 
47 #define rtw_ft_roam_status(a, s)	\
48 	((rtw_to_roam(a) > 0) && rtw_ft_chk_status(a, s))
49 
50 #define rtw_ft_authed_sta(a)	\
51 	((rtw_ft_chk_status(a, RTW_FT_AUTHENTICATED_STA)) ||	\
52 	(rtw_ft_chk_status(a, RTW_FT_ASSOCIATING_STA)) ||	\
53 	(rtw_ft_chk_status(a, RTW_FT_ASSOCIATED_STA)))
54 
55 #define rtw_ft_set_status(a, s) \
56 	do { \
57 		((a)->mlmepriv.ft_roam.ft_status = (s)); \
58 	} while (0)
59 
60 #define rtw_ft_lock_set_status(a, s) \
61 	do { \
62 		_rtw_spinlock_bh(&(a)->mlmepriv.lock);	\
63 		((a)->mlmepriv.ft_roam.ft_status = (s));	\
64 		_rtw_spinunlock_bh(&(a)->mlmepriv.lock);	\
65 	} while (0)
66 
67 #define rtw_ft_reset_status(a) \
68 	do { \
69 		((a)->mlmepriv.ft_roam.ft_status = RTW_FT_UNASSOCIATED_STA); \
70 	} while (0)
71 
72 enum rtw_ft_capability {
73 	RTW_FT_EN = BIT0,
74 	RTW_FT_OTD_EN = BIT1,
75 	RTW_FT_PEER_EN = BIT2,
76 	RTW_FT_PEER_OTD_EN = BIT3,
77 	RTW_FT_BTM_ROAM = BIT4,
78 	RTW_FT_TEST_RSSI_ROAM = BIT7,
79 };
80 
81 #define rtw_ft_chk_flags(a, f) \
82 	((a)->mlmepriv.ft_roam.ft_flags & (f))
83 
84 #define rtw_ft_set_flags(a, f) \
85 	do { \
86 		((a)->mlmepriv.ft_roam.ft_flags |= (f)); \
87 	} while (0)
88 
89 #define rtw_ft_clr_flags(a, f) \
90 	do { \
91 		((a)->mlmepriv.ft_roam.ft_flags &= ~(f)); \
92 	} while (0)
93 
94 #define rtw_ft_roam(a)	\
95 	((rtw_to_roam(a) > 0) && rtw_ft_chk_flags(a, RTW_FT_PEER_EN))
96 
97 #define rtw_ft_valid_akm(a, t)	\
98 	((rtw_ft_chk_flags(a, RTW_FT_EN)) && \
99 	(((t) == 3) || ((t) == 4)))
100 
101 #define rtw_ft_roam_expired(a, r)	\
102 	((rtw_chk_roam_flags(a, RTW_ROAM_ON_EXPIRED)) \
103 	&& (r == WLAN_REASON_ACTIVE_ROAM))
104 
105 /* allow OTD while driver disconnect with current AP */
106 #if 1
107 #define rtw_ft_otd_roam_en(a)	\
108 	((rtw_ft_chk_flags(a, RTW_FT_OTD_EN))	\
109 	&& ((a)->mlmepriv.ft_roam.ft_cap & 0x01))
110 #else
111 #define rtw_ft_otd_roam_en(a)	\
112 	((rtw_ft_chk_flags(a, RTW_FT_OTD_EN))	\
113 	&& ((a)->mlmepriv.ft_roam.ft_roam_on_expired == _FALSE)	\
114 	&& ((a)->mlmepriv.ft_roam.ft_cap & 0x01))
115 #endif
116 
117 #define rtw_ft_otd_roam(a) \
118 	rtw_ft_chk_flags(a, RTW_FT_PEER_OTD_EN)
119 
120 #define rtw_ft_valid_otd_candidate(a, p)	\
121 	((rtw_ft_chk_flags(a, RTW_FT_OTD_EN)) 	\
122 	&& ((rtw_ft_chk_flags(a, RTW_FT_PEER_OTD_EN)	\
123 	&& ((*((p)+4) & 0x01) == 0))	\
124 	|| ((rtw_ft_chk_flags(a, RTW_FT_PEER_OTD_EN) == 0)	\
125 	&& (*((p)+4) & 0x01))))
126 
127 struct ft_roam_info {
128 	u16	mdid;
129 	u8	ft_cap;
130 	/*b0: FT over DS, b1: Resource Req Protocol Cap, b2~b7: Reserved*/
131 	u8	updated_ft_ies[RTW_FT_MAX_IE_SZ];
132 	u16	updated_ft_ies_len;
133 	u8	ft_action[RTW_FT_MAX_IE_SZ];
134 	u16	ft_action_len;
135 	struct cfg80211_ft_event_params ft_event;
136 	u8	ft_roam_on_expired;
137 	u8	ft_flags;
138 	u32 ft_status;
139 	u32 ft_req_retry_cnt;
140 	bool ft_updated_bcn;
141 };
142 
143 struct rtw_sta_ft_info_t {
144 	u8 *rsn_ie;
145 	u32 rsn_len;
146 	u8 *md_ie;
147 	u32 md_len;
148 	u8 *ft_ie;
149 	u32 ft_len;
150 };
151 
152 void rtw_ft_info_init(struct ft_roam_info *pft);
153 
154 int rtw_ft_proc_flags_get(struct seq_file *m, void *v);
155 
156 ssize_t rtw_ft_proc_flags_set(struct file *file, const char __user *buffer,
157 	size_t count, loff_t *pos, void *data);
158 
159 u8 rtw_ft_chk_roaming_candidate(
160 	_adapter *padapter, struct wlan_network *competitor);
161 
162 void rtw_ft_update_stainfo(_adapter *padapter, WLAN_BSSID_EX *pnetwork);
163 
164 void rtw_ft_reassoc_event_callback(_adapter *padapter, u8 *pbuf);
165 
166 void rtw_ft_validate_akm_type(_adapter  *padapter,
167 	struct wlan_network *pnetwork);
168 
169 void rtw_ft_update_bcn(_adapter *padapter, union recv_frame *precv_frame);
170 
171 void rtw_ft_start_clnt_join(_adapter *padapter);
172 
173 u8 rtw_ft_update_rsnie(
174 	_adapter *padapter, u8 bwrite,
175 	struct pkt_attrib *pattrib, u8 **pframe);
176 
177 void rtw_ft_build_auth_req_ies(_adapter *padapter,
178 	struct pkt_attrib *pattrib, u8 **pframe);
179 
180 void rtw_ft_build_assoc_req_ies(_adapter *padapter,
181 	u8 is_reassoc, struct pkt_attrib *pattrib, u8 **pframe);
182 
183 u8 rtw_ft_update_auth_rsp_ies(_adapter *padapter, u8 *pframe, u32 len);
184 
185 void rtw_ft_start_roam(_adapter *padapter, u8 *pTargetAddr);
186 
187 void rtw_ft_issue_action_req(_adapter *padapter, u8 *pTargetAddr);
188 
189 void rtw_ft_report_evt(_adapter *padapter);
190 
191 void rtw_ft_report_reassoc_evt(_adapter *padapter, u8 *pMacAddr);
192 
193 void rtw_ft_link_timer_hdl(void *ctx);
194 
195 void rtw_ft_roam_timer_hdl(void *ctx);
196 
197 void rtw_ft_roam_status_reset(_adapter *padapter);
198 
199 void rtw_ft_peer_info_init(struct sta_info *psta);
200 
201 void rtw_ft_peer_info_free(struct sta_info *psta);
202 
203 int rtw_ft_update_sta_ies(_adapter *padapter,
204 	struct cfg80211_update_ft_ies_params *pie);
205 
206 void rtw_ft_update_assocresp_ies(struct net_device *net,
207 	struct cfg80211_ap_settings *settings);
208 
209 void rtw_ft_process_ft_auth_rsp(_adapter *padapter, u8 *pframe, u32 len);
210 
211 void rtw_ft_build_assoc_rsp_ies(_adapter *padapter,
212 	struct sta_info *psta, struct pkt_attrib *pattrib, u8 **pframe);
213 
214 #endif /* __RTW_FT_H_ */
215