Merge "Handle supplicant kill event." into tizen
[platform/core/connectivity/net-config.git] / src / signal-handler.c
1 /*
2  * Network Configuration Module
3  *
4  * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <vconf.h>
24 #include <vconf-keys.h>
25 #include <sys/wait.h>
26
27 #include "log.h"
28 #include "util.h"
29 #include "netdbus.h"
30 #include "neterror.h"
31 #include "wifi-wps.h"
32 #include "wifi-agent.h"
33 #include "wifi-power.h"
34 #include "wifi-state.h"
35 #include "wifi-indicator.h"
36 #include "wifi-scan.h"
37 #include "wifi-bssid-scan.h"
38 #include "wifi-background-scan.h"
39 #include "netsupplicant.h"
40 #include "network-state.h"
41 #include "cellular-state.h"
42 #include "signal-handler.h"
43 #include "wifi-tdls.h"
44 #include "wifi-dpp.h"
45 #include "ip-conflict-detect.h"
46 #include "wifi-key-encryption.h"
47 #include "clatd-handler.h"
48 #if defined TIZEN_DEBUG_ENABLE
49 #include "network-dump.h"
50 #define NETWORK_LOG_DUMP_SCRIPT  "/opt/var/lib/net-config/network_log_dump.sh"
51 #define MAX_SIZE_ERROR_BUFFER 256
52 #endif
53
54 #define DBUS_SERVICE_DBUS                       "org.freedesktop.DBus"
55 #define DBUS_INTERFACE_DBUS                     "org.freedesktop.DBus"
56 #define SIGNAL_INTERFACE_REMOVED                "InterfaceRemoved"
57 #define SIGNAL_SCAN_DONE                        "ScanDone"
58 #define SIGNAL_SCAN_CHANGED                     "ScanChanged"
59 #define SIGNAL_BSS_ADDED                        "BSSAdded"
60 #define SIGNAL_PROPERTIES_CHANGED               "PropertiesChanged"
61 #define SIGNAL_PROPERTIES_DRIVER_HANGED         "DriverHanged"
62 #define SIGNAL_PROPERTIES_SESSION_OVERLAPPED    "SessionOverlapped"
63 #define SIGNAL_TDLS_CONNECTED                           "TDLSConnected"
64 #define SIGNAL_TDLS_DISCONNECTED                        "TDLSDisconnected"
65 #define SIGNAL_TDLS_PEER_FOUND                          "TDLSPeerFound"
66
67 #define SIGNAL_DPP_AUTH_SUCCESS "DPPAuthSuccess"
68 #define SIGNAL_DPP_AUTH_FAILED "DPPAuthFailed"
69 #define SIGNAL_DPP_NOT_COMPATIBLE "DPPNotCompatible"
70 #define SIGNAL_DPP_CONF_FAILED "DPPConfFailed"
71 #define SIGNAL_DPP_SCAN_PEER_QR "DPPScanPeerQrCode"
72 #define SIGNAL_DPP_NETWORK_ID "DPPNetworkID"
73 #define SIGNAL_DPP_CONF_SENT "DPPConfSent"
74 #define SIGNAL_DPP_CONF_RECEIVED "DPPConfReceived"
75 #define SIGNAL_DPP_CONF_OBJ "DPPConfObj"
76
77 #define SIGNAL_WPS_CONNECTED                            "WPSConnected"
78 #define SIGNAL_WPS_EVENT                                        "Event"
79 #define SIGNAL_WPS_CREDENTIALS                          "Credentials"
80
81 #define CONNMAN_SIGNAL_SERVICES_CHANGED         "ServicesChanged"
82 #define CONNMAN_SIGNAL_PROPERTY_CHANGED         "PropertyChanged"
83 #define CONNMAN_SIGNAL_DEVICE_CHANGED           "DeviceChanged"
84 #define CONNMAN_SIGNAL_DEVICE_DETECTED          "DeviceDetected"
85 #define SIGNAL_NAME_OWNER_CHANGED               "NameOwnerChanged"
86
87 #define MAX_SIG_LEN 64
88 #define TOTAL_CONN_SIGNALS 7
89 #define MAX_SOCKET_OPEN_RETRY 5
90
91 typedef enum {
92         SIG_INTERFACE_REMOVED = 0,
93         SIG_PROPERTIES_CHANGED,
94         SIG_BSS_ADDED,
95         SIG_SCAN_DONE,
96         SIG_DRIVER_HANGED,
97         SIG_SESSION_OVERLAPPED,
98         SIG_TDLS_CONNECTED,
99         SIG_TDLS_DISCONNECTED,
100         SIG_TDLS_PEER_FOUND,
101         SIG_DPP_AUTH_SUCCESS,
102         SIG_DPP_AUTH_FAILED,
103         SIG_DPP_NOT_COMPATIBLE,
104         SIG_DPP_CONF_FAILED,
105         SIG_DPP_SCAN_PEER_QR,
106         SIG_DPP_NETWORK_ID,
107         SIG_DPP_CONF_SENT,
108         SIG_DPP_CONF_RECEIVED,
109         SIG_DPP_CONF_OBJ,
110         SIG_MAX
111 } SuppSigArrayIndex;
112
113 static int conn_subscription_ids[TOTAL_CONN_SIGNALS] = {0};
114 static const char supplicant_signals[SIG_MAX][MAX_SIG_LEN] = {
115                 SIGNAL_INTERFACE_REMOVED,
116                 SIGNAL_PROPERTIES_CHANGED,
117                 SIGNAL_BSS_ADDED,
118                 SIGNAL_SCAN_DONE,
119                 SIGNAL_PROPERTIES_DRIVER_HANGED,
120                 SIGNAL_PROPERTIES_SESSION_OVERLAPPED,
121                 SIGNAL_TDLS_CONNECTED,
122                 SIGNAL_TDLS_DISCONNECTED,
123                 SIGNAL_TDLS_PEER_FOUND,
124                 SIGNAL_DPP_AUTH_SUCCESS,
125                 SIGNAL_DPP_AUTH_FAILED,
126                 SIGNAL_DPP_NOT_COMPATIBLE,
127                 SIGNAL_DPP_CONF_FAILED,
128                 SIGNAL_DPP_SCAN_PEER_QR,
129                 SIGNAL_DPP_NETWORK_ID,
130                 SIGNAL_DPP_CONF_SENT,
131                 SIGNAL_DPP_CONF_RECEIVED,
132                 SIGNAL_DPP_CONF_OBJ,
133 };
134 static const char *supplicant_iface_for_sig[SIG_MAX] = {
135                 SUPPLICANT_INTERFACE,
136                 SUPPLICANT_IFACE_INTERFACE,
137                 SUPPLICANT_IFACE_INTERFACE,
138                 SUPPLICANT_IFACE_INTERFACE,
139                 SUPPLICANT_IFACE_INTERFACE,
140                 SUPPLICANT_IFACE_INTERFACE,
141                 SUPPLICANT_IFACE_INTERFACE,
142                 SUPPLICANT_IFACE_INTERFACE,
143                 SUPPLICANT_IFACE_INTERFACE,
144                 SUPPLICANT_IFACE_DPP,
145                 SUPPLICANT_IFACE_DPP,
146                 SUPPLICANT_IFACE_DPP,
147                 SUPPLICANT_IFACE_DPP,
148                 SUPPLICANT_IFACE_DPP,
149                 SUPPLICANT_IFACE_DPP,
150                 SUPPLICANT_IFACE_DPP,
151                 SUPPLICANT_IFACE_DPP,
152                 SUPPLICANT_IFACE_DPP,
153 };
154
155 static int supp_subscription_ids[SIG_MAX] = {0};
156 #if defined TIZEN_DEBUG_ENABLE
157 static int dumpservice_subscription_id = 0;
158 #endif
159
160 typedef void (*supplicant_signal_cb)(GDBusConnection *conn,
161                 const gchar *name, const gchar *path, const gchar *interface,
162                 const gchar *sig, GVariant *param, gpointer user_data);
163 typedef void (*connman_signal_cb)(GDBusConnection *conn,
164                 const gchar *name, const gchar *path, const gchar *interface,
165                 const gchar *sig, GVariant *param, gpointer user_data);
166
167 static void __netconfig_extract_ipv4_signal_data(GVariant *dictionary,
168                 const gchar *profile)
169 {
170         gchar *key = NULL;
171         const gchar *value = NULL;
172         GVariant *var = NULL;
173         GVariantIter iter;
174         GVariantBuilder *builder;
175         GVariant *params;
176
177         g_variant_iter_init(&iter, dictionary);
178         while (g_variant_iter_loop(&iter, "{sv}", &key, &var)) {
179                 if (g_strcmp0(key, "Address") == 0)  {
180                         g_variant_get(var, "&s", &value);
181                         char *old_ip = vconf_get_str(VCONFKEY_NETWORK_IP);
182
183                         DBG("Old IPv4.Address [%s] Received new IPv4.Address [%s]", old_ip,
184                                                   value);
185                         if (g_strcmp0(old_ip, value) != 0) {
186                                 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
187
188                                 if (value != NULL) {
189                                         netconfig_set_default_ipaddress(value);
190                                         vconf_set_str(VCONFKEY_NETWORK_IP, value);
191                                         g_variant_builder_add(builder, "{sv}", "IPv4Address",
192                                                                   g_variant_new_string(value));
193                                 } else if (old_ip != NULL && strlen(old_ip) > 0) {
194                                         vconf_set_str(VCONFKEY_NETWORK_IP, "");
195                                         g_variant_builder_add(builder, "{sv}", "IPv4Address",
196                                                                   g_variant_new_string(""));
197                                 }
198
199                                 params = g_variant_new("(@a{sv})",
200                                                                            g_variant_builder_end(builder));
201
202                                 g_variant_builder_unref(builder);
203
204                                 netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
205                                                    NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged",
206                                                    params);
207                         }
208                         free(old_ip);
209                 }
210         }
211 }
212
213 static void __netconfig_extract_ipv6_signal_data(GVariant *dictionary,
214                                                                                                  const gchar *profile)
215 {
216         gchar *key = NULL;
217         const gchar *value = NULL;
218         GVariant *var = NULL;
219         GVariantIter iter;
220         GVariantBuilder *builder;
221         GVariant *params;
222
223         g_variant_iter_init(&iter, dictionary);
224         while (g_variant_iter_loop(&iter, "{sv}", &key, &var)) {
225                 if (g_strcmp0(key, "Address") == 0)  {
226                         g_variant_get(var, "&s", &value);
227                         char *old_ip6 = vconf_get_str(VCONFKEY_NETWORK_IP6);
228
229                         DBG("Old IPv6.Address [%s] Received new IPv6.Address [%s]", old_ip6,
230                                                         value);
231                         if (g_strcmp0(old_ip6, value) != 0) {
232                                 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
233
234                                 if (value != NULL) {
235                                         netconfig_set_default_ipaddress6(value);
236                                         vconf_set_str(VCONFKEY_NETWORK_IP6, value);
237                                         g_variant_builder_add(builder, "{sv}", "IPv6Address",
238                                                                   g_variant_new_string(value));
239                                 } else if (old_ip6 != NULL && strlen(old_ip6) > 0) {
240                                         vconf_set_str(VCONFKEY_NETWORK_IP6, "");
241                                         g_variant_builder_add(builder, "{sv}", "IPv6Address",
242                                                                   g_variant_new_string(""));
243                                 }
244
245                                 params = g_variant_new("(@a{sv})",
246                                                                            g_variant_builder_end(builder));
247                                 g_variant_builder_unref(builder);
248
249                                 netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
250                                                    NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged",
251                                                    params);
252                         }
253                         free(old_ip6);
254                 }
255         }
256 }
257
258 #if defined TIZEN_DEBUG_ENABLE
259 static int __netconfig_handle_execute_file(const char *file_path,
260                 char *const args[], char *const envs[])
261 {
262         pid_t pid = 0;
263         int status = 0;
264         int rv = 0;
265         errno = 0;
266         register unsigned int index = 0;
267         char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
268
269         while (args[index] != NULL) {
270                 DBG("%s", args[index]);
271                 index++;
272         }
273
274         if (!(pid = fork())) {
275                 DBG("pid(%d), ppid (%d)", getpid(), getppid());
276                 DBG("Inside child, exec (%s) command", file_path);
277
278                 errno = 0;
279                 if (execve(file_path, args, envs) == -1) {
280                         DBG("Fail to execute command (%s)",
281                                         strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
282                         exit(1);
283                 }
284         } else if (pid > 0) {
285                 if (waitpid(pid, &status, 0) == -1)
286                         DBG("wait pid (%u) status (%d)", pid, status);
287
288                 if (WIFEXITED(status)) {
289                         rv = WEXITSTATUS(status);
290                         DBG("exited, status=%d", rv);
291                 } else if (WIFSIGNALED(status)) {
292                         DBG("killed by signal %d", WTERMSIG(status));
293                 } else if (WIFSTOPPED(status)) {
294                         DBG("stopped by signal %d", WSTOPSIG(status));
295                 } else if (WIFCONTINUED(status)) {
296                         DBG("continued");
297                 }
298
299                 return rv;
300         }
301
302         DBG("failed to fork(%s)",
303                 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
304         return -EIO;
305 }
306
307 static int _start_dump()
308 {
309         int rv = 0;
310         gchar *path = NETWORK_LOG_DUMP_SCRIPT;
311         char *const args[] = { NETWORK_LOG_DUMP_SCRIPT, NULL };
312         char *const envs[] = { NULL };
313
314         rv = __netconfig_handle_execute_file(path, args, envs);
315         if (rv < 0) {
316                 ERR("Fail to execute network log dump shell");
317                 return -EIO;
318         }
319         return 0;
320 }
321 #endif
322
323 static char *__supplicant_get_interface_name(const gchar *path, const gchar *interface)
324 {
325         GVariant *params = NULL;
326         GVariant *reply = NULL, *var = NULL;;
327         char *interface_name = NULL;
328
329         params = g_variant_new("(ss)", interface, "Ifname");
330
331         reply = netconfig_supplicant_invoke_dbus_method(SUPPLICANT_SERVICE,
332                                 path, DBUS_INTERFACE_PROPERTIES, "Get", params);
333         if (reply == NULL) {
334                 ERR("Failed to get interface name");
335                 return NULL;
336         }
337
338         g_variant_get(reply, "(v)", &var);
339
340         if (g_variant_is_of_type(var, G_VARIANT_TYPE_STRING)) {
341                 interface_name = g_variant_dup_string(var, NULL);
342                 DBG("%s [%s]", path, interface_name);
343         }
344
345         g_variant_unref(var);
346         g_variant_unref(reply);
347
348         return interface_name;
349 }
350
351 static void _technology_signal_cb(GDBusConnection *conn,
352                 const gchar *name, const gchar *path, const gchar *interface,
353                 const gchar *sig, GVariant *param, gpointer user_data)
354 {
355         gchar *key = NULL;
356         GVariant *var = NULL;
357         GVariantIter *iter = NULL;
358         const gchar *svalue = NULL;
359         gboolean bvalue = FALSE;
360
361         DBG("%s %s", path, sig);
362
363         if (param == NULL)
364                 return;
365
366         if (g_str_has_prefix(path, CONNMAN_WIFI_TECHNOLOGY_PREFIX) != TRUE)
367                 return;
368
369         if (g_strcmp0(sig, CONNMAN_SIGNAL_DEVICE_CHANGED) == 0) {
370                 g_variant_get(param, "(a{sv})", &iter);
371                 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
372                         if (g_strcmp0(key, "Ifname") == 0) {
373                                 svalue = g_variant_get_string(var, NULL);
374                                 DBG("Ifname [%s]", svalue);
375                         } else if (g_strcmp0(key, "Powered") == 0) {
376                                 bvalue = g_variant_get_boolean(var);
377                                 DBG("Powered [%d]", bvalue);
378                                 if (svalue)
379                                         wifi_state_update_power_state(svalue, bvalue);
380                         } else if (g_strcmp0(key, "Connected") == 0) {
381                                 bvalue = g_variant_get_boolean(var);
382                                 DBG("Connected [%d]", bvalue);
383                                 if (svalue) {
384                                         wifi_state_set_connected(svalue, bvalue);
385                                         if (bvalue == TRUE)
386                                                 wifi_state_set_technology_state(svalue, NETCONFIG_WIFI_TECH_CONNECTED);
387                                         else
388                                                 wifi_state_set_technology_state(svalue, NETCONFIG_WIFI_TECH_POWERED);
389                                 }
390                         }
391                 }
392                 g_variant_iter_free(iter);
393         } else if (g_strcmp0(sig, CONNMAN_SIGNAL_DEVICE_DETECTED) == 0) {
394                 wifi_state_update_device_list();
395         }
396 }
397
398 static void _service_signal_cb(GDBusConnection *conn,
399                 const gchar *name, const gchar *path,
400                 const gchar *interface, const gchar *sig,
401                 GVariant *param, gpointer user_data)
402 {
403         gchar *sigvalue = NULL;
404         gchar *property;
405         GVariant *variant = NULL, *var;
406         GVariantIter *iter;
407         const gchar *value = NULL;
408         struct sock_data *sd = NULL;
409         gchar *pf = NULL;
410         int idx = 0;
411         unsigned char strength = 0;
412         const char *interface_name = NULL;
413
414         if (path == NULL || param == NULL)
415                 goto done;
416
417         g_variant_get(param, "(sv)", &sigvalue, &variant);
418         if (sigvalue == NULL)
419                 goto done;
420
421         if (g_strcmp0(sig, CONNMAN_SIGNAL_PROPERTY_CHANGED) != 0)
422                 goto done;
423
424         interface_name = netconfig_get_ifname(path);
425
426         if (g_strcmp0(sigvalue, "State") == 0) {
427                 g_variant_get(variant, "s", &property);
428
429                 DBG("[%s] %s", property, path);
430
431                 if (netconfig_is_wifi_profile(path) == TRUE) {
432                         int wifi_state = 0;
433
434                         netconfig_vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
435                         if (wifi_state == VCONFKEY_WIFI_OFF) {
436                                 g_free(property);
437                                 goto done;
438                         }
439
440                         if (g_strcmp0(property, "ready") == 0 || g_strcmp0(property, "online") == 0) {
441                                 netconfig_update_default_profile();
442
443                                 wifi_state_set_service_state(interface_name, path, NETCONFIG_WIFI_CONNECTED);
444
445                         } else if (g_strcmp0(property, "failure") == 0 ||
446                                 g_strcmp0(property, "disconnect") == 0 || g_strcmp0(property, "idle") == 0) {
447                                 if (g_strcmp0(property, "failure") == 0)
448                                         wifi_state_set_service_state(interface_name, path, NETCONFIG_WIFI_FAILURE);
449                                 else
450                                         wifi_state_set_service_state(interface_name, path, NETCONFIG_WIFI_IDLE);
451
452                                 if (g_strcmp0(path, netconfig_get_default_profile()) != 0) {
453                                         g_free(property);
454                                         goto done;
455                                 }
456
457                                 netconfig_update_default_profile();
458
459                         } else if (g_strcmp0(property, "association") == 0 || g_strcmp0(property, "configuration") == 0) {
460                                 if (g_strcmp0(property, "association") == 0)
461                                         wifi_state_set_service_state(interface_name, path, NETCONFIG_WIFI_ASSOCIATION);
462                                 else
463                                         wifi_state_set_service_state(interface_name, path, NETCONFIG_WIFI_CONFIGURATION);
464
465                                 if (g_strcmp0(path, netconfig_get_default_profile()) != 0) {
466                                         g_free(property);
467                                         goto done;
468                                 }
469
470                                 netconfig_update_default_profile();
471
472                         }
473                 } else {
474                         if (g_strcmp0(property, "ready") == 0 || g_strcmp0(property, "online") == 0) {
475                                 netconfig_update_default_profile();
476
477                                 if (netconfig_is_cellular_profile(netconfig_get_default_profile())) {
478                                         pf = netconfig_get_connected_cellular_internet_ipv6only_profile(NULL);
479                                         if (pf) {
480                                                 g_free(pf);
481
482                                                 /* Enable clatd if it is not in running state */
483                                                 DBG("Connected to ipv6 only cellular, enable clatd");
484                                                 netconfig_clatd_enable();
485                                         }
486                                 }
487
488                                 if (netconfig_is_cellular_profile(path) && netconfig_is_cellular_internet_profile(path))
489                                         cellular_state_set_service_state(NETCONFIG_CELLULAR_ONLINE);
490
491                         } else if (g_strcmp0(property, "failure") == 0 ||
492                                 g_strcmp0(property, "disconnect") == 0 || g_strcmp0(property, "idle") == 0) {
493                                 if (netconfig_get_default_profile() == NULL) {
494                                         g_free(property);
495                                         goto done;
496                                 }
497
498                                 if (netconfig_is_cellular_profile(path) && netconfig_is_cellular_internet_profile(path)) {
499                                         cellular_state_set_service_state(NETCONFIG_CELLULAR_IDLE);
500
501                                         /* Disable clatd if it is in running state */
502                                         DBG("disable clatd");
503                                         netconfig_clatd_disable();
504                                 }
505
506                                 if (g_strcmp0(path, netconfig_get_default_profile()) != 0) {
507                                         g_free(property);
508                                         goto done;
509                                 }
510
511                                 netconfig_update_default_profile();
512                         } else if (g_strcmp0(property, "association") == 0 || g_strcmp0(property, "configuration") == 0) {
513                                 if (netconfig_get_default_profile() == NULL) {
514                                         g_free(property);
515                                         goto done;
516                                 }
517
518                                 if (netconfig_is_cellular_profile(path) && netconfig_is_cellular_internet_profile(path))
519                                         cellular_state_set_service_state(NETCONFIG_CELLULAR_CONNECTING);
520
521                                 if (g_strcmp0(path, netconfig_get_default_profile()) != 0) {
522                                         g_free(property);
523                                         goto done;
524                                 }
525
526                                 netconfig_update_default_profile();
527                         }
528                 }
529
530                 if (netconfig_is_wifi_profile(path) || netconfig_is_ethernet_profile(path)) {
531                         if (g_strcmp0(property, "ready") == 0) {
532                                 if (g_strcmp0(path, netconfig_get_default_profile()) == 0
533                                                 && netconfig_get_default_is_internet())
534                                         netconfig_set_default_is_internet(FALSE);
535
536                                 for (idx = 0; idx < MAX_SOCKET_OPEN_RETRY; idx++) {
537                                         sd = start_ip_conflict_mon();
538                                         if (sd != NULL)
539                                                 break;
540                                 }
541                         } else if (g_strcmp0(property, "online") == 0) {
542                                 if (g_strcmp0(path, netconfig_get_default_profile()) == 0)
543                                         netconfig_set_default_is_internet(TRUE);
544                         } else {
545                                 stop_ip_conflict_mon();
546                         }
547                 }
548
549                 g_free(property);
550         } else if (g_strcmp0(sigvalue, "Proxy") == 0) {
551                 if (g_strcmp0(path, netconfig_get_default_profile()) != 0)
552                         goto done;
553
554                 if (!g_variant_is_of_type(variant, G_VARIANT_TYPE_ARRAY))
555                         goto done;
556
557                 g_variant_get(variant, "a{sv}", &iter);
558                 while (g_variant_iter_loop(iter, "{sv}", &property, &var)) {
559                         GVariantBuilder *builder;
560                         GVariant *sig_params;
561                         if (g_strcmp0(property, "Servers") == 0) {
562                                 GVariantIter *iter_sub = NULL;
563
564                                 g_variant_get(var, "as", &iter_sub);
565                                 g_variant_iter_loop(iter_sub, "s", &value);
566                                 g_variant_iter_free(iter_sub);
567
568                                 DBG("Proxy - [%s]", value);
569                                 if (g_strcmp0(value, netconfig_get_default_proxy()) != 0) {
570                                         builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
571
572                                         netconfig_set_default_proxy(value);
573                                         vconf_set_str(VCONFKEY_NETWORK_PROXY, value);
574
575                                         g_variant_builder_add(builder, "{sv}", "ProxyAddress",
576                                                                         g_variant_new_string(value));
577
578                                         sig_params = g_variant_new("(@a{sv})",
579                                                                         g_variant_builder_end(builder));
580                                         g_variant_builder_unref(builder);
581
582                                         netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
583                                                            NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged",
584                                                            sig_params);
585                                 }
586
587                                 g_free(property);
588                                 g_variant_unref(var);
589                                 break;
590                         } else if (g_strcmp0(property, "Method") == 0) {
591                                 value = g_variant_get_string(var, NULL);
592                                 DBG("Method - [%s]", value);
593
594                                 if (g_strcmp0(value, "direct") == 0) {
595                                         if (g_strcmp0("", netconfig_get_default_proxy()) != 0) {
596                                                 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
597
598                                                 netconfig_set_default_proxy("");
599                                                 vconf_set_str(VCONFKEY_NETWORK_PROXY, "");
600
601                                                 g_variant_builder_add(builder, "{sv}", "ProxyAddress",
602                                                                         g_variant_new_string(""));
603
604                                                 sig_params = g_variant_new("(@a{sv})",
605                                                                         g_variant_builder_end(builder));
606                                                 g_variant_builder_unref(builder);
607
608                                                 netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
609                                                                    NETCONFIG_NETWORK_INTERFACE,
610                                                                    "NetworkConfigChanged", sig_params);
611                                         }
612                                 }
613
614                                 g_free(property);
615                                 g_variant_unref(var);
616                                 break;
617                         }
618                 }
619
620                 g_variant_iter_free(iter);
621         } else if (g_strcmp0(sigvalue, "IPv4") == 0) {
622                 if (g_strcmp0(path, netconfig_get_default_profile()) != 0)
623                         goto done;
624
625                 __netconfig_extract_ipv4_signal_data(variant, path);
626         } else if (g_strcmp0(sigvalue, "IPv6") == 0) {
627                 if (g_strcmp0(path, netconfig_get_default_profile()) != 0)
628                         goto done;
629
630                 __netconfig_extract_ipv6_signal_data(variant, path);
631         } else if (g_strcmp0(sigvalue, "Strength") == 0) {
632                 strength = g_variant_get_byte(variant);
633
634                 netconfig_wifi_indicator_update(interface_name, path, strength - 120);
635         } else if (g_strcmp0(sigvalue, "Error") == 0) {
636                 g_variant_get(variant, "s", &property);
637                 INFO("[%s] Property : %s", sigvalue, property);
638 #if defined TIZEN_DEBUG_ENABLE
639                 if (g_strcmp0(property, "dhcp-failed") == 0
640                         || g_strcmp0(property, "connect-failed") == 0
641                         || g_strcmp0(property, "login-failed") == 0
642                         || g_strcmp0(property, "auth-failed") == 0
643                         || g_strcmp0(property, "invalid-key") == 0) {
644
645                         INFO("start dump");
646                         _start_dump();
647                 }
648 #endif
649                 g_free(property);
650         }
651 done:
652         g_free(sigvalue);
653
654         if (variant)
655                 g_variant_unref(variant);
656
657         return;
658 }
659
660 static void _dbus_name_changed_cb(GDBusConnection *conn,
661                 const gchar *Name, const gchar *path, const gchar *interface,
662                 const gchar *sig, GVariant *param, gpointer user_data)
663 {
664         gchar *name = NULL;
665         gchar *old = NULL;
666         gchar *new = NULL;
667
668         if (param == NULL)
669                 return;
670
671         g_variant_get(param, "(sss)", &name, &old, &new);
672
673         if (g_strcmp0(name, CONNMAN_SERVICE) == 0 && *new == '\0') {
674                 DBG("ConnMan destroyed: name %s, old %s, new %s", name, old, new);
675
676                 connman_register_agent();
677         } else if (g_strcmp0(name, CLATD_SERVICE) == 0 && *new == '\0') {
678                 DBG("Clat destroyed: name %s, old %s, new %s", name, old, new);
679
680                 /* If clatd is terminated unexpectedly, reset and enable clat service. */
681                 if (NETCONFIG_CELLULAR_ONLINE == cellular_state_get_service_state())
682                         netconfig_clatd_reset();
683         } else if (g_strcmp0(name, SUPPLICANT_SERVICE) == 0 && *new == '\0') {
684                 DBG("Supplicant destroyed: name %s, old %s, new %s", name, old, new);
685                 __mark_supplicant_stopped();
686         }
687         g_free(name);
688         g_free(old);
689         g_free(new);
690
691         return;
692 }
693
694 static void _scan_changed_cb(GDBusConnection *conn,
695                 const gchar *name, const gchar *path, const gchar *interface,
696                 const gchar *sig, GVariant *param, gpointer user_data)
697 {
698         const char *key = NULL;
699         GVariant *var;
700         gboolean value = false;
701
702         if (g_strcmp0(sig, SIGNAL_SCAN_CHANGED) == 0) {
703                 g_variant_get(param, "(sv)", &key, &var);
704
705                 if (g_strcmp0(key, "scan_started") == 0)
706                         value = true;
707                 else if (g_strcmp0(key, "scan_done") == 0)
708                         value = false;
709
710                 DBG("Scan changed [%s]", (value == true) ? "Started" : "Done");
711                 netconfig_battery_update_wifi_scan(value);
712
713                 if (var != NULL)
714                         g_variant_unref(var);
715         }
716 }
717
718 static void _supplicant_interface_removed(GDBusConnection *conn,
719                 const gchar *name, const gchar *path, const gchar *interface,
720                 const gchar *sig, GVariant *param, gpointer user_data)
721 {
722         char *interface_name = NULL;
723
724         DBG("Interface removed handling!");
725
726         interface_name = __supplicant_get_interface_name(path, interface);
727         if (interface_name == NULL)
728                 return;
729
730         if (netconfig_wifi_bssidscan_get_mode(interface_name) == TRUE)
731                 netconfig_wifi_bssid_signal_scanaborted(interface_name);
732
733         g_free(interface_name);
734         return;
735 }
736
737 static void _supplicant_properties_changed(GDBusConnection *conn,
738                 const gchar *name, const gchar *path, const gchar *interface,
739                 const gchar *sig, GVariant *param, gpointer user_data)
740 {
741         DBG("Properties changed handling!");
742         gchar *key = NULL;
743         const gchar *state = NULL;
744         GVariantIter *iter = NULL;
745         GVariant *variant = NULL;
746         gboolean scanning = FALSE;
747         char *interface_name = NULL;
748
749         if (param == NULL)
750                 return;
751
752         interface_name = __supplicant_get_interface_name(path, interface);
753         if (interface_name == NULL)
754                 return;
755
756         g_variant_get(param, "(a{sv})", &iter);
757         while (g_variant_iter_loop(iter, "{sv}", &key, &variant)) {
758                 if (g_strcmp0(key, "Scanning") == 0) {
759                         scanning = g_variant_get_boolean(variant);
760                         DBG("setting scanning %s", scanning ? "TRUE" : "FALSE");
761                         if (scanning == TRUE)
762                                 netconfig_wifi_scan_set_scanning(interface_name, TRUE);
763                         else
764                                 netconfig_wifi_scan_set_scanning(interface_name, FALSE);
765
766                         g_variant_unref(variant);
767                         g_free(key);
768                         variant = NULL;
769                         key = NULL;
770                         break;
771                 } else if (g_strcmp0(key, "State") == 0) {
772                         state = g_variant_get_string(variant, NULL);
773                         if (state != NULL)
774                                 DBG("Supplicant state : %s", state);
775
776                         g_variant_unref(variant);
777                         g_free(key);
778                         variant = NULL;
779                         key = NULL;
780                         break;
781                 } else if (g_strcmp0(key, "DisconnectReason") == 0) {
782                         int reason = g_variant_get_int32(variant);
783                         DBG("Supplicant DisconnReason : %d", reason);
784
785                         g_variant_unref(variant);
786                         g_free(key);
787                         variant = NULL;
788                         key = NULL;
789                         break;
790                 } else {
791                         gchar *value;
792                         value = g_variant_print(variant, TRUE);
793                         DBG("Supplicant %s : %s", key, value);
794
795                         g_free(value);
796                 }
797         }
798
799         g_variant_iter_free(iter);
800         g_free(interface_name);
801         return;
802 }
803
804 static void _supplicant_bss_added(GDBusConnection *conn,
805                 const gchar *name, const gchar *path, const gchar *interface,
806                 const gchar *sig, GVariant *param, gpointer user_data)
807 {
808         DBG("BSS added handling!");
809         wifi_state_set_bss_found(TRUE);
810
811         return;
812 }
813
814 static void _supplicant_scan_done(GDBusConnection *conn,
815                 const gchar *name, const gchar *path, const gchar *interface,
816                 const gchar *sig, GVariant *param, gpointer user_data)
817 {
818         char *interface_name = NULL;
819
820         DBG("Scan Done handling!");
821
822         interface_name = __supplicant_get_interface_name(path, interface);
823         if (interface_name == NULL)
824                 return;
825
826         netconfig_wifi_scan_set_scanning(interface_name, FALSE);
827
828         if (netconfig_wifi_bssidscan_get_mode(interface_name) == TRUE) {
829                 DBG("%s bssid scan done!", interface_name);
830                 netconfig_wifi_bssid_signal_scandone(interface_name);
831                 if (wifi_state_get_technology_state(interface_name)
832                                 < NETCONFIG_WIFI_TECH_POWERED) {
833                         g_free(interface_name);
834                         return;
835                 }
836         }
837
838         if (netconfig_wifi_bgscan_get_mode(interface_name) == TRUE) {
839                 DBG("%s bgscan done!", interface_name);
840                 if (wifi_state_get_technology_state(interface_name)
841                                 >= NETCONFIG_WIFI_TECH_POWERED) {
842                         netconfig_wifi_bgscan_start(interface_name, FALSE);
843                 }
844
845                 wifi_start_timer_network_notification(interface_name);
846         }
847
848         g_free(interface_name);
849         return;
850 }
851
852 static void _supplicant_driver_hanged(GDBusConnection *conn,
853                 const gchar *name, const gchar *path, const gchar *interface,
854                 const gchar *sig, GVariant *param, gpointer user_data)
855 {
856         char *interface_name = NULL;
857
858         DBG("Driver Hanged handling!");
859         ERR("Critical. Wi-Fi firmware crashed");
860
861 #if !defined TIZEN_WEARABLE
862         netconfig_send_message_to_net_popup("Wi-Fi Error",
863                 "Wi-Fi Driver Hanged. Please get log dump and report", "popup", NULL);
864 #endif
865
866         interface_name = __supplicant_get_interface_name(path, interface);
867         if (interface_name == NULL)
868                 return;
869
870         wifi_power_recover_firmware(interface_name);
871
872         g_free(interface_name);
873         return;
874
875 }
876
877 static void _supplicant_session_overlapped(GDBusConnection *conn,
878                 const gchar *name, const gchar *path, const gchar *interface,
879                 const gchar *sig, GVariant *param, gpointer user_data)
880 {
881         DBG("Driver session overlapped handling!");
882         ERR("WPS PBC SESSION OVERLAPPED");
883 #if defined TIZEN_WEARABLE
884         return;
885 #else
886         netconfig_send_message_to_net_popup("WPS Error",
887                                         "wps session overlapped", "popup", NULL);
888 #endif
889 }
890
891 #if defined TIZEN_DEBUG_ENABLE
892 static void __netconfig_dumpservice_handler(GDBusConnection *conn,
893                 const gchar *name, const gchar *path, const gchar *interface,
894                 const gchar *sig, GVariant *param, gpointer user_data)
895 {
896         int mode;
897         gchar *signal_path = NULL;
898
899         if (param == NULL)
900                 return;
901
902         g_variant_get(param, "(is)", &mode, &signal_path);
903         DBG("Path: %s and mode: %d", signal_path, mode);
904
905         netconfig_dump_log(signal_path);
906         if (signal_path)
907                 g_free(signal_path);
908
909         return;
910 }
911 #endif
912
913 static void _supplicant_tdls_connected(GDBusConnection *conn,
914                 const gchar *name, const gchar *path, const gchar *interface,
915                 const gchar *sig, GVariant *param, gpointer user_data)
916 {
917         char *interface_name = NULL;
918
919         DBG("Received TDLS Connected Signal");
920
921         interface_name = __supplicant_get_interface_name(path, interface);
922         if (interface_name == NULL)
923                 return;
924
925         netconfig_wifi_tdls_connected_event(interface_name, param);
926
927         g_free(interface_name);
928         return;
929 }
930
931 static void _supplicant_tdls_disconnected(GDBusConnection *conn,
932                 const gchar *name, const gchar *path, const gchar *interface,
933                 const gchar *sig, GVariant *param, gpointer user_data)
934 {
935         char *interface_name = NULL;
936
937         DBG("Received TDLS Disconnected Signal");
938
939         interface_name = __supplicant_get_interface_name(path, interface);
940         if (interface_name == NULL)
941                 return;
942
943         netconfig_wifi_tdls_disconnected_event(interface_name, param);
944
945         g_free(interface_name);
946         return;
947 }
948
949 static void _supplicant_tdls_peer_found(GDBusConnection *conn,
950                 const gchar *name, const gchar *path, const gchar *interface,
951                 const gchar *sig, GVariant *param, gpointer user_data)
952 {
953         char *interface_name = NULL;
954
955         DBG("Received TDLS Peer Found Signal");
956
957         interface_name = __supplicant_get_interface_name(path, interface);
958         if (interface_name == NULL)
959                 return;
960
961         netconfig_wifi_tdls_peer_found_event(interface_name, param);
962
963         g_free(interface_name);
964         return;
965 }
966
967 static void _supplicant_dpp_auth_success(GDBusConnection *conn,
968                 const gchar *name, const gchar *path, const gchar *interface,
969                 const gchar *sig, GVariant *param, gpointer user_data)
970 {
971         DBG("Received DPP Auth Success Signal");
972         netconfig_wifi_dpp_auth_success_event(param);
973         return;
974 }
975
976 static void _supplicant_dpp_auth_failed(GDBusConnection *conn,
977                 const gchar *name, const gchar *path, const gchar *interface,
978                 const gchar *sig, GVariant *param, gpointer user_data)
979 {
980         DBG("Received DPP Auth Failed Signal");
981         netconfig_wifi_dpp_auth_failed_event(param);
982         return;
983 }
984
985 static void _supplicant_dpp_not_compatible(GDBusConnection *conn,
986                 const gchar *name, const gchar *path, const gchar *interface,
987                 const gchar *sig, GVariant *param, gpointer user_data)
988 {
989         DBG("Received DPP Not Compatible Signal");
990         netconfig_wifi_dpp_not_compatible_event(param);
991         return;
992 }
993
994 static void _supplicant_dpp_conf_failed(GDBusConnection *conn,
995                 const gchar *name, const gchar *path, const gchar *interface,
996                 const gchar *sig, GVariant *param, gpointer user_data)
997 {
998         DBG("Received DPP Conf Failed Signal");
999         netconfig_wifi_dpp_conf_failed_event(param);
1000         return;
1001 }
1002
1003 static void _supplicant_dpp_scan_peer_qr(GDBusConnection *conn,
1004                 const gchar *name, const gchar *path, const gchar *interface,
1005                 const gchar *sig, GVariant *param, gpointer user_data)
1006 {
1007         DBG("Received DPP Scan Peer QR Signal");
1008         netconfig_wifi_dpp_scan_peer_qr_event(param);
1009         return;
1010 }
1011
1012 static void _supplicant_dpp_network_id(GDBusConnection *conn,
1013                 const gchar *name, const gchar *path, const gchar *interface,
1014                 const gchar *sig, GVariant *param, gpointer user_data)
1015 {
1016         DBG("Received DPP Network Id Signal");
1017         netconfig_wifi_dpp_network_id_event(param);
1018         return;
1019 }
1020
1021 static void _supplicant_dpp_conf_sent(GDBusConnection *conn,
1022                 const gchar *name, const gchar *path, const gchar *interface,
1023                 const gchar *sig, GVariant *param, gpointer user_data)
1024 {
1025         DBG("Received DPP Conf Sent Signal");
1026         netconfig_wifi_dpp_conf_sent_event(param);
1027         return;
1028 }
1029
1030 static void _supplicant_dpp_conf_received(GDBusConnection *conn,
1031                 const gchar *name, const gchar *path, const gchar *interface,
1032                 const gchar *sig, GVariant *param, gpointer user_data)
1033 {
1034         DBG("Received DPP Conf Received Signal");
1035         netconfig_wifi_dpp_conf_received_event(param);
1036         return;
1037 }
1038
1039 static void _supplicant_dpp_conf_obj(GDBusConnection *conn,
1040                 const gchar *name, const gchar *path, const gchar *interface,
1041                 const gchar *sig, GVariant *param, gpointer user_data)
1042 {
1043         char *interface_name = NULL;
1044
1045         DBG("Received DPP Conf Obj Signal");
1046
1047         interface_name = __supplicant_get_interface_name(path, interface);
1048         if (interface_name == NULL)
1049                 return;
1050
1051         netconfig_wifi_dpp_conf_obj_event(interface_name, param);
1052
1053         g_free(interface_name);
1054         return;
1055 }
1056
1057 static void _supplicant_wifi_wps_connected(const char *interface_name, GVariant *param)
1058 {
1059         gchar *key;
1060         char ssid[32] = {0, };
1061         gchar *name;
1062         GVariantIter *iter;
1063         GVariant *variant;
1064         int config_error = 0;
1065         int error_indication = 0;
1066         gsize ssid_len = 0;
1067
1068         if (param == NULL) {
1069                 ERR("Param is NULL");
1070                 return;
1071         }
1072
1073         g_variant_get(param, "(sa{sv})", &name, &iter);
1074         INFO("wps Result: %s", name);
1075         while (g_variant_iter_loop(iter, "{sv}", &key, &variant)) {
1076                 INFO("wps Key is %s", key);
1077                 if (g_strcmp0(key, "SSID") == 0) {
1078                         const char *t_key = NULL;
1079                         t_key = g_variant_get_fixed_array(variant, &ssid_len, sizeof(guchar));
1080                         INFO("wps ssid_len is %zd ", ssid_len);
1081                         if (t_key == NULL) {
1082                                 g_free(key);
1083                                 g_variant_unref(variant);
1084                                 ERR("WPS PBC Connection Failed");
1085                                 goto error;
1086                         }
1087                         if (ssid_len > 0 && ssid_len <= 32) {
1088                                 memcpy(ssid, t_key, ssid_len);
1089                         } else {
1090                                 memset(ssid, 0, sizeof(ssid));
1091                                 ssid_len = 0;
1092                         }
1093                         INFO("WPS PBC Connection completed with AP %s", ssid);
1094                         netconfig_wifi_notify_wps_completed(interface_name,
1095                                 ssid, ssid_len);
1096                 }
1097         }
1098
1099         g_variant_iter_free(iter);
1100         g_free(name);
1101         return;
1102
1103 error:
1104         g_variant_iter_free(iter);
1105         g_free(name);
1106         error_indication = WPS_EI_OPERATION_FAILED;
1107         config_error = WPS_CFG_NO_ERROR;
1108         ERR("Error Occured! Notifying Fail Event");
1109         netconfig_wifi_notify_wps_fail_event(interface_name,
1110                 config_error, error_indication);
1111
1112 }
1113
1114 static void _supplicant_wifi_wps_event(const char *interface_name, GVariant *param)
1115 {
1116         gchar *key;
1117         gchar *name;
1118         GVariantIter *iter;
1119         GVariant *variant;
1120         gint32 config_error = 0;
1121         gint32 error_indication = 0;
1122
1123         if (param == NULL) {
1124                 ERR("Param is NULL");
1125                 return;
1126         }
1127
1128         g_variant_get(param, "(sa{sv})", &name, &iter);
1129         INFO("Event Result: %s", name);
1130         if (g_strcmp0(name, "fail") == 0) {
1131                 while (g_variant_iter_loop(iter, "{sv}", &key, &variant)) {
1132                         if (key == NULL)
1133                                 goto error;
1134                         INFO("Key is %s", key);
1135                         if (g_strcmp0(key, "config_error") == 0) {
1136                                 config_error = g_variant_get_int32(variant);
1137                                 ERR("Config Error %d", config_error);
1138                         } else if (g_strcmp0(key, "error_indication") == 0) {
1139                                 error_indication = g_variant_get_int32(variant);
1140                                 ERR("Error Indication %d", error_indication);
1141                         }
1142                 }
1143                 netconfig_wifi_notify_wps_fail_event(interface_name,
1144                         config_error, error_indication);
1145         }
1146
1147         g_variant_iter_free(iter);
1148         g_free(name);
1149         return;
1150
1151 error:
1152         g_variant_iter_free(iter);
1153         g_free(name);
1154         error_indication = WPS_EI_OPERATION_FAILED;
1155         config_error = WPS_CFG_NO_ERROR;
1156         ERR("Error Occured! Notifying Fail Event");
1157         netconfig_wifi_notify_wps_fail_event(interface_name,
1158                 config_error, error_indication);
1159 }
1160
1161 static void _find_service_and_set_passphrase(char *ssid, char *key)
1162 {
1163         GString *str;
1164         GVariant *reply = NULL;
1165         int i, j, ssid_len;
1166         char *service_path;
1167         char *dev_mac_addr;
1168         char ident[13];
1169         gchar *enc_passphrase;
1170
1171         ssid_len = strlen(ssid);
1172
1173         str = g_string_sized_new((ssid_len * 2) + 55);
1174         if (!str)
1175                 return;
1176
1177         dev_mac_addr = vconf_get_str(VCONFKEY_WIFI_BSSID_ADDRESS);
1178         if (!dev_mac_addr) {
1179                 ERR("Failed to get mac address from vconf key");
1180                 g_string_free(str, TRUE);
1181                 return;
1182         }
1183
1184         j = 0;
1185         for (i = 0; dev_mac_addr[i]; i++) {
1186                 if (dev_mac_addr[i] != ':')
1187                         ident[j++] = dev_mac_addr[i];
1188         }
1189         ident[j] = '\0';
1190
1191         g_string_append_printf(str, "%s%s_", CONNMAN_WIFI_SERVICE_PROFILE_PREFIX,
1192                                                    ident);
1193         free(dev_mac_addr);
1194
1195         for (i = 0; i < ssid_len; i++) {
1196                 if (ssid[i] != '"')
1197                         g_string_append_printf(str, "%02x", ssid[i]);
1198         }
1199
1200         g_string_append_printf(str, "_managed_psk");
1201
1202         service_path = g_string_free(str, FALSE);
1203
1204         enc_passphrase = _netconfig_encrypt_passphrase(key);
1205         if (!enc_passphrase) {
1206                 ERR("Failed to encrypt passphrase");
1207                 g_free(service_path);
1208                 return;
1209         }
1210
1211         INFO("wps service_path %s Passphrase %s", service_path, enc_passphrase);
1212
1213         reply = netconfig_invoke_dbus_method(CONNMAN_SERVICE, service_path,
1214                                          CONNMAN_SERVICE_INTERFACE, "SetProperty",
1215                                          g_variant_new("(sv)", "Passphrase",
1216                                                                    g_variant_new_string(enc_passphrase)));
1217         if (reply != NULL)
1218                 g_variant_unref(reply);
1219         else
1220                 ERR("Failed to set passphrase");
1221
1222         g_free(service_path);
1223
1224         return;
1225 }
1226
1227 static void _supplicant_wifi_wps_credentials(const char *interface_name, GVariant *param)
1228 {
1229         gchar *key;
1230         char ssid[32] = {0, };
1231         char wps_key[100] = {0, };
1232         GVariantIter *iter;
1233         GVariant *variant;
1234         int config_error = 0;
1235         int error_indication = 0;
1236         gsize ssid_len = 0;
1237         char *key_mgmt = NULL;
1238
1239         if (param == NULL) {
1240                 ERR("Param is NULL");
1241                 return;
1242         }
1243
1244         g_variant_get(param, "(a{sv})", &iter);
1245         while (g_variant_iter_loop(iter, "{sv}", &key, &variant)) {
1246                 if (key == NULL)
1247                         goto error;
1248                 INFO("wps Key is %s", key);
1249                 if (g_strcmp0(key, "Key") == 0) {
1250                         gsize key_len = 0;
1251                         const char *t_key = NULL;
1252                         key_len = g_variant_get_size(variant);
1253
1254                         INFO("wps password len %zd ", key_len);
1255                         if (key_len > 0) {
1256                                 t_key = g_variant_get_fixed_array(variant, &key_len,
1257                                                   sizeof(guchar));
1258                                 if (!t_key) {
1259                                         g_free(key);
1260                                         g_variant_unref(variant);
1261                                         goto error;
1262                                 }
1263                                 strncpy(wps_key, t_key, key_len);
1264                                 wps_key[key_len] = '\0';
1265                                 INFO("WPS Key in process credentials %s", wps_key);
1266                         } else
1267                                 SLOGI("WPS AP Security ->Open");
1268                 } else if (g_strcmp0(key, "SSID") == 0) {
1269                         const char *t_key = NULL;
1270                         t_key = g_variant_get_fixed_array(variant, &ssid_len,
1271                                                   sizeof(guchar));
1272                         INFO("wps ssid_len is %zd ", ssid_len);
1273                         if (!t_key) {
1274                                 g_free(key);
1275                                 g_variant_unref(variant);
1276                                 goto error;
1277                         }
1278                         if (ssid_len > 0 && ssid_len <= 32) {
1279                                 memcpy(ssid, t_key, ssid_len);
1280                         } else {
1281                                 memset(ssid, 0, sizeof(ssid));
1282                                 ssid_len = 0;
1283                         }
1284                         INFO("SSID in process credentials %s", ssid);
1285                 } else if (g_strcmp0(key, "AuthType") == 0) {
1286                         gchar *auth_type;
1287                         GVariantIter *var_iter;
1288                         g_variant_get(variant, "as", &var_iter);
1289                         while (g_variant_iter_loop(var_iter, "s", &auth_type)) {
1290                                 INFO("wps auth_type %s", auth_type);
1291                                 if (g_strcmp0(auth_type, "wpa-psk") == 0 ||
1292                                         g_strcmp0(auth_type, "wpa2-psk") == 0)
1293                                         key_mgmt = "psk";
1294                                 else if (g_strcmp0(auth_type, "open") == 0)
1295                                         key_mgmt = "none";
1296                         }
1297                         g_variant_iter_free(var_iter);
1298                 } else if (g_strcmp0(key, "EncrType") == 0) {
1299                         gchar *encr_type;
1300                         GVariantIter *var_iter;
1301                         g_variant_get(variant, "as", &var_iter);
1302                         while (g_variant_iter_loop(var_iter, "s", &encr_type))
1303                                 INFO("wps encr_type %s", encr_type);
1304                         g_variant_iter_free(var_iter);
1305                 } else if (g_strcmp0(key, "BSSID") == 0) {
1306                         const guchar *bssid;
1307                         gsize bssid_len;
1308                         bssid = g_variant_get_fixed_array(variant, &bssid_len,
1309                                                                 sizeof(guchar));
1310                         if (bssid && bssid_len == 6)
1311                                 INFO("wps BSSID %2x:%2x:%2x:%2x:%2x:%2x", bssid[0], bssid[1],
1312                                          bssid[2], bssid[3], bssid[4], bssid[5]);
1313                 }
1314         }
1315
1316         g_variant_iter_free(iter);
1317
1318         if (g_strcmp0(key_mgmt, "psk") == 0)
1319                 _find_service_and_set_passphrase(ssid, wps_key);
1320
1321         netconfig_wifi_notify_wps_credentials(interface_name, ssid, ssid_len, wps_key);
1322         return;
1323
1324 error:
1325         g_variant_iter_free(iter);
1326         error_indication = WPS_EI_OPERATION_FAILED;
1327         config_error = WPS_CFG_NO_ERROR;
1328         ERR("Error Occured! Notifying Fail Event");
1329         netconfig_wifi_notify_wps_fail_event(interface_name, config_error, error_indication);
1330 }
1331
1332 static void __netconfig_wps_signal_filter_handler(GDBusConnection *conn,
1333                 const gchar *name, const gchar *path, const gchar *interface,
1334                 const gchar *sig, GVariant *param, gpointer user_data)
1335 {
1336         char *interface_name = NULL;
1337
1338         interface_name = __supplicant_get_interface_name(path, SUPPLICANT_IFACE_INTERFACE);
1339         if (interface_name == NULL)
1340                 return;
1341
1342         if (g_strcmp0(sig, SIGNAL_WPS_CREDENTIALS) == 0) {
1343                 INFO("Received wps CREDENTIALS Signal from Supplicant");
1344                 _supplicant_wifi_wps_credentials(interface_name, param);
1345         } else if (g_strcmp0(sig, SIGNAL_WPS_EVENT) == 0) {
1346                 INFO("Received wps EVENT Signal from Supplicant");
1347                 _supplicant_wifi_wps_event(interface_name, param);
1348         } else if (g_strcmp0(sig, SIGNAL_WPS_CONNECTED) == 0) {
1349                 INFO("Received WPSConnected Signal from Supplicant");
1350                 _supplicant_wifi_wps_connected(interface_name, param);
1351         }
1352
1353         g_free(interface_name);
1354         return;
1355 }
1356
1357 static void __telephony_svc_cs_changed_cb(keynode_t * node, void *data)
1358 {
1359         int telephony_svc_cs = 0;
1360
1361         if (node != NULL)
1362                 telephony_svc_cs = vconf_keynode_get_int(node);
1363         else
1364                 netconfig_vconf_get_int(VCONFKEY_TELEPHONY_SVC_CS, &telephony_svc_cs);
1365
1366         DBG("Telephony svc cs [%d]", telephony_svc_cs);
1367
1368         switch (telephony_svc_cs) {
1369         case 1:
1370                 netconfig_battery_end_dn();
1371                 break;
1372         case 2:
1373                 netconfig_battery_start_dn();
1374                 break;
1375         default:
1376                 break;
1377         }
1378 }
1379
1380 static void __telephony_rssi_changed_cb(keynode_t * node, void *data)
1381 {
1382         int rssi = 0;
1383
1384         if (node != NULL)
1385                 rssi = vconf_keynode_get_int(node);
1386         else
1387                 netconfig_vconf_get_int(VCONFKEY_TELEPHONY_RSSI, &rssi);
1388
1389         DBG("Telephony rssi [%d]", rssi);
1390
1391         netconfig_battery_update_dn_rssi(rssi);
1392 }
1393
1394 static void _notify_telephony_svc_cs(void)
1395 {
1396         int telephony_svc_cs = 0;
1397
1398         netconfig_vconf_get_int(VCONFKEY_TELEPHONY_SVC_CS, &telephony_svc_cs);
1399         DBG("Telephony svc cs [%d]", telephony_svc_cs);
1400
1401         switch (telephony_svc_cs) {
1402         case 1:
1403                 netconfig_battery_end_dn();
1404                 break;
1405         case 2:
1406                 netconfig_battery_start_dn();
1407                 break;
1408         default:
1409                 break;
1410         }
1411
1412         vconf_notify_key_changed(VCONFKEY_TELEPHONY_SVC_CS, __telephony_svc_cs_changed_cb, NULL);
1413 }
1414
1415 static void _notify_telephony_rssi(void)
1416 {
1417         int rssi = 0;
1418
1419         netconfig_vconf_get_int(VCONFKEY_TELEPHONY_RSSI, &rssi);
1420         DBG("Telephony rssi [%d]", rssi);
1421
1422         netconfig_battery_update_dn_rssi(rssi);
1423
1424         vconf_notify_key_changed(VCONFKEY_TELEPHONY_RSSI, __telephony_rssi_changed_cb, NULL);
1425 }
1426
1427 static void _ignore_telephony_svc_cs(void)
1428 {
1429         vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SVC_CS, __telephony_svc_cs_changed_cb);
1430 }
1431
1432 static void _ignore_telephony_rssi(void)
1433 {
1434         vconf_ignore_key_changed(VCONFKEY_TELEPHONY_RSSI, __telephony_rssi_changed_cb);
1435 }
1436
1437 static supplicant_signal_cb supplicant_cbs[SIG_MAX] = {
1438                 _supplicant_interface_removed,
1439                 _supplicant_properties_changed,
1440                 _supplicant_bss_added,
1441                 _supplicant_scan_done,
1442                 _supplicant_driver_hanged,
1443                 _supplicant_session_overlapped,
1444                 _supplicant_tdls_connected,
1445                 _supplicant_tdls_disconnected,
1446                 _supplicant_tdls_peer_found,
1447                 _supplicant_dpp_auth_success,
1448                 _supplicant_dpp_auth_failed,
1449                 _supplicant_dpp_not_compatible,
1450                 _supplicant_dpp_conf_failed,
1451                 _supplicant_dpp_scan_peer_qr,
1452                 _supplicant_dpp_network_id,
1453                 _supplicant_dpp_conf_sent,
1454                 _supplicant_dpp_conf_received,
1455                 _supplicant_dpp_conf_obj,
1456 };
1457
1458 void register_gdbus_signal(void)
1459 {
1460         GDBusConnection *connection = NULL;
1461         SuppSigArrayIndex sig;
1462         connection = netdbus_get_connection();
1463
1464         if (connection == NULL) {
1465                 ERR("Failed to get GDbus Connection");
1466                 return;
1467         }
1468
1469         /* listening to messages from all objects as no path is specified */
1470         /* see signals from the given interface */
1471         conn_subscription_ids[0] = g_dbus_connection_signal_subscribe(
1472                         connection,
1473                         CONNMAN_SERVICE,
1474                         CONNMAN_TECHNOLOGY_INTERFACE,
1475                         NULL,
1476                         NULL,
1477                         NULL,
1478                         G_DBUS_SIGNAL_FLAGS_NONE,
1479                         _technology_signal_cb,
1480                         NULL,
1481                         NULL);
1482
1483         conn_subscription_ids[1] = g_dbus_connection_signal_subscribe(
1484                         connection,
1485                         CONNMAN_SERVICE,
1486                         CONNMAN_SERVICE_INTERFACE,
1487                         CONNMAN_SIGNAL_PROPERTY_CHANGED,
1488                         NULL,
1489                         NULL,
1490                         G_DBUS_SIGNAL_FLAGS_NONE,
1491                         _service_signal_cb,
1492                         NULL,
1493                         NULL);
1494
1495         conn_subscription_ids[2] = g_dbus_connection_signal_subscribe(
1496                         connection,
1497                         DBUS_SERVICE_DBUS,
1498                         DBUS_INTERFACE_DBUS,
1499                         SIGNAL_NAME_OWNER_CHANGED,
1500                         NULL,
1501                         CONNMAN_SERVICE,
1502                         G_DBUS_SIGNAL_FLAGS_NONE,
1503                         _dbus_name_changed_cb,
1504                         NULL,
1505                         NULL);
1506
1507         conn_subscription_ids[3] = g_dbus_connection_signal_subscribe(
1508                         connection,
1509                         CONNMAN_SERVICE,
1510                         CONNMAN_MANAGER_INTERFACE,
1511                         SIGNAL_SCAN_CHANGED,
1512                         CONNMAN_MANAGER_PATH,
1513                         NULL,
1514                         G_DBUS_SIGNAL_FLAGS_NONE,
1515                         _scan_changed_cb,
1516                         NULL,
1517                         NULL);
1518
1519         INFO("Successfully register connman DBus signal filters");
1520
1521         conn_subscription_ids[4] = g_dbus_connection_signal_subscribe(
1522                         connection,
1523                         SUPPLICANT_SERVICE,
1524                         SUPPLICANT_INTERFACE ".Interface.WPS",
1525                         NULL,
1526                         NULL,
1527                         NULL,
1528                         G_DBUS_SIGNAL_FLAGS_NONE,
1529                         __netconfig_wps_signal_filter_handler,
1530                         NULL,
1531                         NULL);
1532
1533         INFO("Successfully register Supplicant WPS DBus signal filters");
1534
1535         conn_subscription_ids[5] = g_dbus_connection_signal_subscribe(
1536                         connection,
1537                         DBUS_SERVICE_DBUS,
1538                         DBUS_INTERFACE_DBUS,
1539                         SIGNAL_NAME_OWNER_CHANGED,
1540                         NULL,
1541                         CLATD_SERVICE,
1542                         G_DBUS_SIGNAL_FLAGS_NONE,
1543                         _dbus_name_changed_cb,
1544                         NULL,
1545                         NULL);
1546
1547         conn_subscription_ids[6] = g_dbus_connection_signal_subscribe(
1548                         connection,
1549                         DBUS_SERVICE_DBUS,
1550                         DBUS_INTERFACE_DBUS,
1551                         SIGNAL_NAME_OWNER_CHANGED,
1552                         NULL,
1553                         SUPPLICANT_SERVICE,
1554                         G_DBUS_SIGNAL_FLAGS_NONE,
1555                         _dbus_name_changed_cb,
1556                         NULL,
1557                         NULL);
1558
1559         INFO("Successfully register clat DBus signal filters");
1560
1561         for (sig = SIG_INTERFACE_REMOVED; sig < SIG_MAX; sig++) {
1562                 supp_subscription_ids[sig] = g_dbus_connection_signal_subscribe(
1563                                 connection,
1564                                 SUPPLICANT_SERVICE,
1565                                 supplicant_iface_for_sig[sig],
1566                                 supplicant_signals[sig],
1567                                 NULL,
1568                                 NULL,
1569                                 G_DBUS_SIGNAL_FLAGS_NONE,
1570                                 supplicant_cbs[sig],
1571                                 NULL,
1572                                 NULL);
1573         }
1574
1575         INFO("Successfully register Supplicant DBus signal filters");
1576
1577 #if defined TIZEN_DEBUG_ENABLE
1578         dumpservice_subscription_id = g_dbus_connection_signal_subscribe(
1579                         connection,
1580                         NULL,
1581                         DUMP_SERVICE_INTERFACE,
1582                         DUMP_SIGNAL,
1583                         NULL,
1584                         NULL,
1585                         G_DBUS_SIGNAL_FLAGS_NONE,
1586                         __netconfig_dumpservice_handler,
1587                         NULL,
1588                         NULL);
1589
1590         INFO("Successfully registered Dumpservice DBus signal filter");
1591 #endif
1592
1593         _notify_telephony_svc_cs();
1594         _notify_telephony_rssi();
1595
1596         INFO("Successfully register Telephony vconf keys");
1597
1598         /* In case ConnMan precedes this signal register,
1599          * net-config should update the default connected profile.
1600          */
1601         netconfig_update_default();
1602 }
1603
1604 void deregister_gdbus_signal(void)
1605 {
1606         GDBusConnection *connection = NULL;
1607         int signal;
1608         SuppSigArrayIndex sig;
1609         connection = netdbus_get_connection();
1610         if (!connection) {
1611                 ERR("Already de-registered. Nothing to be done");
1612                 return;
1613         }
1614
1615         for (signal = 0; signal < TOTAL_CONN_SIGNALS; signal++) {
1616                 if (conn_subscription_ids[signal]) {
1617                         g_dbus_connection_signal_unsubscribe(connection,
1618                                                 conn_subscription_ids[signal]);
1619                 }
1620         }
1621
1622         for (sig = SIG_INTERFACE_REMOVED; sig < SIG_MAX; sig++) {
1623                 if (supp_subscription_ids[sig]) {
1624                         g_dbus_connection_signal_unsubscribe(connection,
1625                                                 supp_subscription_ids[sig]);
1626                 }
1627         }
1628
1629 #if defined TIZEN_DEBUG_ENABLE
1630         g_dbus_connection_signal_unsubscribe(connection,
1631                         dumpservice_subscription_id);
1632 #endif
1633
1634         _ignore_telephony_svc_cs();
1635         _ignore_telephony_rssi();
1636 }