Parcourir la source

qcacld-3.0: Add a new INI bg_rssi_threshold

FW triggers roaming based on the RSSI score of AP(s) available
after background scan. Currently, the host does not configure
the value of bg_rssi_threshold RSSI. This results in ping-pong
roaming after background scan, even though candidate AP
RSSI is not better than 5dbm than connected AP.

Fix is to configure the value of bg_rssi_threshold via new
INI "bg_rssi_threshold" and configuring default value of
INI as 5dB.

Min: 0
Max: 100
Default: 5

Change-Id: Ib710e294c8b33ff4903d41453e3b55f02daf53ae
CRs-Fixed: 2763962
Abhinav Kumar il y a 4 ans
Parent
commit
7ac893f2af

+ 1 - 0
components/mlme/core/src/wlan_mlme_main.c

@@ -1696,6 +1696,7 @@ static void mlme_init_lfr_cfg(struct wlan_objmgr_psoc *psoc,
 	lfr->roam_preauth_retry_count =
 		cfg_get(psoc, CFG_LFR3_ROAM_PREAUTH_RETRY_COUNT);
 	lfr->roam_rssi_diff = cfg_get(psoc, CFG_LFR_ROAM_RSSI_DIFF);
+	lfr->bg_rssi_threshold = cfg_get(psoc, CFG_LFR_ROAM_BG_RSSI_TH);
 	lfr->roam_scan_offload_enabled =
 		cfg_get(psoc, CFG_LFR_ROAM_SCAN_OFFLOAD_ENABLED);
 	lfr->neighbor_scan_timer_period =

+ 29 - 0
components/mlme/dispatcher/inc/cfg_mlme_lfr.h

@@ -1250,6 +1250,34 @@
 	CFG_VALUE_OR_DEFAULT, \
 	"Enable roam based on rssi")
 
