Fix auto connection failure
[platform/upstream/connman.git] / src / service.c
index fb780fb..e6cc61c 100755 (executable)
@@ -860,6 +860,9 @@ static int service_ext_load(struct connman_service *service)
        int i;
        int err = 0;
 
+#if defined TIZEN_EXT
+       if (!simplified_log)
+#endif
        DBG("service %p", service);
 
        if (!service->network)
@@ -1036,7 +1039,9 @@ static int service_load(struct connman_service *service)
 #if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET
        bool use_eapol;
 #endif
-
+#if defined TIZEN_EXT
+       if (!simplified_log)
+#endif
        DBG("service %p", service);
 
        keyfile = connman_storage_load_service(service->identifier);
@@ -4381,8 +4386,9 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
                connman_dbus_dict_append_basic(dict, "AssocStatusCode",
                                DBUS_TYPE_INT32, &service->assoc_status_code);
 
+               val = service->hidden_service;
                connman_dbus_dict_append_basic(dict, "Hidden",
-                               DBUS_TYPE_BOOLEAN, &service->hidden_service);
+                               DBUS_TYPE_BOOLEAN, &val);
 
                break;
 #endif
@@ -4390,7 +4396,7 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
 #if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET
                connman_dbus_dict_append_dict(dict, "EapOverEthernet",
                                                append_eap_over_ethernet, service);
-
+               /* fall through */
 #endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */
        case CONNMAN_SERVICE_TYPE_BLUETOOTH:
        case CONNMAN_SERVICE_TYPE_GADGET:
@@ -4888,6 +4894,30 @@ bool connman_service_get_internet_connection(struct connman_service *service)
 
        return service->is_internet_connection;
 }
+
+DBusMessage *connman_service_get_defaut_info(DBusMessage *msg,
+                                                       struct connman_service *service)
+{
+       DBusMessage *reply;
+       DBusMessageIter array, dict;
+
+       reply = dbus_message_new_method_return(msg);
+       if (!reply)
+               return NULL;
+
+       dbus_message_iter_init_append(reply, &array);
+
+       if (service)
+               dbus_message_iter_append_basic(&array, DBUS_TYPE_OBJECT_PATH,
+                                                               &service->path);
+
+       connman_dbus_dict_open(&array, &dict);
+       if (service)
+               append_properties(&dict, FALSE, service);
+       connman_dbus_dict_close(&array, &dict);
+
+       return reply;
+}
 #endif
 
 void __connman_service_set_proxy_autoconfig(struct connman_service *service,
@@ -6234,6 +6264,9 @@ static void preferred_tech_add_by_type(gpointer data, gpointer user_data)
                tech_data->preferred_list =
                        g_list_append(tech_data->preferred_list, service);
 
+#if defined TIZEN_EXT
+               if (!simplified_log)
+#endif
                DBG("type %d service %p %s", tech_data->type, service,
                                service->name);
        }
