Merge "Fix crash caused by decryption response delay" into tizen
[platform/upstream/connman.git] / src / network.c
index d71b419..46a4af9 100755 (executable)
 #include <connman/acd.h>
 #include "src/shared/arp.h"
 
+#if defined TIZEN_EXT
+#include <gdbus.h>
+
+static DBusConnection *connection;
+#endif
+
 /*
  * How many times to send RS with the purpose of
  * refreshing RDNSS entries before they actually expire.
@@ -56,6 +62,8 @@
 static unsigned char invalid_bssid[WIFI_BSSID_LEN_MAX] = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 };
+
+static GHashTable *dhcp_status_list = NULL;
 #endif
 
 static GSList *network_list = NULL;
@@ -122,6 +130,7 @@ struct connman_network {
                unsigned int keymgmt;
                char *keymgmt_type;
                bool rsn_mode;
+               bool pmf_required;
                int disconnect_reason;
                int assoc_status_code;
                GSList *vsie_list;
@@ -137,8 +146,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;
@@ -146,16 +154,20 @@ struct connman_network {
                int transition_mode_ssid_len;
                unsigned char transition_mode_bssid[WIFI_BSSID_LEN_MAX];
                bool roaming_progress;
+               bool roaming_dhcp;
                char *roaming_cur_bssid;
                char *roaming_dst_bssid;
                __time_t roam_scan_time;
+               unsigned int max_bssid_count;
                int snr;
+               unsigned int est_throughput;
 #endif
        } wifi;
 
 #if defined TIZEN_EXT
        /* Multiple APN services and a default APN which a user selected */
        bool default_internet;
+       bool is_psk_sha256;
 #endif
 
 };
@@ -560,6 +572,10 @@ static int set_connected_manual(struct connman_network *network)
        ipconfig = __connman_service_get_ip4config(service);
        __connman_ipconfig_enable(ipconfig);
 
+#if defined TIZEN_EXT
+       if (!service || !ipconfig)
+               return -EINVAL;
+#endif
        if (!__connman_ipconfig_get_local(ipconfig))
                __connman_service_read_ip4config(service);
 
@@ -595,7 +611,11 @@ static void remove_dhcp_timeout(struct connman_network *network)
        }
 }
 
+#if defined TIZEN_EXT
+int set_connected_dhcp(struct connman_network *network)
+#else
 static int set_connected_dhcp(struct connman_network *network)
+#endif
 {
        struct connman_service *service;
        struct connman_ipconfig *ipconfig_ipv4;
@@ -1345,6 +1365,9 @@ static void network_destruct(struct connman_network *network)
 #if defined TIZEN_EXT
        g_slist_free_full(network->wifi.vsie_list, g_free);
        g_slist_free_full(network->wifi.bssid_list, g_free);
+
+       if (TIZEN_INS_ENABLED)
+               g_hash_table_destroy(network->wifi.assoc_reject_table);
 #endif
        g_free(network->path);
        g_free(network->group);
@@ -1409,6 +1432,9 @@ struct connman_network *
 connman_network_ref_debug(struct connman_network *network,
                        const char *file, int line, const char *caller)
 {
+#if defined TIZEN_EXT
+       if (!simplified_log)
+#endif
        DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
                network->refcount + 1, file, line, caller);
 
@@ -1426,6 +1452,9 @@ connman_network_ref_debug(struct connman_network *network,
 void connman_network_unref_debug(struct connman_network *network,
                                const char *file, int line, const char *caller)
 {
+#if defined TIZEN_EXT
+       if (!simplified_log)
+#endif
        DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
                network->refcount - 1, file, line, caller);
 
@@ -1803,6 +1832,10 @@ static void set_authenticate_error(struct connman_network *network)
        if (!service)
                return;
 
+       if (connman_service_get_favorite(service)) {
+               __connman_service_set_ignore(service, true);
+       }
+
        __connman_service_indicate_error(service,
                                        CONNMAN_SERVICE_ERROR_AUTH_FAILED);
 }
@@ -1819,6 +1852,9 @@ static void set_associate_error(struct connman_network *network)
        if (!service)
                return;
 
+       if (connman_service_get_favorite(service))
+               __connman_service_set_ignore(service, true);
+
        __connman_service_indicate_error(service,
                                        CONNMAN_SERVICE_ERROR_ASSOC_FAILED);
 #else
@@ -2001,6 +2037,18 @@ bool connman_network_get_connected(struct connman_network *network)
        return network->connected;
 }
 
