policy: don't select better candidate with bad signal
Don't select a node as a better candidate where a STA has insufficient signal to. This is the case when the roam_trigger_snr is greater than the projected signal of the client. This stops clients from being selected to roam to a node where the signal is not sufficient to maintain the connection. A selection might otherwise happen e.g. due to better channel load on the remote node. Signed-off-by: David Bauer <mail@david-bauer.net>
This commit is contained in:
15
policy.c
15
policy.c
@@ -72,6 +72,18 @@ below_max_assoc(struct sta_info *si)
|
|||||||
return !node->max_assoc || node->n_assoc < node->max_assoc;
|
return !node->max_assoc || node->n_assoc < node->max_assoc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
over_min_signal(struct sta_info *si)
|
||||||
|
{
|
||||||
|
if (config.min_snr && si->signal < usteer_snr_to_signal(si->node, config.min_snr))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (config.roam_trigger_snr && si->signal < usteer_snr_to_signal(si->node, config.roam_trigger_snr))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static uint32_t
|
static uint32_t
|
||||||
is_better_candidate(struct sta_info *si_cur, struct sta_info *si_new)
|
is_better_candidate(struct sta_info *si_cur, struct sta_info *si_new)
|
||||||
{
|
{
|
||||||
@@ -80,6 +92,9 @@ is_better_candidate(struct sta_info *si_cur, struct sta_info *si_new)
|
|||||||
if (!below_max_assoc(si_new))
|
if (!below_max_assoc(si_new))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (!over_min_signal(si_new))
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (below_assoc_threshold(si_cur, si_new) &&
|
if (below_assoc_threshold(si_cur, si_new) &&
|
||||||
!below_assoc_threshold(si_new, si_cur))
|
!below_assoc_threshold(si_new, si_cur))
|
||||||
reasons |= (1 << UEV_SELECT_REASON_NUM_ASSOC);
|
reasons |= (1 << UEV_SELECT_REASON_NUM_ASSOC);
|
||||||
|
Reference in New Issue
Block a user