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