Merge "Block all extra scans caused by ConnMan" into tizen
authorcheoleun moon <chleun.moon@samsung.com>
Mon, 25 May 2020 02:17:01 +0000 (02:17 +0000)
committerGerrit Code Review <gerrit@review>
Mon, 25 May 2020 02:17:01 +0000 (02:17 +0000)
gdbus/watch.c
gsupplicant/supplicant.c
packaging/connman.spec

index 447e486..1ca3c4b 100755 (executable)
@@ -136,6 +136,51 @@ static struct filter_data *filter_data_find(DBusConnection *connection)
        return NULL;
 }
 
+#if defined TIZEN_EXT
+#define SENDER_PREFIX ",sender='%s'"
+#define PATH_PREFIX ",path='%s'"
+#define IFACE_PREFIX ",interface='%s'"
+#define MEMBER_PREFIX ",member='%s'"
+#define ARG0_PREFIX ",arg0='%s'"
+
+static gboolean check_rule_length(int remains, const char *prefix, const char *data)
+{
+       if (!prefix || !data)
+               return FALSE;
+
+       return strlen(prefix) - 2 + strlen(data) < remains;
+}
+
+static void format_rule(struct filter_data *data, char *rule, size_t size)
+{
+       const char *sender;
+       int offset;
+
+       offset = snprintf(rule, size, "type='signal'");
+       sender = data->name ? : data->owner;
+
+       if (sender &&
+                       check_rule_length(size - offset, SENDER_PREFIX, sender))
+               offset += snprintf(rule + offset, size - offset,
+                               SENDER_PREFIX, sender);
+       if (data->path &&
+                       check_rule_length(size - offset, PATH_PREFIX, data->path))
+               offset += snprintf(rule + offset, size - offset,
+                               PATH_PREFIX, data->path);
+       if (data->interface &&
+                       check_rule_length(size - offset, IFACE_PREFIX, data->interface))
+               offset += snprintf(rule + offset, size - offset,
+                               IFACE_PREFIX, data->interface);
+       if (data->member &&
+                       check_rule_length(size - offset, MEMBER_PREFIX, data->member))
+               offset += snprintf(rule + offset, size - offset,
+                               MEMBER_PREFIX, data->member);
+       if (data->argument &&
+                       check_rule_length(size - offset, ARG0_PREFIX, data->argument))
+               snprintf(rule + offset, size - offset,
+                               ARG0_PREFIX, data->argument);
+}
+#else
 static void format_rule(struct filter_data *data, char *rule, size_t size)
 {
        const char *sender;
@@ -160,6 +205,7 @@ static void format_rule(struct filter_data *data, char *rule, size_t size)
                snprintf(rule + offset, size - offset,
                                ",arg0='%s'", data->argument);
 }
+#endif
 
 static gboolean add_match(struct filter_data *data,
                                DBusHandleMessageFunction filter)
index 759e165..2dccc95 100755 (executable)
@@ -2455,16 +2455,30 @@ static char *create_group(struct g_supplicant_bss *bss)
        return g_string_free(str, FALSE);
 }
 
+static void update_network_with_best_bss(GSupplicantNetwork *network,
+               struct g_supplicant_bss *best_bss)
+{
+       network->signal = best_bss->signal;
+       network->frequency = best_bss->frequency;
+       network->best_bss = best_bss;
+}
+
 static bool update_best_bss(GSupplicantNetwork *network,
                struct g_supplicant_bss *bss, struct g_supplicant_bss *best_bss)
 {
        int score_new;
        int score_best;
 
+       if (network->best_bss == NULL) {
+               update_network_with_best_bss(network, bss);
+               return true;
+       }
+
        score_new = calculate_score(
                compare_bssid(bss->bssid, network->last_connected_bssid),
                get_assoc_reject_cnt(network->assoc_reject_table, bss->bssid),
                bss->frequency, bss->signal);
+
        score_best = calculate_score(
                compare_bssid(network->best_bss->bssid, network->last_connected_bssid),
                get_assoc_reject_cnt(network->assoc_reject_table, network->best_bss->bssid),
@@ -2475,9 +2489,7 @@ static bool update_best_bss(GSupplicantNetwork *network,
                        MAC2STR(bss->bssid), score_new,
                        MAC2STR(network->best_bss->bssid), score_best);
 
-               network->signal = bss->signal;
-               network->frequency = bss->frequency;
-               network->best_bss = bss;
+               update_network_with_best_bss(network, bss);
 
                SUPPLICANT_DBG("Update best BSS for %s", network->name);
 
@@ -5570,6 +5582,53 @@ static void interface_create_params(DBusMessageIter *iter, void *user_data)
        supplicant_dbus_dict_close(iter, &dict);
 }
 
+#if defined TIZEN_EXT
+static void interface_get_state(const char *key, DBusMessageIter *iter,
+               void *user_data)
+{
+       struct interface_create_data *data = user_data;
+       GSupplicantInterface *interface = NULL;
+       const char *str = NULL;
+
+       SUPPLICANT_DBG("key[%s]", key);
+
+       if (!data) {
+               SUPPLICANT_DBG("data is NULL");
+               return;
+       }
+
+       interface = data->interface;
+       if (!interface) {
+               SUPPLICANT_DBG("interface is NULL");
+               return;
+       }
+
+       if (iter)
+               dbus_message_iter_get_basic(iter, &str);
+
+       if (str) {
+               if (string2state(str) != interface->state)
+                       interface->state = string2state(str);
+       }
+
+       if (interface->state == G_SUPPLICANT_STATE_DISABLED)
+               interface->ready = FALSE;
+       else
+               interface->ready = TRUE;
+
+       SUPPLICANT_DBG("state %s (%d)", str, interface->state);
+
+       if (data->callback) {
+               data->callback(0, interface, data->user_data);
+#if defined TIZEN_EXT_WIFI_MESH
+               callback_mesh_support(interface);
+#endif
+       }
+
+       interface_create_data_free(data);
+}
+#endif
+
 static void interface_get_result(const char *error,
                                DBusMessageIter *iter, void *user_data)
 {
@@ -5597,6 +5656,16 @@ static void interface_get_result(const char *error,
                goto done;
        }
 
+#if defined TIZEN_EXT
+       data->interface = interface;
+       err = supplicant_dbus_property_get(path,
+                       SUPPLICANT_INTERFACE ".Interface",
+                       "State", interface_get_state, data, NULL);
+
+       if (err == 0)
+               return;
+#endif
+
        if (data->callback) {
                data->callback(0, interface, data->user_data);
 #if !defined TIZEN_EXT
index 6fa2f94..4a6815e 100644 (file)
@@ -5,7 +5,7 @@
 
 Name:           connman
 Version:        1.37
-Release:        39
+Release:        41
 License:        GPL-2.0+
 Summary:        Connection Manager
 Url:            http://connman.net