diff --git a/umac/mlme/connection_mgr/core/src/wlan_cm_connect.c b/umac/mlme/connection_mgr/core/src/wlan_cm_connect.c index 9fdbb29138..7cd7686e2a 100644 --- a/umac/mlme/connection_mgr/core/src/wlan_cm_connect.c +++ b/umac/mlme/connection_mgr/core/src/wlan_cm_connect.c @@ -735,7 +735,12 @@ static inline void cm_update_advance_filter(struct wlan_objmgr_pdev *pdev, struct cnx_mgr *cm_ctx, struct scan_filter *filter, struct cm_connect_req *cm_req) -{ } +{ + struct wlan_objmgr_vdev *vdev = cm_ctx->vdev; + + if (cm_ctx->cm_candidate_advance_filter) + cm_ctx->cm_candidate_advance_filter(vdev, filter); +} static void cm_update_security_filter(struct scan_filter *filter, struct wlan_cm_connect_req *req) @@ -913,7 +918,7 @@ static QDF_STATUS cm_connect_get_candidates(struct wlan_objmgr_pdev *pdev, op_mode = wlan_vdev_mlme_get_opmode(cm_ctx->vdev); if (num_bss && op_mode == QDF_STA_MODE) - cm_calculate_scores(pdev, filter, candidate_list); + cm_calculate_scores(cm_ctx, pdev, filter, candidate_list); qdf_mem_free(filter); if (!candidate_list || !qdf_list_size(candidate_list)) { diff --git a/umac/mlme/connection_mgr/core/src/wlan_cm_host_roam.c b/umac/mlme/connection_mgr/core/src/wlan_cm_host_roam.c index 1d7f118f99..b0d3d76bb0 100644 --- a/umac/mlme/connection_mgr/core/src/wlan_cm_host_roam.c +++ b/umac/mlme/connection_mgr/core/src/wlan_cm_host_roam.c @@ -196,7 +196,7 @@ static QDF_STATUS cm_roam_get_candidates(struct wlan_objmgr_pdev *pdev, op_mode = wlan_vdev_mlme_get_opmode(cm_ctx->vdev); if (num_bss && op_mode == QDF_STA_MODE) - cm_calculate_scores(pdev, filter, candidate_list); + cm_calculate_scores(cm_ctx, pdev, filter, candidate_list); qdf_mem_free(filter); diff --git a/umac/mlme/connection_mgr/core/src/wlan_cm_main.h b/umac/mlme/connection_mgr/core/src/wlan_cm_main.h index 1f3d05583f..7f5ccba042 100644 --- a/umac/mlme/connection_mgr/core/src/wlan_cm_main.h +++ b/umac/mlme/connection_mgr/core/src/wlan_cm_main.h @@ -278,6 +278,12 @@ struct cnx_mgr { #ifdef SM_ENG_HIST_ENABLE struct cm_req_history req_history; #endif +#ifndef CONN_MGR_ADV_FEATURE + void (*cm_candidate_advance_filter)(struct wlan_objmgr_vdev *vdev, + struct scan_filter *filter); + void (*cm_candidate_list_custom_sort)(struct wlan_objmgr_vdev *vdev, + qdf_list_t *list); +#endif }; /** diff --git a/umac/mlme/connection_mgr/core/src/wlan_cm_main_api.h b/umac/mlme/connection_mgr/core/src/wlan_cm_main_api.h index 4bab11a5b1..83894c329f 100644 --- a/umac/mlme/connection_mgr/core/src/wlan_cm_main_api.h +++ b/umac/mlme/connection_mgr/core/src/wlan_cm_main_api.h @@ -961,13 +961,15 @@ cm_update_scan_mlme_on_disconnect(struct wlan_objmgr_vdev *vdev, /** * cm_calculate_scores() - Score the candidates obtained from scan * manager after filtering + * @cm_ctx: Connection manager context * @pdev: Object manager pdev * @filter: Scan filter params * @list: List of candidates to be scored * * Return: void */ -void cm_calculate_scores(struct wlan_objmgr_pdev *pdev, +void cm_calculate_scores(struct cnx_mgr *cm_ctx, + struct wlan_objmgr_pdev *pdev, struct scan_filter *filter, qdf_list_t *list); /** @@ -1063,4 +1065,33 @@ static inline void cm_req_history_print(struct cnx_mgr *cm_ctx) */ QDF_STATUS cm_activate_cmd_req_flush_cb(struct scheduler_msg *msg); #endif + +#ifndef CONN_MGR_ADV_FEATURE +/** + * cm_set_candidate_advance_filter_cb() - Set CM candidate advance + * filter cb + * @vdev: Objmgr vdev + * @filter_fun: CM candidate advance filter cb + * + * Return: void + */ +void cm_set_candidate_advance_filter_cb( + struct wlan_objmgr_vdev *vdev, + void (*filter_fun)(struct wlan_objmgr_vdev *vdev, + struct scan_filter *filter)); + +/** + * cm_set_candidate_custom_sort_cb() - Set CM candidate custom sort cb + * @vdev: Objmgr vdev + * @sort_fun: CM candidate custom sort cb + * + * Return: void + */ +void cm_set_candidate_custom_sort_cb( + struct wlan_objmgr_vdev *vdev, + void (*sort_fun)(struct wlan_objmgr_vdev *vdev, + qdf_list_t *list)); + +#endif + #endif /* __WLAN_CM_MAIN_API_H__ */ diff --git a/umac/mlme/connection_mgr/core/src/wlan_cm_util.c b/umac/mlme/connection_mgr/core/src/wlan_cm_util.c index 0f98a8dbc5..3cd374194a 100644 --- a/umac/mlme/connection_mgr/core/src/wlan_cm_util.c +++ b/umac/mlme/connection_mgr/core/src/wlan_cm_util.c @@ -1300,7 +1300,8 @@ cm_get_pcl_chan_weigtage_for_sta(struct wlan_objmgr_pdev *pdev, } } -void cm_calculate_scores(struct wlan_objmgr_pdev *pdev, +void cm_calculate_scores(struct cnx_mgr *cm_ctx, + struct wlan_objmgr_pdev *pdev, struct scan_filter *filter, qdf_list_t *list) { struct pcl_freq_weight_list *pcl_lst = NULL; @@ -1319,10 +1320,17 @@ void cm_calculate_scores(struct wlan_objmgr_pdev *pdev, } #else inline -void cm_calculate_scores(struct wlan_objmgr_pdev *pdev, +void cm_calculate_scores(struct cnx_mgr *cm_ctx, + struct wlan_objmgr_pdev *pdev, struct scan_filter *filter, qdf_list_t *list) { wlan_cm_calculate_bss_score(pdev, NULL, list, &filter->bssid_hint); + + /* + * Custom sorting if enabled + */ + if (cm_ctx && cm_ctx->cm_candidate_list_custom_sort) + cm_ctx->cm_candidate_list_custom_sort(cm_ctx->vdev, list); } #endif @@ -1433,3 +1441,33 @@ void cm_req_history_print(struct cnx_mgr *cm_ctx) qdf_spin_unlock_bh(&history->cm_req_hist_lock); } #endif + +#ifndef CONN_MGR_ADV_FEATURE +void cm_set_candidate_advance_filter_cb( + struct wlan_objmgr_vdev *vdev, + void (*filter_fun)(struct wlan_objmgr_vdev *vdev, + struct scan_filter *filter)) +{ + struct cnx_mgr *cm_ctx; + + cm_ctx = cm_get_cm_ctx(vdev); + if (!cm_ctx) + return; + + cm_ctx->cm_candidate_advance_filter = filter_fun; +} + +void cm_set_candidate_custom_sort_cb( + struct wlan_objmgr_vdev *vdev, + void (*sort_fun)(struct wlan_objmgr_vdev *vdev, + qdf_list_t *list)) +{ + struct cnx_mgr *cm_ctx; + + cm_ctx = cm_get_cm_ctx(vdev); + if (!cm_ctx) + return; + + cm_ctx->cm_candidate_list_custom_sort = sort_fun; +} +#endif diff --git a/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_api.h b/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_api.h index dafc594b99..00e216c95b 100644 --- a/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_api.h +++ b/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_api.h @@ -399,6 +399,49 @@ static inline void wlan_cm_req_history_print(struct wlan_objmgr_vdev *vdev) {} #endif +#ifdef CONN_MGR_ADV_FEATURE +/** + * wlan_cm_set_candidate_advance_filter_cb() - Set CM candidate advance + * filter cb + * @vdev: Objmgr vdev + * @filter_fun: CM candidate advance filter cb + * + * Return: void + */ +static inline +void wlan_cm_set_candidate_advance_filter_cb( + struct wlan_objmgr_vdev *vdev, + void (*filter_fun)(struct wlan_objmgr_vdev *vdev, + struct scan_filter *filter)); +{ +} + +/** + * wlan_cm_set_candidate_custom_sort_cb() - Set CM candidate custom sort cb + * @vdev: Objmgr vdev + * @sort_fun: CM candidate custom sort cb + * + * Return: void + */ +static inline +void wlan_cm_set_candidate_custom_sort_cb( + struct wlan_objmgr_vdev *vdev, + void (*sort_fun)(struct wlan_objmgr_vdev *vdev, + qdf_list_t *list)) +{ +} +#else +void wlan_cm_set_candidate_advance_filter_cb( + struct wlan_objmgr_vdev *vdev, + void (*filter_fun)(struct wlan_objmgr_vdev *vdev, + struct scan_filter *filter)); + +void wlan_cm_set_candidate_custom_sort_cb( + struct wlan_objmgr_vdev *vdev, + void (*sort_fun)(struct wlan_objmgr_vdev *vdev, + qdf_list_t *list)); +#endif + #else #ifdef WLAN_POLICY_MGR_ENABLE diff --git a/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_api.c b/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_api.c index eb525fd967..4eb201d4ce 100644 --- a/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_api.c +++ b/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_api.c @@ -313,3 +313,22 @@ void wlan_cm_req_history_print(struct wlan_objmgr_vdev *vdev) cm_req_history_print(cm_ctx); } #endif /* SM_ENG_HIST_ENABLE */ + +#ifndef CONN_MGR_ADV_FEATURE +void wlan_cm_set_candidate_advance_filter_cb( + struct wlan_objmgr_vdev *vdev, + void (*filter_fun)(struct wlan_objmgr_vdev *vdev, + struct scan_filter *filter)) +{ + cm_set_candidate_advance_filter_cb(vdev, filter_fun); +} + +void wlan_cm_set_candidate_custom_sort_cb( + struct wlan_objmgr_vdev *vdev, + void (*sort_fun)(struct wlan_objmgr_vdev *vdev, + qdf_list_t *list)) +{ + cm_set_candidate_custom_sort_cb(vdev, sort_fun); +} + +#endif