X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fsignal-handler.c;h=1d517e6cf1ceb4afffd7209db3a09a08a98188f4;hb=7ab0b0af10623241f16c7a8e962d55ebdcd817f6;hp=504a3bf5d88a242db2557ea47f55debba6de3aa2;hpb=7995025de0a9956a69cc9b78d32ac182e63a649e;p=platform%2Fcore%2Fconnectivity%2Fnet-config.git diff --git a/src/signal-handler.c b/src/signal-handler.c index 504a3bf..1d517e6 100755 --- a/src/signal-handler.c +++ b/src/signal-handler.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "log.h" #include "util.h" @@ -31,18 +32,30 @@ #include "wifi-agent.h" #include "wifi-power.h" #include "wifi-state.h" +#include "wifi-indicator.h" +#include "wifi-scan.h" +#include "wifi-bssid-scan.h" +#include "wifi-background-scan.h" #include "netsupplicant.h" #include "network-state.h" #include "cellular-state.h" #include "signal-handler.h" -#include "wifi-ssid-scan.h" -#include "wifi-background-scan.h" #include "wifi-tdls.h" +#include "wifi-dpp.h" +#include "ip-conflict-detect.h" +#include "wifi-key-encryption.h" +#include "clatd-handler.h" +#if defined TIZEN_DEBUG_ENABLE +#include "network-dump.h" +#define NETWORK_LOG_DUMP_SCRIPT "/opt/var/lib/net-config/network_log_dump.sh" +#define MAX_SIZE_ERROR_BUFFER 256 +#endif #define DBUS_SERVICE_DBUS "org.freedesktop.DBus" #define DBUS_INTERFACE_DBUS "org.freedesktop.DBus" #define SIGNAL_INTERFACE_REMOVED "InterfaceRemoved" #define SIGNAL_SCAN_DONE "ScanDone" +#define SIGNAL_SCAN_CHANGED "ScanChanged" #define SIGNAL_BSS_ADDED "BSSAdded" #define SIGNAL_PROPERTIES_CHANGED "PropertiesChanged" #define SIGNAL_PROPERTIES_DRIVER_HANGED "DriverHanged" @@ -51,16 +64,31 @@ #define SIGNAL_TDLS_DISCONNECTED "TDLSDisconnected" #define SIGNAL_TDLS_PEER_FOUND "TDLSPeerFound" +#define SIGNAL_DPP_AUTH_SUCCESS "DPPAuthSuccess" +#define SIGNAL_DPP_AUTH_FAILED "DPPAuthFailed" +#define SIGNAL_DPP_NOT_COMPATIBLE "DPPNotCompatible" +#define SIGNAL_DPP_CONF_FAILED "DPPConfFailed" +#define SIGNAL_DPP_SCAN_PEER_QR "DPPScanPeerQrCode" +#define SIGNAL_DPP_NETWORK_ID "DPPNetworkID" +#define SIGNAL_DPP_CONF_SENT "DPPConfSent" +#define SIGNAL_DPP_CONF_RECEIVED "DPPConfReceived" +#define SIGNAL_DPP_CONF_OBJ "DPPConfObj" + #define SIGNAL_WPS_CONNECTED "WPSConnected" #define SIGNAL_WPS_EVENT "Event" #define SIGNAL_WPS_CREDENTIALS "Credentials" #define CONNMAN_SIGNAL_SERVICES_CHANGED "ServicesChanged" #define CONNMAN_SIGNAL_PROPERTY_CHANGED "PropertyChanged" -#define CONNMAN_SIGNAL_NAME_CHANGED "NameOwnerChanged" +#define CONNMAN_SIGNAL_DEVICE_CHANGED "DeviceChanged" +#define CONNMAN_SIGNAL_DEVICE_DETECTED "DeviceDetected" +#define SIGNAL_NAME_OWNER_CHANGED "NameOwnerChanged" +#define NETCONFIG_SIGNAL_VCONF_CHANGED "VconfChanged" + #define MAX_SIG_LEN 64 -#define TOTAL_CONN_SIGNALS 5 +#define TOTAL_CONN_SIGNALS 7 +#define MAX_SOCKET_OPEN_RETRY 5 typedef enum { SIG_INTERFACE_REMOVED = 0, @@ -72,6 +100,15 @@ typedef enum { SIG_TDLS_CONNECTED, SIG_TDLS_DISCONNECTED, SIG_TDLS_PEER_FOUND, + SIG_DPP_AUTH_SUCCESS, + SIG_DPP_AUTH_FAILED, + SIG_DPP_NOT_COMPATIBLE, + SIG_DPP_CONF_FAILED, + SIG_DPP_SCAN_PEER_QR, + SIG_DPP_NETWORK_ID, + SIG_DPP_CONF_SENT, + SIG_DPP_CONF_RECEIVED, + SIG_DPP_CONF_OBJ, SIG_MAX } SuppSigArrayIndex; @@ -86,9 +123,42 @@ static const char supplicant_signals[SIG_MAX][MAX_SIG_LEN] = { SIGNAL_TDLS_CONNECTED, SIGNAL_TDLS_DISCONNECTED, SIGNAL_TDLS_PEER_FOUND, + SIGNAL_DPP_AUTH_SUCCESS, + SIGNAL_DPP_AUTH_FAILED, + SIGNAL_DPP_NOT_COMPATIBLE, + SIGNAL_DPP_CONF_FAILED, + SIGNAL_DPP_SCAN_PEER_QR, + SIGNAL_DPP_NETWORK_ID, + SIGNAL_DPP_CONF_SENT, + SIGNAL_DPP_CONF_RECEIVED, + SIGNAL_DPP_CONF_OBJ, +}; +static const char *supplicant_iface_for_sig[SIG_MAX] = { + SUPPLICANT_INTERFACE, + SUPPLICANT_IFACE_INTERFACE, + SUPPLICANT_IFACE_INTERFACE, + SUPPLICANT_IFACE_INTERFACE, + SUPPLICANT_IFACE_INTERFACE, + SUPPLICANT_IFACE_INTERFACE, + SUPPLICANT_IFACE_INTERFACE, + SUPPLICANT_IFACE_INTERFACE, + SUPPLICANT_IFACE_INTERFACE, + SUPPLICANT_IFACE_DPP, + SUPPLICANT_IFACE_DPP, + SUPPLICANT_IFACE_DPP, + SUPPLICANT_IFACE_DPP, + SUPPLICANT_IFACE_DPP, + SUPPLICANT_IFACE_DPP, + SUPPLICANT_IFACE_DPP, + SUPPLICANT_IFACE_DPP, + SUPPLICANT_IFACE_DPP, }; static int supp_subscription_ids[SIG_MAX] = {0}; +#if defined TIZEN_DEBUG_ENABLE +static int dumpservice_subscription_id = 0; +#endif +static int netconfig_subscription_id = 0; typedef void (*supplicant_signal_cb)(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface, @@ -97,103 +167,252 @@ typedef void (*connman_signal_cb)(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface, const gchar *sig, GVariant *param, gpointer user_data); -static void __netconfig_extract_ipv4_signal_data(GVariant *dictionary, const gchar *profile) +static void __netconfig_extract_ipv4_signal_data(GVariant *dictionary, + const gchar *profile) { gchar *key = NULL; const gchar *value = NULL; GVariant *var = NULL; GVariantIter iter; + GVariantBuilder *builder; + GVariant *params; g_variant_iter_init(&iter, dictionary); while (g_variant_iter_loop(&iter, "{sv}", &key, &var)) { if (g_strcmp0(key, "Address") == 0) { - value = g_variant_get_string(var, NULL); + g_variant_get(var, "&s", &value); char *old_ip = vconf_get_str(VCONFKEY_NETWORK_IP); - DBG("Old IPv4.Address [%s] Received new IPv4.Address [%s]", old_ip, value); + DBG("Old IPv4.Address [%s] Received new IPv4.Address [%s]", old_ip, + value); if (g_strcmp0(old_ip, value) != 0) { - if (value != NULL) - vconf_set_str(VCONFKEY_NETWORK_IP, value); - else if (old_ip != NULL && strlen(old_ip) > 0) - vconf_set_str(VCONFKEY_NETWORK_IP, ""); + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); + + if (value != NULL) { + netconfig_set_default_ipaddress(value); + netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, value, TRUE); + g_variant_builder_add(builder, "{sv}", "IPv4Address", + g_variant_new_string(value)); + } else if (old_ip != NULL && strlen(old_ip) > 0) { + netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, "",TRUE); + g_variant_builder_add(builder, "{sv}", "IPv4Address", + g_variant_new_string("")); + } + + params = g_variant_new("(@a{sv})", + g_variant_builder_end(builder)); + + g_variant_builder_unref(builder); + + netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH, + NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged", + params); } free(old_ip); } } } -static void __netconfig_extract_ipv6_signal_data(GVariant *dictionary, const gchar *profile) +static void __netconfig_extract_ipv6_signal_data(GVariant *dictionary, + const gchar *profile) { gchar *key = NULL; const gchar *value = NULL; GVariant *var = NULL; GVariantIter iter; + GVariantBuilder *builder; + GVariant *params; g_variant_iter_init(&iter, dictionary); while (g_variant_iter_loop(&iter, "{sv}", &key, &var)) { if (g_strcmp0(key, "Address") == 0) { - value = g_variant_get_string(var, NULL); + g_variant_get(var, "&s", &value); char *old_ip6 = vconf_get_str(VCONFKEY_NETWORK_IP6); - DBG("Old IPv6.Address [%s] Received new IPv6.Address [%s]", old_ip6, value); + DBG("Old IPv6.Address [%s] Received new IPv6.Address [%s]", old_ip6, + value); if (g_strcmp0(old_ip6, value) != 0) { - if (value != NULL) - vconf_set_str(VCONFKEY_NETWORK_IP6, value); - else if (old_ip6 != NULL && strlen(old_ip6) > 0) - vconf_set_str(VCONFKEY_NETWORK_IP6, ""); + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); + + if (value != NULL) { + netconfig_set_default_ipaddress6(value); + netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, value, TRUE); + g_variant_builder_add(builder, "{sv}", "IPv6Address", + g_variant_new_string(value)); + } else if (old_ip6 != NULL && strlen(old_ip6) > 0) { + netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, "", TRUE); + g_variant_builder_add(builder, "{sv}", "IPv6Address", + g_variant_new_string("")); + } + + params = g_variant_new("(@a{sv})", + g_variant_builder_end(builder)); + g_variant_builder_unref(builder); + + netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH, + NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged", + params); } free(old_ip6); } } } +#if defined TIZEN_DEBUG_ENABLE +static int __netconfig_handle_execute_file(const char *file_path, + char *const args[], char *const envs[]) +{ + pid_t pid = 0; + int status = 0; + int rv = 0; + errno = 0; + register unsigned int index = 0; + char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, }; + + while (args[index] != NULL) { + DBG("%s", args[index]); + index++; + } + + if (!(pid = fork())) { + DBG("pid(%d), ppid (%d)", getpid(), getppid()); + DBG("Inside child, exec (%s) command", file_path); + + errno = 0; + if (execve(file_path, args, envs) == -1) { + DBG("Fail to execute command (%s)", + strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER)); + exit(1); + } + } else if (pid > 0) { + if (waitpid(pid, &status, 0) == -1) + DBG("wait pid (%u) status (%d)", pid, status); + + if (WIFEXITED(status)) { + rv = WEXITSTATUS(status); + DBG("exited, status=%d", rv); + } else if (WIFSIGNALED(status)) { + DBG("killed by signal %d", WTERMSIG(status)); + } else if (WIFSTOPPED(status)) { + DBG("stopped by signal %d", WSTOPSIG(status)); + } else if (WIFCONTINUED(status)) { + DBG("continued"); + } + + return rv; + } + + DBG("failed to fork(%s)", + strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER)); + return -EIO; +} + +static int _start_dump() +{ + int rv = 0; + gchar *path = NETWORK_LOG_DUMP_SCRIPT; + char *const args[] = { NETWORK_LOG_DUMP_SCRIPT, NULL }; + char *const envs[] = { NULL }; + + rv = __netconfig_handle_execute_file(path, args, envs); + if (rv < 0) { + ERR("Fail to execute network log dump shell"); + return -EIO; + } + return 0; +} +#endif + +static char *__supplicant_get_interface_name(const gchar *path, const gchar *interface) +{ + GVariant *params = NULL; + GVariant *reply = NULL, *var = NULL;; + char *interface_name = NULL; + + params = g_variant_new("(ss)", interface, "Ifname"); + + reply = netconfig_supplicant_invoke_dbus_method(SUPPLICANT_SERVICE, + path, DBUS_INTERFACE_PROPERTIES, "Get", params); + if (reply == NULL) { + ERR("Failed to get interface name"); + return NULL; + } + + g_variant_get(reply, "(v)", &var); + + if (g_variant_is_of_type(var, G_VARIANT_TYPE_STRING)) { + interface_name = g_variant_dup_string(var, NULL); + DBG("%s [%s]", path, interface_name); + } + + g_variant_unref(var); + g_variant_unref(reply); + + return interface_name; +} + static void _technology_signal_cb(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface, const gchar *sig, GVariant *param, gpointer user_data) { gchar *key = NULL; - gboolean value = FALSE; GVariant *var = NULL; + GVariantIter *iter = NULL; + const gchar *svalue = NULL; + gboolean bvalue = FALSE; + + DBG("%s %s", path, sig); if (param == NULL) return; - if (g_str_has_prefix(path, CONNMAN_WIFI_TECHNOLOGY_PREFIX) == TRUE) { - g_variant_get(param, "(sv)", &key, &var); - if (g_strcmp0(key, "Powered") == 0) { - /* Power state */ - value = g_variant_get_boolean(var); - if (value == TRUE) - wifi_state_update_power_state(TRUE); - else - wifi_state_update_power_state(FALSE); - } else if (g_strcmp0(key, "Connected") == 0) { - /* Connection state */ - value = g_variant_get_boolean(var); - if (value == TRUE) - wifi_state_set_tech_state(NETCONFIG_WIFI_TECH_CONNECTED); - else - wifi_state_set_tech_state(NETCONFIG_WIFI_TECH_POWERED); - } else if (g_strcmp0(key, "Tethering") == 0) { - /* Tethering state */ - wifi_state_set_tech_state(NETCONFIG_WIFI_TECH_TETHERED); + if (g_str_has_prefix(path, CONNMAN_WIFI_TECHNOLOGY_PREFIX) != TRUE) + return; + + if (g_strcmp0(sig, CONNMAN_SIGNAL_DEVICE_CHANGED) == 0) { + g_variant_get(param, "(a{sv})", &iter); + while (g_variant_iter_loop(iter, "{sv}", &key, &var)) { + if (g_strcmp0(key, "Ifname") == 0) { + svalue = g_variant_get_string(var, NULL); + DBG("Ifname [%s]", svalue); + } else if (g_strcmp0(key, "Powered") == 0) { + bvalue = g_variant_get_boolean(var); + DBG("Powered [%d]", bvalue); + if (svalue) + wifi_state_update_power_state(svalue, bvalue); + } else if (g_strcmp0(key, "Connected") == 0) { + bvalue = g_variant_get_boolean(var); + DBG("Connected [%d]", bvalue); + if (svalue) { + wifi_state_set_connected(svalue, bvalue); + if (bvalue == TRUE) + wifi_state_set_technology_state(svalue, NETCONFIG_WIFI_TECH_CONNECTED); + else + wifi_state_set_technology_state(svalue, NETCONFIG_WIFI_TECH_POWERED); + } + } } - if (key) - g_free(key); - if (var) - g_variant_unref(var); + g_variant_iter_free(iter); + } else if (g_strcmp0(sig, CONNMAN_SIGNAL_DEVICE_DETECTED) == 0) { + wifi_state_update_device_list(); } } static void _service_signal_cb(GDBusConnection *conn, const gchar *name, const gchar *path, - const gchar *interface, const gchar *sig, GVariant *param, gpointer user_data) + const gchar *interface, const gchar *sig, + GVariant *param, gpointer user_data) { gchar *sigvalue = NULL; gchar *property; GVariant *variant = NULL, *var; GVariantIter *iter; const gchar *value = NULL; + struct sock_data *sd = NULL; + gchar *pf = NULL; + int idx = 0; + unsigned char strength = 0; + const char *interface_name = NULL; if (path == NULL || param == NULL) goto done; @@ -205,10 +424,13 @@ static void _service_signal_cb(GDBusConnection *conn, if (g_strcmp0(sig, CONNMAN_SIGNAL_PROPERTY_CHANGED) != 0) goto done; + interface_name = netconfig_get_ifname(path); + if (g_strcmp0(sigvalue, "State") == 0) { g_variant_get(variant, "s", &property); DBG("[%s] %s", property, path); + if (netconfig_is_wifi_profile(path) == TRUE) { int wifi_state = 0; @@ -219,92 +441,77 @@ static void _service_signal_cb(GDBusConnection *conn, } if (g_strcmp0(property, "ready") == 0 || g_strcmp0(property, "online") == 0) { - if (wifi_state >= VCONFKEY_WIFI_CONNECTED) { - g_free(property); - goto done; - } - - netconfig_update_default_profile(path); + netconfig_update_default_profile(); - wifi_state_set_service_state(NETCONFIG_WIFI_CONNECTED); + wifi_state_set_service_state(interface_name, path, NETCONFIG_WIFI_CONNECTED); - } else if (g_strcmp0(property, "failure") == 0 || g_strcmp0(property, "disconnect") == 0 || g_strcmp0(property, "idle") == 0) { - if (netconfig_get_default_profile() == NULL || - netconfig_is_wifi_profile(netconfig_get_default_profile()) - != TRUE) { - if (g_strcmp0(property, "failure") == 0) - wifi_state_set_service_state(NETCONFIG_WIFI_FAILURE); - else - wifi_state_set_service_state(NETCONFIG_WIFI_IDLE); - g_free(property); - goto done; - } + } else if (g_strcmp0(property, "failure") == 0 || + g_strcmp0(property, "disconnect") == 0 || g_strcmp0(property, "idle") == 0) { + if (g_strcmp0(property, "failure") == 0) + wifi_state_set_service_state(interface_name, path, NETCONFIG_WIFI_FAILURE); + else + wifi_state_set_service_state(interface_name, path, NETCONFIG_WIFI_IDLE); if (g_strcmp0(path, netconfig_get_default_profile()) != 0) { g_free(property); goto done; } - netconfig_update_default_profile(NULL); - - if (g_strcmp0(property, "failure") == 0) - wifi_state_set_service_state(NETCONFIG_WIFI_FAILURE); - else - wifi_state_set_service_state(NETCONFIG_WIFI_IDLE); + netconfig_update_default_profile(); } else if (g_strcmp0(property, "association") == 0 || g_strcmp0(property, "configuration") == 0) { - if (netconfig_get_default_profile() == NULL || - netconfig_is_wifi_profile(netconfig_get_default_profile()) != TRUE) { - if (g_strcmp0(property, "association") == 0) - wifi_state_set_service_state(NETCONFIG_WIFI_ASSOCIATION); - else - wifi_state_set_service_state(NETCONFIG_WIFI_CONFIGURATION); - g_free(property); - goto done; - } + if (g_strcmp0(property, "association") == 0) + wifi_state_set_service_state(interface_name, path, NETCONFIG_WIFI_ASSOCIATION); + else + wifi_state_set_service_state(interface_name, path, NETCONFIG_WIFI_CONFIGURATION); if (g_strcmp0(path, netconfig_get_default_profile()) != 0) { g_free(property); goto done; } - netconfig_update_default_profile(NULL); - - if (g_strcmp0(property, "association") == 0) - wifi_state_set_service_state(NETCONFIG_WIFI_ASSOCIATION); - else - wifi_state_set_service_state(NETCONFIG_WIFI_CONFIGURATION); + netconfig_update_default_profile(); } } else { if (g_strcmp0(property, "ready") == 0 || g_strcmp0(property, "online") == 0) { - if (netconfig_get_default_profile() == NULL) { - if (!netconfig_is_cellular_profile(path)) - netconfig_update_default_profile(path); - else { - if (netconfig_is_cellular_internet_profile(path)) - netconfig_update_default_profile(path); + netconfig_update_default_profile(); + + if (netconfig_is_cellular_profile(netconfig_get_default_profile())) { + pf = netconfig_get_connected_cellular_internet_ipv6only_profile(NULL); + if (pf) { + g_free(pf); + + /* Enable clatd if it is not in running state */ + DBG("Connected to ipv6 only cellular, enable clatd"); + netconfig_clatd_enable(); } } if (netconfig_is_cellular_profile(path) && netconfig_is_cellular_internet_profile(path)) cellular_state_set_service_state(NETCONFIG_CELLULAR_ONLINE); - } else if (g_strcmp0(property, "failure") == 0 || g_strcmp0(property, "disconnect") == 0 || g_strcmp0(property, "idle") == 0) { + } else if (g_strcmp0(property, "failure") == 0 || + g_strcmp0(property, "disconnect") == 0 || g_strcmp0(property, "idle") == 0) { if (netconfig_get_default_profile() == NULL) { g_free(property); goto done; } - if (netconfig_is_cellular_profile(path) && netconfig_is_cellular_internet_profile(path)) + if (netconfig_is_cellular_profile(path) && netconfig_is_cellular_internet_profile(path)) { cellular_state_set_service_state(NETCONFIG_CELLULAR_IDLE); + /* Disable clatd if it is in running state */ + DBG("disable clatd"); + netconfig_clatd_disable(); + } + if (g_strcmp0(path, netconfig_get_default_profile()) != 0) { g_free(property); goto done; } - netconfig_update_default_profile(NULL); + netconfig_update_default_profile(); } else if (g_strcmp0(property, "association") == 0 || g_strcmp0(property, "configuration") == 0) { if (netconfig_get_default_profile() == NULL) { g_free(property); @@ -319,19 +526,41 @@ static void _service_signal_cb(GDBusConnection *conn, goto done; } - netconfig_update_default_profile(NULL); + netconfig_update_default_profile(); + } + } + + if (netconfig_is_wifi_profile(path) || netconfig_is_ethernet_profile(path)) { + if (g_strcmp0(property, "ready") == 0) { + if (g_strcmp0(path, netconfig_get_default_profile()) == 0 + && netconfig_get_default_is_internet()) + netconfig_set_default_is_internet(FALSE); + + for (idx = 0; idx < MAX_SOCKET_OPEN_RETRY; idx++) { + sd = start_ip_conflict_mon(); + if (sd != NULL) + break; + } + } else if (g_strcmp0(property, "online") == 0) { + if (g_strcmp0(path, netconfig_get_default_profile()) == 0) + netconfig_set_default_is_internet(TRUE); + } else { + stop_ip_conflict_mon(); } } + g_free(property); } else if (g_strcmp0(sigvalue, "Proxy") == 0) { - if (netconfig_is_wifi_profile(path) != TRUE || g_strcmp0(path, netconfig_get_default_profile()) != 0) + if (g_strcmp0(path, netconfig_get_default_profile()) != 0) goto done; - if (!g_variant_type_equal(variant, G_VARIANT_TYPE_ARRAY)) + if (!g_variant_is_of_type(variant, G_VARIANT_TYPE_ARRAY)) goto done; g_variant_get(variant, "a{sv}", &iter); while (g_variant_iter_loop(iter, "{sv}", &property, &var)) { + GVariantBuilder *builder; + GVariant *sig_params; if (g_strcmp0(property, "Servers") == 0) { GVariantIter *iter_sub = NULL; @@ -340,7 +569,23 @@ static void _service_signal_cb(GDBusConnection *conn, g_variant_iter_free(iter_sub); DBG("Proxy - [%s]", value); - vconf_set_str(VCONFKEY_NETWORK_PROXY, value); + if (g_strcmp0(value, netconfig_get_default_proxy()) != 0) { + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); + + netconfig_set_default_proxy(value); + netconfig_set_vconf_str(VCONFKEY_NETWORK_PROXY, value, TRUE); + + g_variant_builder_add(builder, "{sv}", "ProxyAddress", + g_variant_new_string(value)); + + sig_params = g_variant_new("(@a{sv})", + g_variant_builder_end(builder)); + g_variant_builder_unref(builder); + + netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH, + NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged", + sig_params); + } g_free(property); g_variant_unref(var); @@ -349,8 +594,25 @@ static void _service_signal_cb(GDBusConnection *conn, value = g_variant_get_string(var, NULL); DBG("Method - [%s]", value); - if (g_strcmp0(value, "direct") == 0) - vconf_set_str(VCONFKEY_NETWORK_PROXY, ""); + if (g_strcmp0(value, "direct") == 0) { + if (g_strcmp0("", netconfig_get_default_proxy()) != 0) { + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); + + netconfig_set_default_proxy(""); + netconfig_set_vconf_str(VCONFKEY_NETWORK_PROXY, "", TRUE); + + g_variant_builder_add(builder, "{sv}", "ProxyAddress", + g_variant_new_string("")); + + sig_params = g_variant_new("(@a{sv})", + g_variant_builder_end(builder)); + g_variant_builder_unref(builder); + + netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH, + NETCONFIG_NETWORK_INTERFACE, + "NetworkConfigChanged", sig_params); + } + } g_free(property); g_variant_unref(var); @@ -360,17 +622,38 @@ static void _service_signal_cb(GDBusConnection *conn, g_variant_iter_free(iter); } else if (g_strcmp0(sigvalue, "IPv4") == 0) { + if (g_strcmp0(path, netconfig_get_default_profile()) != 0) + goto done; + __netconfig_extract_ipv4_signal_data(variant, path); } else if (g_strcmp0(sigvalue, "IPv6") == 0) { + if (g_strcmp0(path, netconfig_get_default_profile()) != 0) + goto done; + __netconfig_extract_ipv6_signal_data(variant, path); + } else if (g_strcmp0(sigvalue, "Strength") == 0) { + strength = g_variant_get_byte(variant); + + netconfig_wifi_indicator_update(interface_name, path, strength - 120); } else if (g_strcmp0(sigvalue, "Error") == 0) { g_variant_get(variant, "s", &property); INFO("[%s] Property : %s", sigvalue, property); +#if defined TIZEN_DEBUG_ENABLE + if (g_strcmp0(property, "dhcp-failed") == 0 + || g_strcmp0(property, "connect-failed") == 0 + || g_strcmp0(property, "login-failed") == 0 + || g_strcmp0(property, "auth-failed") == 0 + || g_strcmp0(property, "assoc-failed") == 0 + || g_strcmp0(property, "invalid-key") == 0) { + + INFO("start dump"); + _start_dump(); + } +#endif g_free(property); } done: - if (sigvalue) - g_free(sigvalue); + g_free(sigvalue); if (variant) g_variant_unref(variant); @@ -395,101 +678,96 @@ static void _dbus_name_changed_cb(GDBusConnection *conn, DBG("ConnMan destroyed: name %s, old %s, new %s", name, old, new); connman_register_agent(); + } else if (g_strcmp0(name, CLATD_SERVICE) == 0 && *new == '\0') { + DBG("Clat destroyed: name %s, old %s, new %s", name, old, new); + + /* If clatd is terminated unexpectedly, reset and enable clat service. */ + if (NETCONFIG_CELLULAR_ONLINE == cellular_state_get_service_state()) + netconfig_clatd_reset(); + } else if (g_strcmp0(name, SUPPLICANT_SERVICE) == 0 && *new == '\0') { + DBG("Supplicant destroyed: name %s, old %s, new %s", name, old, new); + __mark_supplicant_stopped(); } - if (name) - g_free(name); - if (old) - g_free(old); - if (new) - g_free(new); + g_free(name); + g_free(old); + g_free(new); return; } -static void _services_changed_cb(GDBusConnection *conn, const gchar *name, - const gchar *path, const gchar *interface, const gchar *sig, - GVariant *param, gpointer user_data) +static void _dbus_vconf_changed_cb(GDBusConnection *conn, + const gchar *Name, const gchar *path, const gchar *interface, + const gchar *sig, GVariant *param, gpointer user_data) { - gchar *property, *value; - gchar *service_path; - GVariant *variant = NULL; - GVariantIter *added = NULL, *removed = NULL, *next = NULL; + gchar *key = NULL; + gchar *type = NULL; + gchar *str_val = NULL; + int int_val = 0; - if (path == NULL || param == NULL) + if (param == NULL) return; - if (g_strcmp0(sig, CONNMAN_SIGNAL_SERVICES_CHANGED) != 0) - return; + g_variant_get(param, "(sssi)", &key, &type, &str_val, &int_val); - if (netconfig_get_default_profile() != NULL) - return; + if (!key || key[0] == '\0') + goto done; - g_variant_get(param, "(a(oa{sv})ao)", &added, &removed); - - while (g_variant_iter_loop(added, "(oa{sv})", &service_path, &next)) { - gboolean is_wifi_prof, is_cell_prof, is_cell_internet_prof; - is_wifi_prof = netconfig_is_wifi_profile(service_path); - is_cell_prof = netconfig_is_cellular_profile(service_path); - is_cell_internet_prof = netconfig_is_cellular_internet_profile( - service_path); - if (service_path != NULL) { - while (g_variant_iter_loop(next, "{sv}", &property, - &variant)) { - if (g_strcmp0(property, "State") == 0) { - g_variant_get(variant, "s", &value); - DBG("Profile %s State %s", service_path, - value); - if (g_strcmp0(value, "ready") != 0 && - g_strcmp0(value, - "online") != 0) { - g_free(property); - g_free(value); - g_variant_unref(variant); - break; - } + DBG("VconfChanged key: %s, type: %s, str_val: %s, int_val: %d", + key, type, str_val, int_val); - if (!is_cell_prof) - netconfig_update_default_profile( - service_path); - else if (is_cell_internet_prof) { - netconfig_update_default_profile( - service_path); - } - if (is_wifi_prof) - wifi_state_set_service_state( - NETCONFIG_WIFI_CONNECTED); - else if (is_cell_prof && - is_cell_internet_prof) - cellular_state_set_service_state( - NETCONFIG_CELLULAR_ONLINE); - g_free(property); - g_free(value); - g_variant_unref(variant); - break; - } - } - } - } + if (g_strcmp0(type, "string") == 0 && str_val) + vconf_set_str(key, str_val); + else if (g_strcmp0(type, "int") == 0) + vconf_set_int(key, int_val); + else if (g_strcmp0(type, "bool") == 0) + vconf_set_bool(key, int_val); + +done: + g_free(key); + g_free(type); + g_free(str_val); +} - g_variant_iter_free(added); +static void _scan_changed_cb(GDBusConnection *conn, + const gchar *name, const gchar *path, const gchar *interface, + const gchar *sig, GVariant *param, gpointer user_data) +{ + const char *key = NULL; + GVariant *var; + gboolean value = false; - if (next) - g_variant_iter_free(next); + if (g_strcmp0(sig, SIGNAL_SCAN_CHANGED) == 0) { + g_variant_get(param, "(sv)", &key, &var); - if (removed) - g_variant_iter_free(removed); + if (g_strcmp0(key, "scan_started") == 0) + value = true; + else if (g_strcmp0(key, "scan_done") == 0) + value = false; - return; + DBG("Scan changed [%s]", (value == true) ? "Started" : "Done"); + netconfig_battery_update_wifi_scan(value); + + if (var != NULL) + g_variant_unref(var); + } } static void _supplicant_interface_removed(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface, const gchar *sig, GVariant *param, gpointer user_data) { + char *interface_name = NULL; + DBG("Interface removed handling!"); - if (netconfig_wifi_is_wps_enabled() == TRUE) - netconfig_wifi_wps_signal_scanaborted(); + interface_name = __supplicant_get_interface_name(path, interface); + if (interface_name == NULL) + return; + + if (netconfig_wifi_bssidscan_get_mode(interface_name) == TRUE) + netconfig_wifi_bssid_signal_scanaborted(interface_name); + + g_free(interface_name); return; } @@ -498,32 +776,65 @@ static void _supplicant_properties_changed(GDBusConnection *conn, const gchar *sig, GVariant *param, gpointer user_data) { DBG("Properties changed handling!"); - gchar *key; - GVariantIter *iter; - GVariant *variant; + gchar *key = NULL; + const gchar *state = NULL; + GVariantIter *iter = NULL; + GVariant *variant = NULL; gboolean scanning = FALSE; + char *interface_name = NULL; if (param == NULL) return; + interface_name = __supplicant_get_interface_name(path, interface); + if (interface_name == NULL) + return; + g_variant_get(param, "(a{sv})", &iter); while (g_variant_iter_loop(iter, "{sv}", &key, &variant)) { if (g_strcmp0(key, "Scanning") == 0) { scanning = g_variant_get_boolean(variant); DBG("setting scanning %s", scanning ? "TRUE" : "FALSE"); if (scanning == TRUE) - netconfig_wifi_set_scanning(TRUE); + netconfig_wifi_scan_set_scanning(interface_name, TRUE); else - netconfig_wifi_set_scanning(FALSE); + netconfig_wifi_scan_set_scanning(interface_name, FALSE); + + g_variant_unref(variant); + g_free(key); + variant = NULL; + key = NULL; + break; + } else if (g_strcmp0(key, "State") == 0) { + state = g_variant_get_string(variant, NULL); + if (state != NULL) + DBG("Supplicant state : %s", state); + + g_variant_unref(variant); + g_free(key); + variant = NULL; + key = NULL; + break; + } else if (g_strcmp0(key, "DisconnectReason") == 0) { + int reason = g_variant_get_int32(variant); + DBG("Supplicant DisconnReason : %d", reason); g_variant_unref(variant); g_free(key); + variant = NULL; + key = NULL; break; + } else { + gchar *value; + value = g_variant_print(variant, TRUE); + DBG("Supplicant %s : %s", key, value); + + g_free(value); } } g_variant_iter_free(iter); - + g_free(interface_name); return; } @@ -532,10 +843,7 @@ static void _supplicant_bss_added(GDBusConnection *conn, const gchar *sig, GVariant *param, gpointer user_data) { DBG("BSS added handling!"); - if (wifi_ssid_scan_get_state() == TRUE) - wifi_ssid_scan_add_bss(param); - else - wifi_state_set_bss_found(TRUE); + wifi_state_set_bss_found(TRUE); return; } @@ -544,28 +852,37 @@ static void _supplicant_scan_done(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface, const gchar *sig, GVariant *param, gpointer user_data) { + char *interface_name = NULL; + DBG("Scan Done handling!"); - netconfig_wifi_set_scanning(FALSE); - if (netconfig_wifi_is_wps_enabled() == TRUE) { - netconfig_wifi_wps_signal_scandone(); - if (wifi_state_get_technology_state() < NETCONFIG_WIFI_TECH_POWERED) + interface_name = __supplicant_get_interface_name(path, interface); + if (interface_name == NULL) + return; + + netconfig_wifi_scan_set_scanning(interface_name, FALSE); + + if (netconfig_wifi_bssidscan_get_mode(interface_name) == TRUE) { + DBG("%s bssid scan done!", interface_name); + netconfig_wifi_bssid_signal_scandone(interface_name); + if (wifi_state_get_technology_state(interface_name) + < NETCONFIG_WIFI_TECH_POWERED) { + g_free(interface_name); return; + } } - if (netconfig_wifi_get_bgscan_state() != TRUE) { - if (wifi_ssid_scan_get_state() == TRUE) - wifi_ssid_scan_emit_scan_completed(); - else - wifi_ssid_scan(NULL); - } else { - if (wifi_state_get_technology_state() >= - NETCONFIG_WIFI_TECH_POWERED) - netconfig_wifi_bgscan_start(FALSE); + if (netconfig_wifi_bgscan_get_mode(interface_name) == TRUE) { + DBG("%s bgscan done!", interface_name); + if (wifi_state_get_technology_state(interface_name) + >= NETCONFIG_WIFI_TECH_POWERED) { + netconfig_wifi_bgscan_start(interface_name, FALSE); + } - wifi_start_timer_network_notification(); + wifi_start_timer_network_notification(interface_name); } + g_free(interface_name); return; } @@ -573,12 +890,25 @@ static void _supplicant_driver_hanged(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface, const gchar *sig, GVariant *param, gpointer user_data) { + char *interface_name = NULL; + DBG("Driver Hanged handling!"); ERR("Critical. Wi-Fi firmware crashed"); - wifi_power_recover_firmware(); +#if !defined TIZEN_WEARABLE + netconfig_send_message_to_net_popup("Wi-Fi Error", + "Wi-Fi Driver Hanged. Please get log dump and report", "popup", NULL); +#endif + + interface_name = __supplicant_get_interface_name(path, interface); + if (interface_name == NULL) + return; + + wifi_power_recover_firmware(interface_name); + g_free(interface_name); return; + } static void _supplicant_session_overlapped(GDBusConnection *conn, @@ -595,13 +925,43 @@ static void _supplicant_session_overlapped(GDBusConnection *conn, #endif } +#if defined TIZEN_DEBUG_ENABLE +static void __netconfig_dumpservice_handler(GDBusConnection *conn, + const gchar *name, const gchar *path, const gchar *interface, + const gchar *sig, GVariant *param, gpointer user_data) +{ + int mode; + gchar *signal_path = NULL; + + if (param == NULL) + return; + + g_variant_get(param, "(is)", &mode, &signal_path); + DBG("Path: %s and mode: %d", signal_path, mode); + + netconfig_dump_log(signal_path); + if (signal_path) + g_free(signal_path); + + return; +} +#endif + static void _supplicant_tdls_connected(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface, const gchar *sig, GVariant *param, gpointer user_data) { + char *interface_name = NULL; + DBG("Received TDLS Connected Signal"); - netconfig_wifi_tdls_connected_event(param); + interface_name = __supplicant_get_interface_name(path, interface); + if (interface_name == NULL) + return; + + netconfig_wifi_tdls_connected_event(interface_name, param); + + g_free(interface_name); return; } @@ -609,9 +969,17 @@ static void _supplicant_tdls_disconnected(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface, const gchar *sig, GVariant *param, gpointer user_data) { + char *interface_name = NULL; + DBG("Received TDLS Disconnected Signal"); - netconfig_wifi_tdls_disconnected_event(param); + interface_name = __supplicant_get_interface_name(path, interface); + if (interface_name == NULL) + return; + + netconfig_wifi_tdls_disconnected_event(interface_name, param); + + g_free(interface_name); return; } @@ -619,12 +987,111 @@ static void _supplicant_tdls_peer_found(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface, const gchar *sig, GVariant *param, gpointer user_data) { + char *interface_name = NULL; + DBG("Received TDLS Peer Found Signal"); - netconfig_wifi_tdls_peer_found_event(param); + + interface_name = __supplicant_get_interface_name(path, interface); + if (interface_name == NULL) + return; + + netconfig_wifi_tdls_peer_found_event(interface_name, param); + + g_free(interface_name); return; } -static void _supplicant_wifi_wps_connected(GVariant *param) +static void _supplicant_dpp_auth_success(GDBusConnection *conn, + const gchar *name, const gchar *path, const gchar *interface, + const gchar *sig, GVariant *param, gpointer user_data) +{ + DBG("Received DPP Auth Success Signal"); + netconfig_wifi_dpp_auth_success_event(param); + return; +} + +static void _supplicant_dpp_auth_failed(GDBusConnection *conn, + const gchar *name, const gchar *path, const gchar *interface, + const gchar *sig, GVariant *param, gpointer user_data) +{ + DBG("Received DPP Auth Failed Signal"); + netconfig_wifi_dpp_auth_failed_event(param); + return; +} + +static void _supplicant_dpp_not_compatible(GDBusConnection *conn, + const gchar *name, const gchar *path, const gchar *interface, + const gchar *sig, GVariant *param, gpointer user_data) +{ + DBG("Received DPP Not Compatible Signal"); + netconfig_wifi_dpp_not_compatible_event(param); + return; +} + +static void _supplicant_dpp_conf_failed(GDBusConnection *conn, + const gchar *name, const gchar *path, const gchar *interface, + const gchar *sig, GVariant *param, gpointer user_data) +{ + DBG("Received DPP Conf Failed Signal"); + netconfig_wifi_dpp_conf_failed_event(param); + return; +} + +static void _supplicant_dpp_scan_peer_qr(GDBusConnection *conn, + const gchar *name, const gchar *path, const gchar *interface, + const gchar *sig, GVariant *param, gpointer user_data) +{ + DBG("Received DPP Scan Peer QR Signal"); + netconfig_wifi_dpp_scan_peer_qr_event(param); + return; +} + +static void _supplicant_dpp_network_id(GDBusConnection *conn, + const gchar *name, const gchar *path, const gchar *interface, + const gchar *sig, GVariant *param, gpointer user_data) +{ + DBG("Received DPP Network Id Signal"); + netconfig_wifi_dpp_network_id_event(param); + return; +} + +static void _supplicant_dpp_conf_sent(GDBusConnection *conn, + const gchar *name, const gchar *path, const gchar *interface, + const gchar *sig, GVariant *param, gpointer user_data) +{ + DBG("Received DPP Conf Sent Signal"); + netconfig_wifi_dpp_conf_sent_event(param); + return; +} + +static void _supplicant_dpp_conf_received(GDBusConnection *conn, + const gchar *name, const gchar *path, const gchar *interface, + const gchar *sig, GVariant *param, gpointer user_data) +{ + DBG("Received DPP Conf Received Signal"); + netconfig_wifi_dpp_conf_received_event(param); + return; +} + +static void _supplicant_dpp_conf_obj(GDBusConnection *conn, + const gchar *name, const gchar *path, const gchar *interface, + const gchar *sig, GVariant *param, gpointer user_data) +{ + char *interface_name = NULL; + + DBG("Received DPP Conf Obj Signal"); + + interface_name = __supplicant_get_interface_name(path, interface); + if (interface_name == NULL) + return; + + netconfig_wifi_dpp_conf_obj_event(interface_name, param); + + g_free(interface_name); + return; +} + +static void _supplicant_wifi_wps_connected(const char *interface_name, GVariant *param) { gchar *key; char ssid[32] = {0, }; @@ -647,7 +1114,7 @@ static void _supplicant_wifi_wps_connected(GVariant *param) if (g_strcmp0(key, "SSID") == 0) { const char *t_key = NULL; t_key = g_variant_get_fixed_array(variant, &ssid_len, sizeof(guchar)); - INFO("wps ssid_len is %d ", ssid_len); + INFO("wps ssid_len is %zd ", ssid_len); if (t_key == NULL) { g_free(key); g_variant_unref(variant); @@ -661,7 +1128,8 @@ static void _supplicant_wifi_wps_connected(GVariant *param) ssid_len = 0; } INFO("WPS PBC Connection completed with AP %s", ssid); - netconfig_wifi_notify_wps_completed(ssid, ssid_len); + netconfig_wifi_notify_wps_completed(interface_name, + ssid, ssid_len); } } @@ -675,11 +1143,12 @@ error: error_indication = WPS_EI_OPERATION_FAILED; config_error = WPS_CFG_NO_ERROR; ERR("Error Occured! Notifying Fail Event"); - netconfig_wifi_notify_wps_fail_event(config_error, error_indication); + netconfig_wifi_notify_wps_fail_event(interface_name, + config_error, error_indication); } -static void _supplicant_wifi_wps_event(GVariant *param) +static void _supplicant_wifi_wps_event(const char *interface_name, GVariant *param) { gchar *key; gchar *name; @@ -708,7 +1177,8 @@ static void _supplicant_wifi_wps_event(GVariant *param) ERR("Error Indication %d", error_indication); } } - netconfig_wifi_notify_wps_fail_event(config_error, error_indication); + netconfig_wifi_notify_wps_fail_event(interface_name, + config_error, error_indication); } g_variant_iter_free(iter); @@ -721,19 +1191,87 @@ error: error_indication = WPS_EI_OPERATION_FAILED; config_error = WPS_CFG_NO_ERROR; ERR("Error Occured! Notifying Fail Event"); - netconfig_wifi_notify_wps_fail_event(config_error, error_indication); + netconfig_wifi_notify_wps_fail_event(interface_name, + config_error, error_indication); +} + +static void _find_service_and_set_passphrase(char *ssid, char *key) +{ + GString *str; + GVariant *reply = NULL; + int i, j, ssid_len; + char *service_path; + char *dev_mac_addr; + char ident[13]; + gchar *enc_passphrase; + + ssid_len = strlen(ssid); + + str = g_string_sized_new((ssid_len * 2) + 55); + if (!str) + return; + + dev_mac_addr = vconf_get_str(VCONFKEY_WIFI_BSSID_ADDRESS); + if (!dev_mac_addr) { + ERR("Failed to get mac address from vconf key"); + g_string_free(str, TRUE); + return; + } + + j = 0; + for (i = 0; dev_mac_addr[i]; i++) { + if (dev_mac_addr[i] != ':') + ident[j++] = dev_mac_addr[i]; + } + ident[j] = '\0'; + + g_string_append_printf(str, "%s%s_", CONNMAN_WIFI_SERVICE_PROFILE_PREFIX, + ident); + free(dev_mac_addr); + + for (i = 0; i < ssid_len; i++) { + if (ssid[i] != '"') + g_string_append_printf(str, "%02x", ssid[i]); + } + + g_string_append_printf(str, "_managed_psk"); + + service_path = g_string_free(str, FALSE); + + enc_passphrase = _netconfig_encrypt_passphrase(key); + if (!enc_passphrase) { + ERR("Failed to encrypt passphrase"); + g_free(service_path); + return; + } + + INFO("wps service_path %s Passphrase %s", service_path, enc_passphrase); + + reply = netconfig_invoke_dbus_method(CONNMAN_SERVICE, service_path, + CONNMAN_SERVICE_INTERFACE, "SetProperty", + g_variant_new("(sv)", "Passphrase", + g_variant_new_string(enc_passphrase))); + if (reply != NULL) + g_variant_unref(reply); + else + ERR("Failed to set passphrase"); + + g_free(service_path); + + return; } -static void _supplicant_wifi_wps_credentials(GVariant *param) +static void _supplicant_wifi_wps_credentials(const char *interface_name, GVariant *param) { gchar *key; - char ssid[32]; - char wps_key[100]; + char ssid[32] = {0, }; + char wps_key[100] = {0, }; GVariantIter *iter; GVariant *variant; int config_error = 0; int error_indication = 0; gsize ssid_len = 0; + char *key_mgmt = NULL; if (param == NULL) { ERR("Param is NULL"); @@ -750,9 +1288,10 @@ static void _supplicant_wifi_wps_credentials(GVariant *param) const char *t_key = NULL; key_len = g_variant_get_size(variant); - INFO("wps password len %d ", key_len); + INFO("wps password len %zd ", key_len); if (key_len > 0) { - t_key = g_variant_get_fixed_array(variant, &key_len, sizeof(guchar)); + t_key = g_variant_get_fixed_array(variant, &key_len, + sizeof(guchar)); if (!t_key) { g_free(key); g_variant_unref(variant); @@ -765,8 +1304,9 @@ static void _supplicant_wifi_wps_credentials(GVariant *param) SLOGI("WPS AP Security ->Open"); } else if (g_strcmp0(key, "SSID") == 0) { const char *t_key = NULL; - t_key = g_variant_get_fixed_array(variant, &ssid_len, sizeof(guchar)); - INFO("wps ssid_len is %d ", ssid_len); + t_key = g_variant_get_fixed_array(variant, &ssid_len, + sizeof(guchar)); + INFO("wps ssid_len is %zd ", ssid_len); if (!t_key) { g_free(key); g_variant_unref(variant); @@ -779,19 +1319,43 @@ static void _supplicant_wifi_wps_credentials(GVariant *param) ssid_len = 0; } INFO("SSID in process credentials %s", ssid); + } else if (g_strcmp0(key, "AuthType") == 0) { + gchar *auth_type; + GVariantIter *var_iter; + g_variant_get(variant, "as", &var_iter); + while (g_variant_iter_loop(var_iter, "s", &auth_type)) { + INFO("wps auth_type %s", auth_type); + if (g_strcmp0(auth_type, "wpa-psk") == 0 || + g_strcmp0(auth_type, "wpa2-psk") == 0) + key_mgmt = "psk"; + else if (g_strcmp0(auth_type, "open") == 0) + key_mgmt = "none"; + } + g_variant_iter_free(var_iter); + } else if (g_strcmp0(key, "EncrType") == 0) { + gchar *encr_type; + GVariantIter *var_iter; + g_variant_get(variant, "as", &var_iter); + while (g_variant_iter_loop(var_iter, "s", &encr_type)) + INFO("wps encr_type %s", encr_type); + g_variant_iter_free(var_iter); + } else if (g_strcmp0(key, "BSSID") == 0) { + const guchar *bssid; + gsize bssid_len; + bssid = g_variant_get_fixed_array(variant, &bssid_len, + sizeof(guchar)); + if (bssid && bssid_len == 6) + INFO("wps BSSID %2x:%2x:%2x:%2x:%2x:%2x", bssid[0], bssid[1], + bssid[2], bssid[3], bssid[4], bssid[5]); } } g_variant_iter_free(iter); -#if 0 - /* - * Notify WPS Credentials only when requested through WPS PBC - * In case of WPS PIN connman will take care of notification - */ - if (netconfig_get_wps_field() == TRUE) -#endif - netconfig_wifi_notify_wps_credentials(ssid, ssid_len, wps_key); + if (g_strcmp0(key_mgmt, "psk") == 0) + _find_service_and_set_passphrase(ssid, wps_key); + + netconfig_wifi_notify_wps_credentials(interface_name, ssid, ssid_len, wps_key); return; error: @@ -799,27 +1363,114 @@ error: error_indication = WPS_EI_OPERATION_FAILED; config_error = WPS_CFG_NO_ERROR; ERR("Error Occured! Notifying Fail Event"); - netconfig_wifi_notify_wps_fail_event(config_error, error_indication); + netconfig_wifi_notify_wps_fail_event(interface_name, config_error, error_indication); } static void __netconfig_wps_signal_filter_handler(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface, const gchar *sig, GVariant *param, gpointer user_data) { + char *interface_name = NULL; + + interface_name = __supplicant_get_interface_name(path, SUPPLICANT_IFACE_INTERFACE); + if (interface_name == NULL) + return; + if (g_strcmp0(sig, SIGNAL_WPS_CREDENTIALS) == 0) { INFO("Received wps CREDENTIALS Signal from Supplicant"); - _supplicant_wifi_wps_credentials(param); + _supplicant_wifi_wps_credentials(interface_name, param); } else if (g_strcmp0(sig, SIGNAL_WPS_EVENT) == 0) { INFO("Received wps EVENT Signal from Supplicant"); - _supplicant_wifi_wps_event(param); + _supplicant_wifi_wps_event(interface_name, param); } else if (g_strcmp0(sig, SIGNAL_WPS_CONNECTED) == 0) { INFO("Received WPSConnected Signal from Supplicant"); - _supplicant_wifi_wps_connected(param); + _supplicant_wifi_wps_connected(interface_name, param); } + g_free(interface_name); return; } +static void __telephony_svc_cs_changed_cb(keynode_t * node, void *data) +{ + int telephony_svc_cs = 0; + + if (node != NULL) + telephony_svc_cs = vconf_keynode_get_int(node); + else + netconfig_vconf_get_int(VCONFKEY_TELEPHONY_SVC_CS, &telephony_svc_cs); + + DBG("Telephony svc cs [%d]", telephony_svc_cs); + + switch (telephony_svc_cs) { + case 1: + netconfig_battery_end_dn(); + break; + case 2: + netconfig_battery_start_dn(); + break; + default: + break; + } +} + +static void __telephony_rssi_changed_cb(keynode_t * node, void *data) +{ + int rssi = 0; + + if (node != NULL) + rssi = vconf_keynode_get_int(node); + else + netconfig_vconf_get_int(VCONFKEY_TELEPHONY_RSSI, &rssi); + + DBG("Telephony rssi [%d]", rssi); + + netconfig_battery_update_dn_rssi(rssi); +} + +static void _notify_telephony_svc_cs(void) +{ + int telephony_svc_cs = 0; + + netconfig_vconf_get_int(VCONFKEY_TELEPHONY_SVC_CS, &telephony_svc_cs); + DBG("Telephony svc cs [%d]", telephony_svc_cs); + + switch (telephony_svc_cs) { + case 1: + netconfig_battery_end_dn(); + break; + case 2: + netconfig_battery_start_dn(); + break; + default: + break; + } + + vconf_notify_key_changed(VCONFKEY_TELEPHONY_SVC_CS, __telephony_svc_cs_changed_cb, NULL); +} + +static void _notify_telephony_rssi(void) +{ + int rssi = 0; + + netconfig_vconf_get_int(VCONFKEY_TELEPHONY_RSSI, &rssi); + DBG("Telephony rssi [%d]", rssi); + + netconfig_battery_update_dn_rssi(rssi); + + vconf_notify_key_changed(VCONFKEY_TELEPHONY_RSSI, __telephony_rssi_changed_cb, NULL); +} + +static void _ignore_telephony_svc_cs(void) +{ + vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SVC_CS, __telephony_svc_cs_changed_cb); +} + +static void _ignore_telephony_rssi(void) +{ + vconf_ignore_key_changed(VCONFKEY_TELEPHONY_RSSI, __telephony_rssi_changed_cb); +} + static supplicant_signal_cb supplicant_cbs[SIG_MAX] = { _supplicant_interface_removed, _supplicant_properties_changed, @@ -829,13 +1480,46 @@ static supplicant_signal_cb supplicant_cbs[SIG_MAX] = { _supplicant_session_overlapped, _supplicant_tdls_connected, _supplicant_tdls_disconnected, - _supplicant_tdls_peer_found + _supplicant_tdls_peer_found, + _supplicant_dpp_auth_success, + _supplicant_dpp_auth_failed, + _supplicant_dpp_not_compatible, + _supplicant_dpp_conf_failed, + _supplicant_dpp_scan_peer_qr, + _supplicant_dpp_network_id, + _supplicant_dpp_conf_sent, + _supplicant_dpp_conf_received, + _supplicant_dpp_conf_obj, }; +void register_gdbus_signal_container(void) +{ + GDBusConnection *connection = NULL; + connection = netdbus_get_connection(); + + if (connection == NULL) { + ERR("Failed to get GDbus Connection"); + return; + } + + netconfig_subscription_id = g_dbus_connection_signal_subscribe( + connection, + NETCONFIG_SERVICE, + NETCONFIG_NETWORK_INTERFACE, + NETCONFIG_SIGNAL_VCONF_CHANGED, + NETCONFIG_NETWORK_PATH, + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + _dbus_vconf_changed_cb, + NULL, + NULL); + + INFO("Successfully register host net-config DBus signal filter"); +} + void register_gdbus_signal(void) { GDBusConnection *connection = NULL; - const char *interface = NULL; SuppSigArrayIndex sig; connection = netdbus_get_connection(); @@ -874,7 +1558,7 @@ void register_gdbus_signal(void) connection, DBUS_SERVICE_DBUS, DBUS_INTERFACE_DBUS, - CONNMAN_SIGNAL_NAME_CHANGED, + SIGNAL_NAME_OWNER_CHANGED, NULL, CONNMAN_SERVICE, G_DBUS_SIGNAL_FLAGS_NONE, @@ -886,11 +1570,11 @@ void register_gdbus_signal(void) connection, CONNMAN_SERVICE, CONNMAN_MANAGER_INTERFACE, - CONNMAN_SIGNAL_SERVICES_CHANGED, - NULL, + SIGNAL_SCAN_CHANGED, + CONNMAN_MANAGER_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE, - _services_changed_cb, + _scan_changed_cb, NULL, NULL); @@ -910,17 +1594,37 @@ void register_gdbus_signal(void) INFO("Successfully register Supplicant WPS DBus signal filters"); - for (sig = SIG_INTERFACE_REMOVED; sig < SIG_MAX; sig++) { - /* - * For SIG_INTERFACE_REMOVED INTERFACE_ADDED - */ - interface = (sig == SIG_INTERFACE_REMOVED) ? - SUPPLICANT_INTERFACE : SUPPLICANT_IFACE_INTERFACE; + conn_subscription_ids[5] = g_dbus_connection_signal_subscribe( + connection, + DBUS_SERVICE_DBUS, + DBUS_INTERFACE_DBUS, + SIGNAL_NAME_OWNER_CHANGED, + NULL, + CLATD_SERVICE, + G_DBUS_SIGNAL_FLAGS_NONE, + _dbus_name_changed_cb, + NULL, + NULL); + + conn_subscription_ids[6] = g_dbus_connection_signal_subscribe( + connection, + DBUS_SERVICE_DBUS, + DBUS_INTERFACE_DBUS, + SIGNAL_NAME_OWNER_CHANGED, + NULL, + SUPPLICANT_SERVICE, + G_DBUS_SIGNAL_FLAGS_NONE, + _dbus_name_changed_cb, + NULL, + NULL); + INFO("Successfully register clat DBus signal filters"); + + for (sig = SIG_INTERFACE_REMOVED; sig < SIG_MAX; sig++) { supp_subscription_ids[sig] = g_dbus_connection_signal_subscribe( connection, SUPPLICANT_SERVICE, - interface, + supplicant_iface_for_sig[sig], supplicant_signals[sig], NULL, NULL, @@ -932,12 +1636,48 @@ void register_gdbus_signal(void) INFO("Successfully register Supplicant DBus signal filters"); +#if defined TIZEN_DEBUG_ENABLE + dumpservice_subscription_id = g_dbus_connection_signal_subscribe( + connection, + NULL, + DUMP_SERVICE_INTERFACE, + DUMP_SIGNAL, + NULL, + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + __netconfig_dumpservice_handler, + NULL, + NULL); + + INFO("Successfully registered Dumpservice DBus signal filter"); +#endif + + _notify_telephony_svc_cs(); + _notify_telephony_rssi(); + + INFO("Successfully register Telephony vconf keys"); + /* In case ConnMan precedes this signal register, * net-config should update the default connected profile. */ netconfig_update_default(); } +void deregister_gdbus_signal_container(void) +{ + GDBusConnection *connection = NULL; + + connection = netdbus_get_connection(); + if (!connection) { + ERR("Already de-registered. Nothing to be done"); + return; + } + + if (netconfig_subscription_id) + g_dbus_connection_signal_unsubscribe(connection, + netconfig_subscription_id); +} + void deregister_gdbus_signal(void) { GDBusConnection *connection = NULL; @@ -963,4 +1703,11 @@ void deregister_gdbus_signal(void) } } +#if defined TIZEN_DEBUG_ENABLE + g_dbus_connection_signal_unsubscribe(connection, + dumpservice_subscription_id); +#endif + + _ignore_telephony_svc_cs(); + _ignore_telephony_rssi(); }