3
0
mirror of https://git.kernel.org/pub/scm/network/wireless/iwd.git synced 2024-12-23 06:02:37 +01:00

netdev: introduce [General].RoamThreshold5G

This value sets the roaming threshold on 5GHz networks. The
threshold has been separated from 2.4GHz because in many cases
5GHz can perform much better at low RSSI than 2.4GHz.

In addition the BSS ranking logic was re-worked and now 5GHz is
much more preferred, even at low RSSI. This means we need a
lower floor for RSSI before roaming, otherwise IWD would end
up roaming immediately after connecting due to low RSSI CQM
events.
This commit is contained in:
James Prestwood 2021-05-07 13:26:18 -07:00 committed by Denis Kenzior
parent 7b26a87d7a
commit 968584d3f0

View File

@ -891,6 +891,7 @@ struct netdev *netdev_find(int ifindex)
/* Threshold RSSI for roaming to trigger, configurable in main.conf */ /* Threshold RSSI for roaming to trigger, configurable in main.conf */
static int LOW_SIGNAL_THRESHOLD; static int LOW_SIGNAL_THRESHOLD;
static int LOW_SIGNAL_THRESHOLD_5GHZ;
static void netdev_cqm_event_rssi_threshold(struct netdev *netdev, static void netdev_cqm_event_rssi_threshold(struct netdev *netdev,
uint32_t rssi_event) uint32_t rssi_event)
@ -925,6 +926,8 @@ static void netdev_cqm_event_rssi_value(struct netdev *netdev, int rssi_val)
{ {
bool new_rssi_low; bool new_rssi_low;
uint8_t prev_rssi_level_idx = netdev->cur_rssi_level_idx; uint8_t prev_rssi_level_idx = netdev->cur_rssi_level_idx;
int threshold = netdev->frequency > 4000 ? LOW_SIGNAL_THRESHOLD_5GHZ :
LOW_SIGNAL_THRESHOLD;
if (!netdev->connected) if (!netdev->connected)
return; return;
@ -939,7 +942,7 @@ static void netdev_cqm_event_rssi_value(struct netdev *netdev, int rssi_val)
if (!netdev->event_filter) if (!netdev->event_filter)
return; return;
new_rssi_low = rssi_val < LOW_SIGNAL_THRESHOLD; new_rssi_low = rssi_val < threshold;
if (netdev->cur_rssi_low != new_rssi_low) { if (netdev->cur_rssi_low != new_rssi_low) {
int event = new_rssi_low ? int event = new_rssi_low ?
NETDEV_EVENT_RSSI_THRESHOLD_LOW : NETDEV_EVENT_RSSI_THRESHOLD_LOW :
@ -4806,9 +4809,11 @@ static struct l_genl_msg *netdev_build_cmd_cqm_rssi_update(
uint32_t hyst = 5; uint32_t hyst = 5;
int thold_count; int thold_count;
int32_t thold_list[levels_num + 2]; int32_t thold_list[levels_num + 2];
int threshold = netdev->frequency > 4000 ? LOW_SIGNAL_THRESHOLD_5GHZ :
LOW_SIGNAL_THRESHOLD;
if (levels_num == 0) { if (levels_num == 0) {
thold_list[0] = LOW_SIGNAL_THRESHOLD; thold_list[0] = threshold;
thold_count = 1; thold_count = 1;
} else { } else {
/* /*
@ -4827,13 +4832,12 @@ static struct l_genl_msg *netdev_build_cmd_cqm_rssi_update(
if (i && thold_list[thold_count - 1] >= val) if (i && thold_list[thold_count - 1] >= val)
return NULL; return NULL;
if (val >= LOW_SIGNAL_THRESHOLD && !low_sig_added) { if (val >= threshold && !low_sig_added) {
thold_list[thold_count++] = thold_list[thold_count++] = threshold;
LOW_SIGNAL_THRESHOLD;
low_sig_added = true; low_sig_added = true;
/* Duplicate values are not allowed */ /* Duplicate values are not allowed */
if (val == LOW_SIGNAL_THRESHOLD) if (val == threshold)
continue; continue;
} }
@ -5833,6 +5837,10 @@ static int netdev_init(void)
&LOW_SIGNAL_THRESHOLD)) &LOW_SIGNAL_THRESHOLD))
LOW_SIGNAL_THRESHOLD = -70; LOW_SIGNAL_THRESHOLD = -70;
if (!l_settings_get_int(settings, "General", "RoamThreshold5G",
&LOW_SIGNAL_THRESHOLD_5GHZ))
LOW_SIGNAL_THRESHOLD_5GHZ = -76;
if (!l_settings_get_bool(settings, "General", "ControlPortOverNL80211", if (!l_settings_get_bool(settings, "General", "ControlPortOverNL80211",
&pae_over_nl80211)) &pae_over_nl80211))
pae_over_nl80211 = true; pae_over_nl80211 = true;