+#if defined TIZEN_EXT
+bool connman_network_get_psk_sha256(struct connman_network *network)
+{
+       return network->is_psk_sha256;
+}
+
+void connman_network_set_psk_sha256(struct connman_network *network, bool is_psk_sha256)
+{
+       network->is_psk_sha256 = is_psk_sha256;
+}
+#endif
+
 /**
  * connman_network_get_associating:
  * @network: network structure
@@ -2063,6 +2111,70 @@ out:
        return err;
 }
 
+#if defined TIZEN_EXT
+char *__connman_network_get_dhcp_status(const char *ifname)
+{
+       char *status = NULL;
+
+       if (!ifname)
+               return NULL;
+
+       status = g_hash_table_lookup(dhcp_status_list, ifname);
+       DBG("ifname: %s, DHCP status: %s", ifname, status);
+
+       return status;
+}
+
+static void __connman_network_update_dhcp_status(
+                               const char *ifname, const char *status)
+{
+       if (!ifname || !status)
+               return;
+
+       g_hash_table_replace(dhcp_status_list, g_strdup(ifname), g_strdup(status));
+}
+
+dbus_bool_t __connman_network_notify_dhcp_changed(const char *key, const char *val)
+{
+       DBusMessage *signal;
+       DBusMessageIter iter;
+       dbus_bool_t result = FALSE;
+
+       if (val) {
+               if (!g_utf8_validate(val, -1, NULL)) {
+                       DBG("key %s, invalid val", key);
+                       val = "";
+               } else {
+                       DBG("key %s, val %s", key, val);
+               }
+       } else {
+               DBG("key %s, val NULL", key);
+               val = "";
+       }
+
+       signal = dbus_message_new_signal(CONNMAN_MANAGER_PATH,
+                       CONNMAN_MANAGER_INTERFACE, "DhcpChanged");
+
+       if (!signal)
+               return result;
+
+       dbus_message_iter_init_append(signal, &iter);
+       connman_dbus_property_append_basic(&iter, key, DBUS_TYPE_STRING, &val);
+
+       result = dbus_connection_send(connection, signal, NULL);
+       if (result)
+               DBG("Successfuly sent signal");
+       else
+               DBG("Fail to send signal");
+
+       dbus_message_unref(signal);
+
+       __connman_network_update_dhcp_status(val, key);
+
+       return result;
+}
+#endif
+
 /**
  * __connman_network_connect:
  * @network: network structure
@@ -2374,9 +2486,6 @@ int connman_network_set_bssid(struct connman_network *network,
        if (bssid == NULL)
                return -EINVAL;
 
-       if (network->connected)
-               return -EPERM;
-
        if (!simplified_log)
                DBG("network %p bssid %02x:%02x:%02x:%02x:%02x:%02x", network,
                                bssid[0], bssid[1], bssid[2],
@@ -2595,9 +2704,15 @@ unsigned char *connman_network_get_countrycode(struct connman_network *network)
 int connman_network_set_bssid_list(struct connman_network *network,
                                        GSList *bssids)
 {
+       unsigned int max_bssid_count;
+
        g_slist_free_full(network->wifi.bssid_list, g_free);
        network->wifi.bssid_list = bssids;
 
+       max_bssid_count = g_slist_length(bssids);
+       if (network->wifi.max_bssid_count < max_bssid_count)
+               network->wifi.max_bssid_count = max_bssid_count;
+
        return 0;
 }
 
@@ -2635,6 +2750,11 @@ void *connman_network_get_bssid_list(struct connman_network *network)
        return network->wifi.bssid_list;
 }
 
+unsigned int connman_network_get_max_bssid_count(struct connman_network *network)
+{
+       return network->wifi.max_bssid_count;
+}
+
 int connman_network_set_last_connected_bssid(struct connman_network *network,
                                const unsigned char *bssid)
 {
@@ -2663,6 +2783,8 @@ void connman_network_set_assoc_reject_table(struct connman_network *network,
        if (!assoc_reject_table)
                return;
 
+       g_hash_table_destroy(network->wifi.assoc_reject_table);
+
        network->wifi.assoc_reject_table = assoc_reject_table;
 }
 
@@ -2694,6 +2816,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,
@@ -2814,6 +2947,21 @@ int connman_network_set_wifi_channel(struct connman_network *network,
        return 0;
 }
 
+int connman_network_set_autoconnect(struct connman_network *network,
+                               bool autoconnect)
+{
+       if (!network->driver || !network->driver->set_autoconnect)
+               return 0;
+       return network->driver->set_autoconnect(network, autoconnect);
+}
+
+bool __connman_network_native_autoconnect(struct connman_network *network)
+{
+       if (!network->driver || !network->driver->set_autoconnect)
+               return false;
+       return true;
+}
+
 uint16_t connman_network_get_wifi_channel(struct connman_network *network)
 {
        return network->wifi.channel;
@@ -3009,9 +3157,12 @@ int connman_network_set_bool(struct connman_network *network,
                network->wifi.isHS20AP = value;
        else if (g_strcmp0(key, "WiFi.TRANSITION_MODE") == 0)
                network->wifi.owe_transition_mode = value;
-       else if (g_strcmp0(key, "WiFi.Roaming") == 0) {
+       else if (g_strcmp0(key, "WiFi.Roaming") == 0)
                network->wifi.roaming_progress = value;
-       }
+       else if (g_strcmp0(key, "WiFi.RoamingDHCP") == 0)
+               network->wifi.roaming_dhcp = value;
+       else if (g_strcmp0(key, "WiFi.PMFRequired") == 0)
+               network->wifi.pmf_required = value;
 #endif
 
        return -EINVAL;
@@ -3044,6 +3195,10 @@ bool connman_network_get_bool(struct connman_network *network,
                return network->wifi.owe_transition_mode;
        else if (g_str_equal(key, "WiFi.Roaming"))
                return network->wifi.roaming_progress;
+       else if (g_str_equal(key, "WiFi.RoamingDHCP"))
+               return network->wifi.roaming_dhcp;
+       else if (g_str_equal(key, "WiFi.PMFRequired"))
+               return network->wifi.pmf_required;
 #endif
 
        return false;
@@ -3134,6 +3289,7 @@ const void *connman_network_get_blob(struct connman_network *network,
                return network->wifi.transition_mode_ssid;
 #endif
        }
+
        return NULL;
 }
 
@@ -3208,6 +3364,11 @@ void connman_network_update(struct connman_network *network)
 int __connman_network_init(void)
 {
        DBG("");
+#if defined TIZEN_EXT
+       connection = connman_dbus_get_connection();
+       dhcp_status_list = g_hash_table_new_full(g_str_hash,
+                       g_str_equal, g_free, g_free);
+#endif
 
        return 0;
 }
@@ -3215,4 +3376,9 @@ int __connman_network_init(void)
 void __connman_network_cleanup(void)
 {
        DBG("");
+#if defined TIZEN_EXT
+       dbus_connection_unref(connection);
+       if (dhcp_status_list)
+               g_hash_table_destroy(dhcp_status_list);
+#endif
 }