1 /******************************************************************************
2 *
3 * Copyright(c) 2007 - 2019 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_EXT_H_
16 #define __RTW_MLME_EXT_H_
17
18
19 /* Commented by Albert 20101105
20 * Increase the SURVEY_TO value from 100 to 150 ( 100ms to 150ms )
21 * The Realtek 8188CE SoftAP will spend around 100ms to send the probe response after receiving the probe request.
22 * So, this driver tried to extend the dwell time for each scanning channel.
23 * This will increase the chance to receive the probe response from SoftAP. */
24 #define SURVEY_TO (100)
25
26 #define REAUTH_TO (300) /* (50) */
27 #define REASSOC_TO (300) /* (50) */
28 /* #define DISCONNECT_TO (3000) */
29 #define ADDBA_TO (2000)
30
31 #define LINKED_TO (1) /* unit:2 sec, 1x2 = 2 sec */
32
33 #define REAUTH_LIMIT (4)
34 #define REASSOC_LIMIT (4)
35 #define READDBA_LIMIT (2)
36
37 #ifdef CONFIG_GSPI_HCI
38 #define ROAMING_LIMIT 5
39 #else
40 #define ROAMING_LIMIT 8
41 #endif
42
43 /*net_type, pmlmeinfo->state*/
44 #define _HW_STATE_NOLINK_ 0x00
45 #define _HW_STATE_ADHOC_ 0x01
46 #define _HW_STATE_STATION_ 0x02
47 #define _HW_STATE_AP_ 0x03
48 #define _HW_STATE_MONITOR_ 0x04
49
50 #define WIFI_FW_NULL_STATE _HW_STATE_NOLINK_
51 #define WIFI_FW_STATION_STATE _HW_STATE_STATION_
52 #define WIFI_FW_AP_STATE _HW_STATE_AP_
53 #define WIFI_FW_ADHOC_STATE _HW_STATE_ADHOC_
54
55 #define WIFI_FW_PRE_LINK 0x00000800
56 #define WIFI_FW_AUTH_NULL 0x00000100
57 #define WIFI_FW_AUTH_STATE 0x00000200
58 #define WIFI_FW_AUTH_SUCCESS 0x00000400
59
60 #define WIFI_FW_ASSOC_STATE 0x00002000
61 #define WIFI_FW_ASSOC_SUCCESS 0x00004000
62
63 #define WIFI_FW_LINKING_STATE (WIFI_FW_AUTH_NULL | WIFI_FW_AUTH_STATE | WIFI_FW_AUTH_SUCCESS | WIFI_FW_ASSOC_STATE)
64
65
66 #define _1M_RATE_ 0
67 #define _2M_RATE_ 1
68 #define _5M_RATE_ 2
69 #define _11M_RATE_ 3
70 #define _6M_RATE_ 4
71 #define _9M_RATE_ 5
72 #define _12M_RATE_ 6
73 #define _18M_RATE_ 7
74 #define _24M_RATE_ 8
75 #define _36M_RATE_ 9
76 #define _48M_RATE_ 10
77 #define _54M_RATE_ 11
78
79 /********************************************************
80 MCS rate definitions
81 *********************************************************/
82 #define MCS_RATE_1R (0x000000ff)
83 #define MCS_RATE_2R (0x0000ffff)
84 #define MCS_RATE_3R (0x00ffffff)
85 #define MCS_RATE_4R (0xffffffff)
86 #define MCS_RATE_2R_13TO15_OFF (0x00001fff)
87
88
89 extern unsigned char RTW_WPA_OUI[];
90 extern unsigned char WMM_OUI[];
91 extern unsigned char WPS_OUI[];
92 extern unsigned char WFD_OUI[];
93 extern unsigned char P2P_OUI[];
94 extern unsigned char MULTI_AP_OUI[];
95
96 extern unsigned char WMM_INFO_OUI[];
97 extern unsigned char WMM_PARA_OUI[];
98
99 typedef struct _RT_CHANNEL_PLAN {
100 unsigned char Channel[MAX_CHANNEL_NUM];
101 unsigned char Len;
102 } RT_CHANNEL_PLAN, *PRT_CHANNEL_PLAN;
103
104 typedef enum _HT_IOT_PEER {
105 HT_IOT_PEER_UNKNOWN = 0,
106 HT_IOT_PEER_REALTEK = 1,
107 HT_IOT_PEER_REALTEK_92SE = 2,
108 HT_IOT_PEER_BROADCOM = 3,
109 HT_IOT_PEER_RALINK = 4,
110 HT_IOT_PEER_ATHEROS = 5,
111 HT_IOT_PEER_CISCO = 6,
112 HT_IOT_PEER_MERU = 7,
113 HT_IOT_PEER_MARVELL = 8,
114 HT_IOT_PEER_REALTEK_SOFTAP = 9,/* peer is RealTek SOFT_AP, by Bohn, 2009.12.17 */
115 HT_IOT_PEER_SELF_SOFTAP = 10, /* Self is SoftAP */
116 HT_IOT_PEER_AIRGO = 11,
117 HT_IOT_PEER_INTEL = 12,
118 HT_IOT_PEER_RTK_APCLIENT = 13,
119 HT_IOT_PEER_REALTEK_81XX = 14,
120 HT_IOT_PEER_REALTEK_WOW = 15,
121 HT_IOT_PEER_REALTEK_JAGUAR_BCUTAP = 16,
122 HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP = 17,
123 HT_IOT_PEER_MAX = 18
124 } HT_IOT_PEER_E, *PHTIOT_PEER_E;
125
126
127 typedef enum _RT_HT_INF0_CAP {
128 RT_HT_CAP_USE_TURBO_AGGR = 0x01,
129 RT_HT_CAP_USE_LONG_PREAMBLE = 0x02,
130 RT_HT_CAP_USE_AMPDU = 0x04,
131 RT_HT_CAP_USE_WOW = 0x8,
132 RT_HT_CAP_USE_SOFTAP = 0x10,
133 RT_HT_CAP_USE_92SE = 0x20,
134 RT_HT_CAP_USE_88C_92C = 0x40,
135 RT_HT_CAP_USE_AP_CLIENT_MODE = 0x80, /* AP team request to reserve this bit, by Emily */
136 } RT_HT_INF0_CAPBILITY, *PRT_HT_INF0_CAPBILITY;
137
138 typedef enum _RT_HT_INF1_CAP {
139 RT_HT_CAP_USE_VIDEO_CLIENT = 0x01,
140 RT_HT_CAP_USE_JAGUAR_BCUT = 0x02,
141 RT_HT_CAP_USE_JAGUAR_CCUT = 0x04,
142 } RT_HT_INF1_CAPBILITY, *PRT_HT_INF1_CAPBILITY;
143
144 struct mlme_handler {
145 unsigned int num;
146 char *str;
147 unsigned int (*func)(_adapter *padapter, union recv_frame *precv_frame);
148 };
149
150 struct action_handler {
151 unsigned int num;
152 char *str;
153 unsigned int (*func)(_adapter *padapter, union recv_frame *precv_frame);
154 };
155
156 enum SCAN_STATE {
157 SCAN_DISABLE = 0,
158 SCAN_START = 1,
159 SCAN_PS_ANNC_WAIT = 2,
160 SCAN_ENTER = 3,
161 SCAN_PROCESS = 4,
162
163 /* backop */
164 SCAN_BACKING_OP = 5,
165 SCAN_BACK_OP = 6,
166 SCAN_LEAVING_OP = 7,
167 SCAN_LEAVE_OP = 8,
168
169 /* SW antenna diversity (before linked) */
170 SCAN_SW_ANTDIV_BL = 9,
171
172 /* legacy p2p */
173 SCAN_TO_P2P_LISTEN = 10,
174 SCAN_P2P_LISTEN = 11,
175
176 SCAN_COMPLETE = 12,
177 SCAN_STATE_MAX,
178 };
179
180 const char *scan_state_str(u8 state);
181
182 enum ss_backop_flag {
183 SS_BACKOP_EN = BIT0, /* backop when linked */
184 SS_BACKOP_EN_NL = BIT1, /* backop even when no linked */
185
186 SS_BACKOP_PS_ANNC = BIT4,
187 SS_BACKOP_TX_RESUME = BIT5,
188 };
189
190 struct ss_res {
191 u8 state;
192 u8 next_state; /* will set to state on next cmd hdl */
193 int bss_cnt;
194 int channel_idx;
195 u8 force_ssid_scan;
196 int scan_mode;
197 u16 scan_ch_ms;
198 u32 scan_timeout_ms;
199 u8 rx_ampdu_accept;
200 u8 rx_ampdu_size;
201 u8 igi_scan;
202 u8 igi_before_scan; /* used for restoring IGI value without enable DIG & FA_CNT */
203 #ifdef CONFIG_SCAN_BACKOP
204 u8 backop_flags_sta; /* policy for station mode*/
205 #ifdef CONFIG_AP_MODE
206 u8 backop_flags_ap; /* policy for ap mode */
207 #endif
208 #ifdef CONFIG_RTW_MESH
209 u8 backop_flags_mesh; /* policy for mesh mode */
210 #endif
211 u8 backop_flags; /* per backop runtime decision */
212 u8 scan_cnt;
213 u8 scan_cnt_max;
214 systime backop_time; /* the start time of backop */
215 u16 backop_ms;
216 #endif
217 #if defined(CONFIG_ANTENNA_DIVERSITY) || defined(DBG_SCAN_SW_ANTDIV_BL)
218 u8 is_sw_antdiv_bl_scan;
219 #endif
220 u8 ssid_num;
221 u8 ch_num;
222 NDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT];
223 struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];
224
225 u32 token; /* 0: use to identify caller */
226 u16 duration; /* 0: use default */
227 u8 igi; /* 0: use defalut */
228 u8 bw; /* 0: use default */
229
230 bool acs; /* aim to trigger channel selection when scan done */
231 };
232
233 #ifdef CONFIG_TDLS
234 enum TDLS_option {
235 TDLS_ESTABLISHED = 1,
236 TDLS_ISSUE_PTI,
237 TDLS_CH_SW_RESP,
238 TDLS_CH_SW_PREPARE,
239 TDLS_CH_SW_START,
240 TDLS_CH_SW_TO_OFF_CHNL,
241 TDLS_CH_SW_TO_BASE_CHNL_UNSOLICITED,
242 TDLS_CH_SW_TO_BASE_CHNL,
243 TDLS_CH_SW_END_TO_BASE_CHNL,
244 TDLS_CH_SW_END,
245 TDLS_RS_RCR,
246 TDLS_TEARDOWN_STA,
247 TDLS_TEARDOWN_STA_NO_WAIT,
248 TDLS_TEARDOWN_STA_LOCALLY,
249 TDLS_TEARDOWN_STA_LOCALLY_POST,
250 maxTDLS,
251 };
252
253 #endif /* CONFIG_TDLS */
254
255 /*
256 * Usage:
257 * When one iface acted as AP mode and the other iface is STA mode and scanning,
258 * it should switch back to AP's operating channel periodically.
259 * Parameters info:
260 * When the driver scanned RTW_SCAN_NUM_OF_CH channels, it would switch back to AP's operating channel for
261 * RTW_BACK_OP_CH_MS milliseconds.
262 * Example:
263 * For chip supports 2.4G + 5GHz and AP mode is operating in channel 1,
264 * RTW_SCAN_NUM_OF_CH is 8, RTW_BACK_OP_CH_MS is 300
265 * When it's STA mode gets set_scan command,
266 * it would
267 * 1. Doing the scan on channel 1.2.3.4.5.6.7.8
268 * 2. Back to channel 1 for 300 milliseconds
269 * 3. Go through doing site survey on channel 9.10.11.36.40.44.48.52
270 * 4. Back to channel 1 for 300 milliseconds
271 * 5. ... and so on, till survey done.
272 */
273 #if defined(CONFIG_ATMEL_RC_PATCH)
274 #define RTW_SCAN_NUM_OF_CH 2
275 #define RTW_BACK_OP_CH_MS 200
276 #elseif defined(CONFIG_CUSTOMER_EZVIZ_CHIME2)
277 #define RTW_SCAN_NUM_OF_CH 1
278 #define RTW_BACK_OP_CH_MS 200
279 #else
280 #define RTW_SCAN_NUM_OF_CH 3
281 #define RTW_BACK_OP_CH_MS 400
282 #endif
283
284 #define RTW_IP_ADDR_LEN 4
285 #define RTW_IPv6_ADDR_LEN 16
286
287 struct mlme_ext_info {
288 u32 state;
289 #ifdef CONFIG_MI_WITH_MBSSID_CAM
290 u8 hw_media_state;
291 #endif
292 u32 reauth_count;
293 u32 reassoc_count;
294 u32 link_count;
295 u32 auth_seq;
296 u32 auth_algo; /* 802.11 auth, could be open, shared, auto */
297 u16 auth_status;
298 u32 authModeToggle;
299 u32 enc_algo;/* encrypt algorithm; */
300 u32 key_index; /* this is only valid for legendary wep, 0~3 for key id. */
301 u32 iv;
302 u8 chg_txt[128];
303 u16 aid;
304 u16 bcn_interval;
305 u16 capability;
306 u8 assoc_AP_vendor;
307 u8 slotTime;
308 u8 preamble_mode;
309 u8 WMM_enable;
310 u8 ERP_enable;
311 u8 ERP_IE;
312 u8 HT_enable;
313 u8 HT_caps_enable;
314 u8 HT_info_enable;
315 u8 HT_protection;
316 u8 turboMode_cts2self;
317 u8 turboMode_rtsen;
318 u8 SM_PS;
319 u8 agg_enable_bitmap;
320 u8 ADDBA_retry_count;
321 u8 candidate_tid_bitmap;
322 u8 dialogToken;
323 /* Accept ADDBA Request */
324 BOOLEAN bAcceptAddbaReq;
325 u8 bwmode_updated;
326 u8 hidden_ssid_mode;
327 u8 VHT_enable;
328
329 u8 ip_addr[RTW_IP_ADDR_LEN];
330 u8 ip6_addr[RTW_IPv6_ADDR_LEN];
331
332 struct ADDBA_request ADDBA_req;
333 struct WMM_para_element WMM_param;
334 struct HT_caps_element HT_caps;
335 struct HT_info_element HT_info;
336 WLAN_BSSID_EX network;/* join network or bss_network, if in ap mode, it is the same to cur_network.network */
337 #ifdef ROKU_PRIVATE
338 /*infra mode, store supported rates from AssocRsp*/
339 NDIS_802_11_RATES_EX SupportedRates_infra_ap;
340 u8 ht_vht_received;/*ht_vht_received used to show debug msg BIT(0):HT BIT(1):VHT */
341 #endif /* ROKU_PRIVATE */
342 };
343
344 /* The channel information about this channel including joining, scanning, and power constraints. */
345 typedef struct _RT_CHANNEL_INFO {
346 u8 ChannelNum; /* The channel number. */
347 RT_SCAN_TYPE ScanType; /* Scan type such as passive or active scan. */
348 bool dfs;
349 /* u16 ScanPeriod; */ /* Listen time in millisecond in this channel. */
350 /* s32 MaxTxPwrDbm; */ /* Max allowed tx power. */
351 /* u32 ExInfo; */ /* Extended Information for this channel. */
352 #ifdef CONFIG_FIND_BEST_CHANNEL
353 u32 rx_count;
354 #endif
355 #if CONFIG_IEEE80211_BAND_5GHZ && CONFIG_DFS
356 #ifdef CONFIG_DFS_MASTER
357 systime non_ocp_end_time;
358 #endif
359 #endif
360 u8 hidden_bss_cnt; /* per scan count */
361 } RT_CHANNEL_INFO, *PRT_CHANNEL_INFO;
362
363 #define CAC_TIME_MS (60*1000)
364 #define CAC_TIME_CE_MS (10*60*1000)
365 #define NON_OCP_TIME_MS (30*60*1000)
366
367 #if CONFIG_TXPWR_LIMIT
368 void rtw_txpwr_init_regd(struct rf_ctl_t *rfctl);
369 #endif
370 void rtw_rfctl_init(_adapter *adapter);
371 void rtw_rfctl_deinit(_adapter *adapter);
372
373 u8 rtw_rfctl_get_dfs_domain(struct rf_ctl_t *rfctl);
374 u8 rtw_rfctl_dfs_domain_unknown(struct rf_ctl_t *rfctl);
375
376 #ifdef CONFIG_DFS_MASTER
377 struct rf_ctl_t;
378 #define CH_IS_NON_OCP(rt_ch_info) (rtw_time_after((rt_ch_info)->non_ocp_end_time, rtw_get_current_time()))
379 bool rtw_is_cac_reset_needed(struct rf_ctl_t *rfctl, u8 ch, u8 bw, u8 offset);
380 bool _rtw_rfctl_overlap_radar_detect_ch(struct rf_ctl_t *rfctl, u8 ch, u8 bw, u8 offset);
381 bool rtw_rfctl_overlap_radar_detect_ch(struct rf_ctl_t *rfctl);
382 bool rtw_rfctl_is_tx_blocked_by_ch_waiting(struct rf_ctl_t *rfctl);
383 bool rtw_chset_is_chbw_non_ocp(RT_CHANNEL_INFO *ch_set, u8 ch, u8 bw, u8 offset);
384 bool rtw_chset_is_ch_non_ocp(RT_CHANNEL_INFO *ch_set, u8 ch);
385 void rtw_chset_update_non_ocp(RT_CHANNEL_INFO *ch_set, u8 ch, u8 bw, u8 offset);
386 void rtw_chset_update_non_ocp_ms(RT_CHANNEL_INFO *ch_set, u8 ch, u8 bw, u8 offset, int ms);
387 u32 rtw_get_ch_waiting_ms(struct rf_ctl_t *rfctl, u8 ch, u8 bw, u8 offset, u32 *r_non_ocp_ms, u32 *r_cac_ms);
388 void rtw_reset_cac(struct rf_ctl_t *rfctl, u8 ch, u8 bw, u8 offset);
389 u32 rtw_force_stop_cac(struct rf_ctl_t *rfctl, u32 timeout_ms);
390 #else
391 #define CH_IS_NON_OCP(rt_ch_info) 0
392 #define rtw_chset_is_chbw_non_ocp(ch_set, ch, bw, offset) _FALSE
393 #define rtw_chset_is_ch_non_ocp(ch_set, ch) _FALSE
394 #define rtw_rfctl_is_tx_blocked_by_ch_waiting(rfctl) _FALSE
395 #endif
396
397 enum {
398 RTW_CHF_2G = BIT0,
399 RTW_CHF_5G = BIT1,
400 RTW_CHF_DFS = BIT2,
401 RTW_CHF_LONG_CAC = BIT3,
402 RTW_CHF_NON_DFS = BIT4,
403 RTW_CHF_NON_LONG_CAC = BIT5,
404 RTW_CHF_NON_OCP = BIT6,
405 };
406
407 bool rtw_choose_shortest_waiting_ch(struct rf_ctl_t *rfctl, u8 sel_ch, u8 max_bw
408 , u8 *dec_ch, u8 *dec_bw, u8 *dec_offset
409 , u8 d_flags, u8 cur_ch, bool by_int_info, u8 mesh_only);
410
411 #ifdef CONFIG_PROC_DEBUG
412 void dump_chset(void *sel, RT_CHANNEL_INFO *ch_set);
413 void dump_cur_chset(void *sel, struct rf_ctl_t *rfctl);
414 #endif
415
416 int rtw_chset_search_ch(RT_CHANNEL_INFO *ch_set, const u32 ch);
417 u8 rtw_chset_is_chbw_valid(RT_CHANNEL_INFO *ch_set, u8 ch, u8 bw, u8 offset
418 , bool allow_primary_passive, bool allow_passive);
419 void rtw_chset_sync_chbw(RT_CHANNEL_INFO *ch_set, u8 *req_ch, u8 *req_bw, u8 *req_offset
420 , u8 *g_ch, u8 *g_bw, u8 *g_offset, bool allow_primary_passive, bool allow_passive);
421
422 bool rtw_mlme_band_check(_adapter *adapter, const u32 ch);
423
424
425 enum {
426 BAND_24G = BIT0,
427 BAND_5G = BIT1,
428 };
429 void RTW_SET_SCAN_BAND_SKIP(_adapter *padapter, int skip_band);
430 void RTW_CLR_SCAN_BAND_SKIP(_adapter *padapter, int skip_band);
431 int RTW_GET_SCAN_BAND_SKIP(_adapter *padapter);
432
433 bool rtw_mlme_ignore_chan(_adapter *adapter, const u32 ch);
434
435 /* P2P_MAX_REG_CLASSES - Maximum number of regulatory classes */
436 #define P2P_MAX_REG_CLASSES 10
437
438 /* P2P_MAX_REG_CLASS_CHANNELS - Maximum number of channels per regulatory class */
439 #define P2P_MAX_REG_CLASS_CHANNELS 20
440
441 /* struct p2p_channels - List of supported channels */
442 struct p2p_channels {
443 /* struct p2p_reg_class - Supported regulatory class */
444 struct p2p_reg_class {
445 /* reg_class - Regulatory class (IEEE 802.11-2007, Annex J) */
446 u8 reg_class;
447
448 /* channel - Supported channels */
449 u8 channel[P2P_MAX_REG_CLASS_CHANNELS];
450
451 /* channels - Number of channel entries in use */
452 size_t channels;
453 } reg_class[P2P_MAX_REG_CLASSES];
454
455 /* reg_classes - Number of reg_class entries in use */
456 size_t reg_classes;
457 };
458
459 struct p2p_oper_class_map {
460 enum hw_mode {IEEE80211G, IEEE80211A} mode;
461 u8 op_class;
462 u8 min_chan;
463 u8 max_chan;
464 u8 inc;
465 enum { BW20, BW40PLUS, BW40MINUS } bw;
466 };
467
468 struct mlme_ext_priv {
469 _adapter *padapter;
470 u8 mlmeext_init;
471 ATOMIC_T event_seq;
472 u16 mgnt_seq;
473 #ifdef CONFIG_IEEE80211W
474 u16 sa_query_seq;
475 #endif
476 /* struct fw_priv fwpriv; */
477
478 unsigned char cur_channel;
479 unsigned char cur_bwmode;
480 unsigned char cur_ch_offset;/* PRIME_CHNL_OFFSET */
481 unsigned char cur_wireless_mode; /* NETWORK_TYPE */
482
483 unsigned char basicrate[NumRates];
484 unsigned char datarate[NumRates];
485 #ifdef CONFIG_80211N_HT
486 unsigned char default_supported_mcs_set[16];
487 #endif
488
489 struct ss_res sitesurvey_res;
490 struct mlme_ext_info mlmext_info;/* for sta/adhoc mode, including current scanning/connecting/connected related info.
491 * for ap mode, network includes ap's cap_info */
492 _timer survey_timer;
493 _timer link_timer;
494
495 #ifdef CONFIG_RTW_REPEATER_SON
496 _timer rson_scan_timer;
497 #endif
498 #ifdef CONFIG_RTW_80211R
499 _timer ft_link_timer;
500 _timer ft_roam_timer;
501 #endif
502 #ifdef CONFIG_RTW_TOKEN_BASED_XMIT
503 _timer tbtx_xmit_timer;
504 _timer tbtx_token_dispatch_timer;
505 #endif
506
507 systime last_scan_time;
508 u8 scan_abort;
509 u8 join_abort;
510
511 u8 tx_rate; /* TXRATE when USERATE is set. */
512 RATE_SECTION tx_rate_section; /* decided by tx_rate */
513
514 u32 retry; /* retry for issue probereq */
515
516 u64 TSFValue;
517 u32 bcn_cnt;
518 u32 last_bcn_cnt;
519 u8 cur_bcn_cnt;/*2s*/
520 u8 dtim;/*DTIM Period*/
521 #ifdef DBG_RX_BCN
522 u8 tim[4];
523 #endif
524 #ifdef CONFIG_BCN_RECV_TIME
525 u16 bcn_rx_time;
526 #endif
527 #ifdef CONFIG_AP_MODE
528 unsigned char bstart_bss;
529 #endif
530
531 #ifdef CONFIG_80211D
532 u8 update_channel_plan_by_ap_done;
533 #endif
534 /* recv_decache check for Action_public frame */
535 u8 action_public_dialog_token;
536 u16 action_public_rxseq;
537
538 /* #ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK */
539 u8 active_keep_alive_check;
540 /* #endif */
541 #ifdef DBG_FIXED_CHAN
542 u8 fixed_chan;
543 #endif
544
545 u8 tsf_update_required:1;
546 u8 en_hw_update_tsf:1; /* set hw sync bcn tsf register or not */
547 systime tsf_update_pause_stime;
548 u8 tsf_update_pause_factor; /* num of bcn intervals to stay TSF update pause status */
549 u8 tsf_update_restore_factor; /* num of bcn interval to stay TSF update restore status */
550 #ifdef CONFIG_SUPPORT_STATIC_SMPS
551 u8 ssmps_en;
552 u16 ssmps_tx_tp_th;/*Mbps*/
553 u16 ssmps_rx_tp_th;/*Mbps*/
554 #ifdef DBG_STATIC_SMPS
555 u8 ssmps_test;
556 u8 ssmps_test_en;
557 #endif
558 #endif
559 #ifdef CONFIG_CTRL_TXSS_BY_TP
560 u8 txss_ctrl_en;
561 u16 txss_tp_th;/*Mbps*/
562 u8 txss_tp_chk_cnt;/*unit 2s*/
563 bool txss_1ss;
564 u8 txss_momi_type_bk;
565 #endif
566 #ifdef CONFIG_DFS
567 _timer csa_timer;
568 #endif /* CONFIG_DFS */
569 };
570
571 struct support_rate_handler {
572 u8 rate;
573 bool basic;
574 bool existence;
575 };
576
check_mlmeinfo_state(struct mlme_ext_priv * plmeext,sint state)577 static inline u8 check_mlmeinfo_state(struct mlme_ext_priv *plmeext, sint state)
578 {
579 if ((plmeext->mlmext_info.state & 0x03) == state)
580 return _TRUE;
581
582 return _FALSE;
583 }
584
585 void sitesurvey_set_offch_state(_adapter *adapter, u8 scan_state);
586
587 #define mlmeext_msr(mlmeext) ((mlmeext)->mlmext_info.state & 0x03)
588 #define mlmeext_scan_state(mlmeext) ((mlmeext)->sitesurvey_res.state)
589 #define mlmeext_scan_state_str(mlmeext) scan_state_str((mlmeext)->sitesurvey_res.state)
590 #define mlmeext_chk_scan_state(mlmeext, _state) ((mlmeext)->sitesurvey_res.state == (_state))
591 #define mlmeext_set_scan_state(mlmeext, _state) \
592 do { \
593 ((mlmeext)->sitesurvey_res.state = (_state)); \
594 ((mlmeext)->sitesurvey_res.next_state = (_state)); \
595 rtw_mi_update_iface_status(&((container_of(mlmeext, _adapter, mlmeextpriv)->mlmepriv)), 0); \
596 /* RTW_INFO("set_scan_state:%s\n", scan_state_str(_state)); */ \
597 sitesurvey_set_offch_state(container_of(mlmeext, _adapter, mlmeextpriv), _state); \
598 } while (0)
599
600 #define mlmeext_scan_next_state(mlmeext) ((mlmeext)->sitesurvey_res.next_state)
601 #define mlmeext_set_scan_next_state(mlmeext, _state) \
602 do { \
603 ((mlmeext)->sitesurvey_res.next_state = (_state)); \
604 /* RTW_INFO("set_scan_next_state:%s\n", scan_state_str(_state)); */ \
605 } while (0)
606
607 #ifdef CONFIG_SCAN_BACKOP
608 #define mlmeext_scan_backop_flags(mlmeext) ((mlmeext)->sitesurvey_res.backop_flags)
609 #define mlmeext_chk_scan_backop_flags(mlmeext, flags) ((mlmeext)->sitesurvey_res.backop_flags & (flags))
610 #define mlmeext_assign_scan_backop_flags(mlmeext, flags) \
611 do { \
612 ((mlmeext)->sitesurvey_res.backop_flags = (flags)); \
613 RTW_INFO("assign_scan_backop_flags:0x%02x\n", (mlmeext)->sitesurvey_res.backop_flags); \
614 } while (0)
615
616 #define mlmeext_scan_backop_flags_sta(mlmeext) ((mlmeext)->sitesurvey_res.backop_flags_sta)
617 #define mlmeext_chk_scan_backop_flags_sta(mlmeext, flags) ((mlmeext)->sitesurvey_res.backop_flags_sta & (flags))
618 #define mlmeext_assign_scan_backop_flags_sta(mlmeext, flags) \
619 do { \
620 ((mlmeext)->sitesurvey_res.backop_flags_sta = (flags)); \
621 } while (0)
622 #else
623 #define mlmeext_scan_backop_flags(mlmeext) (0)
624 #define mlmeext_chk_scan_backop_flags(mlmeext, flags) (0)
625 #define mlmeext_assign_scan_backop_flags(mlmeext, flags) do {} while (0)
626
627 #define mlmeext_scan_backop_flags_sta(mlmeext) (0)
628 #define mlmeext_chk_scan_backop_flags_sta(mlmeext, flags) (0)
629 #define mlmeext_assign_scan_backop_flags_sta(mlmeext, flags) do {} while (0)
630 #endif /* CONFIG_SCAN_BACKOP */
631
632 #if defined(CONFIG_SCAN_BACKOP) && defined(CONFIG_AP_MODE)
633 #define mlmeext_scan_backop_flags_ap(mlmeext) ((mlmeext)->sitesurvey_res.backop_flags_ap)
634 #define mlmeext_chk_scan_backop_flags_ap(mlmeext, flags) ((mlmeext)->sitesurvey_res.backop_flags_ap & (flags))
635 #define mlmeext_assign_scan_backop_flags_ap(mlmeext, flags) \
636 do { \
637 ((mlmeext)->sitesurvey_res.backop_flags_ap = (flags)); \
638 } while (0)
639 #else
640 #define mlmeext_scan_backop_flags_ap(mlmeext) (0)
641 #define mlmeext_chk_scan_backop_flags_ap(mlmeext, flags) (0)
642 #define mlmeext_assign_scan_backop_flags_ap(mlmeext, flags) do {} while (0)
643 #endif /* defined(CONFIG_SCAN_BACKOP) && defined(CONFIG_AP_MODE) */
644
645 #if defined(CONFIG_SCAN_BACKOP) && defined(CONFIG_RTW_MESH)
646 #define mlmeext_scan_backop_flags_mesh(mlmeext) ((mlmeext)->sitesurvey_res.backop_flags_mesh)
647 #define mlmeext_chk_scan_backop_flags_mesh(mlmeext, flags) ((mlmeext)->sitesurvey_res.backop_flags_mesh & (flags))
648 #define mlmeext_assign_scan_backop_flags_mesh(mlmeext, flags) \
649 do { \
650 ((mlmeext)->sitesurvey_res.backop_flags_mesh = (flags)); \
651 } while (0)
652 #else
653 #define mlmeext_scan_backop_flags_mesh(mlmeext) (0)
654 #define mlmeext_chk_scan_backop_flags_mesh(mlmeext, flags) (0)
655 #define mlmeext_assign_scan_backop_flags_mesh(mlmeext, flags) do {} while (0)
656 #endif /* defined(CONFIG_SCAN_BACKOP) && defined(CONFIG_RTW_MESH) */
657
658 u32 rtw_scan_timeout_decision(_adapter *padapter);
659
660 void init_mlme_default_rate_set(_adapter *padapter);
661 int init_mlme_ext_priv(_adapter *padapter);
662 int init_hw_mlme_ext(_adapter *padapter);
663 void free_mlme_ext_priv(struct mlme_ext_priv *pmlmeext);
664 extern struct xmit_frame *alloc_mgtxmitframe(struct xmit_priv *pxmitpriv);
665 struct xmit_frame *alloc_mgtxmitframe_once(struct xmit_priv *pxmitpriv);
666
667 /* void fill_fwpriv(_adapter * padapter, struct fw_priv *pfwpriv); */
668 u8 judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen);
669 void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len);
670 void set_mcs_rate_by_mask(u8 *mcs_set, u32 mask);
671 void UpdateBrateTbl(_adapter *padapter, u8 *mBratesOS);
672 void UpdateBrateTblForSoftAP(u8 *bssrateset, u32 bssratelen);
673 void change_band_update_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 ch);
674
675 void Set_MSR(_adapter *padapter, u8 type);
676
677 void rtw_set_external_auth_status(_adapter *padapter, const void *data, int len);
678
679 u8 rtw_get_oper_ch(_adapter *adapter);
680 void rtw_set_oper_ch(_adapter *adapter, u8 ch);
681 u8 rtw_get_oper_bw(_adapter *adapter);
682 void rtw_set_oper_bw(_adapter *adapter, u8 bw);
683 u8 rtw_get_oper_choffset(_adapter *adapter);
684 void rtw_set_oper_choffset(_adapter *adapter, u8 offset);
685 systime rtw_get_on_oper_ch_time(_adapter *adapter);
686 systime rtw_get_on_cur_ch_time(_adapter *adapter);
687
688 void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode);
689
690 void csa_timer_hdl(void *FunctionContext);
691
692 unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval);
693
694 void _clear_cam_entry(_adapter *padapter, u8 entry);
695 void write_cam_from_cache(_adapter *adapter, u8 id);
696 void rtw_sec_cam_swap(_adapter *adapter, u8 cam_id_a, u8 cam_id_b);
697 void rtw_clean_dk_section(_adapter *adapter);
698 void rtw_clean_hw_dk_cam(_adapter *adapter);
699
700 /* modify both HW and cache */
701 void write_cam(_adapter *padapter, u8 id, u16 ctrl, u8 *mac, u8 *key);
702 void clear_cam_entry(_adapter *padapter, u8 id);
703
704 /* modify cache only */
705 void write_cam_cache(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key);
706 void clear_cam_cache(_adapter *adapter, u8 id);
707
708 void invalidate_cam_all(_adapter *padapter);
709
710 void flush_all_cam_entry(_adapter *padapter);
711
712 BOOLEAN IsLegal5GChannel(PADAPTER Adapter, u8 channel);
713
714 void site_survey(_adapter *padapter, u8 survey_channel, RT_SCAN_TYPE ScanType);
715 u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSID_EX *bssid);
716 void update_network(WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src, _adapter *padapter, bool update_ie);
717
718 u8 *get_my_bssid(WLAN_BSSID_EX *pnetwork);
719 u16 get_beacon_interval(WLAN_BSSID_EX *bss);
720
721 int is_client_associated_to_ap(_adapter *padapter);
722 int is_client_associated_to_ibss(_adapter *padapter);
723 int is_IBSS_empty(_adapter *padapter);
724
725 unsigned char check_assoc_AP(u8 *pframe, uint len);
726 void get_assoc_AP_Vendor(char *vendor, u8 assoc_AP_vendor);
727 #ifdef CONFIG_RTS_FULL_BW
728 void rtw_parse_sta_vendor_ie_8812(_adapter *adapter, struct sta_info *sta, u8 *tlv_ies, u16 tlv_ies_len);
729 #endif/*CONFIG_RTS_FULL_BW*/
730 #ifdef CONFIG_80211AC_VHT
731 void get_vht_bf_cap(u8 *pframe, uint len, struct vht_bf_cap *bf_cap);
732 #endif
733
734 int WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
735 #ifdef CONFIG_WFD
736 void rtw_process_wfd_ie(_adapter *adapter, u8 *ie, u8 ie_len, const char *tag);
737 void rtw_process_wfd_ies(_adapter *adapter, u8 *ies, u8 ies_len, const char *tag);
738 #endif
739 void WMMOnAssocRsp(_adapter *padapter);
740 #ifdef CONFIG_RTW_TOKEN_BASED_XMIT
741 u8 rtw_is_tbtx_capabilty(u8 *p, u8 len);
742 #endif
743
744 void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
745 #ifdef ROKU_PRIVATE
746 void HT_caps_handler_infra_ap(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
747 #endif
748 void HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
749 void HTOnAssocRsp(_adapter *padapter);
750
751 #ifdef ROKU_PRIVATE
752 void Supported_rate_infra_ap(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
753 void Extended_Supported_rate_infra_ap(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
754 #endif
755
756 void ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
757 void VCS_update(_adapter *padapter, struct sta_info *psta);
758 void update_ldpc_stbc_cap(struct sta_info *psta);
759
760 bool rtw_validate_value(u16 EID, u8 *p, u16 len);
761 bool is_hidden_ssid(char *ssid, int len);
762 bool hidden_ssid_ap(WLAN_BSSID_EX *snetwork);
763 void rtw_absorb_ssid_ifneed(_adapter *padapter, WLAN_BSSID_EX *bssid, u8 *pframe);
764
765 int rtw_get_bcn_keys(_adapter *adapter, u8 *whdr, u32 flen, struct beacon_keys *bcn_keys);
766 int rtw_get_bcn_keys_from_bss(WLAN_BSSID_EX *bss, struct beacon_keys *bcn_keys);
767 int rtw_update_bcn_keys_of_network(struct wlan_network *network);
768
769 int validate_beacon_len(u8 *pframe, uint len);
770 void rtw_dump_bcn_keys(void *sel, struct beacon_keys *recv_beacon);
771 void rtw_bcn_key_err_fix(struct beacon_keys *cur, struct beacon_keys *recv);
772 bool rtw_bcn_key_compare(struct beacon_keys *cur, struct beacon_keys *recv);
773 int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len);
774 void update_beacon_info(_adapter *padapter, u8 *pframe, uint len, struct sta_info *psta);
775 #if CONFIG_DFS
776 void process_csa_ie(_adapter *padapter, u8 *ies, uint ies_len);
777 #endif
778 void update_capinfo(PADAPTER Adapter, u16 updateCap);
779 void update_wireless_mode(_adapter *padapter);
780 void update_tx_basic_rate(_adapter *padapter, u8 modulation);
781 void update_sta_basic_rate(struct sta_info *psta, u8 wireless_mode);
782 int rtw_ies_get_supported_rate(u8 *ies, uint ies_len, u8 *rate_set, u8 *rate_num);
783
784 /* for sta/adhoc mode */
785 void update_sta_info(_adapter *padapter, struct sta_info *psta);
786 unsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz);
787 unsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz);
788 void Update_RA_Entry(_adapter *padapter, struct sta_info *psta);
789 void set_sta_rate(_adapter *padapter, struct sta_info *psta);
790
791 unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason, u8 locally_generated);
792
793 unsigned char get_highest_rate_idx(u64 mask);
794 unsigned char get_lowest_rate_idx_ex(u64 mask, int start_bit);
795 #define get_lowest_rate_idx(mask) get_lowest_rate_idx_ex(mask, 0)
796
797 int support_short_GI(_adapter *padapter, struct HT_caps_element *pHT_caps, u8 bwmode);
798 unsigned int is_ap_in_tkip(_adapter *padapter);
799 unsigned int is_ap_in_wep(_adapter *padapter);
800 unsigned int should_forbid_n_rate(_adapter *padapter);
801
802 enum eap_type parsing_eapol_packet(_adapter *padapter, u8 *key_payload, struct sta_info *psta, u8 trx_type);
803
804 bool _rtw_camctl_chk_cap(_adapter *adapter, u8 cap);
805 void _rtw_camctl_set_flags(_adapter *adapter, u32 flags);
806 void rtw_camctl_set_flags(_adapter *adapter, u32 flags);
807 void _rtw_camctl_clr_flags(_adapter *adapter, u32 flags);
808 void rtw_camctl_clr_flags(_adapter *adapter, u32 flags);
809 bool _rtw_camctl_chk_flags(_adapter *adapter, u32 flags);
810
811 struct sec_cam_bmp;
812 void dump_sec_cam_map(void *sel, struct sec_cam_bmp *map, u8 max_num);
813 void rtw_sec_cam_map_set(struct sec_cam_bmp *map, u8 id);
814 void rtw_sec_cam_map_clr_all(struct sec_cam_bmp *map);
815
816 bool _rtw_camid_is_gk(_adapter *adapter, u8 cam_id);
817 bool rtw_camid_is_gk(_adapter *adapter, u8 cam_id);
818 s16 rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid, s8 gk);
819 s16 rtw_camid_alloc(_adapter *adapter, struct sta_info *sta, u8 kid, u8 gk, bool ext_sec, bool *used);
820 void rtw_camid_free(_adapter *adapter, u8 cam_id);
821 u8 rtw_get_sec_camid(_adapter *adapter, u8 max_bk_key_num, u8 *sec_key_id);
822
823 struct macid_bmp;
824 struct macid_ctl_t;
825 bool _rtw_macid_ctl_chk_cap(_adapter *adapter, u8 cap);
826 void dump_macid_map(void *sel, struct macid_bmp *map, u8 max_num);
827 bool rtw_macid_is_set(struct macid_bmp *map, u8 id);
828 void rtw_macid_map_clr(struct macid_bmp *map, u8 id);
829 bool rtw_macid_is_used(struct macid_ctl_t *macid_ctl, u8 id);
830 bool rtw_macid_is_bmc(struct macid_ctl_t *macid_ctl, u8 id);
831 u8 rtw_macid_get_iface_bmp(struct macid_ctl_t *macid_ctl, u8 id);
832 bool rtw_macid_is_iface_shared(struct macid_ctl_t *macid_ctl, u8 id);
833 bool rtw_macid_is_iface_specific(struct macid_ctl_t *macid_ctl, u8 id, _adapter *adapter);
834 s8 rtw_macid_get_ch_g(struct macid_ctl_t *macid_ctl, u8 id);
835 void rtw_alloc_macid(_adapter *padapter, struct sta_info *psta);
836 void rtw_release_macid(_adapter *padapter, struct sta_info *psta);
837 u8 rtw_search_max_mac_id(_adapter *padapter);
838 u8 rtw_macid_ctl_set_h2c_msr(struct macid_ctl_t *macid_ctl, u8 id, u8 h2c_msr);
839 void rtw_macid_ctl_set_bw(struct macid_ctl_t *macid_ctl, u8 id, u8 bw);
840 void rtw_macid_ctl_set_vht_en(struct macid_ctl_t *macid_ctl, u8 id, u8 en);
841 void rtw_macid_ctl_set_rate_bmp0(struct macid_ctl_t *macid_ctl, u8 id, u32 bmp);
842 void rtw_macid_ctl_set_rate_bmp1(struct macid_ctl_t *macid_ctl, u8 id, u32 bmp);
843 #ifdef CONFIG_PROTSEL_MACSLEEP
844 void rtw_macid_ctl_init_sleep_reg(struct macid_ctl_t *macid_ctl, u16 reg_ctrl, u16 reg_info);
845 void rtw_macid_ctl_init_drop_reg(struct macid_ctl_t *macid_ctl, u16 reg_ctrl, u16 reg_info);
846 #else
847 void rtw_macid_ctl_init_sleep_reg(struct macid_ctl_t *macid_ctl, u16 m0, u16 m1, u16 m2, u16 m3);
848 void rtw_macid_ctl_init_drop_reg(struct macid_ctl_t *macid_ctl, u16 m0, u16 m1, u16 m2, u16 m3);
849 #endif
850 void rtw_macid_ctl_init(struct macid_ctl_t *macid_ctl);
851 void rtw_macid_ctl_deinit(struct macid_ctl_t *macid_ctl);
852 u8 rtw_iface_bcmc_id_get(_adapter *padapter);
853 void rtw_iface_bcmc_id_set(_adapter *padapter, u8 mac_id);
854 #if defined(DBG_CONFIG_ERROR_RESET) && defined(CONFIG_CONCURRENT_MODE)
855 void rtw_iface_bcmc_sec_cam_map_restore(_adapter *adapter);
856 #endif
857 bool rtw_bmp_is_set(const u8 *bmp, u8 bmp_len, u8 id);
858 void rtw_bmp_set(u8 *bmp, u8 bmp_len, u8 id);
859 void rtw_bmp_clear(u8 *bmp, u8 bmp_len, u8 id);
860 bool rtw_bmp_not_empty(const u8 *bmp, u8 bmp_len);
861 bool rtw_bmp_not_empty_exclude_bit0(const u8 *bmp, u8 bmp_len);
862
863 #ifdef CONFIG_AP_MODE
864 bool rtw_tim_map_is_set(_adapter *padapter, const u8 *map, u8 id);
865 void rtw_tim_map_set(_adapter *padapter, u8 *map, u8 id);
866 void rtw_tim_map_clear(_adapter *padapter, u8 *map, u8 id);
867 bool rtw_tim_map_anyone_be_set(_adapter *padapter, const u8 *map);
868 bool rtw_tim_map_anyone_be_set_exclude_aid0(_adapter *padapter, const u8 *map);
869 #endif /* CONFIG_AP_MODE */
870
871 u32 report_join_res(_adapter *padapter, int aid_res, u16 status);
872 void report_survey_event(_adapter *padapter, union recv_frame *precv_frame);
873 void report_surveydone_event(_adapter *padapter, bool acs);
874 u32 report_del_sta_event(_adapter *padapter, unsigned char *MacAddr, unsigned short reason, bool enqueue, u8 locally_generated);
875 void report_add_sta_event(_adapter *padapter, unsigned char *MacAddr);
876 bool rtw_port_switch_chk(_adapter *adapter);
877 void report_wmm_edca_update(_adapter *padapter);
878
879 void beacon_timing_control(_adapter *padapter);
880 u8 chk_bmc_sleepq_cmd(_adapter *padapter);
881 extern u8 set_tx_beacon_cmd(_adapter *padapter, u8 flags);
882 unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame);
883 void update_mgnt_tx_rate(_adapter *padapter, u8 rate);
884 void update_monitor_frame_attrib(_adapter *padapter, struct pkt_attrib *pattrib);
885 void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib);
886 void update_mgntframe_attrib_addr(_adapter *padapter, struct xmit_frame *pmgntframe);
887 void dump_mgntframe(_adapter *padapter, struct xmit_frame *pmgntframe);
888 s32 dump_mgntframe_and_wait(_adapter *padapter, struct xmit_frame *pmgntframe, int timeout_ms);
889 s32 dump_mgntframe_and_wait_ack(_adapter *padapter, struct xmit_frame *pmgntframe);
890 s32 dump_mgntframe_and_wait_ack_timeout(_adapter *padapter, struct xmit_frame *pmgntframe, int timeout_ms);
891
892 #ifdef CONFIG_P2P
893 int get_reg_classes_full_count(struct p2p_channels *channel_list);
894 void issue_probersp_p2p(_adapter *padapter, unsigned char *da);
895 void issue_p2p_provision_request(_adapter *padapter, u8 *pssid, u8 ussidlen, u8 *pdev_raddr);
896 void issue_p2p_GO_request(_adapter *padapter, u8 *raddr);
897 void issue_probereq_p2p(_adapter *padapter, u8 *da);
898 int issue_probereq_p2p_ex(_adapter *adapter, u8 *da, int try_cnt, int wait_ms);
899 void issue_p2p_invitation_response(_adapter *padapter, u8 *raddr, u8 dialogToken, u8 success);
900 void issue_p2p_invitation_request(_adapter *padapter, u8 *raddr);
901 #endif /* CONFIG_P2P */
902 void issue_beacon(_adapter *padapter, int timeout_ms);
903 void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probereq);
904 void _issue_assocreq(_adapter *padapter, u8 is_assoc);
905 void issue_assocreq(_adapter *padapter);
906 void issue_reassocreq(_adapter *padapter);
907 void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *pstat, int pkt_type);
908 void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status);
909 void issue_probereq(_adapter *padapter, const NDIS_802_11_SSID *pssid, const u8 *da);
910 s32 issue_probereq_ex(_adapter *padapter, const NDIS_802_11_SSID *pssid, const u8 *da, u8 ch, bool append_wps, int try_cnt, int wait_ms);
911 int issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms);
912 int issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid, u8 ps, int try_cnt, int wait_ms);
913 int issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason);
914 int issue_deauth_ex(_adapter *padapter, u8 *da, unsigned short reason, int try_cnt, int wait_ms);
915 void issue_action_spct_ch_switch(_adapter *padapter, u8 *ra, u8 new_ch, u8 ch_offset);
916 void issue_addba_req(_adapter *adapter, unsigned char *ra, u8 tid);
917 void issue_addba_rsp(_adapter *adapter, unsigned char *ra, u8 tid, u16 status, u8 size);
918 u8 issue_addba_rsp_wait_ack(_adapter *adapter, unsigned char *ra, u8 tid, u16 status, u8 size, int try_cnt, int wait_ms);
919 void issue_del_ba(_adapter *adapter, unsigned char *ra, u8 tid, u16 reason, u8 initiator);
920 int issue_del_ba_ex(_adapter *adapter, unsigned char *ra, u8 tid, u16 reason, u8 initiator, int try_cnt, int wait_ms);
921 void issue_action_BSSCoexistPacket(_adapter *padapter);
922
923 #ifdef CONFIG_IEEE80211W
924 void issue_action_SA_Query(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short tid, u8 key_type);
925 int issue_deauth_11w(_adapter *padapter, unsigned char *da, unsigned short reason, u8 key_type);
926 #endif /* CONFIG_IEEE80211W */
927 int issue_action_SM_PS(_adapter *padapter , unsigned char *raddr , u8 NewMimoPsMode);
928 int issue_action_SM_PS_wait_ack(_adapter *padapter, unsigned char *raddr, u8 NewMimoPsMode, int try_cnt, int wait_ms);
929
930 unsigned int send_delba_sta_tid(_adapter *adapter, u8 initiator, struct sta_info *sta, u8 tid, u8 force);
931 unsigned int send_delba_sta_tid_wait_ack(_adapter *adapter, u8 initiator, struct sta_info *sta, u8 tid, u8 force);
932
933 unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr);
934 #ifdef CONFIG_AP_MODE
935 unsigned int send_beacon(_adapter *padapter);
936 #endif
937 void start_clnt_assoc(_adapter *padapter);
938 void start_clnt_auth(_adapter *padapter);
939 void start_clnt_join(_adapter *padapter);
940 void start_create_ibss(_adapter *padapter);
941
942 #if defined(CONFIG_LAYER2_ROAMING) && defined(CONFIG_RTW_80211K)
943 void rtw_roam_nb_discover(_adapter *padapter, u8 bfroce);
944 #endif
945
946 unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame);
947 unsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame);
948 unsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame);
949 unsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame);
950 unsigned int DoReserved(_adapter *padapter, union recv_frame *precv_frame);
951 unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame);
952 unsigned int OnAtim(_adapter *padapter, union recv_frame *precv_frame);
953 unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame);
954 unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame);
955 unsigned int OnAuthClient(_adapter *padapter, union recv_frame *precv_frame);
956 unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame);
957 unsigned int OnAction(_adapter *padapter, union recv_frame *precv_frame);
958
959 unsigned int on_action_spct(_adapter *padapter, union recv_frame *precv_frame);
960 unsigned int OnAction_qos(_adapter *padapter, union recv_frame *precv_frame);
961 unsigned int OnAction_dls(_adapter *padapter, union recv_frame *precv_frame);
962 #ifdef CONFIG_RTW_WNM
963 unsigned int on_action_wnm(_adapter *adapter, union recv_frame *rframe);
964 #endif
965
966 #define RX_AMPDU_ACCEPT_INVALID 0xFF
967 #define RX_AMPDU_SIZE_INVALID 0xFF
968
969 enum rx_ampdu_reason {
970 RX_AMPDU_DRV_FIXED = 1,
971 RX_AMPDU_BTCOEX = 2, /* not used, because BTCOEX has its own variable management */
972 RX_AMPDU_DRV_SCAN = 3,
973 };
974 u8 rtw_rx_ampdu_size(_adapter *adapter);
975 bool rtw_rx_ampdu_is_accept(_adapter *adapter);
976 bool rtw_rx_ampdu_set_size(_adapter *adapter, u8 size, u8 reason);
977 bool rtw_rx_ampdu_set_accept(_adapter *adapter, u8 accept, u8 reason);
978 u8 rx_ampdu_apply_sta_tid(_adapter *adapter, struct sta_info *sta, u8 tid, u8 accept, u8 size);
979 u8 rx_ampdu_size_sta_limit(_adapter *adapter, struct sta_info *sta);
980 u8 rx_ampdu_apply_sta(_adapter *adapter, struct sta_info *sta, u8 accept, u8 size);
981 u16 rtw_rx_ampdu_apply(_adapter *adapter);
982
983 unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame);
984 unsigned int on_action_public(_adapter *padapter, union recv_frame *precv_frame);
985 unsigned int OnAction_ft(_adapter *padapter, union recv_frame *precv_frame);
986 unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame);
987 #ifdef CONFIG_IEEE80211W
988 unsigned int OnAction_sa_query(_adapter *padapter, union recv_frame *precv_frame);
989 #endif /* CONFIG_IEEE80211W */
990 unsigned int on_action_rm(_adapter *padapter, union recv_frame *precv_frame);
991 unsigned int OnAction_wmm(_adapter *padapter, union recv_frame *precv_frame);
992 unsigned int OnAction_vht(_adapter *padapter, union recv_frame *precv_frame);
993 unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame);
994 #ifdef CONFIG_RTW_TOKEN_BASED_XMIT
995 unsigned int OnAction_tbtx_token(_adapter *padapter, union recv_frame *precv_frame);
996 #endif
997
998 #ifdef CONFIG_RTW_TOKEN_BASED_XMIT
999 void rtw_issue_action_token_req(_adapter *padapter, struct sta_info *pstat);
1000 void rtw_issue_action_token_rel(_adapter *padapter);
1001 #endif
1002
1003 void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res);
1004 void mlmeext_sta_del_event_callback(_adapter *padapter);
1005 void mlmeext_sta_add_event_callback(_adapter *padapter, struct sta_info *psta);
1006
1007 int rtw_get_rx_chk_limit(_adapter *adapter);
1008 void rtw_set_rx_chk_limit(_adapter *adapter, int limit);
1009 void linked_status_chk(_adapter *padapter, u8 from_timer);
1010
1011 #define rtw_get_bcn_cnt(adapter) (adapter->mlmeextpriv.cur_bcn_cnt)
1012 #define rtw_get_bcn_dtim_period(adapter) (adapter->mlmeextpriv.dtim)
1013 void rtw_collect_bcn_info(_adapter *adapter);
1014
1015 void _linked_info_dump(_adapter *padapter);
1016
1017 void survey_timer_hdl(void *ctx);
1018 #ifdef CONFIG_RTW_REPEATER_SON
1019 void rson_timer_hdl(void *ctx);
1020 #endif
1021 void link_timer_hdl(void *ctx);
1022 void addba_timer_hdl(void *ctx);
1023 #ifdef CONFIG_RTW_TOKEN_BASED_XMIT
1024 void rtw_tbtx_xmit_timer_hdl(void *ctx);
1025 void rtw_tbtx_token_dispatch_timer_hdl(void *ctx);
1026 #endif
1027 #ifdef CONFIG_IEEE80211W
1028 void sa_query_timer_hdl(void *ctx);
1029 #endif /* CONFIG_IEEE80211W */
1030 #if 0
1031 void reauth_timer_hdl(_adapter *padapter);
1032 void reassoc_timer_hdl(_adapter *padapter);
1033 #endif
1034
1035 #define set_survey_timer(mlmeext, ms) \
1036 do { \
1037 /*RTW_INFO("%s set_survey_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms));*/ \
1038 _set_timer(&(mlmeext)->survey_timer, (ms)); \
1039 } while (0)
1040
1041 #define set_link_timer(mlmeext, ms) \
1042 do { \
1043 /*RTW_INFO("%s set_link_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms));*/ \
1044 _set_timer(&(mlmeext)->link_timer, (ms)); \
1045 } while (0)
1046
1047 bool rtw_is_cck_rate(u8 rate);
1048 bool rtw_is_ofdm_rate(u8 rate);
1049 bool rtw_is_basic_rate_cck(u8 rate);
1050 bool rtw_is_basic_rate_ofdm(u8 rate);
1051 bool rtw_is_basic_rate_mix(u8 rate);
1052
1053 extern int cckrates_included(unsigned char *rate, int ratelen);
1054 extern int cckratesonly_included(unsigned char *rate, int ratelen);
1055
1056 extern void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr);
1057
1058 extern void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len);
1059 extern void correct_TSF(_adapter *padapter, u8 mlme_state);
1060 #ifdef CONFIG_BCN_RECV_TIME
1061 void rtw_rx_bcn_time_update(_adapter *adapter, uint bcn_len, u8 data_rate);
1062 #endif
1063 extern u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer);
1064
1065 void rtw_process_bar_frame(_adapter *padapter, union recv_frame *precv_frame);
1066 void rtw_join_done_chk_ch(_adapter *padapter, int join_res);
1067
1068 int rtw_chk_start_clnt_join(_adapter *padapter, u8 *ch, u8 *bw, u8 *offset);
1069
1070 #ifdef RTW_BUSY_DENY_SCAN
1071 #ifndef BUSY_TRAFFIC_SCAN_DENY_PERIOD
1072 #ifdef CONFIG_RTW_ANDROID
1073 #ifdef CONFIG_PLATFORM_ARM_SUN8I
1074 #define BUSY_TRAFFIC_SCAN_DENY_PERIOD 8000
1075 #else
1076 #define BUSY_TRAFFIC_SCAN_DENY_PERIOD 12000
1077 #endif
1078 #else /* !CONFIG_ANDROID */
1079 #define BUSY_TRAFFIC_SCAN_DENY_PERIOD 16000
1080 #endif /* !CONFIG_ANDROID */
1081 #endif /* !BUSY_TRAFFIC_SCAN_DENY_PERIOD */
1082 #endif /* RTW_BUSY_DENY_SCAN */
1083
1084 void rtw_leave_opch(_adapter *adapter);
1085 void rtw_back_opch(_adapter *adapter);
1086
1087 u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf);
1088 u8 disconnect_hdl(_adapter *padapter, u8 *pbuf);
1089 u8 createbss_hdl(_adapter *padapter, u8 *pbuf);
1090 #ifdef CONFIG_AP_MODE
1091 u8 stop_ap_hdl(_adapter *adapter);
1092 #endif
1093 #ifdef CONFIG_RTW_TOKEN_BASED_XMIT
1094 u8 tx_control_hdl(_adapter *adapter);
1095 #endif
1096 u8 setopmode_hdl(_adapter *padapter, u8 *pbuf);
1097 u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf);
1098 u8 setauth_hdl(_adapter *padapter, u8 *pbuf);
1099 u8 setkey_hdl(_adapter *padapter, u8 *pbuf);
1100 u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf);
1101 u8 set_assocsta_hdl(_adapter *padapter, u8 *pbuf);
1102 u8 del_assocsta_hdl(_adapter *padapter, u8 *pbuf);
1103 u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf);
1104 u8 add_ba_rsp_hdl(_adapter *padapter, unsigned char *pbuf);
1105
1106 void rtw_ap_wep_pk_setting(_adapter *adapter, struct sta_info *psta);
1107
1108 u8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf);
1109 u8 chk_bmc_sleepq_hdl(_adapter *padapter, unsigned char *pbuf);
1110 u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf);
1111 u8 rtw_set_chbw_hdl(_adapter *padapter, u8 *pbuf);
1112 u8 rtw_iqk_hdl(_adapter *padapter, unsigned char *pbuf);
1113 u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf);
1114 u8 led_blink_hdl(_adapter *padapter, unsigned char *pbuf);
1115 u8 set_csa_hdl(_adapter *padapter, unsigned char *pbuf); /* Kurt: Handling DFS channel switch announcement ie. */
1116 u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf);
1117 u8 run_in_thread_hdl(_adapter *padapter, u8 *pbuf);
1118
1119 int rtw_sae_preprocess(_adapter *adapter, const u8 *buf, u32 len, u8 tx);
1120
1121 u32 rtw_desc_rate_to_bitrate(u8 bw, u8 rate_idx, u8 sgi);
1122
1123 #ifdef CONFIG_RTW_MULTI_AP
1124 void rtw_ch_util_rpt(_adapter *adapter);
1125 #endif
1126
1127 #define GEN_MLME_EXT_HANDLER(cmd, callback) {cmd, callback},
1128
1129 struct rtw_cmd {
1130 u8(*cmd_hdl)(_adapter *padapter, u8 *pbuf);
1131 void (*callback)(_adapter *padapter, struct cmd_obj *cmd);
1132 };
1133
1134 #ifdef _RTW_CMD_C_
1135 #ifdef CONFIG_RTW_MESH
1136 extern u8 rtw_mesh_set_plink_state_cmd_hdl(_adapter *adapter, u8 *parmbuf);
1137 #else
rtw_mesh_set_plink_state_cmd_hdl(_adapter * adapter,u8 * parmbuf)1138 u8 rtw_mesh_set_plink_state_cmd_hdl(_adapter *adapter, u8 *parmbuf) { return H2C_CMD_FAIL; };
1139 #endif
1140
1141 struct rtw_cmd wlancmds[] = {
1142 GEN_MLME_EXT_HANDLER(join_cmd_hdl, rtw_joinbss_cmd_callback) /*CMD_JOINBSS*/
1143 GEN_MLME_EXT_HANDLER(disconnect_hdl, rtw_disassoc_cmd_callback) /*CMD_DISCONNECT*/
1144 GEN_MLME_EXT_HANDLER(createbss_hdl, NULL) /*CMD_CREATE_BSS*/
1145 GEN_MLME_EXT_HANDLER(setopmode_hdl, NULL) /*CMD_SET_OPMODE*/
1146 GEN_MLME_EXT_HANDLER(sitesurvey_cmd_hdl, rtw_survey_cmd_callback) /*CMD_SITE_SURVEY*/
1147 GEN_MLME_EXT_HANDLER(setauth_hdl, NULL) /*CMD_SET_AUTH*/
1148 GEN_MLME_EXT_HANDLER(setkey_hdl, NULL) /*CMD_SET_KEY*/
1149 GEN_MLME_EXT_HANDLER(set_stakey_hdl, rtw_setstaKey_cmdrsp_callback) /*CMD_SET_STAKEY*/
1150 GEN_MLME_EXT_HANDLER(add_ba_hdl, NULL) /*CMD_ADD_BAREQ*/
1151 GEN_MLME_EXT_HANDLER(rtw_set_chbw_hdl, NULL) /*CMD_SET_CHANNEL*/
1152 GEN_MLME_EXT_HANDLER(tx_beacon_hdl, NULL) /*CMD_TX_BEACON*/
1153 GEN_MLME_EXT_HANDLER(mlme_evt_hdl, NULL) /*CMD_SET_MLME_EVT*/
1154 GEN_MLME_EXT_HANDLER(rtw_drvextra_cmd_hdl, NULL) /*CMD_SET_DRV_EXTRA*/
1155 GEN_MLME_EXT_HANDLER(set_chplan_hdl, NULL) /*CMD_SET_CHANPLAN*/
1156 GEN_MLME_EXT_HANDLER(led_blink_hdl, NULL) /*CMD_LEDBLINK*/
1157 GEN_MLME_EXT_HANDLER(set_csa_hdl, NULL) /*CMD_SET_CHANSWITCH*/
1158 GEN_MLME_EXT_HANDLER(tdls_hdl, NULL) /*CMD_TDLS*/
1159 GEN_MLME_EXT_HANDLER(chk_bmc_sleepq_hdl, NULL) /*CMD_CHK_BMCSLEEPQ*/
1160 GEN_MLME_EXT_HANDLER(run_in_thread_hdl, NULL) /*CMD_RUN_INTHREAD*/
1161 GEN_MLME_EXT_HANDLER(add_ba_rsp_hdl, NULL) /*CMD_ADD_BARSP*/
1162 GEN_MLME_EXT_HANDLER(rm_post_event_hdl, NULL) /*CMD_RM_POST_EVENT*/
1163 GEN_MLME_EXT_HANDLER(rtw_mesh_set_plink_state_cmd_hdl, NULL) /*CMD_SET_MESH_PLINK_STATE*/
1164 GEN_MLME_EXT_HANDLER(rtw_iqk_hdl, NULL) /*CMD_DO_IQK*/
1165 };
1166 #endif
1167
1168 struct rtw_evt_header {
1169 u8 id;
1170 u8 seq;
1171 u16 len;
1172 };
1173
1174 enum rtw_event_id {
1175 EVT_SURVEY, /*0*/
1176 EVT_SURVEY_DONE, /*1*/
1177 EVT_JOINBSS, /*2*/
1178 EVT_ADD_STA, /*3*/
1179 EVT_DEL_STA, /*4*/
1180 EVT_WMM_UPDATE, /*5*/
1181 #ifdef CONFIG_IEEE80211W
1182 EVT_TIMEOUT_STA, /*6*/
1183 #endif /* CONFIG_IEEE80211W */
1184 #ifdef CONFIG_RTW_80211R
1185 EVT_FT_REASSOC, /*7*/
1186 #endif
1187 EVT_ID_MAX
1188 };
1189 #ifdef _RTW_MLME_EXT_C_
1190 static struct rtw_event wlanevents[] = {
1191 {sizeof(struct survey_event), &rtw_survey_event_callback}, /*EVT_SURVEY*/
1192 {sizeof(struct surveydone_event), &rtw_surveydone_event_callback}, /*EVT_SURVEY_DONE*/
1193 {sizeof(struct joinbss_event), &rtw_joinbss_event_callback}, /*EVT_JOINBSS*/
1194 {sizeof(struct stassoc_event), &rtw_stassoc_event_callback}, /*EVT_ADD_STA*/
1195 {sizeof(struct stadel_event), &rtw_stadel_event_callback}, /*EVT_DEL_STA*/
1196 {sizeof(struct wmm_event), &rtw_wmm_event_callback}, /*EVT_WMM_UPDATE*/
1197 #ifdef CONFIG_IEEE80211W
1198 {sizeof(struct stadel_event), &rtw_sta_timeout_event_callback}, /*EVT_TIMEOUT_STA*/
1199 #endif /* CONFIG_IEEE80211W */
1200 #ifdef CONFIG_RTW_80211R
1201 {sizeof(struct stassoc_event), &rtw_ft_reassoc_event_callback}, /*EVT_FT_REASSOC*/
1202 #endif
1203 };
1204 #endif/* _RTW_MLME_EXT_C_ */
1205 #endif
1206