Merge "Add support for WPS2-PSK security type in Security property of service interfa...
[platform/upstream/connman.git] / src / service.c
index 320e7cc..b424bd5 100755 (executable)
@@ -327,6 +327,10 @@ enum connman_service_security __connman_service_string2security(const char *str)
                return CONNMAN_SERVICE_SECURITY_NONE;
        if (!strcmp(str, "wep"))
                return CONNMAN_SERVICE_SECURITY_WEP;
+#if defined TIZEN_EXT
+       if (!strcmp(str, "rsn"))
+               return CONNMAN_SERVICE_SECURITY_RSN;
+#endif
 
        return CONNMAN_SERVICE_SECURITY_UNKNOWN;
 }
@@ -342,8 +346,14 @@ static const char *security2string(enum connman_service_security security)
                return "wep";
        case CONNMAN_SERVICE_SECURITY_PSK:
        case CONNMAN_SERVICE_SECURITY_WPA:
+#if defined TIZEN_EXT
+               return "psk";
+       case CONNMAN_SERVICE_SECURITY_RSN:
+               return "rsn";
+#else
        case CONNMAN_SERVICE_SECURITY_RSN:
                return "psk";
+#endif
        case CONNMAN_SERVICE_SECURITY_8021X:
                return "ieee8021x";
        }
@@ -472,6 +482,7 @@ connman_service_is_user_allowed(struct connman_service *service, uid_t uid)
        return true;
 }
 
+#if !defined TIZEN_EXT
 static GList *connman_service_get_login_users()
 {
        struct utmpx *utmp;
@@ -497,9 +508,13 @@ static GList *connman_service_get_login_users()
 
        return user_list;
 }
+#endif
 
 static bool is_service_owner_user_login(struct connman_service *service)
 {
+#if defined TIZEN_EXT
+       return true;
+#else
        GList *list, *user_list;
        bool ret = false;
 
@@ -529,6 +544,7 @@ static bool is_service_owner_user_login(struct connman_service *service)
        g_list_free(user_list);
 
        return ret;
+#endif
 }
 
 int __connman_service_load_modifiable(struct connman_service *service)
@@ -674,6 +690,8 @@ static int service_load(struct connman_service *service)
 
                                connman_network_set_blob(service->network,
                                        "WiFi.SSID", ssid, hex_ssid_len / 2);
+
+                               g_free(ssid);
                        }
 
                        g_free(hex_ssid);
@@ -1888,8 +1906,10 @@ static void state_changed(struct connman_service *service)
        if (!str)
                return;
 
+#if !defined TIZEN_EXT
        if (!allow_property_changed(service))
                return;
