xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8821cs/include/rtw_ft.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2007 - 2017 Realtek Corporation.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun  * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun  * published by the Free Software Foundation.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun  * more details.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *****************************************************************************/
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #ifndef __RTW_FT_H_
17*4882a593Smuzhiyun #define __RTW_FT_H_
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun enum rtw_ieee80211_ft_actioncode {
20*4882a593Smuzhiyun 	RTW_WLAN_ACTION_FT_RESV,
21*4882a593Smuzhiyun 	RTW_WLAN_ACTION_FT_REQ,
22*4882a593Smuzhiyun 	RTW_WLAN_ACTION_FT_RSP,
23*4882a593Smuzhiyun 	RTW_WLAN_ACTION_FT_CONF,
24*4882a593Smuzhiyun 	RTW_WLAN_ACTION_FT_ACK,
25*4882a593Smuzhiyun 	RTW_WLAN_ACTION_FT_MAX,
26*4882a593Smuzhiyun };
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun enum _rtw_ft_sta_status {
29*4882a593Smuzhiyun 	RTW_FT_UNASSOCIATED_STA = 0,
30*4882a593Smuzhiyun 	RTW_FT_AUTHENTICATING_STA,
31*4882a593Smuzhiyun 	RTW_FT_AUTHENTICATED_STA,
32*4882a593Smuzhiyun 	RTW_FT_ASSOCIATING_STA,
33*4882a593Smuzhiyun 	RTW_FT_ASSOCIATED_STA,
34*4882a593Smuzhiyun 	RTW_FT_REQUESTING_STA,
35*4882a593Smuzhiyun 	RTW_FT_REQUESTED_STA,
36*4882a593Smuzhiyun 	RTW_FT_CONFIRMED_STA,
37*4882a593Smuzhiyun 	RTW_FT_UNSPECIFIED_STA
38*4882a593Smuzhiyun };
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #define RTW_FT_ACTION_REQ_LMT	4
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define RTW_FT_MAX_IE_SZ	256
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define rtw_ft_chk_status(a, s) \
45*4882a593Smuzhiyun 	((a)->mlmepriv.ft_roam.ft_status == (s))
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define rtw_ft_roam_status(a, s)	\
48*4882a593Smuzhiyun 	((rtw_to_roam(a) > 0) && rtw_ft_chk_status(a, s))
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #define rtw_ft_authed_sta(a)	\
51*4882a593Smuzhiyun 	((rtw_ft_chk_status(a, RTW_FT_AUTHENTICATED_STA)) ||	\
52*4882a593Smuzhiyun 	(rtw_ft_chk_status(a, RTW_FT_ASSOCIATING_STA)) ||	\
53*4882a593Smuzhiyun 	(rtw_ft_chk_status(a, RTW_FT_ASSOCIATED_STA)))
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define rtw_ft_set_status(a, s) \
56*4882a593Smuzhiyun 	do { \
57*4882a593Smuzhiyun 		((a)->mlmepriv.ft_roam.ft_status = (s)); \
58*4882a593Smuzhiyun 	} while (0)
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun #define rtw_ft_lock_set_status(a, s, irq) \
61*4882a593Smuzhiyun 	do { \
62*4882a593Smuzhiyun 		_enter_critical_bh(&(a)->mlmepriv.lock, ((_irqL *)(irq)));	\
63*4882a593Smuzhiyun 		((a)->mlmepriv.ft_roam.ft_status = (s));	\
64*4882a593Smuzhiyun 		_exit_critical_bh(&(a)->mlmepriv.lock, ((_irqL *)(irq)));	\
65*4882a593Smuzhiyun 	} while (0)
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #define rtw_ft_reset_status(a) \
68*4882a593Smuzhiyun 	do { \
69*4882a593Smuzhiyun 		((a)->mlmepriv.ft_roam.ft_status = RTW_FT_UNASSOCIATED_STA); \
70*4882a593Smuzhiyun 	} while (0)
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun enum rtw_ft_capability {
73*4882a593Smuzhiyun 	RTW_FT_EN = BIT0,
74*4882a593Smuzhiyun 	RTW_FT_OTD_EN = BIT1,
75*4882a593Smuzhiyun 	RTW_FT_PEER_EN = BIT2,
76*4882a593Smuzhiyun 	RTW_FT_PEER_OTD_EN = BIT3,
77*4882a593Smuzhiyun 	RTW_FT_BTM_ROAM = BIT4,
78*4882a593Smuzhiyun 	RTW_FT_TEST_RSSI_ROAM = BIT7,
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun #define rtw_ft_chk_flags(a, f) \
82*4882a593Smuzhiyun 	((a)->mlmepriv.ft_roam.ft_flags & (f))
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define rtw_ft_set_flags(a, f) \
85*4882a593Smuzhiyun 	do { \
86*4882a593Smuzhiyun 		((a)->mlmepriv.ft_roam.ft_flags |= (f)); \
87*4882a593Smuzhiyun 	} while (0)
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun #define rtw_ft_clr_flags(a, f) \
90*4882a593Smuzhiyun 	do { \
91*4882a593Smuzhiyun 		((a)->mlmepriv.ft_roam.ft_flags &= ~(f)); \
92*4882a593Smuzhiyun 	} while (0)
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun #define rtw_ft_roam(a)	\
95*4882a593Smuzhiyun 	((rtw_to_roam(a) > 0) && rtw_ft_chk_flags(a, RTW_FT_PEER_EN))
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun #define rtw_ft_valid_akm(a, t)	\
98*4882a593Smuzhiyun 	((rtw_ft_chk_flags(a, RTW_FT_EN)) && \
99*4882a593Smuzhiyun 	(((t) == 3) || ((t) == 4)))
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun #define rtw_ft_roam_expired(a, r)	\
102*4882a593Smuzhiyun 	((rtw_chk_roam_flags(a, RTW_ROAM_ON_EXPIRED)) \
103*4882a593Smuzhiyun 	&& (r == WLAN_REASON_ACTIVE_ROAM))
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun #define rtw_ft_otd_roam_en(a)	\
106*4882a593Smuzhiyun 	((rtw_ft_chk_flags(a, RTW_FT_OTD_EN))	\
107*4882a593Smuzhiyun 	&& ((a)->mlmepriv.ft_roam.ft_roam_on_expired == _FALSE)	\
108*4882a593Smuzhiyun 	&& ((a)->mlmepriv.ft_roam.ft_cap & 0x01))
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun #define rtw_ft_otd_roam(a) \
111*4882a593Smuzhiyun 	rtw_ft_chk_flags(a, RTW_FT_PEER_OTD_EN)
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun #define rtw_ft_valid_otd_candidate(a, p)	\
114*4882a593Smuzhiyun 	((rtw_ft_chk_flags(a, RTW_FT_OTD_EN)) 	\
115*4882a593Smuzhiyun 	&& ((rtw_ft_chk_flags(a, RTW_FT_PEER_OTD_EN)	\
116*4882a593Smuzhiyun 	&& ((*((p)+4) & 0x01) == 0))	\
117*4882a593Smuzhiyun 	|| ((rtw_ft_chk_flags(a, RTW_FT_PEER_OTD_EN) == 0)	\
118*4882a593Smuzhiyun 	&& (*((p)+4) & 0x01))))
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun struct ft_roam_info {
121*4882a593Smuzhiyun 	u16	mdid;
122*4882a593Smuzhiyun 	u8	ft_cap;
123*4882a593Smuzhiyun 	/*b0: FT over DS, b1: Resource Req Protocol Cap, b2~b7: Reserved*/
124*4882a593Smuzhiyun 	u8	updated_ft_ies[RTW_FT_MAX_IE_SZ];
125*4882a593Smuzhiyun 	u16	updated_ft_ies_len;
126*4882a593Smuzhiyun 	u8	ft_action[RTW_FT_MAX_IE_SZ];
127*4882a593Smuzhiyun 	u16	ft_action_len;
128*4882a593Smuzhiyun 	struct cfg80211_ft_event_params ft_event;
129*4882a593Smuzhiyun 	u8	ft_roam_on_expired;
130*4882a593Smuzhiyun 	u8	ft_flags;
131*4882a593Smuzhiyun 	u32 ft_status;
132*4882a593Smuzhiyun 	u32 ft_req_retry_cnt;
133*4882a593Smuzhiyun 	bool ft_updated_bcn;
134*4882a593Smuzhiyun };
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun void rtw_ft_info_init(struct ft_roam_info *pft);
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun int rtw_ft_proc_flags_get(struct seq_file *m, void *v);
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun ssize_t rtw_ft_proc_flags_set(struct file *file, const char __user *buffer,
141*4882a593Smuzhiyun 	size_t count, loff_t *pos, void *data);
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun u8 rtw_ft_chk_roaming_candidate(
144*4882a593Smuzhiyun 	_adapter *padapter, struct wlan_network *competitor);
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun void rtw_ft_update_stainfo(_adapter *padapter, WLAN_BSSID_EX *pnetwork);
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun void rtw_ft_reassoc_event_callback(_adapter *padapter, u8 *pbuf);
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun void rtw_ft_validate_akm_type(_adapter  *padapter,
151*4882a593Smuzhiyun 	struct wlan_network *pnetwork);
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun void rtw_ft_update_bcn(_adapter *padapter, union recv_frame *precv_frame);
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun void rtw_ft_start_clnt_join(_adapter *padapter);
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun u8 rtw_ft_update_rsnie(
158*4882a593Smuzhiyun 	_adapter *padapter, u8 bwrite,
159*4882a593Smuzhiyun 	struct pkt_attrib *pattrib, u8 **pframe);
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun void rtw_ft_build_auth_req_ies(_adapter *padapter,
162*4882a593Smuzhiyun 	struct pkt_attrib *pattrib, u8 **pframe);
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun void rtw_ft_build_assoc_req_ies(_adapter *padapter,
165*4882a593Smuzhiyun 	u8 is_reassoc, struct pkt_attrib *pattrib, u8 **pframe);
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun u8 rtw_ft_update_auth_rsp_ies(_adapter *padapter, u8 *pframe, u32 len);
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun void rtw_ft_start_roam(_adapter *padapter, u8 *pTargetAddr);
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun void rtw_ft_issue_action_req(_adapter *padapter, u8 *pTargetAddr);
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun void rtw_ft_report_evt(_adapter *padapter);
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun void rtw_ft_report_reassoc_evt(_adapter *padapter, u8 *pMacAddr);
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun void rtw_ft_link_timer_hdl(void *ctx);
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun void rtw_ft_roam_timer_hdl(void *ctx);
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun void rtw_ft_roam_status_reset(_adapter *padapter);
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun #endif /* __RTW_FT_H_ */
184