@@ -6331,6 +6364,9 @@ static bool auto_connect_service(GList *services,
        bool ignore[MAX_CONNMAN_SERVICE_TYPES] = { };
        bool autoconnecting = false;
        GList *list;
+#if defined TIZEN_EXT
+       GSList *wifi_ignore = NULL;
+#endif
 
        DBG("preferred %d sessions %d reason %s", preferred, active_count,
                reason2string(reason));
@@ -6346,6 +6382,13 @@ static bool auto_connect_service(GList *services,
        for (list = services; list; list = list->next) {
                service = list->data;
 
+#if defined TIZEN_EXT
+               if (service->type == CONNMAN_SERVICE_TYPE_WIFI) {
+                       int index = connman_network_get_index(service->network);
+                       if (g_slist_find(wifi_ignore, GINT_TO_POINTER(index)) != NULL)
+                               continue;
+               } else
+#endif
                if (ignore[service->type]) {
                        DBG("service %p type %s ignore", service,
                                __connman_service_type2string(service->type));
@@ -6369,9 +6412,18 @@ static bool auto_connect_service(GList *services,
                if (service->pending ||
                                is_connecting(service->state) ||
                                is_connected(service->state)) {
+#if defined TIZEN_EXT
+                       if (service->type == CONNMAN_SERVICE_TYPE_WIFI) {
+                               int index = connman_network_get_index(service->network);
+                               wifi_ignore = g_slist_prepend(wifi_ignore, GINT_TO_POINTER(index));
+
+                               autoconnecting = true;
+                               continue;
+                       }
+#else
                        if (autoconnect_no_session_active(service))
                                        return true;
-
+#endif
                        ignore[service->type] = true;
                        autoconnecting = true;
 
@@ -6388,6 +6440,7 @@ static bool auto_connect_service(GList *services,
 #if defined TIZEN_EXT
                        DBG("Service is not favorite, autoconnecting %d",
                                        autoconnecting);
+                       g_slist_free(wifi_ignore);
 #endif
                        return autoconnecting;
                }
@@ -6403,7 +6456,9 @@ static bool auto_connect_service(GList *services,
                if (is_ignore(service) || service->state !=
                                CONNMAN_SERVICE_STATE_IDLE)
                        continue;
-
+#if defined TIZEN_EXT
+               if (service->type != CONNMAN_SERVICE_TYPE_WIFI)
+#endif
                if (autoconnect_already_connecting(service, autoconnecting)) {
                        DBG("service %p type %s has no users", service,
                                __connman_service_type2string(service->type));
@@ -6414,13 +6469,22 @@ static bool auto_connect_service(GList *services,
                        (preferred) ? "preferred" : reason2string(reason));
 
                __connman_service_connect(service, reason);
-
+#if !defined TIZEN_EXT
                if (autoconnect_no_session_active(service))
                        return true;
-
+#endif
+#if defined TIZEN_EXT
+               if (service->type == CONNMAN_SERVICE_TYPE_WIFI) {
+                       int index = connman_network_get_index(service->network);
+                       wifi_ignore = g_slist_prepend(wifi_ignore, GINT_TO_POINTER(index));
+                       autoconnecting = true;
+               }
+#endif
                ignore[service->type] = true;
        }
-
+#if defined TIZEN_EXT
+       g_slist_free(wifi_ignore);
+#endif
        return autoconnecting;
 }
 
@@ -7004,6 +7068,9 @@ static void service_append_added_foreach(gpointer data, gpointer user_data)
                append_struct(service, iter);
                g_hash_table_remove(services_notify->add, service->path);
        } else {
+#if defined TIZEN_EXT
+               if (!simplified_log)
+#endif
                DBG("changed %s", service->path);
 
                append_struct_service(iter, NULL, service);
@@ -7212,6 +7279,9 @@ static DBusMessage *downgrade_service(DBusConnection *conn,
 
 static void service_schedule_added(struct connman_service *service)
 {
+#if defined TIZEN_EXT
+       if (!simplified_log)
+#endif
        DBG("service %p", service);
 
        g_hash_table_remove(services_notify->remove, service->path);
@@ -7405,6 +7475,9 @@ static void stats_init(struct connman_service *service)
 
 static void service_initialize(struct connman_service *service)
 {
+#if defined TIZEN_EXT
+       if (!simplified_log)
+#endif
        DBG("service %p", service);
 
        service->refcount = 1;
@@ -7731,6 +7804,25 @@ static gint service_compare(gconstpointer a, gconstpointer b)
        a_connected = is_connected(state_a);
        b_connected = is_connected(state_b);
 
+#if defined TIZEN_EXT
+       if ((a_connected && b_connected) &&
+                       state_a == state_b &&
+                       service_a->type == CONNMAN_SERVICE_TYPE_WIFI &&
+                       service_b->type == CONNMAN_SERVICE_TYPE_WIFI) {
+               const char *default_interface =
+                               connman_option_get_string("DefaultWifiInterface");
+               const char *ifname_a = connman_device_get_string(
+                               connman_network_get_device(service_a->network), "Interface");
+               const char *ifname_b = connman_device_get_string(
+                               connman_network_get_device(service_b->network), "Interface");
+
+               if (g_strcmp0(default_interface, ifname_a) == 0)
+                       return -1;
+               else if (g_strcmp0(default_interface, ifname_b) == 0)
+                       return 1;
+       }
+#endif
+
        if (a_connected && b_connected) {
                if (service_a->order > service_b->order)
                        return -1;
@@ -8660,6 +8752,14 @@ static int service_indicate_state(struct connman_service *service)
                searchdomain_remove_all(service);
 
        service->state = new_state;
+#if defined TIZEN_EXT
+       if (!is_connected(old_state) && is_connected(new_state))
+               connman_device_send_connected_signal(
+                               connman_network_get_device(service->network), true);
+       else if (is_connected(old_state) && !is_connected(new_state))
+               connman_device_send_connected_signal(
+                               connman_network_get_device(service->network), false);
+#endif
        state_changed(service);
 
        if (!is_connected(old_state) && is_connected(new_state))
@@ -9884,7 +9984,9 @@ static struct connman_service *service_get(const char *identifier)
        service = connman_service_create();
        if (!service)
                return NULL;
-
+#if defined TIZEN_EXT
+       if (!simplified_log)
+#endif
        DBG("service %p", service);
 
        service->identifier = g_strdup(identifier);
@@ -9899,6 +10001,9 @@ static struct connman_service *service_get(const char *identifier)
 
 static int service_register(struct connman_service *service)
 {
+#if defined TIZEN_EXT
+       if (!simplified_log)
+#endif
        DBG("service %p", service);
 
        if (service->path)
@@ -9916,7 +10021,7 @@ static int service_register(struct connman_service *service)
        if (ret == -ERANGE)
                service_ext_save(service);
        ret = __connman_config_provision_service(service);
-       if (ret < 0)
+       if (ret < 0 && simplified_log)
                DBG("Failed to provision service");
 #else
        if (__connman_config_provision_service(service) < 0)
@@ -10532,7 +10637,8 @@ void __connman_service_notify_strength_changed(struct connman_network *network)
                return;
 
        service->strength = strength;
-       DBG("Strength %d", strength);
+       if (!simplified_log)
+               DBG("Strength %d", strength);
        strength_changed(service);
        service_list_sort();
 }