Block AutoConnect when hidden connection is in progress
[platform/upstream/connman.git] / src / service.c
index 9149dd2..34a37a7 100755 (executable)
@@ -157,6 +157,13 @@ struct connman_service {
         */
        int user_pdn_connection_refcount;
        bool storage_reload;
+       /*
+        * Description: In case of EAP security type,
+        *                                user can select the keymgmt type for roaming(802.11r).
+        *                                - FT, CCKM, OKC, ...
+        */
+       char *keymgmt_type;
+       int disconnect_reason;
 #endif
 #if defined TIZEN_TV_EXT
        enum connman_dnsconfig_method dns_config_method;
@@ -2727,6 +2734,7 @@ static void append_wifi_ext_info(DBusMessageIter *dict,
        char *bssid_str = bssid_buff;
        unsigned char *bssid;
        unsigned int maxrate;
+       unsigned int keymgmt;
        uint16_t frequency;
        const char *enc_mode;
        gboolean passpoint;
@@ -2736,6 +2744,7 @@ static void append_wifi_ext_info(DBusMessageIter *dict,
        frequency = connman_network_get_frequency(network);
        enc_mode = connman_network_get_enc_mode(network);
        passpoint = connman_network_get_is_hs20AP(network);
+       keymgmt = connman_network_get_keymgmt(network);
 
        snprintf(bssid_str, WIFI_BSSID_STR_LEN, "%02x:%02x:%02x:%02x:%02x:%02x",
                                bssid[0], bssid[1], bssid[2],
@@ -2751,6 +2760,8 @@ static void append_wifi_ext_info(DBusMessageIter *dict,
                                        DBUS_TYPE_STRING, &enc_mode);
        connman_dbus_dict_append_basic(dict, "Passpoint",
                                        DBUS_TYPE_BOOLEAN, &passpoint);
+       connman_dbus_dict_append_basic(dict, "Keymgmt",
+                                       DBUS_TYPE_UINT32, &keymgmt);
 }
 #endif
 
@@ -2761,6 +2772,15 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
        const char *str;
        GSList *list;
 
+#if defined TIZEN_EXT
+       unsigned int frequency = 0U;
+       if (service && service->network) {
+               frequency = connman_network_get_frequency(service->network);
+               connman_dbus_dict_append_basic(dict, "Frequency",
+                               DBUS_TYPE_UINT16, &frequency);
+       }
+#endif
+
        str = __connman_service_type2string(service->type);
        if (str)
                connman_dbus_dict_append_basic(dict, "Type",
@@ -2832,6 +2852,10 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
 
                connman_dbus_dict_append_dict(dict, "Ethernet",
                                                append_ethernet, service);
+
+               connman_dbus_dict_append_basic(dict, "DisconnectReason",
+                               DBUS_TYPE_INT32, &service->disconnect_reason);
+
                break;
 #endif
        case CONNMAN_SERVICE_TYPE_ETHERNET:
@@ -4016,9 +4040,11 @@ static DBusMessage *set_property(DBusConnection *conn,
                if (err < 0) {
                        if (is_connected_state(service, state) ||
                                        is_connecting_state(service, state)) {
-                               __connman_network_enable_ipconfig(service->network,
+                               if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
+                                       __connman_network_enable_ipconfig(service->network,
                                                        service->ipconfig_ipv4);
-                               __connman_network_enable_ipconfig(service->network,
+                               else
+                                       __connman_network_enable_ipconfig(service->network,
                                                        service->ipconfig_ipv6);
                        }
 
@@ -4031,10 +4057,12 @@ static DBusMessage *set_property(DBusConnection *conn,
                        ipv6_configuration_changed(service);
 
                if (is_connecting(service) || is_connected(service)) {
-                       __connman_network_enable_ipconfig(service->network,
-                                                       service->ipconfig_ipv4);
-                       __connman_network_enable_ipconfig(service->network,
-                                                       service->ipconfig_ipv6);
+                       if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
+                               __connman_network_enable_ipconfig(service->network,
+                                                               service->ipconfig_ipv4);
+                       else
+                               __connman_network_enable_ipconfig(service->network,
+                                                               service->ipconfig_ipv6);
                }
 
                service_save(service);
@@ -4057,8 +4085,10 @@ static void set_error(struct connman_service *service,
        if (!service->path)
                return;
 
+#if !defined TIZEN_EXT
        if (!allow_property_changed(service))
                return;
+#endif
 
        str = error2string(service->error);
 
@@ -4246,6 +4276,9 @@ static GList *preferred_tech_list_get(void)
                                 */
                                if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR)
                                        break;
+
+                               if (service->type == CONNMAN_SERVICE_TYPE_BLUETOOTH)
+                                       break;
 #endif
                                return NULL;
                        }
@@ -4588,8 +4621,12 @@ static DBusMessage *connect_service(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
        struct connman_service *service = user_data;
+#if defined TIZEN_EXT
+       int err = 0;
+#else
        int index, err = 0;
        GList *list;
+#endif
 
        DBG("service %p", service);
 
@@ -4629,6 +4666,7 @@ static DBusMessage *connect_service(DBusConnection *conn,
                }
        }
 
+#if !defined TIZEN_EXT
        index = __connman_service_get_index(service);
 
        for (list = service_list; list; list = list->next) {
@@ -4654,6 +4692,7 @@ static DBusMessage *connect_service(DBusConnection *conn,
        }
        if (err == -EINPROGRESS)
                return __connman_error_operation_timeout(msg);
+#endif
 
        service->ignore = false;
 
@@ -5903,21 +5942,6 @@ void __connman_service_set_search_domains(struct connman_service *service,
        searchdomain_add_all(service);
 }
 
-#if defined TIZEN_EXT
-void __connman_service_set_autoconnect(struct connman_service *service,
-                                               bool autoconnect)
-{
-       if (service == NULL)
-               return;
-
-       if (service->autoconnect != autoconnect) {
-               DBG("updated autoconnect flag (%d)", autoconnect);
-               service->autoconnect = autoconnect;
-               service_save(service);
-       }
-}
-#endif
-
 static void service_complete(struct connman_service *service)
 {
        reply_pending(service, EIO);
@@ -5941,7 +5965,14 @@ static void report_error_cb(void *user_context, bool retry,
                /* It is not relevant to stay on Failure state
                 * when failing is due to wrong user input */
                __connman_service_clear_error(service);
+#if defined TIZEN_EXT
+               /* Reseting the state back in case of failure state */
+               service->state_ipv4 = service->state_ipv6 =
+                               CONNMAN_SERVICE_STATE_IDLE;
 
+               if (service->error != CONNMAN_SERVICE_ERROR_AUTH_FAILED)
+                       set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN);
+#endif
                service_complete(service);
                __connman_connection_update_gateway();
        }
@@ -5979,34 +6010,6 @@ static int check_wpspin(struct connman_service *service, const char *wpspin)
        return 0;
 }
 
-#if defined TIZEN_EXT
-static int __connman_service_connect_hidden(struct connman_service *service,
-                       const char *name, int name_len,
-                       const char *identity, const char *passphrase, void *user_data)
-{
-       GList *list;
-
-       for (list = service_list; list; list = list->next) {
-               struct connman_service *target = list->data;
-               const char *target_ssid = NULL;
-               unsigned int target_ssid_len = 0;
-
-               if (service->network != NULL &&
-                                       service->security == target->security) {
-                       target_ssid = connman_network_get_blob(service->network,
-                                                       "WiFi.SSID", &target_ssid_len);
-                       if (target_ssid_len == name_len &&
-                                                       memcmp(target_ssid, name, name_len) == 0) {
-                               return connman_network_connect_hidden(service->network,
-                                                       (char *)identity, (char *)passphrase, user_data);
-                       }
-               }
-       }
-
-       return -ENOENT;
-}
-#endif
-
 static void request_input_cb(struct connman_service *service,
                        bool values_received,
                        const char *name, int name_len,
@@ -6039,14 +6042,6 @@ static void request_input_cb(struct connman_service *service,
        }
 
        if (service->hidden && name_len > 0 && name_len <= 32) {
-#if defined TIZEN_EXT
-               /* TIZEN already has Wi-Fi hidden scan before this hidden connection */
-               err = __connman_service_connect_hidden(service, name, name_len,
-                                               identity, passphrase, user_data);
-               if (err == 0 || err == -EALREADY || err == -EINPROGRESS)
-                       return;
-#endif
-
                device = connman_network_get_device(service->network);
                security = connman_network_get_string(service->network,
                                                        "WiFi.Security");
@@ -6497,6 +6492,7 @@ static int service_indicate_state(struct connman_service *service)
                reply_pending(service, ECONNABORTED);
 
                def_service = __connman_service_get_default();
+               service->disconnect_reason = connman_network_get_disconnect_reason(service->network);
 
                if (!__connman_notifier_is_connected() &&
                        def_service &&
@@ -6539,6 +6535,7 @@ static int service_indicate_state(struct connman_service *service)
 #if defined TIZEN_EXT
                if (service->type == CONNMAN_SERVICE_TYPE_WIFI)
                        service->order = 5;
+               __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO);
 #endif
                if (service->connect_reason == CONNMAN_SERVICE_CONNECT_REASON_USER &&
                        connman_agent_report_error(service, service->path,
@@ -6612,6 +6609,11 @@ int __connman_service_indicate_error(struct connman_service *service,
                                service->error == CONNMAN_SERVICE_ERROR_CONNECT_FAILED)
                        __connman_service_disconnect_default(service);
 
+               if (service->type == CONNMAN_SERVICE_TYPE_WIFI &&
+                               service->error == CONNMAN_SERVICE_ERROR_INVALID_KEY) {
+                       g_free(service->passphrase);
+                       service->passphrase = NULL;
+               }
 #endif
 
        __connman_service_ipconfig_indicate_state(service,
@@ -6716,6 +6718,15 @@ done:
        __connman_wispr_start(service, CONNMAN_IPCONFIG_TYPE_IPV4);
 }
 
+#if defined TIZEN_EXT
+void connman_check_proxy_setup_and_wispr_start(struct connman_service *service){
+
+       DBG("check the proxy and start wispr");
+       check_proxy_setup(service);
+       return;
+}
+#endif
+
 /*
  * How many networks are connected at the same time. If more than 1,
  * then set the rp_filter setting properly (loose mode routing) so that network
@@ -6884,7 +6895,9 @@ int __connman_service_ipconfig_indicate_state(struct connman_service *service,
                }
 #endif
                if (type == CONNMAN_IPCONFIG_TYPE_IPV4) {
+#if !defined TIZEN_EXT
                        check_proxy_setup(service);
+#endif
                        service_rp_filter(service, true);
                } else {
                        service->online_check_count = 1;
@@ -7025,6 +7038,33 @@ static int service_connect(struct connman_service *service)
        if (service->hidden)
                return -EPERM;
 
+#if defined TIZEN_EXT
+       GList *list;
+       int index;
+
+       index = __connman_service_get_index(service);
+
+       for (list = service_list; list; list = list->next) {
+               struct connman_service *temp = list->data;
+
+               if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR)
+                       break;
+
+               if (!is_connecting(temp) && !is_connected(temp))
+                       break;
+
+               if (service == temp)
+                       continue;
+
+               if (service->type != temp->type)
+                       continue;
+
+               if (__connman_service_get_index(temp) == index &&
+                               __connman_service_disconnect(temp) == -EINPROGRESS)
+                       return -EINPROGRESS;
+       }
+#endif
+
        switch (service->type) {
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
        case CONNMAN_SERVICE_TYPE_SYSTEM: