mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-12-22 21:22: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:
parent
7b26a87d7a
commit
968584d3f0
20
src/netdev.c
20
src/netdev.c
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user