289 lines
9.4 KiB
C
Executable File
289 lines
9.4 KiB
C
Executable File
/******************************************************************************
|
|
*
|
|
* Copyright(c) 2007 - 2019 Realtek Corporation.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of version 2 of the GNU General Public License as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
*****************************************************************************/
|
|
#ifndef __RTW_SCAN_H_
|
|
#define __RTW_SCAN_H_
|
|
|
|
/*rtw_mlme.h*/
|
|
void rtw_drv_scan_by_self(_adapter *padapter, u8 reason);
|
|
void rtw_scan_abort_no_wait(_adapter *adapter);
|
|
u32 rtw_scan_abort(_adapter *adapter, u32 timeout_ms);
|
|
void rtw_scan_timeout_handler(void *ctx);
|
|
void rtw_survey_event_callback(_adapter *adapter, u8 *pbuf);
|
|
void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf);
|
|
|
|
enum {
|
|
SS_DENY_MP_MODE,
|
|
SS_DENY_RSON_SCANING,
|
|
SS_DENY_BLOCK_SCAN,
|
|
SS_DENY_BY_DRV,
|
|
SS_DENY_SELF_AP_UNDER_WPS,
|
|
SS_DENY_SELF_AP_UNDER_LINKING,
|
|
SS_DENY_SELF_AP_UNDER_SURVEY,
|
|
/*SS_DENY_SELF_STA_UNDER_WPS,*/
|
|
SS_DENY_SELF_STA_UNDER_LINKING,
|
|
SS_DENY_SELF_STA_UNDER_SURVEY,
|
|
SS_DENY_BUDDY_UNDER_LINK_WPS,
|
|
SS_DENY_BUDDY_UNDER_SURVEY,
|
|
SS_DENY_BUSY_TRAFFIC,
|
|
SS_ALLOW,
|
|
#ifdef DBG_LA_MODE
|
|
SS_DENY_LA_MODE,
|
|
#endif
|
|
SS_DENY_ADAPTIVITY,
|
|
};
|
|
u8 _rtw_sitesurvey_condition_check(const char *caller, _adapter *adapter, bool check_sc_interval);
|
|
#define rtw_sitesurvey_condition_check(adapter, check_sc_interval) _rtw_sitesurvey_condition_check(__func__, adapter, check_sc_interval)
|
|
|
|
#ifdef CONFIG_SET_SCAN_DENY_TIMER
|
|
bool rtw_is_scan_deny(_adapter *adapter);
|
|
void rtw_clear_scan_deny(_adapter *adapter);
|
|
void rtw_set_scan_deny_timer_hdl(void *ctx);
|
|
void rtw_set_scan_deny(_adapter *adapter, u32 ms);
|
|
#else
|
|
#define rtw_is_scan_deny(adapter) _FALSE
|
|
#define rtw_clear_scan_deny(adapter) do {} while (0)
|
|
#define rtw_set_scan_deny(adapter, ms) do {} while (0)
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTW_ACS
|
|
u8 rtw_set_acs_sitesurvey(_adapter *adapter);
|
|
#endif
|
|
|
|
/*rtw_mlme_ext.h*/
|
|
void sitesurvey_set_offch_state(_adapter *adapter, u8 scan_state);
|
|
|
|
/*const char *scan_state_str(u8 state);*/
|
|
#define mlmeext_scan_state(mlmeext) ((mlmeext)->sitesurvey_res.state)
|
|
/*#define mlmeext_scan_state_str(mlmeext) scan_state_str((mlmeext)->sitesurvey_res.state)*/
|
|
#define mlmeext_chk_scan_state(mlmeext, _state) ((mlmeext)->sitesurvey_res.state == (_state))
|
|
#define mlmeext_set_scan_state(mlmeext, _state) \
|
|
do { \
|
|
((mlmeext)->sitesurvey_res.state = (_state)); \
|
|
((mlmeext)->sitesurvey_res.next_state = (_state)); \
|
|
rtw_mi_update_iface_status(&((container_of(mlmeext, _adapter, mlmeextpriv)->mlmepriv)), 0); \
|
|
/* RTW_INFO("set_scan_state:%s\n", scan_state_str(_state)); */ \
|
|
sitesurvey_set_offch_state(container_of(mlmeext, _adapter, mlmeextpriv), _state); \
|
|
} while (0)
|
|
|
|
#if 0
|
|
#define mlmeext_scan_next_state(mlmeext) ((mlmeext)->sitesurvey_res.next_state)
|
|
#define mlmeext_set_scan_next_state(mlmeext, _state) \
|
|
do { \
|
|
((mlmeext)->sitesurvey_res.next_state = (_state)); \
|
|
/* RTW_INFO("set_scan_next_state:%s\n", scan_state_str(_state)); */ \
|
|
} while (0)
|
|
#endif
|
|
#ifdef CONFIG_SCAN_BACKOP
|
|
#define mlmeext_scan_backop_flags(mlmeext) ((mlmeext)->sitesurvey_res.backop_flags)
|
|
#define mlmeext_chk_scan_backop_flags(mlmeext, flags) ((mlmeext)->sitesurvey_res.backop_flags & (flags))
|
|
#define mlmeext_assign_scan_backop_flags(mlmeext, flags) \
|
|
do { \
|
|
((mlmeext)->sitesurvey_res.backop_flags = (flags)); \
|
|
RTW_INFO("assign_scan_backop_flags:0x%02x\n", (mlmeext)->sitesurvey_res.backop_flags); \
|
|
} while (0)
|
|
|
|
#define mlmeext_scan_backop_flags_sta(mlmeext) ((mlmeext)->sitesurvey_res.backop_flags_sta)
|
|
#define mlmeext_chk_scan_backop_flags_sta(mlmeext, flags) ((mlmeext)->sitesurvey_res.backop_flags_sta & (flags))
|
|
#define mlmeext_assign_scan_backop_flags_sta(mlmeext, flags) \
|
|
do { \
|
|
((mlmeext)->sitesurvey_res.backop_flags_sta = (flags)); \
|
|
} while (0)
|
|
#else
|
|
#define mlmeext_scan_backop_flags(mlmeext) (0)
|
|
#define mlmeext_chk_scan_backop_flags(mlmeext, flags) (0)
|
|
#define mlmeext_assign_scan_backop_flags(mlmeext, flags) do {} while (0)
|
|
|
|
#define mlmeext_scan_backop_flags_sta(mlmeext) (0)
|
|
#define mlmeext_chk_scan_backop_flags_sta(mlmeext, flags) (0)
|
|
#define mlmeext_assign_scan_backop_flags_sta(mlmeext, flags) do {} while (0)
|
|
#endif /* CONFIG_SCAN_BACKOP */
|
|
|
|
#if defined(CONFIG_SCAN_BACKOP) && defined(CONFIG_AP_MODE)
|
|
#define mlmeext_scan_backop_flags_ap(mlmeext) ((mlmeext)->sitesurvey_res.backop_flags_ap)
|
|
#define mlmeext_chk_scan_backop_flags_ap(mlmeext, flags) ((mlmeext)->sitesurvey_res.backop_flags_ap & (flags))
|
|
#define mlmeext_assign_scan_backop_flags_ap(mlmeext, flags) \
|
|
do { \
|
|
((mlmeext)->sitesurvey_res.backop_flags_ap = (flags)); \
|
|
} while (0)
|
|
#else
|
|
#define mlmeext_scan_backop_flags_ap(mlmeext) (0)
|
|
#define mlmeext_chk_scan_backop_flags_ap(mlmeext, flags) (0)
|
|
#define mlmeext_assign_scan_backop_flags_ap(mlmeext, flags) do {} while (0)
|
|
#endif /* defined(CONFIG_SCAN_BACKOP) && defined(CONFIG_AP_MODE) */
|
|
|
|
#if defined(CONFIG_SCAN_BACKOP) && defined(CONFIG_RTW_MESH)
|
|
#define mlmeext_scan_backop_flags_mesh(mlmeext) ((mlmeext)->sitesurvey_res.backop_flags_mesh)
|
|
#define mlmeext_chk_scan_backop_flags_mesh(mlmeext, flags) ((mlmeext)->sitesurvey_res.backop_flags_mesh & (flags))
|
|
#define mlmeext_assign_scan_backop_flags_mesh(mlmeext, flags) \
|
|
do { \
|
|
((mlmeext)->sitesurvey_res.backop_flags_mesh = (flags)); \
|
|
} while (0)
|
|
#else
|
|
#define mlmeext_scan_backop_flags_mesh(mlmeext) (0)
|
|
#define mlmeext_chk_scan_backop_flags_mesh(mlmeext, flags) (0)
|
|
#define mlmeext_assign_scan_backop_flags_mesh(mlmeext, flags) do {} while (0)
|
|
#endif /* defined(CONFIG_SCAN_BACKOP) && defined(CONFIG_RTW_MESH) */
|
|
|
|
#if 0
|
|
void survey_timer_hdl(void *ctx);
|
|
#define set_survey_timer(mlmeext, ms) \
|
|
do { \
|
|
/*RTW_INFO("%s set_survey_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms));*/ \
|
|
_set_timer(&(mlmeext)->survey_timer, (ms)); \
|
|
} while (0)
|
|
#define cancel_survey_timer(mlmeext) \
|
|
do { \
|
|
/*RTW_INFO("%s cancel_survey_timer(%p)\n", __FUNCTION__, (mlmeext));*/ \
|
|
_cancel_timer_ex(&(mlmeext)->survey_timer); \
|
|
} while (0)
|
|
#endif
|
|
|
|
enum SCAN_STATE {
|
|
SCAN_DISABLE = 0,
|
|
SCAN_START = 1,
|
|
SCAN_PS_ANNC_WAIT = 2,
|
|
SCAN_ENTER = 3,
|
|
SCAN_PROCESS = 4,
|
|
|
|
/* backop */
|
|
SCAN_BACKING_OP = 5,
|
|
SCAN_BACK_OP = 6,
|
|
SCAN_LEAVING_OP = 7,
|
|
SCAN_LEAVE_OP = 8,
|
|
|
|
/* SW antenna diversity (before linked) */
|
|
SCAN_SW_ANTDIV_BL = 9,
|
|
|
|
/* legacy p2p */
|
|
SCAN_TO_P2P_LISTEN = 10,
|
|
SCAN_P2P_LISTEN = 11,
|
|
|
|
SCAN_COMPLETE = 12,
|
|
SCAN_STATE_MAX,
|
|
};
|
|
|
|
|
|
enum ss_backop_flag {
|
|
SS_BACKOP_EN = BIT0, /* backop when linked */
|
|
SS_BACKOP_EN_NL = BIT1, /* backop even when no linked */
|
|
|
|
SS_BACKOP_PS_ANNC = BIT4,
|
|
SS_BACKOP_TX_RESUME = BIT5,
|
|
};
|
|
|
|
#define RTW_SSID_SCAN_AMOUNT 9 /* for WEXT_CSCAN_AMOUNT 9 */
|
|
#define RTW_CHANNEL_SCAN_AMOUNT (14+37)
|
|
|
|
struct ss_res {
|
|
u8 state;
|
|
u8 next_state; /* will set to state on next cmd hdl */
|
|
int bss_cnt;
|
|
u8 activate_ch_cnt;
|
|
#ifdef CONFIG_CMD_SCAN
|
|
struct rtw_phl_scan_param *scan_param;
|
|
#endif
|
|
struct submit_ctx sctx;
|
|
|
|
u16 scan_ch_ms;
|
|
u32 scan_timeout_ms;
|
|
u8 rx_ampdu_accept;
|
|
u8 rx_ampdu_size;
|
|
#if 0
|
|
int channel_idx;
|
|
u8 force_ssid_scan;
|
|
int scan_mode;
|
|
u8 igi_scan;
|
|
u8 igi_before_scan; /* used for restoring IGI value without enable DIG & FA_CNT */
|
|
#endif
|
|
|
|
#ifdef CONFIG_SCAN_BACKOP
|
|
u8 backop_flags_sta; /* policy for station mode*/
|
|
#ifdef CONFIG_AP_MODE
|
|
u8 backop_flags_ap; /* policy for ap mode */
|
|
#endif
|
|
#ifdef CONFIG_RTW_MESH
|
|
u8 backop_flags_mesh; /* policy for mesh mode */
|
|
#endif
|
|
u8 backop_flags; /* per backop runtime decision */
|
|
#if 0
|
|
u8 scan_cnt;
|
|
#endif
|
|
u8 scan_cnt_max;
|
|
systime backop_time; /* the start time of backop */
|
|
u16 backop_ms;
|
|
#endif
|
|
#if defined(CONFIG_ANTENNA_DIVERSITY) || defined(DBG_SCAN_SW_ANTDIV_BL)
|
|
u8 is_sw_antdiv_bl_scan;
|
|
#endif
|
|
u8 ssid_num;
|
|
u8 ch_num;
|
|
NDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT];
|
|
struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];
|
|
|
|
u32 token; /* 0: use to identify caller */
|
|
u16 duration; /* 0: use default */
|
|
u8 igi; /* 0: use defalut */
|
|
u8 bw; /* 0: use default */
|
|
|
|
bool acs; /* aim to trigger channel selection when scan done */
|
|
};
|
|
|
|
enum rtw_scan_type {
|
|
RTW_SCAN_NORMAL,
|
|
RTW_SCAN_P2P,
|
|
RTW_SCAN_RRM
|
|
};
|
|
|
|
struct sitesurvey_parm {
|
|
enum rtw_phl_scan_type scan_mode; /* active: 1, passive: 0 */
|
|
/* sint bsslimit; // 1 ~ 48 */
|
|
u8 ssid_num;
|
|
u8 ch_num;
|
|
NDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT];
|
|
struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];
|
|
|
|
u32 rrm_token; /* 80211k use it to identify caller */
|
|
u16 duration; /* 0: use default, otherwise: channel scan time */
|
|
u8 igi; /* 0: use defalut */
|
|
u8 bw; /* 0: use default */
|
|
|
|
bool acs; /* aim to trigger channel selection when scan done */
|
|
|
|
enum rtw_scan_type scan_type;
|
|
};
|
|
|
|
void rtw_init_sitesurvey_parm(_adapter *padapter, struct sitesurvey_parm *pparm);
|
|
u8 rtw_sitesurvey_cmd(_adapter *padapter, struct sitesurvey_parm *pparm);
|
|
#ifndef CONFIG_CMD_SCAN
|
|
u32 rtw_site_survey_fsm(_adapter *padapter, struct cmd_obj *pcmd);
|
|
#endif
|
|
|
|
#if 1 /*#ifndef CONFIG_PHL_ARCH*/
|
|
u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf);
|
|
void rtw_survey_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd);
|
|
#endif
|
|
|
|
#ifdef CONFIG_IOCTL_CFG80211
|
|
u8 rtw_phl_remain_on_ch_cmd(_adapter *padapter, u64 cookie, struct wireless_dev *wdev,
|
|
struct ieee80211_channel *ch, u8 ch_type, unsigned int duration,
|
|
struct back_op_param *bkop_parm, u8 is_p2p);
|
|
#endif
|
|
|
|
#ifdef CONFIG_STA_CMD_DISPR
|
|
u8 scan_issu_null_data_cb(void *priv, u8 ridx, bool ps);
|
|
#endif
|
|
|
|
#endif /* __RTW_SCAN_H_ */
|