Use estimated throughput for wifi roaming 26/296126/2 accepted/tizen/7.0/unified/20230822.163535
authorJaehyun Kim <jeik01.kim@samsung.com>
Tue, 18 Jul 2023 04:21:45 +0000 (13:21 +0900)
committerJaehyun Kim <jeik01.kim@samsung.com>
Thu, 20 Jul 2023 08:14:31 +0000 (17:14 +0900)
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>
gsupplicant/gsupplicant.h
gsupplicant/supplicant.c
include/network.h
plugins/wifi.c
src/main.c
src/main.conf
src/main_robot.conf
src/main_tv.conf
src/network.c
src/service.c

index d8d55a4..141d5ac 100755 (executable)
@@ -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);
index 3174857..ab5729c 100755 (executable)
@@ -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);
index 46ccc81..9f1a611 100755 (executable)
@@ -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);
index 25594c9..b0f4116 100755 (executable)
         * 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
index 13e26d4..3a03ed4 100755 (executable)
@@ -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
index e734ecf..09eab2c 100755 (executable)
@@ -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
index f2b84b5..cc364d8 100755 (executable)
@@ -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
index c7b8e11..ce9d711 100755 (executable)
@@ -149,4 +149,4 @@ INSInternetScore = 30
 
 # INS(Intelligent Network Selection) configuration: Common.
 INSSignalLevel3_5GHz = -76
-INSSignalLevel3_24GHz = -74
+INSSignalLevel3_2_4GHz = -74
index 34e6ea7..bd86361 100755 (executable)
@@ -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,
index ac090b5..04c0708 100755 (executable)
@@ -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);