xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_mlme.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 #ifndef __RTW_MLME_H_
16 #define __RTW_MLME_H_
17 
18 
19 #define	MAX_BSS_CNT	128
20 /* #define   MAX_JOIN_TIMEOUT	2000 */
21 /* #define   MAX_JOIN_TIMEOUT	2500 */
22 #define   MAX_JOIN_TIMEOUT	6500
23 
24 /*	Commented by Albert 20101105
25  *	Increase the scanning timeout because of increasing the SURVEY_TO value. */
26 
27 #define SCANNING_TIMEOUT 8000
28 
29 #ifdef CONFIG_SCAN_BACKOP
30 #define CONC_SCANNING_TIMEOUT_SINGLE_BAND 10000
31 #define CONC_SCANNING_TIMEOUT_DUAL_BAND 15000
32 #endif
33 
34 #ifdef PALTFORM_OS_WINCE
35 #define	SCANQUEUE_LIFETIME 12000000 /* unit:us */
36 #else
37 #define	SCANQUEUE_LIFETIME 20000 /* 20sec, unit:msec */
38 #endif
39 
40 #define WIFI_NULL_STATE					0x00000000
41 #define WIFI_ASOC_STATE					0x00000001 /* Linked */
42 #define WIFI_REASOC_STATE				0x00000002
43 #define WIFI_SLEEP_STATE				0x00000004
44 #define WIFI_STATION_STATE				0x00000008
45 #define WIFI_AP_STATE					0x00000010
46 #define WIFI_ADHOC_STATE				0x00000020
47 #define WIFI_ADHOC_MASTER_STATE			0x00000040
48 #define WIFI_UNDER_LINKING				0x00000080
49 #define WIFI_UNDER_WPS					0x00000100
50 #define WIFI_MESH_STATE					0x00000200
51 #define WIFI_STA_ALIVE_CHK_STATE		0x00000400
52 #define WIFI_SITE_MONITOR				0x00000800 /* under site surveying */
53 #define WIFI_WDS						0x00001000
54 #define WIFI_WDS_RX_BEACON				0x00002000 /* already rx WDS AP beacon */
55 #define WIFI_AUTOCONF					0x00004000
56 #define WIFI_AUTOCONF_IND				0x00008000
57 #define WIFI_MP_STATE					0x00010000
58 #define WIFI_MP_CTX_BACKGROUND			0x00020000 /* in continuous tx background */
59 #define WIFI_MP_CTX_ST					0x00040000 /* in continuous tx with single-tone */
60 #define WIFI_MP_CTX_BACKGROUND_PENDING	0x00080000 /* pending in continuous tx background due to out of skb */
61 #define WIFI_MP_CTX_CCK_HW				0x00100000 /* in continuous tx */
62 #define WIFI_MP_CTX_CCK_CS				0x00200000 /* in continuous tx with carrier suppression */
63 #define WIFI_MP_LPBK_STATE				0x00400000
64 #define WIFI_OP_CH_SWITCHING			0x00800000
65 /*#define WIFI_UNDEFINED_STATE			0x01000000*/
66 /*#define WIFI_UNDEFINED_STATE			0x02000000*/
67 /*#define WIFI_UNDEFINED_STATE			0x04000000*/
68 /*#define WIFI_UNDEFINED_STATE			0x08000000*/
69 /*#define WIFI_UNDEFINED_STATE			0x10000000*/
70 /*#define WIFI_UNDEFINED_STATE			0x20000000*/
71 /*#define WIFI_UNDEFINED_STATE			0x40000000*/
72 #define WIFI_MONITOR_STATE				0x80000000
73 
74 #define MIRACAST_DISABLED	0
75 #define MIRACAST_SOURCE		BIT0
76 #define MIRACAST_SINK		BIT1
77 
78 #define MIRACAST_MODE_REVERSE(mode) \
79 	((((mode) & MIRACAST_SOURCE) ? MIRACAST_SINK : 0) | (((mode) & MIRACAST_SINK) ? MIRACAST_SOURCE : 0))
80 
81 bool is_miracast_enabled(_adapter *adapter);
82 bool rtw_chk_miracast_mode(_adapter *adapter, u8 mode);
83 const char *get_miracast_mode_str(int mode);
84 void rtw_wfd_st_switch(struct sta_info *sta, bool on);
85 
86 #define MLME_STATE(adapter) get_fwstate(&((adapter)->mlmepriv))
87 
88 #define MLME_IS_STA(adapter) (MLME_STATE((adapter)) & WIFI_STATION_STATE)
89 #define MLME_IS_AP(adapter) (MLME_STATE((adapter)) & WIFI_AP_STATE)
90 #define MLME_IS_ADHOC(adapter) (MLME_STATE((adapter)) & WIFI_ADHOC_STATE)
91 #define MLME_IS_ADHOC_MASTER(adapter) (MLME_STATE((adapter)) & WIFI_ADHOC_MASTER_STATE)
92 #define MLME_IS_MESH(adapter) (MLME_STATE((adapter)) & WIFI_MESH_STATE)
93 #define MLME_IS_MONITOR(adapter) (MLME_STATE((adapter)) & WIFI_MONITOR_STATE)
94 #define MLME_IS_MP(adapter) (MLME_STATE((adapter)) & WIFI_MP_STATE)
95 #ifdef CONFIG_P2P
96 	#define MLME_IS_PD(adapter) rtw_p2p_chk_role(&(adapter)->wdinfo, P2P_ROLE_DEVICE)
97 	#define MLME_IS_GC(adapter) rtw_p2p_chk_role(&(adapter)->wdinfo, P2P_ROLE_CLIENT)
98 	#define MLME_IS_GO(adapter) rtw_p2p_chk_role(&(adapter)->wdinfo, P2P_ROLE_GO)
99 #else /* !CONFIG_P2P */
100 	#define MLME_IS_PD(adapter) 0
101 	#define MLME_IS_GC(adapter) 0
102 	#define MLME_IS_GO(adapter) 0
103 #endif /* !CONFIG_P2P */
104 
105 #if defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P)
106 #define MLME_IS_ROCH(adapter) (rtw_cfg80211_get_is_roch(adapter) == _TRUE)
107 #else
108 #define MLME_IS_ROCH(adapter) 0
109 #endif
110 
111 #define MLME_IS_MSRC(adapter) rtw_chk_miracast_mode((adapter), MIRACAST_SOURCE)
112 #define MLME_IS_MSINK(adapter) rtw_chk_miracast_mode((adapter), MIRACAST_SINK)
113 
114 #ifdef CONFIG_IOCTL_CFG80211
115 #define MLME_IS_MGMT_TX(adapter) rtw_cfg80211_get_is_mgmt_tx(adapter)
116 #else
117 #define MLME_IS_MGMT_TX(adapter) 0
118 #endif
119 
120 #define MLME_STATE_FMT "%s%s%s%s%s%s%s%s%s%s%s%s"
121 #define MLME_STATE_ARG(adapter) \
122 	MLME_IS_STA((adapter)) ? (MLME_IS_GC((adapter)) ? " GC" : " STA") : \
123 	MLME_IS_AP((adapter)) ? (MLME_IS_GO((adapter)) ? " GO" : " AP") : \
124 	MLME_IS_ADHOC((adapter)) ? " ADHOC" : \
125 	MLME_IS_ADHOC_MASTER((adapter)) ? " ADHOC_M" : \
126 	MLME_IS_MESH((adapter)) ? " MESH" : \
127 	MLME_IS_MONITOR((adapter)) ? " MONITOR" : \
128 	MLME_IS_MP((adapter)) ? " MP" : "", \
129 	MLME_IS_PD((adapter)) ? " PD" : "", \
130 	MLME_IS_MSRC((adapter)) ? " MSRC" : "", \
131 	MLME_IS_MSINK((adapter)) ? " MSINK" : "", \
132 	(MLME_STATE((adapter)) & WIFI_SITE_MONITOR) ? " SCAN" : "", \
133 	(MLME_STATE((adapter)) & WIFI_UNDER_LINKING) ? " LINKING" : "", \
134 	(MLME_STATE((adapter)) & WIFI_ASOC_STATE) ? " ASOC" : "", \
135 	(MLME_STATE((adapter)) & WIFI_OP_CH_SWITCHING) ? " OP_CH_SW" : "", \
136 	(MLME_STATE((adapter)) & WIFI_UNDER_WPS) ? " WPS" : "", \
137 	MLME_IS_ROCH((adapter)) ? " ROCH" : "", \
138 	MLME_IS_MGMT_TX((adapter)) ? " MGMT_TX" : "", \
139 	(MLME_STATE((adapter)) & WIFI_SLEEP_STATE) ? " SLEEP" : ""
140 
141 enum {
142 	MLME_ACTION_UNKNOWN,
143 	MLME_ACTION_NONE,
144 	MLME_SCAN_ENABLE, /* WIFI_SITE_MONITOR */
145 	MLME_SCAN_ENTER, /* WIFI_SITE_MONITOR && !SCAN_DISABLE && !SCAN_BACK_OP */
146 	MLME_SCAN_DONE, /*  WIFI_SITE_MONITOR && (SCAN_DISABLE || SCAN_BACK_OP) */
147 	MLME_SCAN_DISABLE, /* WIFI_SITE_MONITOR is going to be cleared */
148 	MLME_STA_CONNECTING,
149 	MLME_STA_CONNECTED,
150 	MLME_STA_DISCONNECTED,
151 	MLME_TDLS_LINKED,
152 	MLME_TDLS_NOLINK,
153 	MLME_AP_STARTED,
154 	MLME_AP_STOPPED,
155 	MLME_ADHOC_STARTED,
156 	MLME_ADHOC_STOPPED,
157 	MLME_MESH_STARTED,
158 	MLME_MESH_STOPPED,
159 };
160 
161 #define _FW_UNDER_LINKING	WIFI_UNDER_LINKING
162 #define _FW_LINKED			WIFI_ASOC_STATE
163 #define _FW_UNDER_SURVEY	WIFI_SITE_MONITOR
164 
165 
166 enum dot11AuthAlgrthmNum {
167 	dot11AuthAlgrthm_Open = 0,
168 	dot11AuthAlgrthm_Shared,
169 	dot11AuthAlgrthm_8021X,
170 	dot11AuthAlgrthm_Auto,
171 	dot11AuthAlgrthm_WAPI,
172 	dot11AuthAlgrthm_MaxNum
173 };
174 
175 /* Scan type including active and passive scan. */
176 typedef enum _RT_SCAN_TYPE {
177 	SCAN_PASSIVE,
178 	SCAN_ACTIVE,
179 	SCAN_MIX,
180 } RT_SCAN_TYPE, *PRT_SCAN_TYPE;
181 
182 #define WIFI_FREQUENCY_BAND_AUTO 0
183 #define WIFI_FREQUENCY_BAND_5GHZ 1
184 #define WIFI_FREQUENCY_BAND_2GHZ 2
185 
186 #define rtw_band_valid(band) ((band) <= WIFI_FREQUENCY_BAND_2GHZ)
187 
188 enum DriverInterface {
189 	DRIVER_WEXT =  1,
190 	DRIVER_CFG80211 = 2
191 };
192 
193 enum SCAN_RESULT_TYPE {
194 	SCAN_RESULT_P2P_ONLY = 0,		/*	Will return all the P2P devices. */
195 	SCAN_RESULT_ALL = 1,			/*	Will return all the scanned device, include AP. */
196 	SCAN_RESULT_WFD_TYPE = 2		/*	Will just return the correct WFD device. */
197 									/*	If this device is Miracast sink device, it will just return all the Miracast source devices. */
198 };
199 
200 /*
201 
202 there are several "locks" in mlme_priv,
203 since mlme_priv is a shared resource between many threads,
204 like ISR/Call-Back functions, the OID handlers, and even timer functions.
205 
206 
207 Each _queue has its own locks, already.
208 Other items are protected by mlme_priv.lock.
209 
210 To avoid possible dead lock, any thread trying to modifiying mlme_priv
211 SHALL not lock up more than one locks at a time!
212 
213 */
214 
215 
216 #define traffic_threshold	10
217 #define	traffic_scan_period	500
218 
219 typedef struct _RT_LINK_DETECT_T {
220 	u32				NumTxOkInPeriod;
221 	u32				NumRxOkInPeriod;
222 	u32				NumRxUnicastOkInPeriod;
223 	BOOLEAN			bBusyTraffic;
224 	BOOLEAN			bTxBusyTraffic;
225 	BOOLEAN			bRxBusyTraffic;
226 	BOOLEAN			bHigherBusyTraffic; /* For interrupt migration purpose. */
227 	BOOLEAN			bHigherBusyRxTraffic; /* We may disable Tx interrupt according as Rx traffic. */
228 	BOOLEAN			bHigherBusyTxTraffic; /* We may disable Tx interrupt according as Tx traffic. */
229 	/* u8 TrafficBusyState; */
230 	u8 TrafficTransitionCount;
231 	u32 LowPowerTransitionCount;
232 } RT_LINK_DETECT_T, *PRT_LINK_DETECT_T;
233 
234 struct profile_info {
235 	u8	ssidlen;
236 	u8	ssid[WLAN_SSID_MAXLEN];
237 	u8	peermac[ETH_ALEN];
238 };
239 
240 struct tx_invite_req_info {
241 	u8					token;
242 	u8					benable;
243 	u8					go_ssid[WLAN_SSID_MAXLEN];
244 	u8					ssidlen;
245 	u8					go_bssid[ETH_ALEN];
246 	u8					peer_macaddr[ETH_ALEN];
247 	u8					operating_ch;	/*	This information will be set by using the p2p_set op_ch=x */
248 	u8					peer_ch;		/*	The listen channel for peer P2P device */
249 
250 };
251 
252 struct tx_invite_resp_info {
253 	u8					token;	/*	Used to record the dialog token of p2p invitation request frame. */
254 };
255 
256 #ifdef CONFIG_WFD
257 
258 struct wifi_display_info {
259 	u16							wfd_enable;			/*	Eanble/Disable the WFD function. */
260 	u16							init_rtsp_ctrlport;	/* init value of rtsp_ctrlport when WFD enable */
261 	u16							rtsp_ctrlport;		/* TCP port number at which the this WFD device listens for RTSP messages, 0 when WFD disable */
262 	u16							tdls_rtsp_ctrlport;	/* rtsp_ctrlport used by tdls, will sync when rtsp_ctrlport is changed by user */
263 	u16							peer_rtsp_ctrlport;	/*	TCP port number at which the peer WFD device listens for RTSP messages */
264 													/*	This filed should be filled when receiving the gropu negotiation request */
265 
266 	u8							peer_session_avail;	/*	WFD session is available or not for the peer wfd device. */
267 													/*	This variable will be set when sending the provisioning discovery request to peer WFD device. */
268 													/*	And this variable will be reset when it is read by using the iwpriv p2p_get wfd_sa command. */
269 	u8							ip_address[4];
270 	u8							peer_ip_address[4];
271 	u8							wfd_pc;				/*	WFD preferred connection */
272 													/*	0 -> Prefer to use the P2P for WFD connection on peer side. */
273 													/*	1 -> Prefer to use the TDLS for WFD connection on peer side. */
274 
275 	u8							wfd_device_type;	/*	WFD Device Type */
276 													/*	0 -> WFD Source Device */
277 													/*	1 -> WFD Primary Sink Device */
278 	enum	SCAN_RESULT_TYPE	scan_result_type;	/*	Used when P2P is enable. This parameter will impact the scan result. */
279 	u8 op_wfd_mode;
280 	u8 stack_wfd_mode;
281 };
282 #endif /* CONFIG_WFD */
283 
284 struct tx_provdisc_req_info {
285 	u16					wps_config_method_request;	/*	Used when sending the provisioning request frame */
286 	u16					peer_channel_num[2];		/*	The channel number which the receiver stands. */
287 	NDIS_802_11_SSID	ssid;
288 	u8					peerDevAddr[ETH_ALEN];		/*	Peer device address */
289 	u8					peerIFAddr[ETH_ALEN];		/*	Peer interface address */
290 	u8					benable;					/*	This provision discovery request frame is trigger to send or not */
291 };
292 
293 struct rx_provdisc_req_info {	/* When peer device issue prov_disc_req first, we should store the following informations */
294 	u8					peerDevAddr[ETH_ALEN];		/*	Peer device address */
295 	u8					strconfig_method_desc_of_prov_disc_req[4];	/*	description for the config method located in the provisioning discovery request frame.	 */
296 																	/*	The UI must know this information to know which config method the remote p2p device is requiring. */
297 };
298 
299 struct tx_nego_req_info {
300 	u16					peer_channel_num[2];		/*	The channel number which the receiver stands. */
301 	u8					peerDevAddr[ETH_ALEN];		/*	Peer device address */
302 	u8					benable;					/*	This negoitation request frame is trigger to send or not */
303 	u8					peer_ch;					/*	The listen channel for peer P2P device */
304 };
305 
306 struct group_id_info {
307 	u8					go_device_addr[ETH_ALEN];	/*	The GO's device address of this P2P group */
308 	u8					ssid[WLAN_SSID_MAXLEN];		/*	The SSID of this P2P group */
309 };
310 
311 struct scan_limit_info {
312 	u8					scan_op_ch_only;			/*	When this flag is set, the driver should just scan the operation channel */
313 #ifndef CONFIG_P2P_OP_CHK_SOCIAL_CH
314 	u8					operation_ch[2];				/*	Store the operation channel of invitation request frame */
315 #else
316 	u8					operation_ch[5];				/*	Store additional channel 1,6,11  for Android 4.2 IOT & Nexus 4 */
317 #endif /* CONFIG_P2P_OP_CHK_SOCIAL_CH */
318 };
319 
320 #ifdef CONFIG_IOCTL_CFG80211
321 struct cfg80211_wifidirect_info {
322 	_timer					remain_on_ch_timer;
323 	u8						restore_channel;
324 	struct ieee80211_channel	remain_on_ch_channel;
325 	enum nl80211_channel_type	remain_on_ch_type;
326 	ATOMIC_T ro_ch_cookie_gen;
327 	u64 remain_on_ch_cookie;
328 	bool is_ro_ch;
329 	struct wireless_dev *ro_ch_wdev;
330 	systime last_ro_ch_time; /* this will be updated at the beginning and end of ro_ch */
331 };
332 #endif /* CONFIG_IOCTL_CFG80211 */
333 
334 #ifdef CONFIG_P2P_WOWLAN
335 
336 enum P2P_WOWLAN_RECV_FRAME_TYPE {
337 	P2P_WOWLAN_RECV_NEGO_REQ = 0,
338 	P2P_WOWLAN_RECV_INVITE_REQ = 1,
339 	P2P_WOWLAN_RECV_PROVISION_REQ = 2,
340 };
341 
342 struct p2p_wowlan_info {
343 
344 	u8						is_trigger;
345 	enum P2P_WOWLAN_RECV_FRAME_TYPE	wowlan_recv_frame_type;
346 	u8						wowlan_peer_addr[ETH_ALEN];
347 	u16						wowlan_peer_wpsconfig;
348 	u8						wowlan_peer_is_persistent;
349 	u8						wowlan_peer_invitation_type;
350 };
351 
352 #endif /* CONFIG_P2P_WOWLAN */
353 
354 struct wifidirect_info {
355 	_adapter				*padapter;
356 	_timer					find_phase_timer;
357 	_timer					restore_p2p_state_timer;
358 
359 	/*	Used to do the scanning. After confirming the peer is availalble, the driver transmits the P2P frame to peer. */
360 	_timer					pre_tx_scan_timer;
361 	_timer					reset_ch_sitesurvey;
362 	_timer					reset_ch_sitesurvey2;	/*	Just for resetting the scan limit function by using p2p nego */
363 #ifdef CONFIG_CONCURRENT_MODE
364 	/*	Used to switch the channel between legacy AP and listen state. */
365 	_timer					ap_p2p_switch_timer;
366 #endif
367 	struct tx_provdisc_req_info	tx_prov_disc_info;
368 	struct rx_provdisc_req_info rx_prov_disc_info;
369 	struct tx_invite_req_info	invitereq_info;
370 	struct profile_info			profileinfo[P2P_MAX_PERSISTENT_GROUP_NUM];	/*	Store the profile information of persistent group */
371 	struct tx_invite_resp_info	inviteresp_info;
372 	struct tx_nego_req_info	nego_req_info;
373 	struct group_id_info		groupid_info;	/*	Store the group id information when doing the group negotiation handshake. */
374 	struct scan_limit_info		rx_invitereq_info;	/*	Used for get the limit scan channel from the Invitation procedure */
375 	struct scan_limit_info		p2p_info;		/*	Used for get the limit scan channel from the P2P negotiation handshake */
376 #ifdef CONFIG_WFD
377 	struct wifi_display_info		*wfd_info;
378 #endif
379 
380 #ifdef CONFIG_P2P_WOWLAN
381 	struct p2p_wowlan_info		p2p_wow_info;
382 #endif /* CONFIG_P2P_WOWLAN */
383 
384 	enum P2P_ROLE			role;
385 	enum P2P_STATE			pre_p2p_state;
386 	enum P2P_STATE			p2p_state;
387 	u8						device_addr[ETH_ALEN];	/*	The device address should be the mac address of this device. */
388 	u8						interface_addr[ETH_ALEN];
389 	u8						social_chan[4];
390 	u8						listen_channel;
391 	u8						operating_channel;
392 	u8						listen_dwell;		/*	This value should be between 1 and 3 */
393 	u8						support_rate[8];
394 	u8						p2p_wildcard_ssid[P2P_WILDCARD_SSID_LEN];
395 	u8						intent;		/*	should only include the intent value. */
396 	u8						p2p_peer_interface_addr[ETH_ALEN];
397 	u8						p2p_peer_device_addr[ETH_ALEN];
398 	u8						peer_intent;	/*	Included the intent value and tie breaker value. */
399 	u8						device_name[WPS_MAX_DEVICE_NAME_LEN];	/*	Device name for displaying on searching device screen */
400 	u16						device_name_len;
401 	u8						profileindex;	/*	Used to point to the index of profileinfo array */
402 	u8						peer_operating_ch;
403 	u8						find_phase_state_exchange_cnt;
404 	u16						device_password_id_for_nego;	/*	The device password ID for group negotation */
405 	u8						negotiation_dialog_token;
406 	u8						nego_ssid[WLAN_SSID_MAXLEN];	/*	SSID information for group negotitation */
407 	u8						nego_ssidlen;
408 	u8						p2p_group_ssid[WLAN_SSID_MAXLEN];
409 	u8						p2p_group_ssid_len;
410 	u8						persistent_supported;		/*	Flag to know the persistent function should be supported or not. */
411 														/*	In the Sigma test, the Sigma will provide this enable from the sta_set_p2p CAPI. */
412 														/*	0: disable */
413 														/*	1: enable */
414 	u8						session_available;			/*	Flag to set the WFD session available to enable or disable "by Sigma" */
415 														/*	In the Sigma test, the Sigma will disable the session available by using the sta_preset CAPI. */
416 														/*	0: disable */
417 														/*	1: enable */
418 
419 	u8						wfd_tdls_enable;			/*	Flag to enable or disable the TDLS by WFD Sigma */
420 														/*	0: disable */
421 														/*	1: enable */
422 	u8						wfd_tdls_weaksec;			/*	Flag to enable or disable the weak security function for TDLS by WFD Sigma */
423 														/*	0: disable */
424 														/*	In this case, the driver can't issue the tdsl setup request frame. */
425 														/*	1: enable */
426 														/*	In this case, the driver can issue the tdls setup request frame */
427 														/*	even the current security is weak security. */
428 
429 	enum	P2P_WPSINFO		ui_got_wps_info;			/*	This field will store the WPS value (PIN value or PBC) that UI had got from the user. */
430 	u16						supported_wps_cm;			/*	This field describes the WPS config method which this driver supported. */
431 														/*	The value should be the combination of config method defined in page104 of WPS v2.0 spec.	 */
432 	u8						external_uuid;				/* UUID flag */
433 	u8						uuid[16];					/* UUID */
434 	uint						channel_list_attr_len;	/*	This field will contain the length of body of P2P Channel List attribute of group negotitation response frame. */
435 	u8						channel_list_attr[100];		/*	This field will contain the body of P2P Channel List attribute of group negotitation response frame. */
436 														/*	We will use the channel_cnt and channel_list fields when constructing the group negotitation confirm frame. */
437 	u8						driver_interface;			/*	Indicate DRIVER_WEXT or DRIVER_CFG80211 */
438 
439 #ifdef CONFIG_CONCURRENT_MODE
440 	u16						ext_listen_interval;	/*	The interval to be available with legacy AP (ms) */
441 	u16						ext_listen_period;	/*	The time period to be available for P2P listen state (ms) */
442 #endif
443 #ifdef CONFIG_P2P_PS
444 	enum P2P_PS_MODE		p2p_ps_mode; /* indicate p2p ps mode */
445 	enum P2P_PS_STATE		p2p_ps_state; /* indicate p2p ps state */
446 	u8						noa_index; /* Identifies and instance of Notice of Absence timing. */
447 	u8						ctwindow; /* Client traffic window. A period of time in TU after TBTT. */
448 	u8						opp_ps; /* opportunistic power save. */
449 	u8						noa_num; /* number of NoA descriptor in P2P IE. */
450 	u8						noa_count[P2P_MAX_NOA_NUM]; /* Count for owner, Type of client. */
451 	u32						noa_duration[P2P_MAX_NOA_NUM]; /* Max duration for owner, preferred or min acceptable duration for client. */
452 	u32						noa_interval[P2P_MAX_NOA_NUM]; /* Length of interval for owner, preferred or max acceptable interval of client. */
453 	u32						noa_start_time[P2P_MAX_NOA_NUM]; /* schedule expressed in terms of the lower 4 bytes of the TSF timer. */
454 #endif /* CONFIG_P2P_PS */
455 };
456 
457 struct tdls_ss_record {	/* signal strength record */
458 	u8		macaddr[ETH_ALEN];
459 	u8		RxPWDBAll;
460 	u8		is_tdls_sta;	/* _TRUE: direct link sta, _FALSE: else */
461 };
462 
463 struct tdls_temp_mgmt {
464 	u8	initiator;	/* 0: None, 1: we initiate, 2: peer initiate */
465 	u8	peer_addr[ETH_ALEN];
466 };
467 
468 #ifdef CONFIG_TDLS_CH_SW
469 struct tdls_ch_switch {
470 	u32	ch_sw_state;
471 	ATOMIC_T	chsw_on;
472 	u8	addr[ETH_ALEN];
473 	u8	off_ch_num;
474 	u8	ch_offset;
475 	u32	cur_time;
476 	u8	delay_switch_back;
477 	u8	dump_stack;
478 	struct submit_ctx	chsw_sctx;
479 };
480 #endif
481 
482 struct tdls_info {
483 	u8					ap_prohibited;
484 	u8					ch_switch_prohibited;
485 	u8					link_established;
486 	u8					sta_cnt;
487 	u8					sta_maximum;	/* 1:tdls sta is equal (NUM_STA-1), reach max direct link number; 0: else; */
488 	struct tdls_ss_record	ss_record;
489 #ifdef CONFIG_TDLS_CH_SW
490 	struct tdls_ch_switch	chsw_info;
491 #endif
492 
493 	u8					ch_sensing;
494 	u8					cur_channel;
495 	u8					collect_pkt_num[MAX_CHANNEL_NUM];
496 	_lock				cmd_lock;
497 	_lock				hdl_lock;
498 	u8					watchdog_count;
499 	u8					dev_discovered;		/* WFD_TDLS: for sigma test */
500 
501 	/* Let wpa_supplicant to setup*/
502 	u8					driver_setup;
503 #ifdef CONFIG_WFD
504 	struct wifi_display_info		*wfd_info;
505 #endif
506 
507 	struct submit_ctx	*tdls_sctx;
508 };
509 
510 struct tdls_txmgmt {
511 	u8 peer[ETH_ALEN];
512 	u8 action_code;
513 	u8 dialog_token;
514 	u16 status_code;
515 	u8 *buf;
516 	size_t len;
517 };
518 
519 /* used for mlme_priv.roam_flags */
520 enum {
521 	RTW_ROAM_ON_EXPIRED = BIT0,
522 	RTW_ROAM_ON_RESUME = BIT1,
523 	RTW_ROAM_ACTIVE = BIT2,
524 };
525 
526 struct beacon_keys {
527 	u8 ssid[IW_ESSID_MAX_SIZE];
528 	u32 ssid_len;
529 	u8 bcn_channel;
530 	u16 ht_cap_info;
531 	u8 ht_info_infos_0_sco; /* bit0 & bit1 in infos[0] is second channel offset */
532 	int encryp_protocol;
533 	int pairwise_cipher;
534 	int group_cipher;
535 	int is_8021x;
536 };
537 #ifdef CONFIG_RTW_80211R
538 #define FT_ACTION_REQ_LIMIT	4
539 
540 typedef enum _RTW_WIFI_FT_STA_STATUS {
541 	RTW_FT_UNASSOCIATED_STA = 0,
542 	RTW_FT_AUTHENTICATING_STA,
543 	RTW_FT_AUTHENTICATED_STA,
544 	RTW_FT_ASSOCIATING_STA,
545 	RTW_FT_ASSOCIATED_STA,
546 	RTW_FT_REQUESTING_STA,
547 	RTW_FT_REQUESTED_STA,
548 	RTW_FT_CONFIRMED_STA,
549 	RTW_FT_UNSPECIFIED_STA
550 } RTW_WIFI_FT_STA_STATUS;
551 
552 #define rtw_chk_ft_status(adapter, status) ((adapter)->mlmepriv.ftpriv.ft_status == status)
553 #define rtw_set_ft_status(adapter, status) \
554 	do { \
555 		((adapter)->mlmepriv.ftpriv.ft_status = status); \
556 	} while (0)
557 
558 #define rtw_reset_ft_status(adapter) \
559 	do { \
560 		((adapter)->mlmepriv.ftpriv.ft_status = RTW_FT_UNASSOCIATED_STA); \
561 	} while (0)
562 
563 typedef enum _RTW_WIFI_FT_CAPABILITY {
564 	RTW_FT_STA_SUPPORTED = BIT0,
565 	RTW_FT_STA_OVER_DS_SUPPORTED = BIT1,
566 	RTW_FT_SUPPORTED = BIT2,
567 	RTW_FT_OVER_DS_SUPPORTED = BIT3,
568 } RTW_WIFI_FT_CAPABILITY;
569 
570 #define rtw_chk_ft_flags(adapter, flags) ((adapter)->mlmepriv.ftpriv.ft_flags & (flags))
571 #define rtw_set_ft_flags(adapter, flags) \
572 	do { \
573 		((adapter)->mlmepriv.ftpriv.ft_flags |= (flags)); \
574 	} while (0)
575 
576 #define rtw_clr_ft_flags(adapter, flags) \
577 	do { \
578 		((adapter)->mlmepriv.ftpriv.ft_flags &= ~(flags)); \
579 	} while (0)
580 
581 #define RTW_MAX_FTIE_SZ	256
582 typedef struct _ft_priv {
583 	u16	mdid;
584 	u8	ft_cap;	/*b0: FT over DS, b1: Resource Req Protocol Cap, b2~b7: Reserved*/
585 	u8	updated_ft_ies[RTW_MAX_FTIE_SZ];
586 	u16	updated_ft_ies_len;
587 	u8	ft_action[RTW_MAX_FTIE_SZ];
588 	u16	ft_action_len;
589 	struct cfg80211_ft_event_params ft_event;
590 	u8	ft_roam_on_expired;
591 	u8	ft_flags;
592 	u32 ft_status;
593 	u32 ft_req_retry_cnt;
594 } ft_priv;
595 #endif
596 
597 struct mlme_priv {
598 
599 	_lock	lock;
600 	sint	fw_state;	/* shall we protect this variable? maybe not necessarily... */
601 	u8	to_join; /* flag */
602 #ifdef CONFIG_LAYER2_ROAMING
603 	u8 to_roam; /* roaming trying times */
604 	struct wlan_network *roam_network; /* the target of active roam */
605 	u8 roam_flags;
606 	u8 roam_rssi_diff_th; /* rssi difference threshold for active scan candidate selection */
607 	u32 roam_scan_int_ms; /* scan interval for active roam */
608 	u32 roam_scanr_exp_ms; /* scan result expire time in ms  for roam */
609 	u8 roam_tgt_addr[ETH_ALEN]; /* request to roam to speicific target without other consideration */
610 	u8 roam_rssi_threshold;
611 	bool need_to_roam;
612 #endif
613 
614 	u8	*nic_hdl;
615 
616 	_list		*pscanned;
617 	_queue	free_bss_pool;
618 	_queue	scanned_queue;
619 	u8		*free_bss_buf;
620 	u32	num_of_scanned;
621 
622 	NDIS_802_11_SSID	assoc_ssid;
623 	u8	assoc_bssid[6];
624 
625 	struct wlan_network	cur_network;
626 	struct wlan_network *cur_network_scanned;
627 
628 	/* bcn check info */
629 	struct beacon_keys cur_beacon_keys; /* save current beacon keys */
630 	struct beacon_keys new_beacon_keys; /* save new beacon keys */
631 	u8 new_beacon_cnts; /* if new_beacon_cnts >= threshold, ap beacon is changed */
632 
633 #ifdef CONFIG_ARP_KEEP_ALIVE
634 	/* for arp offload keep alive */
635 	u8 bGetGateway;
636 	u8	GetGatewayTryCnt;
637 	u8	gw_mac_addr[6];
638 	u8	gw_ip[4];
639 #endif
640 
641 	/* uint wireless_mode; no used, remove it */
642 
643 	u32	auto_scan_int_ms;
644 
645 	_timer assoc_timer;
646 
647 	uint assoc_by_bssid;
648 	uint assoc_by_rssi;
649 
650 	_timer scan_to_timer; /* driver itself handles scan_timeout status. */
651 	systime scan_start_time; /* used to evaluate the time spent in scanning */
652 
653 #ifdef CONFIG_SET_SCAN_DENY_TIMER
654 	_timer set_scan_deny_timer;
655 	ATOMIC_T set_scan_deny; /* 0: allowed, 1: deny */
656 #endif
657 
658 	struct qos_priv qospriv;
659 
660 #ifdef CONFIG_80211N_HT
661 
662 	/* Number of non-HT AP/stations */
663 	int num_sta_no_ht;
664 
665 	/* Number of HT AP/stations 20 MHz */
666 	/* int num_sta_ht_20mhz; */
667 
668 
669 	int num_FortyMHzIntolerant;
670 
671 	struct ht_priv	htpriv;
672 
673 #endif
674 
675 #ifdef CONFIG_80211AC_VHT
676 	struct vht_priv	vhtpriv;
677 #endif
678 #ifdef CONFIG_BEAMFORMING
679 #ifndef RTW_BEAMFORMING_VERSION_2
680 #if (BEAMFORMING_SUPPORT == 0)/*for driver beamforming*/
681 	struct beamforming_info	beamforming_info;
682 #endif
683 #endif /* !RTW_BEAMFORMING_VERSION_2 */
684 #endif
685 
686 #ifdef CONFIG_DFS
687 	u8	handle_dfs;
688 #endif
689 #ifdef CONFIG_DFS_MASTER
690 	/* TODO: move to rfctl */
691 	_timer dfs_master_timer;
692 #endif
693 #ifdef CONFIG_RTW_80211R
694 	ft_priv ftpriv;
695 #endif
696 
697 	RT_LINK_DETECT_T	LinkDetectInfo;
698 
699 	u8	acm_mask; /* for wmm acm mask */
700 	RT_SCAN_TYPE	scan_mode; /* active: 1, passive: 0 */
701 
702 	u8 *wps_probe_req_ie;
703 	u32 wps_probe_req_ie_len;
704 
705 	u8 ext_capab_ie_data[8];/*currently for ap mode only*/
706 	u8 ext_capab_ie_len;
707 
708 #if defined(CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
709 	/* Number of associated Non-ERP stations (i.e., stations using 802.11b
710 	 * in 802.11g BSS) */
711 	int num_sta_non_erp;
712 
713 	/* Number of associated stations that do not support Short Slot Time */
714 	int num_sta_no_short_slot_time;
715 
716 	/* Number of associated stations that do not support Short Preamble */
717 	int num_sta_no_short_preamble;
718 
719 	ATOMIC_T olbc; /* Overlapping Legacy BSS Condition (Legacy b/g)*/
720 
721 	/* Number of HT associated stations that do not support greenfield */
722 	int num_sta_ht_no_gf;
723 
724 	/* Number of associated non-HT stations */
725 	/* int num_sta_no_ht; */
726 
727 	/* Number of HT associated stations 20 MHz */
728 	int num_sta_ht_20mhz;
729 
730 	/* number of associated stations 40MHz intolerant */
731 	int num_sta_40mhz_intolerant;
732 
733 	/* Overlapping BSS information */
734 	ATOMIC_T olbc_ht;
735 
736 #ifdef CONFIG_80211N_HT
737 	int ht_20mhz_width_req;
738 	int ht_intolerant_ch_reported;
739 	u16 ht_op_mode;
740 	u8 sw_to_20mhz; /*switch to 20Mhz BW*/
741 #endif /* CONFIG_80211N_HT */
742 
743 #ifdef CONFIG_RTW_80211R
744 	u8 *auth_rsp;
745 	u32 auth_rsp_len;
746 #endif
747 	u8 *assoc_req;
748 	u32 assoc_req_len;
749 
750 	u8 *assoc_rsp;
751 	u32 assoc_rsp_len;
752 
753 	/* u8 *wps_probe_req_ie; */
754 	/* u32 wps_probe_req_ie_len; */
755 
756 	u8 *wps_beacon_ie;
757 	u32 wps_beacon_ie_len;
758 
759 	u8 *wps_probe_resp_ie;
760 	u32 wps_probe_resp_ie_len;
761 
762 	u8 *wps_assoc_resp_ie;
763 	u32 wps_assoc_resp_ie_len;
764 
765 	u8 *p2p_beacon_ie;
766 	u32 p2p_beacon_ie_len;
767 
768 	u8 *p2p_probe_req_ie;
769 	u32 p2p_probe_req_ie_len;
770 
771 	u8 *p2p_probe_resp_ie;
772 	u32 p2p_probe_resp_ie_len;
773 
774 	u8 *p2p_go_probe_resp_ie;		/* for GO */
775 	u32 p2p_go_probe_resp_ie_len;	/* for GO */
776 
777 	u8 *p2p_assoc_req_ie;
778 	u32 p2p_assoc_req_ie_len;
779 
780 	u8 *p2p_assoc_resp_ie;
781 	u32 p2p_assoc_resp_ie_len;
782 
783 	_lock	bcn_update_lock;
784 	u8		update_bcn;
785 
786 	u8 ori_ch;
787 	u8 ori_bw;
788 	u8 ori_offset;
789 #endif /* #if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) */
790 
791 #if defined(CONFIG_WFD) && defined(CONFIG_IOCTL_CFG80211)
792 	u8 *wfd_beacon_ie;
793 	u32 wfd_beacon_ie_len;
794 
795 	u8 *wfd_probe_req_ie;
796 	u32 wfd_probe_req_ie_len;
797 
798 	u8 *wfd_probe_resp_ie;
799 	u32 wfd_probe_resp_ie_len;
800 
801 	u8 *wfd_go_probe_resp_ie;		/* for GO */
802 	u32 wfd_go_probe_resp_ie_len;	/* for GO */
803 
804 	u8 *wfd_assoc_req_ie;
805 	u32 wfd_assoc_req_ie_len;
806 
807 	u8 *wfd_assoc_resp_ie;
808 	u32 wfd_assoc_resp_ie_len;
809 #endif
810 
811 #ifdef RTK_DMP_PLATFORM
812 	/* DMP kobject_hotplug function  signal need in passive level */
813 	_workitem	Linkup_workitem;
814 	_workitem	Linkdown_workitem;
815 #endif
816 
817 #ifdef CONFIG_INTEL_WIDI
818 	int	widi_state;
819 	int	listen_state;
820 	_timer	listen_timer;
821 	ATOMIC_T	rx_probe_rsp; /* 1:receive probe respone from RDS source. */
822 	u8	*l2sdTaBuffer;
823 	u8	channel_idx;
824 	u8	group_cnt;	/* In WiDi 3.5, they specified another scan algo. for WFD/RDS co-existed */
825 	u8	sa_ext[L2SDTA_SERVICE_VE_LEN];
826 
827 	u8	widi_enable;
828 	/**
829 	 * For WiDi 4; upper layer would set
830 	 * p2p_primary_device_type_category_id
831 	 * p2p_primary_device_type_sub_category_id
832 	 * p2p_secondary_device_type_category_id
833 	 * p2p_secondary_device_type_sub_category_id
834 	 */
835 	u16	p2p_pdt_cid;
836 	u16	p2p_pdt_scid;
837 	u8	num_p2p_sdt;
838 	u16	p2p_sdt_cid[MAX_NUM_P2P_SDT];
839 	u16	p2p_sdt_scid[MAX_NUM_P2P_SDT];
840 	u8	p2p_reject_disable;	/* When starting NL80211 wpa_supplicant/hostapd, it will call netdev_close */
841 							/* such that it will cause p2p disabled. Use this flag to reject. */
842 #endif /* CONFIG_INTEL_WIDI */
843 	systime lastscantime;
844 #ifdef CONFIG_CONCURRENT_MODE
845 	u8	scanning_via_buddy_intf;
846 #endif
847 
848 #if 0
849 	u8	NumOfBcnInfoChkFail;
850 	u32	timeBcnInfoChkStart;
851 #endif
852 
853 #ifdef CONFIG_APPEND_VENDOR_IE_ENABLE
854 	u32 vendor_ie_mask[WLAN_MAX_VENDOR_IE_NUM];
855 	u8 vendor_ie[WLAN_MAX_VENDOR_IE_NUM][WLAN_MAX_VENDOR_IE_LEN];
856 	u32 vendor_ielen[WLAN_MAX_VENDOR_IE_NUM];
857 #endif
858 };
859 
860 #define mlme_set_scan_to_timer(mlme, ms) \
861 	do { \
862 		/* RTW_INFO("%s set_scan_to_timer(%p, %d)\n", __FUNCTION__, (mlme), (ms)); */ \
863 		_set_timer(&(mlme)->scan_to_timer, (ms)); \
864 	} while (0)
865 
866 #define rtw_mlme_set_auto_scan_int(adapter, ms) \
867 	do { \
868 		adapter->mlmepriv.auto_scan_int_ms = ms; \
869 	} while (0)
870 
871 #define RTW_AUTO_SCAN_REASON_UNSPECIFIED	0
872 #define RTW_AUTO_SCAN_REASON_2040_BSS		BIT0
873 #define RTW_AUTO_SCAN_REASON_ACS			BIT1
874 #define RTW_AUTO_SCAN_REASON_ROAM			BIT2
875 
876 void rtw_mlme_reset_auto_scan_int(_adapter *adapter, u8 *reason);
877 
878 #ifdef CONFIG_AP_MODE
879 
880 struct hostapd_priv {
881 	_adapter *padapter;
882 
883 #ifdef CONFIG_HOSTAPD_MLME
884 	struct net_device *pmgnt_netdev;
885 	struct usb_anchor anchored;
886 #endif
887 
888 };
889 
890 extern int hostapd_mode_init(_adapter *padapter);
891 extern void hostapd_mode_unload(_adapter *padapter);
892 #endif
893 
894 
895 extern void rtw_joinbss_event_prehandle(_adapter *adapter, u8 *pbuf);
896 extern void rtw_survey_event_callback(_adapter *adapter, u8 *pbuf);
897 extern void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf);
898 extern void rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf);
899 extern void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf);
900 extern void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf);
901 void rtw_sta_mstatus_report(_adapter *adapter);
902 extern void rtw_atimdone_event_callback(_adapter *adapter, u8 *pbuf);
903 extern void rtw_cpwm_event_callback(_adapter *adapter, u8 *pbuf);
904 extern void rtw_wmm_event_callback(PADAPTER padapter, u8 *pbuf);
905 #ifdef CONFIG_IEEE80211W
906 void rtw_sta_timeout_event_callback(_adapter *adapter, u8 *pbuf);
907 #endif /* CONFIG_IEEE80211W */
908 #ifdef CONFIG_RTW_80211R
909 void rtw_update_ft_stainfo(_adapter *padapter, WLAN_BSSID_EX *pnetwork);
910 void rtw_ft_reassoc_event_callback(_adapter *padapter, u8 *pbuf);
911 #endif
912 
913 thread_return event_thread(thread_context context);
914 
915 extern void rtw_free_network_queue(_adapter *adapter, u8 isfreeall);
916 extern int rtw_init_mlme_priv(_adapter *adapter);/* (struct mlme_priv *pmlmepriv); */
917 
918 extern void rtw_free_mlme_priv(struct mlme_priv *pmlmepriv);
919 
920 
921 extern sint rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv);
922 extern sint rtw_set_key(_adapter *adapter, struct security_priv *psecuritypriv, sint keyid, u8 set_tx, bool enqueue);
923 extern sint rtw_set_auth(_adapter *adapter, struct security_priv *psecuritypriv);
924 
get_bssid(struct mlme_priv * pmlmepriv)925 __inline static u8 *get_bssid(struct mlme_priv *pmlmepriv)
926 {
927 	/* if sta_mode:pmlmepriv->cur_network.network.MacAddress=> bssid */
928 	/* if adhoc_mode:pmlmepriv->cur_network.network.MacAddress=> ibss mac address */
929 	return pmlmepriv->cur_network.network.MacAddress;
930 }
931 
check_fwstate(struct mlme_priv * pmlmepriv,sint state)932 __inline static sint check_fwstate(struct mlme_priv *pmlmepriv, sint state)
933 {
934 	if ((state == WIFI_NULL_STATE) &&
935 		(pmlmepriv->fw_state == WIFI_NULL_STATE))
936 		return _TRUE;
937 
938 	if (pmlmepriv->fw_state & state)
939 		return _TRUE;
940 
941 	return _FALSE;
942 }
943 
get_fwstate(struct mlme_priv * pmlmepriv)944 __inline static sint get_fwstate(struct mlme_priv *pmlmepriv)
945 {
946 	return pmlmepriv->fw_state;
947 }
948 
949 /*
950  * No Limit on the calling context,
951  * therefore set it to be the critical section...
952  *
953  * ### NOTE:#### (!!!!)
954  * MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock
955  */
956 extern void rtw_mi_update_iface_status(struct mlme_priv *pmlmepriv, sint state);
957 
set_fwstate(struct mlme_priv * pmlmepriv,sint state)958 static inline void set_fwstate(struct mlme_priv *pmlmepriv, sint state)
959 {
960 	pmlmepriv->fw_state |= state;
961 	rtw_mi_update_iface_status(pmlmepriv, state);
962 }
init_fwstate(struct mlme_priv * pmlmepriv,sint state)963 static inline void init_fwstate(struct mlme_priv *pmlmepriv, sint state)
964 {
965 	pmlmepriv->fw_state = state;
966 	rtw_mi_update_iface_status(pmlmepriv, state);
967 }
968 
_clr_fwstate_(struct mlme_priv * pmlmepriv,sint state)969 static inline void _clr_fwstate_(struct mlme_priv *pmlmepriv, sint state)
970 {
971 	pmlmepriv->fw_state &= ~state;
972 	rtw_mi_update_iface_status(pmlmepriv, state);
973 }
974 
975 /*
976  * No Limit on the calling context,
977  * therefore set it to be the critical section...
978  */
clr_fwstate(struct mlme_priv * pmlmepriv,sint state)979 static inline void clr_fwstate(struct mlme_priv *pmlmepriv, sint state)
980 {
981 	_irqL irqL;
982 
983 	_enter_critical_bh(&pmlmepriv->lock, &irqL);
984 	_clr_fwstate_(pmlmepriv, state);
985 	_exit_critical_bh(&pmlmepriv->lock, &irqL);
986 }
987 
up_scanned_network(struct mlme_priv * pmlmepriv)988 static inline void up_scanned_network(struct mlme_priv *pmlmepriv)
989 {
990 	_irqL irqL;
991 
992 	_enter_critical_bh(&pmlmepriv->lock, &irqL);
993 	pmlmepriv->num_of_scanned++;
994 	_exit_critical_bh(&pmlmepriv->lock, &irqL);
995 }
996 u8 rtw_is_adapter_up(_adapter *padapter);
997 
down_scanned_network(struct mlme_priv * pmlmepriv)998 __inline static void down_scanned_network(struct mlme_priv *pmlmepriv)
999 {
1000 	_irqL irqL;
1001 
1002 	_enter_critical_bh(&pmlmepriv->lock, &irqL);
1003 	pmlmepriv->num_of_scanned--;
1004 	_exit_critical_bh(&pmlmepriv->lock, &irqL);
1005 }
1006 
set_scanned_network_val(struct mlme_priv * pmlmepriv,sint val)1007 __inline static void set_scanned_network_val(struct mlme_priv *pmlmepriv, sint val)
1008 {
1009 	_irqL irqL;
1010 
1011 	_enter_critical_bh(&pmlmepriv->lock, &irqL);
1012 	pmlmepriv->num_of_scanned = val;
1013 	_exit_critical_bh(&pmlmepriv->lock, &irqL);
1014 }
1015 
1016 extern u16 rtw_get_capability(WLAN_BSSID_EX *bss);
1017 extern void rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target);
1018 extern void rtw_disconnect_hdl_under_linked(_adapter *adapter, struct sta_info *psta, u8 free_assoc);
1019 extern void rtw_generate_random_ibss(u8 *pibss);
1020 extern struct wlan_network *rtw_find_network(_queue *scanned_queue, u8 *addr);
1021 extern struct wlan_network *rtw_get_oldest_wlan_network(_queue *scanned_queue);
1022 struct wlan_network *_rtw_find_same_network(_queue *scanned_queue, struct wlan_network *network);
1023 struct wlan_network *rtw_find_same_network(_queue *scanned_queue, struct wlan_network *network);
1024 
1025 extern void rtw_free_assoc_resources(_adapter *adapter, int lock_scanned_queue);
1026 extern void rtw_indicate_disconnect(_adapter *adapter, u16 reason, u8 locally_generated);
1027 extern void rtw_indicate_connect(_adapter *adapter);
1028 void rtw_indicate_scan_done(_adapter *padapter, bool aborted);
1029 
1030 void rtw_drv_scan_by_self(_adapter *padapter, u8 reason);
1031 void rtw_scan_wait_completed(_adapter *adapter);
1032 u32 rtw_scan_abort_timeout(_adapter *adapter, u32 timeout_ms);
1033 void rtw_scan_abort_no_wait(_adapter *adapter);
1034 void rtw_scan_abort(_adapter *adapter);
1035 
1036 extern int rtw_restruct_sec_ie(_adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len);
1037 #ifdef CONFIG_WMMPS_STA
1038 void rtw_uapsd_use_default_setting(_adapter *padapter);
1039 bool rtw_is_wmmps_mode(_adapter *padapter);
1040 #endif /* CONFIG_WMMPS_STA */
1041 extern int rtw_restruct_wmm_ie(_adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len, uint initial_out_len);
1042 extern void rtw_init_registrypriv_dev_network(_adapter *adapter);
1043 
1044 extern void rtw_update_registrypriv_dev_network(_adapter *adapter);
1045 
1046 extern void rtw_get_encrypt_decrypt_from_registrypriv(_adapter *adapter);
1047 
1048 extern void rtw_join_timeout_handler(void *ctx);
1049 extern void rtw_scan_timeout_handler(void *ctx);
1050 
1051 extern void rtw_dynamic_check_timer_handlder(void *ctx);
1052 extern void rtw_iface_dynamic_check_timer_handlder(_adapter *adapter);
1053 
1054 #ifdef CONFIG_SET_SCAN_DENY_TIMER
1055 bool rtw_is_scan_deny(_adapter *adapter);
1056 void rtw_clear_scan_deny(_adapter *adapter);
1057 void rtw_set_scan_deny_timer_hdl(void *ctx);
1058 void rtw_set_scan_deny(_adapter *adapter, u32 ms);
1059 #else
1060 #define rtw_is_scan_deny(adapter) _FALSE
1061 #define rtw_clear_scan_deny(adapter) do {} while (0)
1062 #define rtw_set_scan_deny(adapter, ms) do {} while (0)
1063 #endif
1064 
1065 void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv);
1066 
1067 #define MLME_BEACON_IE			0
1068 #define MLME_PROBE_REQ_IE		1
1069 #define MLME_PROBE_RESP_IE		2
1070 #define MLME_GO_PROBE_RESP_IE	3
1071 #define MLME_ASSOC_REQ_IE		4
1072 #define MLME_ASSOC_RESP_IE		5
1073 
1074 #if defined(CONFIG_WFD) && defined(CONFIG_IOCTL_CFG80211)
1075 int rtw_mlme_update_wfd_ie_data(struct mlme_priv *mlme, u8 type, u8 *ie, u32 ie_len);
1076 #endif
1077 
1078 
1079 /* extern struct wlan_network* _rtw_dequeue_network(_queue *queue); */
1080 
1081 extern struct wlan_network *_rtw_alloc_network(struct mlme_priv *pmlmepriv);
1082 
1083 
1084 extern void _rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 isfreeall);
1085 extern void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork);
1086 
1087 
1088 extern struct wlan_network *_rtw_find_network(_queue *scanned_queue, u8 *addr);
1089 
1090 extern void _rtw_free_network_queue(_adapter *padapter, u8 isfreeall);
1091 
1092 extern sint rtw_if_up(_adapter *padapter);
1093 
1094 sint rtw_linked_check(_adapter *padapter);
1095 
1096 u8 *rtw_get_capability_from_ie(u8 *ie);
1097 u8 *rtw_get_timestampe_from_ie(u8 *ie);
1098 u8 *rtw_get_beacon_interval_from_ie(u8 *ie);
1099 
1100 
1101 void rtw_joinbss_reset(_adapter *padapter);
1102 
1103 #ifdef CONFIG_80211N_HT
1104 void	rtw_ht_use_default_setting(_adapter *padapter);
1105 void rtw_build_wmm_ie_ht(_adapter *padapter, u8 *out_ie, uint *pout_len);
1106 unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len, u8 channel);
1107 void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel);
1108 void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe);
1109 void rtw_append_exented_cap(_adapter *padapter, u8 *out_ie, uint *pout_len);
1110 #endif
1111 
1112 int rtw_is_same_ibss(_adapter *adapter, struct wlan_network *pnetwork);
1113 int is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst, u8 feature);
1114 
1115 #ifdef CONFIG_LAYER2_ROAMING
1116 #define rtw_roam_flags(adapter) ((adapter)->mlmepriv.roam_flags)
1117 #define rtw_chk_roam_flags(adapter, flags) ((adapter)->mlmepriv.roam_flags & flags)
1118 #define rtw_clr_roam_flags(adapter, flags) \
1119 	do { \
1120 		((adapter)->mlmepriv.roam_flags &= ~flags); \
1121 	} while (0)
1122 
1123 #define rtw_set_roam_flags(adapter, flags) \
1124 	do { \
1125 		((adapter)->mlmepriv.roam_flags |= flags); \
1126 	} while (0)
1127 
1128 #define rtw_assign_roam_flags(adapter, flags) \
1129 	do { \
1130 		((adapter)->mlmepriv.roam_flags = flags); \
1131 	} while (0)
1132 
1133 void _rtw_roaming(_adapter *adapter, struct wlan_network *tgt_network);
1134 void rtw_roaming(_adapter *adapter, struct wlan_network *tgt_network);
1135 void rtw_set_to_roam(_adapter *adapter, u8 to_roam);
1136 u8 rtw_dec_to_roam(_adapter *adapter);
1137 u8 rtw_to_roam(_adapter *adapter);
1138 int rtw_select_roaming_candidate(struct mlme_priv *pmlmepriv);
1139 #else
1140 #define rtw_roam_flags(adapter) 0
1141 #define rtw_chk_roam_flags(adapter, flags) 0
1142 #define rtw_clr_roam_flags(adapter, flags) do {} while (0)
1143 #define rtw_set_roam_flags(adapter, flags) do {} while (0)
1144 #define rtw_assign_roam_flags(adapter, flags) do {} while (0)
1145 #define _rtw_roaming(adapter, tgt_network) do {} while (0)
1146 #define rtw_roaming(adapter, tgt_network) do {} while (0)
1147 #define rtw_set_to_roam(adapter, to_roam) do {} while (0)
1148 #define rtw_dec_to_roam(adapter) 0
1149 #define rtw_to_roam(adapter) 0
1150 #define rtw_select_roaming_candidate(mlme) _FAIL
1151 #endif /* CONFIG_LAYER2_ROAMING */
1152 
1153 bool rtw_adjust_chbw(_adapter *adapter, u8 req_ch, u8 *req_bw, u8 *req_offset);
1154 
1155 struct sta_media_status_rpt_cmd_parm {
1156 	struct sta_info *sta;
1157 	bool connected;
1158 };
1159 
1160 void rtw_sta_media_status_rpt(_adapter *adapter, struct sta_info *sta, bool connected);
1161 u8 rtw_sta_media_status_rpt_cmd(_adapter *adapter, struct sta_info *sta, bool connected);
1162 void rtw_sta_media_status_rpt_cmd_hdl(_adapter *adapter, struct sta_media_status_rpt_cmd_parm *parm);
1163 void rtw_sta_traffic_info(void *sel, _adapter *adapter);
1164 
1165 #ifdef CONFIG_INTEL_PROXIM
1166 void rtw_proxim_enable(_adapter *padapter);
1167 void rtw_proxim_disable(_adapter *padapter);
1168 void rtw_proxim_send_packet(_adapter *padapter, u8 *pbuf, u16 len, u8 m_rate);
1169 #endif /* CONFIG_INTEL_PROXIM */
1170 
1171 #define IPV4_SRC(_iphdr)			(((u8 *)(_iphdr)) + 12)
1172 #define IPV4_DST(_iphdr)			(((u8 *)(_iphdr)) + 16)
1173 #define GET_IPV4_IHL(_iphdr)		BE_BITS_TO_1BYTE(((u8 *)(_iphdr)) + 0, 0, 4)
1174 #define GET_IPV4_PROTOCOL(_iphdr)	BE_BITS_TO_1BYTE(((u8 *)(_iphdr)) + 9, 0, 8)
1175 #define GET_IPV4_SRC(_iphdr)		BE_BITS_TO_4BYTE(((u8 *)(_iphdr)) + 12, 0, 32)
1176 #define GET_IPV4_DST(_iphdr)		BE_BITS_TO_4BYTE(((u8 *)(_iphdr)) + 16, 0, 32)
1177 
1178 #define GET_UDP_SRC(_udphdr)			BE_BITS_TO_2BYTE(((u8 *)(_udphdr)) + 0, 0, 16)
1179 #define GET_UDP_DST(_udphdr)			BE_BITS_TO_2BYTE(((u8 *)(_udphdr)) + 2, 0, 16)
1180 
1181 #define TCP_SRC(_tcphdr)				(((u8 *)(_tcphdr)) + 0)
1182 #define TCP_DST(_tcphdr)				(((u8 *)(_tcphdr)) + 2)
1183 #define GET_TCP_SRC(_tcphdr)			BE_BITS_TO_2BYTE(((u8 *)(_tcphdr)) + 0, 0, 16)
1184 #define GET_TCP_DST(_tcphdr)			BE_BITS_TO_2BYTE(((u8 *)(_tcphdr)) + 2, 0, 16)
1185 #define GET_TCP_SEQ(_tcphdr)			BE_BITS_TO_4BYTE(((u8 *)(_tcphdr)) + 4, 0, 32)
1186 #define GET_TCP_ACK_SEQ(_tcphdr)		BE_BITS_TO_4BYTE(((u8 *)(_tcphdr)) + 8, 0, 32)
1187 #define GET_TCP_DOFF(_tcphdr)			BE_BITS_TO_1BYTE(((u8 *)(_tcphdr)) + 12, 4, 4)
1188 #define GET_TCP_FIN(_tcphdr)			BE_BITS_TO_1BYTE(((u8 *)(_tcphdr)) + 13, 0, 1)
1189 #define GET_TCP_SYN(_tcphdr)			BE_BITS_TO_1BYTE(((u8 *)(_tcphdr)) + 13, 1, 1)
1190 #define GET_TCP_RST(_tcphdr)			BE_BITS_TO_1BYTE(((u8 *)(_tcphdr)) + 13, 2, 1)
1191 #define GET_TCP_PSH(_tcphdr)			BE_BITS_TO_1BYTE(((u8 *)(_tcphdr)) + 13, 3, 1)
1192 #define GET_TCP_ACK(_tcphdr)			BE_BITS_TO_1BYTE(((u8 *)(_tcphdr)) + 13, 4, 1)
1193 #define GET_TCP_URG(_tcphdr)			BE_BITS_TO_1BYTE(((u8 *)(_tcphdr)) + 13, 5, 1)
1194 #define GET_TCP_ECE(_tcphdr)			BE_BITS_TO_1BYTE(((u8 *)(_tcphdr)) + 13, 6, 1)
1195 #define GET_TCP_CWR(_tcphdr)			BE_BITS_TO_1BYTE(((u8 *)(_tcphdr)) + 13, 7, 1)
1196 
1197 #endif /* __RTL871X_MLME_H_ */
1198