summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaehyun Kim <jeik01.kim@samsung.com>2023-07-18 13:21:45 +0900
committerJaehyun Kim <jeik01.kim@samsung.com>2023-07-20 17:14:31 +0900
commite396cd78fbe44947398347b538e27a7d0dc5018b (patch)
treebc569d09b222fc1a845048f6ff76460d94d258ed
parent0160a66dcae13a327c23bad22887a5cccad48c4e (diff)
downloadconnman-e396cd78fbe44947398347b538e27a7d0dc5018b.tar.gz
connman-e396cd78fbe44947398347b538e27a7d0dc5018b.tar.bz2
connman-e396cd78fbe44947398347b538e27a7d0dc5018b.zip
Use estimated throughput for wifi roamingaccepted/tizen/7.0/unified/20230822.163535
Added setting options for minimum roaming conditions, and use estimated throughput for AP-to-AP comparisons. Change-Id: Ie4eb5930a0511e252f16169c31b439c9f37cba33 Signed-off-by: Jaehyun Kim <jeik01.kim@samsung.com>
-rwxr-xr-xgsupplicant/gsupplicant.h4
-rwxr-xr-xgsupplicant/supplicant.c18
-rwxr-xr-xinclude/network.h3
-rwxr-xr-xplugins/wifi.c165
-rwxr-xr-xsrc/main.c119
-rwxr-xr-xsrc/main.conf10
-rwxr-xr-xsrc/main_robot.conf9
-rwxr-xr-xsrc/main_tv.conf2
-rwxr-xr-xsrc/network.c15
-rwxr-xr-xsrc/service.c2
10 files changed, 272 insertions, 75 deletions
diff --git a/gsupplicant/gsupplicant.h b/gsupplicant/gsupplicant.h
index d8d55a41..141d5ac1 100755
--- a/gsupplicant/gsupplicant.h
+++ b/gsupplicant/gsupplicant.h
@@ -299,6 +299,7 @@ struct g_connman_bssids {
uint16_t frequency;
uint16_t assoc_reject_cnt;
bool is_last_connected;
+ unsigned int est_throughput;
int score_snr;
#if defined TIZEN_EXT_INS
int score_last_connected_bssid;
@@ -336,7 +337,8 @@ typedef void (*GSupplicantInterfaceCallback) (int result,
#if defined TIZEN_EXT
typedef void (*GSupplicantMaxSpeedCallback) (int result, int maxspeed,
- int strength, int snr, void *user_data);
+ int strength, int snr, void *user_data,
+ unsigned int est_throughput);
#endif
void g_supplicant_interface_cancel(GSupplicantInterface *interface);
diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c
index 31748573..ab5729c7 100755
--- a/gsupplicant/supplicant.c
+++ b/gsupplicant/supplicant.c
@@ -456,7 +456,9 @@ struct assoc_count_data {
int assoc_count;
};
+#if defined TIZEN_EXT_INS
static unsigned int last_connected_bss_timeout = 0;
+#endif
static bool simplified_log = true;
#endif
@@ -2015,6 +2017,7 @@ void *g_supplicant_network_get_wifi_vsie(GSupplicantNetwork *network)
return vsie_list;
}
+#if defined TIZEN_EXT_INS
static bool compare_bssid(unsigned char *bssid_a, unsigned char *bssid_b)
{
if (!memcmp(bssid_a, bssid_b, WIFI_BSSID_LEN_MAX))
@@ -2023,7 +2026,6 @@ static bool compare_bssid(unsigned char *bssid_a, unsigned char *bssid_b)
return false;
}
-#if defined TIZEN_EXT_INS
static gchar *convert_bssid_to_str(unsigned char *bssid)
{
GString *bssid_str;
@@ -2203,6 +2205,7 @@ static void update_bssid_list(gpointer key, gpointer value, gpointer user_data)
bssids->strength = 100;
bssids->frequency = bss->frequency;
+ bssids->est_throughput = bss->est_throughput;
bssids->score_snr = (int)bss->snr;
#if defined TIZEN_EXT_INS
@@ -6590,6 +6593,7 @@ static void interface_signalpoll_result(const char *error,
dbus_int32_t maxspeed = 0;
dbus_int32_t strength = 0;
dbus_int32_t snr = 0;
+ dbus_uint32_t est_throughput = 0;
DBusMessageIter sub_iter, dict;
if (error) {
@@ -6621,23 +6625,27 @@ static void interface_signalpoll_result(const char *error,
if (g_strcmp0(key, "linkspeed") == 0) {
dbus_message_iter_get_basic(&value, &maxspeed);
SUPPLICANT_DBG("linkspeed = %d", maxspeed);
- break;
} else if (g_strcmp0(key, "rssi") == 0) {
dbus_message_iter_get_basic(&value, &strength);
SUPPLICANT_DBG("Strength = %d", strength);
- break;
} else if (g_strcmp0(key, "SNR") == 0) {
dbus_message_iter_get_basic(&value, &snr);
SUPPLICANT_DBG("SNR = %d", snr);
- break;
}
+ break;
+ case DBUS_TYPE_UINT32:
+ if (g_strcmp0(key, "est_throughput") == 0) {
+ dbus_message_iter_get_basic(&value, &est_throughput);
+ SUPPLICANT_DBG("est_throughput = %u", est_throughput);
+ }
+ break;
}
dbus_message_iter_next(&dict);
}
out:
if(data->callback)
- data->callback(err, maxspeed, strength, snr, data->user_data);
+ data->callback(err, maxspeed, strength, snr, data->user_data, est_throughput);
g_free(data->path);
dbus_free(data);
diff --git a/include/network.h b/include/network.h
index 46ccc816..9f1a6118 100755
--- a/include/network.h
+++ b/include/network.h
@@ -249,6 +249,9 @@ void connman_network_set_roam_scan_time(struct connman_network *network,
__time_t roam_scan_time);
int connman_network_get_snr(struct connman_network *network);
void connman_network_set_snr(struct connman_network *network, int snr);
+unsigned int connman_network_get_est_throughput(struct connman_network *network);
+void connman_network_set_est_throughput(struct connman_network *network,
+ unsigned int est_throughput);
int connman_network_set_phy_mode(struct connman_network *network,
ieee80211_modes_e mode);
ieee80211_modes_e connman_network_get_phy_mode(struct connman_network *network);
diff --git a/plugins/wifi.c b/plugins/wifi.c
index 25594c93..b0f41169 100755
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -104,10 +104,14 @@
* No signal : -89 ~
*/
#define RSSI_LEVEL_2_5G -77
-#define RSSI_LEVEL_2_24G -75
+#define RSSI_LEVEL_2_2_4G -75
#define RSSI_LEVEL_3_5G -68
-#define RSSI_LEVEL_3_24G -64
+#define RSSI_LEVEL_3_2_4G -64
#define ROAM_SCAN_INTERVAL 60 /* 60 seconds */
+
+static int min_snr = 0;
+static int min_rssi_2_4GHz = 0;
+static int min_rssi_5GHz = 0;
#endif
static struct connman_technology *wifi_technology = NULL;
@@ -2144,40 +2148,100 @@ static gboolean need_bss_transition(uint16_t freq, int snr, int strength)
/*
* If the currently connected AP matches the following conditions,
* scan for BSS transition is started.
- * - SNR is less than 20 or RSSI level is less than 3
+ * - SNR is less than min_snr or RSSI is less than
+ * min_rssi_2_4GHz or min_rssi_5GHz.
*/
- if (snr < 20 && snr != 0)
+ if (min_snr != 0 && snr != 0 && snr < min_snr)
return TRUE;
- else if (freq > 4900 && signal <= RSSI_LEVEL_2_5G)
+ else if (freq > 4000 && signal <= min_rssi_5GHz)
return TRUE;
- else if (freq <= 4900 && signal <= RSSI_LEVEL_2_24G)
+ else if (freq < 4000 && signal <= min_rssi_2_4GHz)
return TRUE;
return FALSE;
}
-static gboolean check_bss_condition(uint16_t freq, int snr, uint16_t strength)
+static gboolean check_bss_diff(int cur_level, int sel_level, int to_5ghz,
+ unsigned int cur_est, unsigned int sel_est)
+{
+ int min_diff;
+ int diff;
+
+ /* This code is from wpa_supplicant. */
+ if (cur_level < -85) /* ..-86 dBm */
+ min_diff = 1;
+ else if (cur_level < -80) /* -85..-81 dBm */
+ min_diff = 2;
+ else if (cur_level < -75) /* -80..-76 dBm */
+ min_diff = 3;
+ else if (cur_level < -70) /* -75..-71 dBm */
+ min_diff = 4;
+ else if (cur_level < 0) /* -70..-1 dBm */
+ min_diff = 5;
+ else /* unspecified units (not in dBm) */
+ min_diff = 2;
+
+ if (cur_est > sel_est * 1.5)
+ min_diff += 10;
+ else if (cur_est > sel_est * 1.2)
+ min_diff += 5;
+ else if (cur_est > sel_est * 1.1)
+ min_diff += 2;
+ else if (cur_est > sel_est)
+ min_diff++;
+ else if (sel_est > cur_est * 1.5)
+ min_diff -= 10;
+ else if (sel_est > cur_est * 1.2)
+ min_diff -= 5;
+ else if (sel_est > cur_est * 1.1)
+ min_diff -= 2;
+ else if (sel_est > cur_est)
+ min_diff--;
+
+ if (to_5ghz)
+ min_diff -= 2;
+
+ diff = sel_level - cur_level;
+
+ if (diff < min_diff)
+ return FALSE;
+
+ return TRUE;
+}
+
+static gboolean check_bss_condition(uint16_t freq, uint16_t strength,
+ unsigned int est_throughput, uint16_t cur_freq, uint16_t cur_strength,
+ unsigned int cur_est_throughput)
{
/*
* Since bssid->strength is a positive value,
* it need to be changed to its original value.
*/
int signal = strength - 120;
+ int cur_signal = cur_strength - 120;
+ int to_5ghz = freq > 4000 && cur_freq < 4000;
+
+ DBG("cur_freq=%d cur_level=%d cur_est=%d sel_freq=%d sel_level=%d sel_est=%d",
+ cur_freq, cur_strength, cur_est_throughput,
+ freq, strength, est_throughput);
/*
* If the AP that matches the following conditions exists in the SCAN result,
* BSS transition is started.
- * - SNR is 25 or more and RSSI level is greater than 3
*/
- if (snr < 25 && snr != 0)
- return FALSE;
- if (freq > 4900 && signal > RSSI_LEVEL_3_5G)
- return TRUE;
- else if (freq <= 4900 && signal > RSSI_LEVEL_3_24G)
+ if (est_throughput > cur_est_throughput + 5000)
return TRUE;
- return FALSE;
+ if (cur_signal > signal + to_5ghz * 2 &&
+ est_throughput < cur_est_throughput * 1.2)
+ return FALSE;
+
+ if (cur_est_throughput > est_throughput + 5000)
+ return FALSE;
+
+ return check_bss_diff(cur_signal, signal,
+ to_5ghz, cur_est_throughput, est_throughput);
}
static void scan_callback_hidden(int result,
@@ -2206,18 +2270,37 @@ static void start_roaming(struct wifi_data *wifi)
if (connman_network_get_bool(network, "WiFi.Roaming"))
return;
+ uint16_t cur_freq = connman_network_get_frequency(network);
+ uint8_t cur_strength = connman_network_get_strength(network);
+ unsigned int cur_est_throughput = connman_network_get_est_throughput(network);
+
if (!need_bss_transition(
- connman_network_get_frequency(network),
+ cur_freq,
connman_network_get_snr(network),
- connman_network_get_strength(network)))
+ cur_strength))
return;
+ unsigned char *cur_bssid = connman_network_get_bssid(network);
+
for (; bssid_list; bssid_list = bssid_list->next) {
struct g_connman_bssids *bssid = bssid_list->data;
- if (check_bss_condition(bssid->frequency,
- bssid->score_snr, bssid->strength))
+ if (memcmp(cur_bssid, bssid->bssid, WIFI_BSSID_LEN_MAX) == 0)
+ continue;
+
+ if (check_bss_condition(
+ bssid->frequency, bssid->strength, bssid->est_throughput,
+ cur_freq, cur_strength, cur_est_throughput)) {
roaming_ap_found = true;
+
+ char bssid_buff[WIFI_BSSID_STR_LEN] = {0,};
+ char *bssid_str = bssid_buff;
+
+ snprintf(bssid_str, WIFI_BSSID_STR_LEN, MACSTR, MAC2STR(bssid->bssid));
+ connman_network_set_string(network,
+ "WiFi.RoamingDstBSSID", bssid_str);
+ break;
+ }
}
if (roaming_ap_found) {
@@ -3946,14 +4029,24 @@ static void ssid_init(GSupplicantSSID *ssid, struct connman_network *network)
}
GSList *list;
- char buff[MAC_ADDRESS_LENGTH];
+ char buff[WIFI_BSSID_STR_LEN];
+ const char *dst_bssid = connman_network_get_string(network,
+ "WiFi.RoamingDstBSSID");
for (list = bssid_list; list; list = list->next) {
struct connman_bssids * bssids = (struct connman_bssids *)list->data;
- g_snprintf(buff, MAC_ADDRESS_LENGTH, "%02x:%02x:%02x:%02x:%02x:%02x",
- bssids->bssid[0], bssids->bssid[1], bssids->bssid[2],
- bssids->bssid[3], bssids->bssid[4], bssids->bssid[5]);
- buff[MAC_ADDRESS_LENGTH - 1] = '\0';
+ g_snprintf(buff, WIFI_BSSID_STR_LEN, MACSTR, MAC2STR(bssids->bssid));
+ buff[WIFI_BSSID_STR_LEN - 1] = '\0';
+
+ if (dst_bssid) {
+ if (g_strcmp0(dst_bssid, (const gchar *)buff) == 0) {
+ memcpy(buff_bssid, bssids->bssid, WIFI_BSSID_LEN_MAX);
+ ssid->bssid = buff_bssid;
+ ssid->freq = (unsigned int)bssids->frequency;
+ break;
+ }
+ continue;
+ }
gchar *curr_bssid = g_strdup((const gchar *)buff);
@@ -3971,6 +4064,9 @@ static void ssid_init(GSupplicantSSID *ssid, struct connman_network *network)
}
}
+ if (dst_bssid)
+ connman_network_set_string(network, "WiFi.RoamingDstBSSID", NULL);
+
if (!list) {
ssid->bssid = connman_network_get_bssid(network);
g_hash_table_remove_all(failed_bssids);
@@ -4242,7 +4338,7 @@ static void set_connection_mode(struct connman_network *network,
}
static void signalpoll_callback(int result, int maxspeed, int strength,
- int snr, void *user_data)
+ int snr, void *user_data, unsigned int est_throughput)
{
char bssid_buff[WIFI_BSSID_STR_LEN] = {0,};
char *bssid_str = bssid_buff;
@@ -4282,11 +4378,12 @@ static void signalpoll_callback(int result, int maxspeed, int strength,
bssid = connman_network_get_bssid(network);
snprintf(bssid_str, WIFI_BSSID_STR_LEN, MACSTR, MAC2STR(bssid));
- DBG("network %p, bssid %s, freq %u, maxspeed %d, strength %d, snr %d",
- network, bssid_str, freq, maxspeed, strength, snr);
+ DBG("network %p, bssid %s, freq %u, maxspeed %d, strength %d, snr %d, est_throughput %u",
+ network, bssid_str, freq, maxspeed, strength, snr, est_throughput);
connman_network_set_strength(network, (uint8_t)strength);
connman_network_set_snr(network, snr);
+ connman_network_set_est_throughput(network, est_throughput);
connman_network_set_maxspeed(network, maxspeed);
set_connection_mode(network, maxspeed);
@@ -6647,7 +6744,7 @@ static void supp_ins_init(void)
connman_setting_get_uint("INSLastConnectedBSSIDScore"),
connman_setting_get_uint("INSAssocRejectScore"),
connman_setting_get_int("INSSignalLevel3_5GHz"),
- connman_setting_get_int("INSSignalLevel3_24GHz")
+ connman_setting_get_int("INSSignalLevel3_2_4GHz")
);
}
#endif /* defined TIZEN_EXT && defined TIZEN_EXT_INS */
@@ -6684,6 +6781,20 @@ static int wifi_init(void)
#if defined TIZEN_EXT
failed_bssids = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+
+ min_snr = connman_setting_get_int("WifiRoamingMinSNR");
+
+ min_rssi_2_4GHz = connman_setting_get_int("WifiRoamingMinRSSI_2_4GHz");
+ if (min_rssi_2_4GHz >= 0)
+ min_rssi_2_4GHz = RSSI_LEVEL_2_2_4G;
+
+ min_rssi_5GHz = connman_setting_get_int("WifiRoamingMinRSSI_5GHz");
+ if (min_rssi_5GHz >= 0)
+ min_rssi_5GHz = RSSI_LEVEL_2_5G;
+
+ DBG("Min SNR: %d, Min RSSI: %d(2.4GHz), %d(5GHz)",
+ min_snr, min_rssi_2_4GHz, min_rssi_5GHz);
+
#endif
#if defined TIZEN_EXT && defined TIZEN_EXT_INS
diff --git a/src/main.c b/src/main.c
index 13e26d46..3a03ed4d 100755
--- a/src/main.c
+++ b/src/main.c
@@ -121,6 +121,9 @@ static struct {
bool simple_log;
bool wifi_roam_scan;
bool wifi_roam;
+ int wifi_roam_min_snr;
+ int wifi_roam_min_rssi_2_4GHz;
+ int wifi_roam_min_rssi_5GHz;
#endif
} connman_settings = {
.bg_scan = true,
@@ -159,6 +162,9 @@ static struct {
.simple_log = true,
.wifi_roam_scan = false,
.wifi_roam = false,
+ .wifi_roam_min_snr = 0,
+ .wifi_roam_min_rssi_2_4GHz = 0,
+ .wifi_roam_min_rssi_5GHz = 0,
#endif
};
@@ -247,13 +253,16 @@ static struct {
#define CONF_TIZEN_TV_EXT "TizenTVExtension"
#define CONF_ENABLE_AUTO_IP "EnableAutoIp"
#define CONF_GLOBAL_NAMESERVER "GlobalNameserver"
-#define CONF_CONNMAN_SUPPLICANT_DEBUG "ConnmanSupplicantDebug"
-#define CONF_CONNMAN_WIFI_DEF_IFNAME "DefaultWifiInterface"
-#define CONF_CONNMAN_FILE_LOG "FileLogging"
-#define CONF_CONNMAN_DLOG_LOG "DlogLogging"
-#define CONF_CONNMAN_SIMPLIFIED_LOG "SimplifiedLog"
-#define CONF_CONNMAN_WIFI_ROAM_SCAN "WifiRoamingScan"
-#define CONF_CONNMAN_WIFI_ROAM "WifiRoaming"
+#define CONF_SUPPLICANT_DEBUG "ConnmanSupplicantDebug"
+#define CONF_WIFI_DEF_IFNAME "DefaultWifiInterface"
+#define CONF_FILE_LOG "FileLogging"
+#define CONF_DLOG_LOG "DlogLogging"
+#define CONF_SIMPLIFIED_LOG "SimplifiedLog"
+#define CONF_WIFI_ROAM_SCAN "WifiRoamingScan"
+#define CONF_WIFI_ROAM "WifiRoaming"
+#define CONF_WIFI_ROAM_MIN_SNR "WifiRoamingMinSNR"
+#define CONF_WIFI_ROAM_MIN_RSSI_2_4 "WifiRoamingMinRSSI_2_4GHz"
+#define CONF_WIFI_ROAM_MIN_RSSI_5 "WifiRoamingMinRSSI_5GHz"
#endif
#if defined TIZEN_EXT
@@ -281,7 +290,7 @@ static struct {
#define CONF_INS_INTERNET_SCORE "INSInternetScore"
/* Common */
#define CONF_INS_SIGNAL_LEVEL3_5GHZ "INSSignalLevel3_5GHz"
-#define CONF_INS_SIGNAL_LEVEL3_24GHZ "INSSignalLevel3_24GHz"
+#define CONF_INS_SIGNAL_LEVEL3_2_4GHZ "INSSignalLevel3_2_4GHz"
#endif
static const char *supported_options[] = {
@@ -314,13 +323,16 @@ static const char *supported_options[] = {
CONF_TIZEN_TV_EXT,
CONF_ENABLE_AUTO_IP,
CONF_GLOBAL_NAMESERVER,
- CONF_CONNMAN_SUPPLICANT_DEBUG,
- CONF_CONNMAN_WIFI_DEF_IFNAME,
- CONF_CONNMAN_FILE_LOG,
- CONF_CONNMAN_DLOG_LOG,
- CONF_CONNMAN_SIMPLIFIED_LOG,
- CONF_CONNMAN_WIFI_ROAM_SCAN,
- CONF_CONNMAN_WIFI_ROAM,
+ CONF_SUPPLICANT_DEBUG,
+ CONF_WIFI_DEF_IFNAME,
+ CONF_FILE_LOG,
+ CONF_DLOG_LOG,
+ CONF_SIMPLIFIED_LOG,
+ CONF_WIFI_ROAM_SCAN,
+ CONF_WIFI_ROAM,
+ CONF_WIFI_ROAM_MIN_SNR,
+ CONF_WIFI_ROAM_MIN_RSSI_2_4,
+ CONF_WIFI_ROAM_MIN_RSSI_5,
#endif
NULL
};
@@ -351,7 +363,7 @@ static const char *supported_ins_options[] = {
CONF_INS_INTERNET_SCORE,
/* Common */
CONF_INS_SIGNAL_LEVEL3_5GHZ,
- CONF_INS_SIGNAL_LEVEL3_24GHZ,
+ CONF_INS_SIGNAL_LEVEL3_2_4GHZ,
NULL
};
#endif
@@ -495,7 +507,7 @@ static void check_config(GKeyFile *config)
}
#if defined TIZEN_EXT
-static void check_Tizen_INS_configuration(GKeyFile *config)
+static void check_tizen_ins_configuration(GKeyFile *config)
{
GError *error = NULL;
char *ins_preferred_freq_bssid;
@@ -649,20 +661,21 @@ static void check_Tizen_INS_configuration(GKeyFile *config)
g_clear_error(&error);
integer = g_key_file_get_integer(config, "INS",
- CONF_INS_SIGNAL_LEVEL3_24GHZ, &error);
+ CONF_INS_SIGNAL_LEVEL3_2_4GHZ, &error);
if (!error)
connman_ins_settings.ins_signal_level3_24ghz = integer;
g_clear_error(&error);
}
-static void check_Tizen_configuration(GKeyFile *config)
+static void check_tizen_configuration(GKeyFile *config)
{
GError *error = NULL;
char **cellular_interfaces;
char *global_nameserver;
char *default_wifi_ifname;
bool boolean;
+ int integer;
gsize len;
cellular_interfaces = g_key_file_get_string_list(config, "General",
@@ -695,51 +708,76 @@ static void check_Tizen_configuration(GKeyFile *config)
g_clear_error(&error);
boolean = __connman_config_get_bool(config, "General",
- CONF_CONNMAN_SUPPLICANT_DEBUG, &error);
+ CONF_SUPPLICANT_DEBUG, &error);
if (!error)
connman_settings.supplicant_debug = boolean;
g_clear_error(&error);
default_wifi_ifname = __connman_config_get_string(config, "General",
- CONF_CONNMAN_WIFI_DEF_IFNAME, &error);
+ CONF_WIFI_DEF_IFNAME, &error);
if (!error)
connman_settings.def_wifi_ifname = default_wifi_ifname;
g_clear_error(&error);
boolean = __connman_config_get_bool(config, "General",
- CONF_CONNMAN_FILE_LOG, &error);
+ CONF_FILE_LOG, &error);
if (!error)
connman_settings.file_log = boolean;
g_clear_error(&error);
boolean = __connman_config_get_bool(config, "General",
- CONF_CONNMAN_DLOG_LOG, &error);
+ CONF_DLOG_LOG, &error);
if (!error)
connman_settings.dlog_log = boolean;
g_clear_error(&error);
boolean = __connman_config_get_bool(config, "General",
- CONF_CONNMAN_SIMPLIFIED_LOG, &error);
+ CONF_SIMPLIFIED_LOG, &error);
if (!error)
connman_settings.simple_log = boolean;
+ g_clear_error(&error);
+
boolean = __connman_config_get_bool(config, "General",
- CONF_CONNMAN_WIFI_ROAM_SCAN, &error);
+ CONF_WIFI_ROAM_SCAN, &error);
if (!error)
connman_settings.wifi_roam_scan = boolean;
+ g_clear_error(&error);
+
boolean = __connman_config_get_bool(config, "General",
- CONF_CONNMAN_WIFI_ROAM, &error);
+ CONF_WIFI_ROAM, &error);
if (!error)
connman_settings.wifi_roam = boolean;
g_clear_error(&error);
- check_Tizen_INS_configuration(config);
+ integer = g_key_file_get_integer(config, "General",
+ CONF_WIFI_ROAM_MIN_SNR, &error);
+ if (!error && integer >= 0)
+ connman_settings.wifi_roam_min_snr = integer;
+
+ g_clear_error(&error);
+
+ integer = g_key_file_get_integer(config, "General",
+ CONF_WIFI_ROAM_MIN_RSSI_2_4, &error);
+ if (!error)
+ connman_settings.wifi_roam_min_rssi_2_4GHz = integer;
+
+ g_clear_error(&error);
+
+ integer = g_key_file_get_integer(config, "General",
+ CONF_WIFI_ROAM_MIN_RSSI_5, &error);
+ if (!error)
+ connman_settings.wifi_roam_min_rssi_5GHz = integer;
+
+ g_clear_error(&error);
+
+ check_tizen_ins_configuration(config);
}
static void set_nofile_inc(void)
@@ -1000,7 +1038,7 @@ static void parse_config(GKeyFile *config)
g_clear_error(&error);
#if defined TIZEN_EXT
- check_Tizen_configuration(config);
+ check_tizen_configuration(config);
#endif
}
@@ -1204,7 +1242,7 @@ char *connman_setting_get_string(const char *key)
if (g_str_equal(key, CONF_INS_PREFERRED_FREQ))
return connman_ins_settings.ins_preferred_freq;
- if (g_str_equal(key, CONF_CONNMAN_WIFI_DEF_IFNAME))
+ if (g_str_equal(key, CONF_WIFI_DEF_IFNAME))
return connman_settings.def_wifi_ifname;
#endif
return NULL;
@@ -1249,22 +1287,22 @@ bool connman_setting_get_bool(const char *key)
if (g_str_equal(key, CONF_ENABLE_AUTO_IP))
return connman_settings.auto_ip;
- if (g_str_equal(key, CONF_CONNMAN_SUPPLICANT_DEBUG))
+ if (g_str_equal(key, CONF_SUPPLICANT_DEBUG))
return connman_settings.supplicant_debug;
- if (g_str_equal(key, CONF_CONNMAN_FILE_LOG))
+ if (g_str_equal(key, CONF_FILE_LOG))
return connman_settings.file_log;
- if (g_str_equal(key, CONF_CONNMAN_DLOG_LOG))
+ if (g_str_equal(key, CONF_DLOG_LOG))
return connman_settings.dlog_log;
- if (g_str_equal(key, CONF_CONNMAN_SIMPLIFIED_LOG))
+ if (g_str_equal(key, CONF_SIMPLIFIED_LOG))
return connman_settings.simple_log;
- if (g_str_equal(key, CONF_CONNMAN_WIFI_ROAM_SCAN))
+ if (g_str_equal(key, CONF_WIFI_ROAM_SCAN))
return connman_settings.wifi_roam_scan;
- if (g_str_equal(key, CONF_CONNMAN_WIFI_ROAM))
+ if (g_str_equal(key, CONF_WIFI_ROAM))
return connman_settings.wifi_roam;
if (g_str_equal(key, CONF_INS_LAST_CONNECTED_BSSID))
@@ -1340,9 +1378,18 @@ int connman_setting_get_int(const char *key)
if (g_str_equal(key, CONF_INS_SIGNAL_LEVEL3_5GHZ))
return connman_ins_settings.ins_signal_level3_5ghz;
- if (g_str_equal(key, CONF_INS_SIGNAL_LEVEL3_24GHZ))
+ if (g_str_equal(key, CONF_INS_SIGNAL_LEVEL3_2_4GHZ))
return connman_ins_settings.ins_signal_level3_24ghz;
+ if (g_str_equal(key, CONF_WIFI_ROAM_MIN_SNR))
+ return connman_settings.wifi_roam_min_snr;
+
+ if (g_str_equal(key, CONF_WIFI_ROAM_MIN_RSSI_2_4))
+ return connman_settings.wifi_roam_min_rssi_2_4GHz;
+
+ if (g_str_equal(key, CONF_WIFI_ROAM_MIN_RSSI_5))
+ return connman_settings.wifi_roam_min_rssi_5GHz;
+
return 0;
}
#endif
diff --git a/src/main.conf b/src/main.conf
index e734ecfe..09eab2cf 100755
--- a/src/main.conf
+++ b/src/main.conf
@@ -215,6 +215,14 @@ DefaultWifiInterface = wlan0
# Default value is false.
# WifiRoaming = true
+# Determine if the SNR and signal have weakened
+# based on the following conditions.
+# - SNR is less than WifiRoamingMinSNR or RSSI is less than
+# WifiRoamingMinRSSI_2_4GHz or WifiRoamingMinRSSI_5GHz.
+# - If the WifiRoamingMinSNR value is 0, the SNR check will be skipped.
+WifiRoamingMinSNR = 20
+WifiRoamingMinRSSI_2_4GHz = -75
+WifiRoamingMinRSSI_5GHz = -77
[INS]
# INS(Intelligent Network Selection) configuration: BSSID Selection.
@@ -245,4 +253,4 @@ INSInternetScore = 30
# INS(Intelligent Network Selection) configuration: Common.
INSSignalLevel3_5GHz = -76
-INSSignalLevel3_24GHz = -74
+INSSignalLevel3_2_4GHz = -74
diff --git a/src/main_robot.conf b/src/main_robot.conf
index f2b84b55..cc364d88 100755
--- a/src/main_robot.conf
+++ b/src/main_robot.conf
@@ -215,6 +215,13 @@ DefaultWifiInterface = wlan0
# Default value is false.
# WifiRoaming = true
+# Determine if the SNR and signal have weakened
+# based on the following conditions.
+# - SNR is less than WifiRoamingMinSNR or RSSI level is less than
+# WifiRoamingMinRSSI_2_4GHz or WifiRoamingMinRSSI_5GHz.
+WifiRoamingMinSNR = 20
+WifiRoamingMinRSSI_2_4GHz = -75
+WifiRoamingMinRSSI_5GHz = -77
[INS]
# INS(Intelligent Network Selection) configuration: BSSID Selection.
@@ -245,4 +252,4 @@ INSInternetScore = 30
# INS(Intelligent Network Selection) configuration: Common.
INSSignalLevel3_5GHz = -76
-INSSignalLevel3_24GHz = -74
+INSSignalLevel3_2_4GHz = -74
diff --git a/src/main_tv.conf b/src/main_tv.conf
index c7b8e112..ce9d711f 100755
--- a/src/main_tv.conf
+++ b/src/main_tv.conf
@@ -149,4 +149,4 @@ INSInternetScore = 30
# INS(Intelligent Network Selection) configuration: Common.
INSSignalLevel3_5GHz = -76
-INSSignalLevel3_24GHz = -74
+INSSignalLevel3_2_4GHz = -74
diff --git a/src/network.c b/src/network.c
index 34e6ea7d..bd86361f 100755
--- a/src/network.c
+++ b/src/network.c
@@ -144,8 +144,7 @@ struct connman_network {
char *connector;
char *c_sign_key;
char *net_access_key;
-#endif
-#if defined TIZEN_EXT
+
unsigned char last_connected_bssid[WIFI_BSSID_LEN_MAX];
GHashTable *assoc_reject_table;
bool owe_transition_mode;
@@ -159,6 +158,7 @@ struct connman_network {
__time_t roam_scan_time;
unsigned int max_bssid_count;
int snr;
+ unsigned int est_throughput;
#endif
} wifi;
@@ -2785,6 +2785,17 @@ void connman_network_set_snr(struct connman_network *network, int snr)
{
network->wifi.snr = snr;
}
+
+unsigned int connman_network_get_est_throughput(struct connman_network *network)
+{
+ return network->wifi.est_throughput;
+}
+
+void connman_network_set_est_throughput(struct connman_network *network,
+ unsigned int est_throughput)
+{
+ network->wifi.est_throughput = est_throughput;
+}
#endif
int connman_network_set_nameservers(struct connman_network *network,
diff --git a/src/service.c b/src/service.c
index ac090b51..04c0708b 100755
--- a/src/service.c
+++ b/src/service.c
@@ -11524,7 +11524,7 @@ static void ins_setting_init(void)
* So the value for comparison should also be converted to the same.
*/
ins_settings.signal_level3_5ghz = connman_setting_get_int("INSSignalLevel3_5GHz") + 120;
- ins_settings.signal_level3_24ghz = connman_setting_get_int("INSSignalLevel3_24GHz") + 120;
+ ins_settings.signal_level3_24ghz = connman_setting_get_int("INSSignalLevel3_2_4GHz") + 120;
DBG("last_user_selection [%s]", ins_settings.last_user_selection ? "true" : "false");
DBG("last_user_selection_time [%d]", ins_settings.last_user_selection_time);