[net-config] Add support of connman's ServicesChanged signal
[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 <string.h>
22 #include <vconf.h>
23 #include <vconf-keys.h>
24
25 #include "log.h"
26 #include "util.h"
27 #include "netdbus.h"
28 #include "neterror.h"
29 #include "wifi-wps.h"
30 #include "wifi-agent.h"
31 #include "wifi-power.h"
32 #include "wifi-state.h"
33 #include "netsupplicant.h"
34 #include "network-state.h"
35 #include "cellular-state.h"
36 #include "signal-handler.h"
37 #include "wifi-ssid-scan.h"
38 #include "wifi-background-scan.h"
39 #include "wifi-tdls.h"
40
41 #if defined TIZEN_DEBUG_DISABLE
42 #include "wifi-dump.h"
43 #endif
44
45 #define DBUS_SERVICE_DBUS                       "org.freedesktop.DBus"
46 #define DBUS_INTERFACE_DBUS                     "org.freedesktop.DBus"
47 #define SIGNAL_INTERFACE_REMOVED                "InterfaceRemoved"
48 #define SIGNAL_SCAN_DONE                        "ScanDone"
49 #define SIGNAL_BSS_ADDED                        "BSSAdded"
50 #define SIGNAL_PROPERTIES_CHANGED               "PropertiesChanged"
51 #define SIGNAL_PROPERTIES_DRIVER_HANGED         "DriverHanged"
52 #define SIGNAL_PROPERTIES_SESSION_OVERLAPPED    "SessionOverlapped"
53 #define SIGNAL_TDLS_CONNECTED                           "TDLSConnected"
54 #define SIGNAL_TDLS_DISCONNECTED                        "TDLSDisconnected"
55 #define SIGNAL_TDLS_PEER_FOUND                          "TDLSPeerFound"
56 #define CONNMAN_SIGNAL_SERVICES_CHANGED         "ServicesChanged"
57 #define CONNMAN_SIGNAL_PROPERTY_CHANGED         "PropertyChanged"
58 #define CONNMAN_SIGNAL_NAME_CHANGED             "NameOwnerChanged"
59
60 #define MAX_SIG_LEN 64
61 #define TOTAL_CONN_SIGNALS 4
62
63 typedef enum {
64         SIG_INTERFACE_REMOVED = 0,
65         SIG_PROPERTIES_CHANGED,
66         SIG_BSS_ADDED,
67         SIG_SCAN_DONE,
68         SIG_DRIVER_HANGED,
69         SIG_SESSION_OVERLAPPED,
70         SIG_TDLS_CONNECTED,
71         SIG_TDLS_DISCONNECTED,
72         SIG_TDLS_PEER_FOUND,
73         SIG_MAX
74 } SuppSigArrayIndex;
75
76 static int conn_subscription_ids[TOTAL_CONN_SIGNALS] = {0};
77 static const char supplicant_signals[SIG_MAX][MAX_SIG_LEN] = {
78                 SIGNAL_INTERFACE_REMOVED,
79                 SIGNAL_PROPERTIES_CHANGED,
80                 SIGNAL_BSS_ADDED,
81                 SIGNAL_SCAN_DONE,
82                 SIGNAL_PROPERTIES_DRIVER_HANGED,
83                 SIGNAL_PROPERTIES_SESSION_OVERLAPPED,
84                 SIGNAL_TDLS_CONNECTED,
85                 SIGNAL_TDLS_DISCONNECTED,
86                 SIGNAL_TDLS_PEER_FOUND,
87 };
88
89 static int supp_subscription_ids[SIG_MAX] = {0};
90 static int dumpservice_subscription_id = 0;
91
92 typedef void (*supplicant_signal_cb)(GDBusConnection *conn,
93                 const gchar *name, const gchar *path, const gchar *interface,
94                 const gchar *sig, GVariant *param, gpointer user_data);
95 typedef void (*connman_signal_cb)(GDBusConnection *conn,
96                 const gchar *name, const gchar *path, const gchar *interface,
97                 const gchar *sig, GVariant *param, gpointer user_data);
98
99 static void _technology_signal_cb(GDBusConnection *conn,
100                 const gchar *name, const gchar *path, const gchar *interface,
101                 const gchar *sig, GVariant *param, gpointer user_data)
102 {
103         gchar *key = NULL;
104         gboolean value = FALSE;
105         GVariant *var = NULL;
106
107         if (param == NULL)
108                 return;
109
110         if (g_str_has_prefix(path, CONNMAN_WIFI_TECHNOLOGY_PREFIX) == TRUE) {
111                 g_variant_get(param, "(sv)", &key, &var);
112                 if (g_strcmp0(key, "Powered") == 0) {
113                         /* Power state */
114                         value = g_variant_get_boolean(var);
115                         if (value == TRUE) {
116                                 wifi_state_update_power_state(TRUE);
117                         } else {
118                                 wifi_state_update_power_state(FALSE);
119                         }
120                 } else if (g_strcmp0(key, "Connected") == 0) {
121                         /* Connection state */
122                         wifi_state_set_tech_state(NETCONFIG_WIFI_TECH_CONNECTED);
123                 } else if (g_strcmp0(key, "Tethering") == 0) {
124                         /* Tethering state */
125                         wifi_state_set_tech_state(NETCONFIG_WIFI_TECH_TETHERED);
126                 }
127                 if (key)
128                         g_free(key);
129                 if (var)
130                         g_variant_unref(var);
131         }
132 }
133
134 static void _service_signal_cb(GDBusConnection *conn,
135                 const gchar *name, const gchar *path,
136                 const gchar *interface, const gchar *sig, GVariant *param, gpointer user_data)
137 {
138         gchar *sigvalue = NULL;
139         gchar *property;
140         GVariant *variant = NULL, *var;
141         GVariantIter *iter;
142         const gchar *value = NULL;
143
144         if (path == NULL || param == NULL)
145                 goto done;
146
147         g_variant_get(param, "(sv)", &sigvalue, &variant);
148         if (sigvalue == NULL)
149                 goto done;
150
151         if (g_strcmp0(sig, CONNMAN_SIGNAL_PROPERTY_CHANGED) != 0) {
152                 goto done;
153         }
154
155         if (g_strcmp0(sigvalue, "State") == 0) {
156                 g_variant_get(variant, "s", &property);
157
158                 DBG("[%s] %s", property, path);
159                 if (netconfig_is_wifi_profile(path) == TRUE) {
160                         int wifi_state = 0;
161
162                         vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
163                         if (wifi_state == VCONFKEY_WIFI_OFF)
164                                 goto done;
165
166                         if (g_strcmp0(property, "ready") == 0 || g_strcmp0(property, "online") == 0) {
167                                 if (wifi_state >= VCONFKEY_WIFI_CONNECTED)
168                                         goto done;
169
170                                 netconfig_update_default_profile(path);
171
172                                 wifi_state_set_service_state(NETCONFIG_WIFI_CONNECTED);
173
174                         } else if (g_strcmp0(property, "failure") == 0 || g_strcmp0(property, "disconnect") == 0 || g_strcmp0(property, "idle") == 0) {
175                                 if (netconfig_get_default_profile() == NULL ||
176                                                 netconfig_is_wifi_profile(netconfig_get_default_profile())
177                                                 != TRUE) {
178                                         if (g_strcmp0(property, "failure") == 0)
179                                                 wifi_state_set_service_state(NETCONFIG_WIFI_FAILURE);
180                                         else
181                                                 wifi_state_set_service_state(NETCONFIG_WIFI_IDLE);
182                                         goto done;
183                                 }
184
185                                 if (g_strcmp0(path, netconfig_get_default_profile()) != 0)
186                                         goto done;
187
188                                 netconfig_update_default_profile(NULL);
189
190                                 if (g_strcmp0(property, "failure") == 0)
191                                         wifi_state_set_service_state(NETCONFIG_WIFI_FAILURE);
192                                 else
193                                         wifi_state_set_service_state(NETCONFIG_WIFI_IDLE);
194
195                         } else if (g_strcmp0(property, "association") == 0 || g_strcmp0(property, "configuration") == 0) {
196                                 if (netconfig_get_default_profile() == NULL ||
197                                                 netconfig_is_wifi_profile(netconfig_get_default_profile()) != TRUE) {
198                                         if (g_strcmp0(property, "association") == 0)
199                                                 wifi_state_set_service_state(NETCONFIG_WIFI_ASSOCIATION);
200                                         else
201                                                 wifi_state_set_service_state(NETCONFIG_WIFI_CONFIGURATION);
202                                         goto done;
203                                 }
204
205                                 if (g_strcmp0(path, netconfig_get_default_profile()) != 0)
206                                         goto done;
207
208                                 netconfig_update_default_profile(NULL);
209
210                                 if (g_strcmp0(property, "association") == 0)
211                                         wifi_state_set_service_state(NETCONFIG_WIFI_ASSOCIATION);
212                                 else
213                                         wifi_state_set_service_state(NETCONFIG_WIFI_CONFIGURATION);
214
215                         }
216                 } else {
217                         if (g_strcmp0(property, "ready") == 0 || g_strcmp0(property, "online") == 0) {
218                                 if (netconfig_get_default_profile() == NULL) {
219                                         if(!netconfig_is_cellular_profile(path)) {
220                                                 netconfig_update_default_profile(path);
221                                         } else {
222                                                 if (netconfig_is_cellular_internet_profile(path)) {
223                                                         netconfig_update_default_profile(path);
224                                                 }
225                                         }
226                                 }
227
228                                 if (netconfig_is_cellular_profile(path) && netconfig_is_cellular_internet_profile(path))
229                                         cellular_state_set_service_state(NETCONFIG_CELLULAR_ONLINE);
230
231                         } else if (g_strcmp0(property, "failure") == 0 || g_strcmp0(property, "disconnect") == 0 || g_strcmp0(property, "idle") == 0) {
232                                 if (netconfig_get_default_profile() == NULL)
233                                         goto done;
234
235                                 if (netconfig_is_cellular_profile(path) && netconfig_is_cellular_internet_profile(path))
236                                         cellular_state_set_service_state(NETCONFIG_CELLULAR_IDLE);
237
238                                 if (g_strcmp0(path, netconfig_get_default_profile()) != 0)
239                                         goto done;
240
241                                 netconfig_update_default_profile(NULL);
242                         } else if (g_strcmp0(property, "association") == 0 ||   g_strcmp0(property, "configuration") == 0) {
243                                 if (netconfig_get_default_profile() == NULL)
244                                         goto done;
245
246                                 if (netconfig_is_cellular_profile(path) && netconfig_is_cellular_internet_profile(path))
247                                         cellular_state_set_service_state(NETCONFIG_CELLULAR_CONNECTING);
248
249                                 if (g_strcmp0(path, netconfig_get_default_profile()) != 0)
250                                         goto done;
251
252                                 netconfig_update_default_profile(NULL);
253                         }
254                 }
255         } else if (g_strcmp0(sigvalue, "Proxy") == 0) {
256                 if (netconfig_is_wifi_profile(path) != TRUE || g_strcmp0(path, netconfig_get_default_profile()) != 0)
257                         goto done;
258
259                 if (!g_variant_type_equal(variant, G_VARIANT_TYPE_ARRAY))
260                         goto done;
261
262                 g_variant_get(variant, "a{sv}", &iter);
263                 while (g_variant_iter_loop(iter, "{sv}", &property, &var)) {
264                         if (g_strcmp0(property, "Servers") == 0) {
265                                 GVariantIter *iter_sub = NULL;
266
267                                 g_variant_get(var, "as", &iter_sub);
268                                 g_variant_iter_loop(iter_sub, "s", &value);
269                                 g_variant_iter_free(iter_sub);
270
271                                 DBG("Proxy - [%s]", value);
272                                 vconf_set_str(VCONFKEY_NETWORK_PROXY, value);
273
274                                 g_free(property);
275                                 g_variant_unref(var);
276                                 break;
277                         } else if (g_strcmp0(property, "Method") == 0) {
278                                 value = g_variant_get_string(var, NULL);
279                                 DBG("Method - [%s]", value);
280
281                                 if (g_strcmp0(value, "direct") == 0)
282                                         vconf_set_str(VCONFKEY_NETWORK_PROXY, "");
283
284                                 g_free(property);
285                                 g_variant_unref(var);
286                                 break;
287                         }
288                 }
289
290                 g_variant_iter_free(iter);
291         } else if (g_strcmp0(sigvalue, "Error") == 0) {
292                 g_variant_get(variant, "s", &property);
293                 INFO("[%s] Property : %s", sigvalue, property);
294         }
295 done:
296         if (sigvalue)
297                 g_free(sigvalue);
298
299         if (variant)
300                 g_variant_unref(variant);
301
302         return;
303 }
304
305 static void _dbus_name_changed_cb(GDBusConnection *conn,
306                 const gchar *Name, const gchar *path, const gchar *interface,
307                 const gchar *sig, GVariant *param, gpointer user_data)
308 {
309         gchar *name = NULL;
310         gchar *old = NULL;
311         gchar *new = NULL;
312
313         if (param == NULL)
314                 return;
315
316         g_variant_get(param, "(sss)", &name, &old, &new);
317
318         if (g_strcmp0(name, CONNMAN_SERVICE) == 0 && *new == '\0') {
319                 DBG("ConnMan destroyed: name %s, old %s, new %s", name, old, new);
320
321                 connman_register_agent();
322         }
323         if (name)
324                 g_free(name);
325         if (old)
326                 g_free(old);
327         if (new)
328                 g_free(new);
329
330         return;
331 }
332
333 static void _services_changed_cb(GDBusConnection *conn, const gchar *name,
334                 const gchar *path, const gchar *interface, const gchar *sig,
335                 GVariant *param, gpointer user_data)
336 {
337         gchar *property, *value;
338         gchar *service_path;
339         GVariant *variant = NULL;
340         GVariantIter *added = NULL, *removed = NULL, *next = NULL;
341
342         if (path == NULL || param == NULL)
343                 return;
344
345         if (g_strcmp0(sig, CONNMAN_SIGNAL_SERVICES_CHANGED) != 0)
346                 return;
347
348         if (netconfig_get_default_profile() != NULL)
349                 return;
350
351         g_variant_get(param, "(a(oa{sv})ao)", &added, &removed);
352
353         while (g_variant_iter_loop(added, "(oa{sv})", &service_path, &next)) {
354                 gboolean is_wifi_prof, is_cell_prof, is_cell_internet_prof;
355                 is_wifi_prof = netconfig_is_wifi_profile(service_path);
356                 is_cell_prof = netconfig_is_cellular_profile(service_path);
357                 is_cell_internet_prof = netconfig_is_cellular_internet_profile(
358                                 service_path);
359                 if (service_path != NULL) {
360                         while (g_variant_iter_loop(next, "{sv}", &property,
361                                                 &variant)) {
362                                 if (g_strcmp0(property, "State") == 0) {
363                                         g_variant_get(variant, "s", &value);
364                                         DBG("Profile %s State %s", service_path,
365                                                         value);
366                                         if (g_strcmp0(value, "ready") != 0 &&
367                                                         g_strcmp0(value,
368                                                                 "online") != 0) {
369                                                 g_free(property);
370                                                 g_variant_unref(variant);
371                                                 break;
372                                         }
373
374                                         if(!is_cell_prof)
375                                                 netconfig_update_default_profile(
376                                                                 service_path);
377                                         else if (is_cell_internet_prof) {
378                                                 netconfig_update_default_profile(
379                                                                 service_path);
380                                         }
381                                         if (is_wifi_prof)
382                                                 wifi_state_set_service_state(
383                                                         NETCONFIG_WIFI_CONNECTED);
384                                         else if (is_cell_prof &&
385                                                         is_cell_internet_prof)
386                                                 cellular_state_set_service_state(
387                                                         NETCONFIG_CELLULAR_ONLINE);
388                                         g_free(property);
389                                         g_variant_unref(variant);
390                                         break;
391                                 }
392                         }
393                 }
394         }
395         if (next)
396                 g_variant_iter_free(next);
397         if (added)
398                 g_variant_iter_free(added);
399         if (removed)
400                 g_variant_iter_free(removed);
401         return;
402 }
403
404 static void _supplicant_interface_removed(GDBusConnection *conn,
405                 const gchar *name, const gchar *path, const gchar *interface,
406                 const gchar *sig, GVariant *param, gpointer user_data)
407 {
408         DBG("Interface removed handling!");
409         if (netconfig_wifi_is_wps_enabled() == TRUE)
410                 netconfig_wifi_wps_signal_scanaborted();
411
412         return;
413 }
414
415 static void _supplicant_properties_changed(GDBusConnection *conn,
416                 const gchar *name, const gchar *path, const gchar *interface,
417                 const gchar *sig, GVariant *param, gpointer user_data)
418 {
419         DBG("Properties changed handling!");
420         gchar *key;
421         GVariantIter *iter;
422         GVariant *variant;
423         gboolean scanning = FALSE;
424
425         if (param == NULL)
426                 return;
427
428         g_variant_get(param, "(a{sv})", &iter);
429         while (g_variant_iter_loop(iter, "{sv}", &key, &variant)) {
430                 if (g_strcmp0(key, "Scanning") == 0) {
431                         scanning = g_variant_get_boolean(variant);
432                         if (scanning == TRUE)
433                                 netconfig_wifi_set_scanning(TRUE);
434
435                         g_variant_unref(variant);
436                         g_free(key);
437                         break;
438                 }
439         }
440
441         g_variant_iter_free(iter);
442
443         return;
444 }
445
446 static void _supplicant_bss_added(GDBusConnection *conn,
447                 const gchar *name, const gchar *path, const gchar *interface,
448                 const gchar *sig, GVariant *param, gpointer user_data)
449 {
450         DBG("BSS added handling!");
451         if (wifi_ssid_scan_get_state() == TRUE)
452                 wifi_ssid_scan_add_bss(param);
453         else
454                 wifi_state_set_bss_found(TRUE);
455
456         return;
457 }
458
459 static void _supplicant_scan_done(GDBusConnection *conn,
460                 const gchar *name, const gchar *path, const gchar *interface,
461                 const gchar *sig, GVariant *param, gpointer user_data)
462 {
463         DBG("Scan Done handling!");
464         netconfig_wifi_set_scanning(FALSE);
465
466         if (netconfig_wifi_is_wps_enabled() == TRUE) {
467                 netconfig_wifi_wps_signal_scandone();
468                 if (wifi_state_get_technology_state() < NETCONFIG_WIFI_TECH_POWERED)
469                         return;
470         }
471
472         if (netconfig_wifi_get_bgscan_state() != TRUE) {
473                 if (wifi_ssid_scan_get_state() == TRUE)
474                         wifi_ssid_scan_emit_scan_completed();
475                 else
476                         wifi_ssid_scan(NULL);
477         } else {
478                 if (wifi_state_get_technology_state() >=
479                                 NETCONFIG_WIFI_TECH_POWERED)
480                         netconfig_wifi_bgscan_start(FALSE);
481
482                 wifi_start_timer_network_notification();
483         }
484
485         return;
486 }
487
488 static void _supplicant_driver_hanged(GDBusConnection *conn,
489                 const gchar *name, const gchar *path, const gchar *interface,
490                 const gchar *sig, GVariant *param, gpointer user_data)
491 {
492         DBG("Driver Hanged handling!");
493         ERR("Critical. Wi-Fi firmware crashed");
494
495         wifi_power_recover_firmware();
496
497         return;
498 }
499
500 static void _supplicant_session_overlapped(GDBusConnection *conn,
501                 const gchar *name, const gchar *path, const gchar *interface,
502                 const gchar *sig, GVariant *param, gpointer user_data)
503 {
504         DBG("Driver session overlapped handling!");
505         ERR("WPS PBC SESSION OVERLAPPED");
506 #if defined TIZEN_WEARABLE
507         wc_launch_syspopup(WC_POPUP_TYPE_SESSION_OVERLAPPED);
508 #else
509         netconfig_send_message_to_net_popup("WPS Error",
510                                         "wps session overlapped", "popup", NULL);
511 #endif
512 }
513
514 static void _supplicant_tdls_connected(GDBusConnection *conn,
515                 const gchar *name, const gchar *path, const gchar *interface,
516                 const gchar *sig, GVariant *param, gpointer user_data)
517 {
518         ERR("Received TDLS Connected Signal");
519         netconfig_wifi_tlds_connected_event(param);
520
521         return;
522 }
523
524 static void _supplicant_tdls_disconnected(GDBusConnection *conn,
525                 const gchar *name, const gchar *path, const gchar *interface,
526                 const gchar *sig, GVariant *param, gpointer user_data)
527 {
528         ERR("Received TDLS Disconnected Signal");
529         netconfig_wifi_tlds_disconnected_event(param);
530
531         return;
532 }
533
534 static void _supplicant_tdls_peer_found(GDBusConnection *conn,
535                 const gchar *name, const gchar *path, const gchar *interface,
536                 const gchar *sig, GVariant *param, gpointer user_data)
537 {
538         ERR("Received TDLS Peer Found Signal");
539         return;
540 }
541
542 static supplicant_signal_cb supplicant_cbs[SIG_MAX] = {
543                 _supplicant_interface_removed,
544                 _supplicant_properties_changed,
545                 _supplicant_bss_added,
546                 _supplicant_scan_done,
547                 _supplicant_driver_hanged,
548                 _supplicant_session_overlapped,
549                 _supplicant_tdls_connected,
550                 _supplicant_tdls_disconnected,
551                 _supplicant_tdls_peer_found
552 };
553
554 #if defined TIZEN_DEBUG_DISABLE
555 static void __netconfig_dumpservice_handler(GDBusConnection *conn,
556                 const gchar *name, const gchar *path, const gchar *interface,
557                 const gchar *sig, GVariant *param, gpointer user_data)
558 {
559         int mode;
560         gchar *signal_path = NULL;
561
562         if (param == NULL)
563                 return;
564
565         g_variant_get(param, "(io)", &mode, &signal_path);
566         DBG("Path: %s and mode: %d", signal_path, mode);
567         netconfig_dump_log(path);
568         if (signal_path)
569                 g_free(signal_path);
570
571         return;
572 }
573 #endif
574
575 void register_gdbus_signal(void)
576 {
577         GDBusConnection *connection = NULL;
578         const char *interface = NULL;
579         SuppSigArrayIndex sig;
580         connection = netdbus_get_connection();
581
582         if (connection == NULL) {
583                 ERR("Failed to get GDbus Connection");
584                 return;
585         }
586
587         /* listening to messages from all objects as no path is specified */
588         /* see signals from the given interface */
589         conn_subscription_ids[0] = g_dbus_connection_signal_subscribe(
590                         connection,
591                         CONNMAN_SERVICE,
592                         CONNMAN_TECHNOLOGY_INTERFACE,
593                         NULL,
594                         NULL,
595                         NULL,
596                         G_DBUS_SIGNAL_FLAGS_NONE,
597                         _technology_signal_cb,
598                         NULL,
599                         NULL);
600
601         conn_subscription_ids[1] = g_dbus_connection_signal_subscribe(
602                         connection,
603                         CONNMAN_SERVICE,
604                         CONNMAN_SERVICE_INTERFACE,
605                         CONNMAN_SIGNAL_PROPERTY_CHANGED,
606                         NULL,
607                         NULL,
608                         G_DBUS_SIGNAL_FLAGS_NONE,
609                         _service_signal_cb,
610                         NULL,
611                         NULL);
612
613         conn_subscription_ids[2] = g_dbus_connection_signal_subscribe(
614                         connection,
615                         DBUS_SERVICE_DBUS,
616                         DBUS_INTERFACE_DBUS,
617                         CONNMAN_SIGNAL_NAME_CHANGED,
618                         NULL,
619                         CONNMAN_SERVICE,
620                         G_DBUS_SIGNAL_FLAGS_NONE,
621                         _dbus_name_changed_cb,
622                         NULL,
623                         NULL);
624
625         conn_subscription_ids[3] = g_dbus_connection_signal_subscribe(
626                         connection,
627                         CONNMAN_SERVICE,
628                         CONNMAN_MANAGER_INTERFACE,
629                         CONNMAN_SIGNAL_SERVICES_CHANGED,
630                         NULL,
631                         NULL,
632                         G_DBUS_SIGNAL_FLAGS_NONE,
633                         _services_changed_cb,
634                         NULL,
635                         NULL);
636
637         INFO("Successfully register connman DBus signal filters");
638
639         for (sig = SIG_INTERFACE_REMOVED; sig < SIG_MAX; sig++) {
640                 /*
641                  * For SIG_INTERFACE_REMOVED INTERFACE_ADDED
642                  */
643                 interface = (sig == SIG_INTERFACE_REMOVED) ?
644                                 SUPPLICANT_INTERFACE : SUPPLICANT_IFACE_INTERFACE;
645
646                 supp_subscription_ids[sig] = g_dbus_connection_signal_subscribe(
647                                 connection,
648                                 SUPPLICANT_SERVICE,
649                                 interface,
650                                 supplicant_signals[sig],
651                                 NULL,
652                                 NULL,
653                                 G_DBUS_SIGNAL_FLAGS_NONE,
654                                 supplicant_cbs[sig],
655                                 NULL,
656                                 NULL);
657         }
658
659         INFO("Successfully register Supplicant DBus signal filters");
660
661 #if defined TIZEN_DEBUG_DISABLE
662         dumpservice_subscription_id = g_dbus_connection_signal_subscribe(
663                         connection,
664                         /*
665                          * Sender => For testing purpose made NULL
666                          *WPA_SUPPLICANT,
667                          */
668                         NULL,
669                         DUMP_SERVICE_INTERFACE,
670                         DUMP_SIGNAL,
671                         NULL,
672                         NULL,
673                         G_DBUS_SIGNAL_FLAGS_NONE,
674                         __netconfig_dumpservice_handler,
675                         NULL,
676                         NULL);
677
678         INFO("Successfully register Dumpservice DBus signal filter");
679 #endif
680         /* In case ConnMan precedes this signal register,
681          * net-config should update the default connected profile.
682          */
683         netconfig_update_default();
684 }
685
686 void deregister_gdbus_signal(void)
687 {
688         GDBusConnection *connection = NULL;
689         int signal;
690         SuppSigArrayIndex sig;
691         connection = netdbus_get_connection();
692         if (!connection) {
693                 ERR("Already de-registered. Nothing to be done");
694                 return;
695         }
696
697         for (signal = 0; signal < TOTAL_CONN_SIGNALS; signal++) {
698                 if (conn_subscription_ids[signal]) {
699                         g_dbus_connection_signal_unsubscribe(connection,
700                                                 conn_subscription_ids[signal]);
701                 }
702         }
703
704         for (sig = SIG_INTERFACE_REMOVED; sig < SIG_MAX; sig++) {
705                 if (supp_subscription_ids[sig]) {
706                         g_dbus_connection_signal_unsubscribe(connection,
707                                                 supp_subscription_ids[sig]);
708                 }
709         }
710
711         g_dbus_connection_signal_unsubscribe(connection,
712                         dumpservice_subscription_id);
713 }