+#endif
 
        connman_dbus_property_changed_basic(service->path,
                                CONNMAN_SERVICE_INTERFACE, "State",
@@ -2708,11 +2728,13 @@ static void append_wifi_ext_info(DBusMessageIter *dict,
        unsigned int maxrate;
        uint16_t frequency;
        const char *enc_mode;
+       gboolean passpoint;
 
        bssid = connman_network_get_bssid(network);
        maxrate = connman_network_get_maxrate(network);
        frequency = connman_network_get_frequency(network);
        enc_mode = connman_network_get_enc_mode(network);
+       passpoint = connman_network_get_is_hs20AP(network);
 
        snprintf(bssid_str, WIFI_BSSID_STR_LEN, "%02x:%02x:%02x:%02x:%02x:%02x",
                                bssid[0], bssid[1], bssid[2],
@@ -2726,6 +2748,8 @@ static void append_wifi_ext_info(DBusMessageIter *dict,
                                        DBUS_TYPE_UINT16, &frequency);
        connman_dbus_dict_append_basic(dict, "EncryptionMode",
                                        DBUS_TYPE_STRING, &enc_mode);
+       connman_dbus_dict_append_basic(dict, "Passpoint",
+                                       DBUS_TYPE_BOOLEAN, &passpoint);
 }
 #endif
 
@@ -3363,7 +3387,9 @@ static int check_passphrase(enum connman_service_security security,
        case CONNMAN_SERVICE_SECURITY_UNKNOWN:
        case CONNMAN_SERVICE_SECURITY_NONE:
        case CONNMAN_SERVICE_SECURITY_WPA:
+#if !defined TIZEN_EXT
        case CONNMAN_SERVICE_SECURITY_RSN:
+#endif
 
                DBG("service security '%s' (%d) not handled",
                                security2string(security), security);
@@ -3371,6 +3397,9 @@ static int check_passphrase(enum connman_service_security security,
                return -EOPNOTSUPP;
 
        case CONNMAN_SERVICE_SECURITY_PSK:
+#if defined TIZEN_EXT
+       case CONNMAN_SERVICE_SECURITY_RSN:
+#endif
                /* A raw key is always 64 bytes length,
                 * its content is in hex representation.
                 * A PSK key must be between [8..63].
@@ -4040,6 +4069,14 @@ static void set_error(struct connman_service *service,
                                DBUS_TYPE_STRING, &str);
 }
 
+static void set_idle(struct connman_service *service)
+{
+       service->state = service->state_ipv4 = service->state_ipv6 =
+                                               CONNMAN_SERVICE_STATE_IDLE;
+       set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN);
+       state_changed(service);
+}
+
 static DBusMessage *clear_property(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
@@ -4344,7 +4381,23 @@ void __connman_service_auto_connect(enum connman_service_connect_reason reason)
        if (!__connman_session_policy_autoconnect(reason))
                return;
 
+#if defined TIZEN_EXT
+       /* Adding Timeout of 500ms before trying to auto connect.
+        * This is done because of below scenario
+        * 1. Device is connected to AP1
+        * 2. WPS Connection request is initiated for AP2
+        * 3. Immediately WPS Connection is Cancelled
+        * When WPS Connection Connection is initiated for AP2 then
+        * sometimes there is a scenario where connman gets in ASSOCIATED
+        * state with AP1 due to autoconnect and subsequently the connection
+        * initiated by AP1 fails and connman service for AP1 comes in
+        * FAILURE state due to this when connection with AP2 is cancelled
+        * then autoconnect with AP1 doesn't works because its autoconnection
+        * is ignored as its last state was FAILURE rather than IDLE */
+       autoconnect_timeout = g_timeout_add(500, run_auto_connect,
+#else
        autoconnect_timeout = g_timeout_add_seconds(0, run_auto_connect,
+#endif
                                                GUINT_TO_POINTER(reason));
 }
 
@@ -4696,6 +4749,38 @@ bool __connman_service_remove(struct connman_service *service)
        g_free(service->eap);
        service->eap = NULL;
 
+#if defined TIZEN_EXT
+       g_free(service->ca_cert_file);
+       service->ca_cert_file = NULL;
+
+       g_free(service->client_cert_file);
+       service->client_cert_file = NULL;
+
+       g_free(service->private_key_file);
+       service->private_key_file = NULL;
+
+       g_free(service->private_key_passphrase);
+       service->private_key_passphrase = NULL;
+
+       g_free(service->phase2);
+       service->phase2 = NULL;
+
+       __connman_ipconfig_set_method(service->ipconfig_ipv4, CONNMAN_IPCONFIG_METHOD_DHCP);
+       __connman_ipconfig_set_method(service->ipconfig_ipv6, CONNMAN_IPCONFIG_METHOD_AUTO);
+       connman_service_set_proxy(service, NULL, false);
+
+       __connman_service_nameserver_clear(service);
+
+       g_strfreev(service->nameservers_config);
+       service->nameservers_config = NULL;
+
+#endif
+
+#if defined TIZEN_EXT
+       if (service->security != CONNMAN_SERVICE_SECURITY_8021X)
+#endif
+       set_idle(service);
+
        service->error = CONNMAN_SERVICE_ERROR_UNKNOWN;
 
        service->user.favorite_user = USER_NONE;
@@ -4704,7 +4789,11 @@ bool __connman_service_remove(struct connman_service *service)
 
        __connman_ipconfig_ipv6_reset_privacy(service->ipconfig_ipv6);
 
+#if defined TIZEN_EXT
+       __connman_storage_remove_service(service->identifier);
+#else
        service_save(service);
+#endif
 
        return true;
 }
@@ -5076,6 +5165,10 @@ static void service_schedule_removed(struct connman_service *service)
 
 static bool allow_property_changed(struct connman_service *service)
 {
+#if defined TIZEN_EXT
+       if (service->path == NULL)
+               return FALSE;
+#endif
        if (g_hash_table_lookup_extended(services_notify->add, service->path,
                                        NULL, NULL)) {
                DBG("no property updates for service %p", service);
@@ -6164,6 +6257,11 @@ static void single_connected_tech(struct connman_service *allowed)
 
        DBG("keeping %p %s", allowed, allowed->path);
 
+#if defined TIZEN_EXT
+       if (!allowed || allowed->type == CONNMAN_SERVICE_TYPE_CELLULAR)
+               return;
+#endif
+
        for (iter = service_list; iter; iter = iter->next) {
                service = iter->data;
 
@@ -6773,6 +6871,19 @@ int __connman_service_ipconfig_indicate_state(struct connman_service *service,
                        is_connected_state(service, new_state))
                nameserver_add_all(service);
 
+#if defined TIZEN_EXT
+       int ret = service_indicate_state(service);
+       /*Sent the Ready changed signal again in case IPv4 IP set
+         after IPv6 IP set*/
+
+       if(ret == -EALREADY && type == CONNMAN_IPCONFIG_TYPE_IPV4
+                       && new_state == CONNMAN_SERVICE_STATE_READY) {
+               DBG("Notify IPv4 state new/old %d/%d", new_state,old_state);
+               state_changed(service);
+       }
+
+       return ret;
+#endif
        return service_indicate_state(service);
 }