qcacld-3.0: Add support to send roam scan scheme for the triggers
Add support to handle the nl80211 attribute - QCA_ATTR_ROAM_CONTROL_TRIGGERS_SCAN_SCHEME. Send RSO update to firmware if roam scan scheme value is received via the nl80211 attribute QCA_ATTR_ROAM_CONTROL_TRIGGERS_SCAN_SCHEME over the QCA_WLAN_VENDOR_ATTR_ROAMING_SUBCMD subcommand. Change-Id: If21281245097648380990b9218a722691279f598 CRs-Fixed: 2785256
This commit is contained in:

committed by
snandini

parent
adbc4f7d5b
commit
cd22d076ab
@@ -1558,6 +1558,7 @@ static void mlme_init_roam_offload_cfg(struct wlan_objmgr_psoc *psoc,
|
||||
lfr->idle_roam_min_rssi = cfg_get(psoc, CFG_LFR_IDLE_ROAM_MIN_RSSI);
|
||||
lfr->roam_trigger_bitmap =
|
||||
cfg_get(psoc, CFG_ROAM_TRIGGER_BITMAP);
|
||||
|
||||
lfr->idle_roam_band = cfg_get(psoc, CFG_LFR_IDLE_ROAM_BAND);
|
||||
lfr->sta_roam_disable = cfg_get(psoc, CFG_STA_DISABLE_ROAM);
|
||||
mlme_init_sae_single_pmk_cfg(psoc, lfr);
|
||||
|
@@ -3010,4 +3010,5 @@ QDF_STATUS mlme_get_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst,
|
||||
*/
|
||||
QDF_STATUS mlme_set_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src,
|
||||
qdf_size_t len);
|
||||
|
||||
#endif /* _WLAN_MLME_API_H_ */
|
||||
|
@@ -513,6 +513,31 @@ wlan_cm_roam_get_vendor_btm_params(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
struct wlan_cm_roam_vendor_btm_params
|
||||
*param);
|
||||
|
||||
/**
|
||||
* wlan_cm_update_roam_scan_scheme_bitmap() - Set roam scan scheme bitmap for
|
||||
* each vdev
|
||||
* @psoc: PSOC pointer
|
||||
* @vdev_id: VDEV id
|
||||
* @roam_scan_scheme_bitmap: bitmap of roam triggers for which partial roam
|
||||
* scan needs to be enabled
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS
|
||||
wlan_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
uint32_t roam_scan_scheme_bitmap);
|
||||
|
||||
/**
|
||||
* wlan_cm_get_roam_scan_scheme_bitmap() - Get roam scan scheme bitmap value
|
||||
* @psoc: PSOC pointer
|
||||
* @vdev_id: VDEV id
|
||||
*
|
||||
* Return: Roam scan scheme bitmap value
|
||||
*/
|
||||
uint32_t wlan_cm_get_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id);
|
||||
#else
|
||||
static inline
|
||||
void wlan_cm_roam_activate_pcl_per_vdev(struct wlan_objmgr_psoc *psoc,
|
||||
@@ -570,5 +595,20 @@ wlan_cm_roam_get_vendor_btm_params(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
struct wlan_cm_roam_vendor_btm_params *param)
|
||||
{}
|
||||
|
||||
static inline QDF_STATUS
|
||||
wlan_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
uint32_t roam_scan_scheme_bitmap)
|
||||
{
|
||||
return QDF_STATUS_E_NOSUPPORT;
|
||||
}
|
||||
|
||||
static inline
|
||||
uint32_t wlan_cm_get_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* FEATURE_ROAM_OFFLOAD */
|
||||
#endif /* WLAN_CM_ROAM_API_H__ */
|
||||
|
@@ -94,6 +94,7 @@
|
||||
#define WLAN_FILS_FT_MAX_LEN 48
|
||||
|
||||
#define WLAN_MAX_PMK_DUMP_BYTES 6
|
||||
#define DEFAULT_ROAM_SCAN_SCHEME_BITMAP 0
|
||||
|
||||
/**
|
||||
* enum roam_cfg_param - Type values for roaming parameters used as index
|
||||
@@ -1312,12 +1313,18 @@ enum roam_scan_freq_scheme {
|
||||
* @beacon_rssi_weight: Number of beacons to be used to calculate the average
|
||||
* rssi of the AP.
|
||||
* @hi_rssi_scan_delay: Roam scan delay in ms for High RSSI roam trigger.
|
||||
* @roam_scan_scheme_bitmap: Bitmap of roam triggers for which partial channel
|
||||
* map scan scheme needs to be enabled. Each bit in the bitmap corresponds to
|
||||
* the bit position in the order provided by the enum roam_trigger_reason
|
||||
* Ex: roam_scan_scheme_bitmap - 0x00110 will enable partial scan for below
|
||||
* triggers:
|
||||
* ROAM_TRIGGER_REASON_PER, ROAM_TRIGGER_REASON_BMISS
|
||||
*/
|
||||
struct wlan_cm_rso_configs {
|
||||
uint8_t rescan_rssi_delta;
|
||||
uint8_t beacon_rssi_weight;
|
||||
uint32_t hi_rssi_scan_delay;
|
||||
|
||||
uint32_t roam_scan_scheme_bitmap;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -135,5 +135,24 @@ ucfg_cm_roaming_in_progress(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id)
|
||||
return wlan_cm_roaming_in_progress(pdev, vdev_id);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
static inline QDF_STATUS
|
||||
ucfg_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
uint32_t roam_scan_scheme_bitmap)
|
||||
{
|
||||
return wlan_cm_update_roam_scan_scheme_bitmap(psoc, vdev_id,
|
||||
roam_scan_scheme_bitmap);
|
||||
}
|
||||
#else
|
||||
static inline QDF_STATUS
|
||||
ucfg_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
uint32_t roam_scan_scheme_bitmap)
|
||||
{
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
@@ -674,3 +674,65 @@ QDF_STATUS wlan_cm_update_fils_ft(struct wlan_objmgr_psoc *psoc,
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
QDF_STATUS
|
||||
wlan_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
uint32_t roam_scan_scheme_bitmap)
|
||||
{
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
|
||||
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
|
||||
WLAN_MLME_NB_ID);
|
||||
|
||||
if (!vdev) {
|
||||
mlme_err("vdev%d: vdev object is NULL", vdev_id);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
||||
if (!mlme_priv) {
|
||||
mlme_err("vdev%d: vdev legacy private object is NULL", vdev_id);
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
mlme_priv->cm_roam.vdev_rso_config.roam_scan_scheme_bitmap =
|
||||
roam_scan_scheme_bitmap;
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
uint32_t wlan_cm_get_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id)
|
||||
{
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
uint32_t roam_scan_scheme_bitmap;
|
||||
|
||||
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
|
||||
WLAN_MLME_NB_ID);
|
||||
|
||||
if (!vdev) {
|
||||
mlme_err("vdev%d: vdev object is NULL", vdev_id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
||||
if (!mlme_priv) {
|
||||
mlme_err("vdev%d: vdev legacy private object is NULL", vdev_id);
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
|
||||
return 0;
|
||||
}
|
||||
|
||||
roam_scan_scheme_bitmap =
|
||||
mlme_priv->cm_roam.vdev_rso_config.roam_scan_scheme_bitmap;
|
||||
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
|
||||
|
||||
return roam_scan_scheme_bitmap;
|
||||
}
|
||||
#endif
|
||||
|
@@ -4543,6 +4543,7 @@ roam_control_policy[QCA_ATTR_ROAM_CONTROL_MAX + 1] = {
|
||||
[QCA_ATTR_ROAM_CONTROL_CONNECTED_RSSI_THRESHOLD] = {.type = NLA_U32},
|
||||
[QCA_ATTR_ROAM_CONTROL_CANDIDATE_RSSI_THRESHOLD] = {.type = NLA_U32},
|
||||
[QCA_ATTR_ROAM_CONTROL_USER_REASON] = {.type = NLA_U32},
|
||||
[QCA_ATTR_ROAM_CONTROL_SCAN_SCHEME_TRIGGERS] = {.type = NLA_U32},
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -4612,7 +4613,7 @@ wlan_hdd_convert_control_roam_trigger_bitmap(uint32_t trigger_reason_bitmap)
|
||||
/* Enable the complete trigger bitmap when all bits are set in
|
||||
* the control config bitmap
|
||||
*/
|
||||
all_bitmap = (QCA_ROAM_TRIGGER_REASON_BSS_LOAD << 1) - 1;
|
||||
all_bitmap = (QCA_ROAM_TRIGGER_REASON_EXTERNAL_SCAN << 1) - 1;
|
||||
if (trigger_reason_bitmap == all_bitmap)
|
||||
return BIT(ROAM_TRIGGER_REASON_MAX) - 1;
|
||||
|
||||
@@ -4640,9 +4641,74 @@ wlan_hdd_convert_control_roam_trigger_bitmap(uint32_t trigger_reason_bitmap)
|
||||
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_BSS_LOAD)
|
||||
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_BSS_LOAD);
|
||||
|
||||
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_USER_TRIGGER)
|
||||
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_FORCED);
|
||||
|
||||
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_DEAUTH)
|
||||
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_DEAUTH);
|
||||
|
||||
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_IDLE)
|
||||
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_IDLE);
|
||||
|
||||
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_TX_FAILURES)
|
||||
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_STA_KICKOUT);
|
||||
|
||||
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_EXTERNAL_SCAN)
|
||||
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_BACKGROUND);
|
||||
|
||||
return drv_trigger_bitmap;
|
||||
}
|
||||
|
||||
/**
|
||||
* wlan_hdd_convert_control_roam_scan_scheme_bitmap() - Convert the
|
||||
* vendor specific roam scan scheme for roam triggers to internal roam trigger
|
||||
* bitmap for partial scan.
|
||||
* @trigger_reason_bitmap: Vendor specific roam trigger bitmap
|
||||
*
|
||||
* Return: Internal roam scan scheme bitmap
|
||||
*/
|
||||
static uint32_t
|
||||
wlan_hdd_convert_control_roam_scan_scheme_bitmap(uint32_t trigger_reason_bitmap)
|
||||
{
|
||||
uint32_t drv_scan_scheme_bitmap = 0;
|
||||
|
||||
/*
|
||||
* Partial scan scheme override over default scan scheme only for
|
||||
* the PER, BMISS, Low RSSI, BTM, BSS_LOAD Triggers
|
||||
*/
|
||||
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_PER)
|
||||
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_PER);
|
||||
|
||||
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_BEACON_MISS)
|
||||
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_BMISS);
|
||||
|
||||
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_POOR_RSSI)
|
||||
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_LOW_RSSI);
|
||||
|
||||
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_BTM)
|
||||
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_BTM);
|
||||
|
||||
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_BSS_LOAD)
|
||||
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_BSS_LOAD);
|
||||
|
||||
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_USER_TRIGGER)
|
||||
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_FORCED);
|
||||
|
||||
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_DEAUTH)
|
||||
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_DEAUTH);
|
||||
|
||||
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_IDLE)
|
||||
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_IDLE);
|
||||
|
||||
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_TX_FAILURES)
|
||||
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_STA_KICKOUT);
|
||||
|
||||
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_EXTERNAL_SCAN)
|
||||
drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_BACKGROUND);
|
||||
|
||||
return drv_scan_scheme_bitmap;
|
||||
}
|
||||
|
||||
/**
|
||||
* hdd_send_roam_triggers_to_sme() - Send roam trigger bitmap to SME
|
||||
* @hdd_ctx: HDD context
|
||||
@@ -4694,6 +4760,16 @@ hdd_send_roam_triggers_to_sme(struct hdd_context *hdd_ctx,
|
||||
triggers.trigger_bitmap =
|
||||
wlan_hdd_convert_control_roam_trigger_bitmap(roam_trigger_bitmap);
|
||||
|
||||
/*
|
||||
* roam trigger bitmap is > 0 - Roam triggers are set.
|
||||
* roam trigger bitmap is 0 - Disable roaming
|
||||
*
|
||||
* For both the above modes, reset the roam scan scheme bitmap to
|
||||
* 0.
|
||||
*/
|
||||
status = ucfg_cm_update_roam_scan_scheme_bitmap(hdd_ctx->psoc,
|
||||
vdev_id, 0);
|
||||
|
||||
#ifdef ROAM_OFFLOAD_V1
|
||||
status = ucfg_cm_rso_set_roam_trigger(hdd_ctx->pdev, vdev_id,
|
||||
&triggers);
|
||||
@@ -4978,6 +5054,15 @@ hdd_set_roam_with_control_config(struct hdd_context *hdd_ctx,
|
||||
}
|
||||
}
|
||||
|
||||
attr = tb2[QCA_ATTR_ROAM_CONTROL_SCAN_SCHEME_TRIGGERS];
|
||||
if (attr) {
|
||||
value = wlan_hdd_convert_control_roam_scan_scheme_bitmap(
|
||||
nla_get_u32(attr));
|
||||
status = ucfg_cm_update_roam_scan_scheme_bitmap(hdd_ctx->psoc,
|
||||
vdev_id,
|
||||
value);
|
||||
}
|
||||
|
||||
/* Scoring and roam candidate selection criteria */
|
||||
attr = tb2[QCA_ATTR_ROAM_CONTROL_SELECTION_CRITERIA];
|
||||
if (attr) {
|
||||
@@ -5004,7 +5089,9 @@ hdd_set_roam_with_control_config(struct hdd_context *hdd_ctx,
|
||||
param.user_roam_reason = nla_get_u32(attr);
|
||||
else
|
||||
param.user_roam_reason = DISABLE_VENDOR_BTM_CONFIG;
|
||||
|
||||
wlan_cm_roam_set_vendor_btm_params(hdd_ctx->psoc, vdev_id, ¶m);
|
||||
/* Sends RSO update */
|
||||
sme_send_vendor_btm_params(hdd_ctx->mac_handle, vdev_id);
|
||||
|
||||
return qdf_status_to_os_return(status);
|
||||
|
@@ -824,6 +824,10 @@ static void csr_neighbor_roam_info_ctx_init(struct mac_context *mac,
|
||||
src_cfg.uint_value = mac->mlme_cfg->lfr.roam_scan_hi_rssi_delay;
|
||||
wlan_cm_roam_cfg_set_value(mac->psoc, session_id,
|
||||
HI_RSSI_DELAY_BTW_SCANS, &src_cfg);
|
||||
|
||||
wlan_cm_update_roam_scan_scheme_bitmap(mac->psoc, session_id,
|
||||
DEFAULT_ROAM_SCAN_SCHEME_BITMAP);
|
||||
|
||||
/*
|
||||
* Now we can clear the preauthDone that
|
||||
* was saved as we are connected afresh
|
||||
|
Reference in New Issue
Block a user