+/*
+ * <ini>
+ * bg_rssi_threshold - To set RSSI Threshold for BG scan roaming
+ * @Min: 0
+ * @Max: 100
+ * @Default: 5
+ *
+ * This INI is used to set the value of rssi threshold to trigger roaming
+ * after background scan. To trigger roam after bg scan, value of rssi of
+ * candidate AP should be higher by this threshold than the rssi of the
+ * currrently associated AP.
+ *
+ * Related: RoamRssiDiff
+ *
+ * Supported Feature: Roaming
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_LFR_ROAM_BG_RSSI_TH CFG_INI_UINT( \
+	"bg_rssi_threshold", \
+	0, \
+	100, \
+	5, \
+	CFG_VALUE_OR_DEFAULT, \
+	"Enable roam based on rssi after BG scan")
+
 /*
  * <ini>
  * gWESModeEnabled - Enable WES mode
@@ -2893,6 +2921,7 @@
 	CFG(CFG_LFR_MAWC_FEATURE_ENABLED) \
 	CFG(CFG_LFR_FAST_TRANSITION_ENABLED) \
 	CFG(CFG_LFR_ROAM_RSSI_DIFF) \
+	CFG(CFG_LFR_ROAM_BG_RSSI_TH) \
 	CFG(CFG_LFR_ENABLE_WES_MODE) \
 	CFG(CFG_LFR_ROAM_SCAN_OFFLOAD_ENABLED) \
 	CFG(CFG_LFR_NEIGHBOR_SCAN_CHANNEL_LIST) \

+ 1 - 0
components/mlme/dispatcher/inc/wlan_mlme_public_struct.h

@@ -1724,6 +1724,7 @@ struct wlan_mlme_lfr_cfg {
 	uint32_t roam_preauth_retry_count;
 	uint32_t roam_preauth_no_ack_timeout;
 	uint8_t roam_rssi_diff;
+	uint8_t bg_rssi_threshold;
 	bool roam_scan_offload_enabled;
 	uint32_t neighbor_scan_timer_period;
 	uint32_t neighbor_scan_min_timer_period;

+ 3 - 0
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h

@@ -186,6 +186,8 @@ struct wlan_roam_triggers {
  *                   absolute RSSI threshold. Zero means no absolute minimum
  *                   RSSI is required. units are the offset from the noise
  *                   floor in dB
+ * @bg_rssi_threshold: Value of rssi threshold to trigger roaming
+ *                     after background scan.
  */
 struct ap_profile {
 	uint32_t flags;
@@ -196,6 +198,7 @@ struct ap_profile {
 	uint32_t rsn_mcastcipherset;
 	uint32_t rsn_mcastmgmtcipherset;
 	uint32_t rssi_abs_thresh;
+	uint8_t bg_rssi_threshold;
 };
 
 /**

+ 3 - 1
components/wmi/src/wmi_unified_roam_tlv.c

@@ -2967,6 +2967,7 @@ send_roam_scan_offload_ap_profile_cmd_tlv(wmi_unified_t wmi_handle,
 		       WMITLV_GET_STRUCT_TLVLEN(wmi_ap_profile));
 	profile->flags = ap_profile->profile.flags;
 	profile->rssi_threshold = ap_profile->profile.rssi_threshold;
+	profile->bg_rssi_threshold = ap_profile->profile.bg_rssi_threshold;
 	profile->ssid.ssid_len = ap_profile->profile.ssid.length;
 	qdf_mem_copy(profile->ssid.ssid, ap_profile->profile.ssid.ssid,
 		     profile->ssid.ssid_len);
@@ -2977,8 +2978,9 @@ send_roam_scan_offload_ap_profile_cmd_tlv(wmi_unified_t wmi_handle,
 				ap_profile->profile.rsn_mcastmgmtcipherset;
 	profile->rssi_abs_thresh = ap_profile->profile.rssi_abs_thresh;
 
-	WMI_LOGD("AP PROFILE: flags %x rssi_thres:%d ssid:%.*s authmode %d uc cipher %d mc cipher %d mc mgmt cipher %d rssi abs thresh %d",
+	WMI_LOGD("AP PROFILE: flags %x rssi_thres:%d bg_rssi_thres:%d ssid:%.*s authmode %d uc cipher %d mc cipher %d mc mgmt cipher %d rssi abs thresh %d",
 		 profile->flags, profile->rssi_threshold,
+		 profile->bg_rssi_threshold,
 		 profile->ssid.ssid_len, ap_profile->profile.ssid.ssid,
 		 profile->rsn_authmode, profile->rsn_ucastcipherset,
 		 profile->rsn_mcastcipherset, profile->rsn_mcastmgmtcipherset,

+ 1 - 0
core/mac/inc/sir_api.h

@@ -2262,6 +2262,7 @@ struct roam_offload_scan_req {
 	uint8_t OpportunisticScanThresholdDiff;
 	uint8_t RoamRescanRssiDiff;
 	uint8_t RoamRssiDiff;
+	uint8_t bg_rssi_threshold;
 	struct rsn_caps rsn_caps;
 	int32_t rssi_abs_thresh;
 	uint8_t ChannelCacheType;

+ 1 - 0
core/sme/inc/csr_neighbor_roam.h

@@ -68,6 +68,7 @@ typedef struct sCsrNeighborRoamCfgParams {
 	uint32_t full_roam_scan_period;
 	bool enable_scoring_for_roam;
 	uint8_t roam_rssi_diff;
+	uint8_t bg_rssi_threshold;
 	uint16_t roam_scan_home_away_time;
 	uint8_t roam_scan_n_probes;
 	uint32_t roam_scan_inactivity_time;

+ 3 - 0
core/sme/src/common/sme_api.c

@@ -7002,6 +7002,9 @@ sme_restore_default_roaming_params(struct mac_context *mac,
 			mac->mlme_cfg->lfr.neighbor_lookup_rssi_threshold;
 	roam_info->cfgParams.roam_rssi_diff =
 			mac->mlme_cfg->lfr.roam_rssi_diff;
+	roam_info->cfgParams.bg_rssi_threshold =
+			mac->mlme_cfg->lfr.bg_rssi_threshold;
+
 	roam_info->cfgParams.maxChannelScanTime =
 			mac->mlme_cfg->lfr.neighbor_scan_max_chan_time;
 	roam_info->cfgParams.roam_scan_home_away_time =

+ 3 - 0
core/sme/src/csr/csr_api_roam.c

@@ -17663,6 +17663,7 @@ csr_create_roam_scan_offload_request(struct mac_context *mac_ctx,
 	req_buf->RoamRescanRssiDiff =
 		roam_info->cfgParams.nRoamRescanRssiDiff;
 	req_buf->RoamRssiDiff = roam_info->cfgParams.roam_rssi_diff;
+	req_buf->bg_rssi_threshold = roam_info->cfgParams.bg_rssi_threshold;
 	req_buf->rssi_abs_thresh =
 		mac_ctx->mlme_cfg->lfr.roam_rssi_abs_threshold;
 	req_buf->reason = reason;
@@ -19945,6 +19946,8 @@ csr_cm_roam_scan_offload_ap_profile(struct mac_context *mac_ctx,
 	/* Group management cipher suite */
 
 	profile->rssi_threshold = roam_info->cfgParams.roam_rssi_diff;
+	profile->bg_rssi_threshold =
+			roam_info->cfgParams.bg_rssi_threshold;
 	/*
 	 * rssi_diff which is updated via framework is equivalent to the
 	 * INI RoamRssiDiff parameter and hence should be updated.

+ 2 - 0
core/sme/src/csr/csr_neighbor_roam.c

@@ -1140,6 +1140,8 @@ QDF_STATUS csr_neighbor_roam_init(struct mac_context *mac, uint8_t sessionId)
 		mac->mlme_cfg->lfr.roam_scan_hi_rssi_ub;
 	pNeighborRoamInfo->cfgParams.roam_rssi_diff =
 		mac->mlme_cfg->lfr.roam_rssi_diff;
+	pNeighborRoamInfo->cfgParams.bg_rssi_threshold =
+		mac->mlme_cfg->lfr.bg_rssi_threshold;
 
 	qdf_zero_macaddr(&pNeighborRoamInfo->currAPbssid);
 	pNeighborRoamInfo->currentNeighborLookupThreshold =

+ 2 - 0
core/wma/src/wma_scan_roam.c

@@ -1065,6 +1065,7 @@ wma_roam_scan_fill_ap_profile(struct roam_offload_scan_req *roam_req,
 		profile->rsn_mcastcipherset = WMI_CIPHER_NONE;
 		profile->rsn_mcastmgmtcipherset = WMI_CIPHER_NONE;
 		profile->rssi_threshold = WMA_ROAM_RSSI_DIFF_DEFAULT;
+		profile->bg_rssi_threshold = WMA_ROAM_RSSI_DIFF_DEFAULT;
 
 		return;
 	}
@@ -1100,6 +1101,7 @@ wma_roam_scan_fill_ap_profile(struct roam_offload_scan_req *roam_req,
 			roam_req->ConnectedNetwork.gp_mgmt_cipher_suite);
 
 	profile->rssi_threshold = roam_req->RoamRssiDiff;
+	profile->bg_rssi_threshold = roam_req->bg_rssi_threshold;
 	if (roam_req->rssi_abs_thresh)
 		profile->rssi_abs_thresh = roam_req->rssi_abs_thresh;
 #ifdef WLAN_FEATURE_11W