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
is_better_candidate(struct sta_info *si_cur, struct sta_info *si_new)
{
if (!below_max_assoc(si_new))
return 0;
+ if (!over_min_signal(si_new))
+ return 0;
+
if (below_assoc_threshold(si_cur, si_new) &&
!below_assoc_threshold(si_new, si_cur))
reasons |= (1 << UEV_SELECT_REASON_NUM_ASSOC);
if (!reasons)
continue;
- if (is_better_candidate(si, si_ref))
- continue;
-
if (!(reasons & required_criteria))
continue;
return NULL;
}
-static int
-snr_to_signal(struct usteer_node *node, int snr)
+int
+usteer_snr_to_signal(struct usteer_node *node, int snr)
{
int noise = -95;
*
* Otherwise, the client potentially ends up in a assoc - kick loop.
*/
- if (config.min_snr && si->signal < snr_to_signal(si->node, config.min_snr)) {
+ if (config.min_snr && si->signal < usteer_snr_to_signal(si->node, config.min_snr)) {
ev.reason = UEV_REASON_LOW_SIGNAL;
ev.threshold.cur = si->signal;
- ev.threshold.ref = snr_to_signal(si->node, config.min_snr);
+ ev.threshold.ref = usteer_snr_to_signal(si->node, config.min_snr);
ret = false;
goto out;
} else if (!config.assoc_steering) {
}
}
- min_signal = snr_to_signal(si->node, config.min_connect_snr);
+ min_signal = usteer_snr_to_signal(si->node, config.min_connect_snr);
if (si->signal < min_signal) {
ev.reason = UEV_REASON_LOW_SIGNAL;
ev.threshold.cur = si->signal;
};
int min_signal;
- min_signal = snr_to_signal(si->node, config.roam_trigger_snr);
+ min_signal = usteer_snr_to_signal(si->node, config.roam_trigger_snr);
switch (si->roam_state) {
case ROAM_TRIGGER_SCAN:
return;
usteer_update_time();
- min_signal = snr_to_signal(&ln->node, min_signal);
+ min_signal = usteer_snr_to_signal(&ln->node, min_signal);
list_for_each_entry(si, &ln->node.sta_info, node_list) {
if (si->connected != STA_CONNECTED || si->signal >= min_signal ||
if (!config.min_snr)
return;
- min_signal = snr_to_signal(&ln->node, config.min_snr);
+ min_signal = usteer_snr_to_signal(&ln->node, config.min_snr);
ev.threshold.ref = min_signal;
list_for_each_entry(si, &ln->node.sta_info, node_list) {
if (is_more_kickable(kick1, si))
kick1 = si;
- tmp = find_better_candidate(si, NULL, 0);
+ tmp = find_better_candidate(si, NULL, (1 << UEV_SELECT_REASON_LOAD));
if (!tmp)
continue;