2 * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include "mesh-util.h"
19 #include "mesh-gdbus.h"
20 #include "mesh-request.h"
24 static GDBusProxy *_gproxy_connman = NULL;
25 static GDBusProxy *_gproxy_connman_mesh = NULL;
26 static GDBusProxy *_gproxy_connman_technology = NULL;
28 static int _meshd_close_gdbus_call(mesh_service *service);
30 static int __channel_to_frequency(int channel, enum nl80211_band band)
36 case NL80211_BAND_2GHZ:
39 else if (channel < 14)
40 return 2407 + channel * 5;
42 case NL80211_BAND_5GHZ:
43 if (channel >= 182 && channel <= 196)
44 return 4000 + channel * 5;
46 return 5000 + channel * 5;
56 static int __frequency_to_channel(int freq)
61 return (freq - 2407) / 5;
62 else if (freq >= 4910 && freq <= 4980)
63 return (freq - 4000) / 5;
64 else if (freq <= 45000)
65 return (freq - 5000) / 5;
66 else if (freq >= 58320 && freq <= 64800)
67 return (freq - 56160) / 2160;
72 static GDBusProxy *_proxy_get_connman(mesh_service *service)
74 GDBusProxy *proxy = NULL;
75 meshd_check_null_ret_error("service", service, NULL);
77 if (NULL == _gproxy_connman) {
78 proxy = g_dbus_proxy_new_sync(service->connection,
79 G_DBUS_PROXY_FLAGS_NONE, NULL,
82 CONNMAN_INTERFACE_MANAGER,
85 proxy = _gproxy_connman;
90 static GDBusProxy *_proxy_get_connman_mesh(mesh_service *service)
92 GDBusProxy *proxy = NULL;
93 meshd_check_null_ret_error("service", service, NULL);
95 if (NULL == _gproxy_connman_mesh) {
96 proxy = g_dbus_proxy_new_sync(service->connection,
97 G_DBUS_PROXY_FLAGS_NONE, NULL,
99 CONNMAN_OBJECT_PATH_MESH,
100 CONNMAN_INTERFACE_MESH,
103 proxy = _gproxy_connman_mesh;
108 static GDBusProxy *_proxy_get_connman_technology(mesh_service *service)
110 GDBusProxy *proxy = NULL;
111 meshd_check_null_ret_error("service", service, NULL);
113 if (NULL == _gproxy_connman_technology) {
114 proxy = g_dbus_proxy_new_sync(service->connection,
115 G_DBUS_PROXY_FLAGS_NONE, NULL,
117 CONNMAN_OBJECT_PATH_TECH_MESH,
118 CONNMAN_INTERFACE_TECH,
121 proxy = _gproxy_connman_technology;
126 static void _dbus_name_owner_notify(GObject *object, GParamSpec *pspec,
129 GDBusProxy *proxy = G_DBUS_PROXY(object);
130 gchar *name_owner = g_dbus_proxy_get_name_owner(proxy);
131 mesh_service *service = (mesh_service*)user_data;
135 if (NULL == name_owner) {
136 MESH_LOGE("name_owner is not exists !");
137 _meshd_close_gdbus_call(service);
143 static int _meshd_create_gdbus_call(mesh_service *service)
146 GError *error = NULL;
149 return MESHD_ERROR_INVALID_PARAMETER;
151 if (NULL != service->connection)
152 return MESHD_ERROR_ALREADY_REGISTERED;
154 service->connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
155 if (service->connection == NULL) {
157 MESH_LOGE("Failed to connect to the D-BUS daemon [%s]", error->message);
160 return MESHD_ERROR_IO_ERROR;
163 id = g_signal_connect(service->connection, "notify::g-name-owner",
164 G_CALLBACK(_dbus_name_owner_notify), service);
166 MESH_LOGE("g_signal_connect() Fail");
167 g_object_unref(service->connection);
168 service->connection = NULL;
169 return MESHD_ERROR_IO_ERROR;
172 return MESHD_ERROR_NONE;
175 static int _meshd_close_gdbus_call(mesh_service *service)
177 /* CHECK: is connection ref count required? */
178 g_object_unref(service->connection);
179 service->connection = NULL;
181 return MESHD_ERROR_NONE;
184 static void _meshd_signal_handler(GDBusConnection *connection,
185 const gchar *sender_name, const gchar *object_path, const gchar *interface_name,
186 const gchar *signal_name, GVariant *parameters, gpointer user_data)
188 mesh_service *service = (mesh_service*)user_data;
190 meshd_check_null_ret("user_data", user_data);
191 //meshd_check_null_ret("event_handler", service->event_handler);
193 NOTUSED(sender_name);
194 NOTUSED(object_path);
195 NOTUSED(interface_name);
196 NOTUSED(signal_name);
201 MESH_LOGD("signal received = %s", signal_name);
202 if (0 == g_strcmp0(signal_name, "ScanDone")) {
203 /* TODO: Handle event */
204 mesh_notify_scan_done();
208 static void _meshd_subscribe_event(mesh_service *service)
212 id = g_dbus_connection_signal_subscribe(
213 (GDBusConnection *)service->connection,
214 CONNMAN_SERVER_NAME, CONNMAN_INTERFACE_MANAGER,
215 "ScanDone", "/", NULL,
216 G_DBUS_CALL_FLAGS_NONE, _meshd_signal_handler, service, NULL);
218 MESH_LOGE("g_dbus_connection_signal_subscribe(ScanDone) Fail(%d)", errno);
221 service->dbus_sub_ids = g_list_append(service->dbus_sub_ids, GUINT_TO_POINTER(id));
222 MESH_LOGD("[Signal subscribe] : ScanDone (%d)", id);
224 /* End of subscription */
227 int meshd_dbus_start(mesh_service *service)
231 rv = _meshd_create_gdbus_call(service);
232 if (MESHD_ERROR_NONE != rv)
235 service->ca = g_cancellable_new();
237 /* Create all required proxies here */
238 _gproxy_connman = _proxy_get_connman(service);
239 meshd_check_null_ret_error("_gproxy_connman", _gproxy_connman,
240 MESHD_ERROR_IO_ERROR);
241 g_dbus_proxy_set_default_timeout(
242 G_DBUS_PROXY(_gproxy_connman), MESH_DBUS_PROXY_TIMEOUT);
244 _gproxy_connman_mesh = _proxy_get_connman_mesh(service);
245 meshd_check_null_ret_error("_gproxy_connman_mesh", _gproxy_connman_mesh,
246 MESHD_ERROR_IO_ERROR);
247 g_dbus_proxy_set_default_timeout(
248 G_DBUS_PROXY(_gproxy_connman_mesh), MESH_DBUS_PROXY_TIMEOUT);
250 _gproxy_connman_technology = _proxy_get_connman_technology(service);
251 meshd_check_null_ret_error("_gproxy_connman_technology", _gproxy_connman_technology,
252 MESHD_ERROR_IO_ERROR);
253 g_dbus_proxy_set_default_timeout(
254 G_DBUS_PROXY(_gproxy_connman_technology), MESH_DBUS_PROXY_TIMEOUT);
256 /* Subscribe events */
257 _meshd_subscribe_event(service);
259 return MESHD_ERROR_NONE;
262 int meshd_dbus_stop(mesh_service *service)
267 return MESHD_ERROR_INVALID_PARAMETER;
269 /* Unref all proxies here */
270 if (_gproxy_connman) {
271 g_object_unref(_gproxy_connman);
272 _gproxy_connman = NULL;
274 if (_gproxy_connman_mesh) {
275 g_object_unref(_gproxy_connman_mesh);
276 _gproxy_connman_mesh = NULL;
278 if (_gproxy_connman_technology) {
279 g_object_unref(_gproxy_connman_technology);
280 _gproxy_connman_technology = NULL;
283 g_cancellable_cancel(service->ca);
284 g_object_unref(service->ca);
287 rv = _meshd_close_gdbus_call(service);
291 int mesh_ipc_create_mesh_interface(mesh_service *service)
293 GVariant *variant = NULL;
294 GError *error = NULL;
295 GVariant *var_dict = NULL;
297 mesh_interface_s *info = NULL;
299 meshd_check_null_ret_error("service", service, MESHD_ERROR_INVALID_PARAMETER);
300 meshd_check_null_ret_error("connection", service->connection,
301 MESHD_ERROR_INVALID_PARAMETER);
302 meshd_check_null_ret_error("_gproxy_connman_technology",
303 _gproxy_connman_technology, MESHD_ERROR_IO_ERROR);
305 info = service->interface_info;
307 g_variant_dict_init(&dict, NULL);
308 g_variant_dict_insert(&dict, "Ifname", "s", info->mesh_interface);
309 g_variant_dict_insert(&dict, "ParentIfname", "s", info->base_interface);
310 g_variant_dict_insert(&dict, "BridgeIfname", "s", info->bridge_interface);
311 var_dict = g_variant_dict_end(&dict);
313 variant = g_dbus_proxy_call_sync(_gproxy_connman_technology, "MeshCommands",
314 g_variant_new("(sv)", "MeshInterfaceAdd", var_dict),
315 G_DBUS_CALL_FLAGS_NONE,
318 MESH_LOGD("Successfully requested. [MeshInterfaceAdd]");
320 MESH_LOGE("Failed DBus call [%s]", error->message);
322 return MESHD_ERROR_IO_ERROR;
325 return MESHD_ERROR_NONE;
328 int mesh_ipc_remove_mesh_interface(mesh_service *service)
330 GVariant *variant = NULL;
331 GError *error = NULL;
332 GVariant *var_dict = NULL;
334 mesh_interface_s *info = NULL;
336 meshd_check_null_ret_error("service", service, MESHD_ERROR_INVALID_PARAMETER);
337 meshd_check_null_ret_error("connection", service->connection,
338 MESHD_ERROR_INVALID_PARAMETER);
339 meshd_check_null_ret_error("_gproxy_connman_technology",
340 _gproxy_connman_technology, MESHD_ERROR_IO_ERROR);
342 info = service->interface_info;
344 g_variant_dict_init(&dict, NULL);
345 g_variant_dict_insert(&dict, "Ifname", "s", info->mesh_interface);
346 var_dict = g_variant_dict_end(&dict);
348 variant = g_dbus_proxy_call_sync(_gproxy_connman_technology, "MeshCommands",
349 g_variant_new("(sv)", "MeshInterfaceRemove", var_dict),
350 G_DBUS_CALL_FLAGS_NONE,
353 MESH_LOGD("Successfully requested. [MeshInterfaceRemove]");
355 MESH_LOGE("Failed DBus call [%s]", error->message);
357 return MESHD_ERROR_IO_ERROR;
360 return MESHD_ERROR_NONE;
363 int mesh_ipc_mesh_scan(mesh_service *service)
365 meshd_check_null_ret_error("service", service, MESHD_ERROR_INVALID_PARAMETER);
366 meshd_check_null_ret_error("connection", service->connection,
367 MESHD_ERROR_INVALID_PARAMETER);
368 meshd_check_null_ret_error("_gproxy_connman_technology",
369 _gproxy_connman_technology, MESHD_ERROR_IO_ERROR);
371 g_dbus_proxy_call(_gproxy_connman_technology, "Scan",
373 G_DBUS_CALL_FLAGS_NONE,
374 -1, NULL, NULL, NULL);
376 MESH_LOGD("Successfully requested. [Scan]");
378 return MESHD_ERROR_NONE;
381 int mesh_ipc_mesh_specific_scan(mesh_service *service, gchar *mesh_id,
384 GVariant *variant = NULL;
385 GError *error = NULL;
386 GVariant *var_dict = NULL;
389 enum nl80211_band band = (channel <= 14) ? NL80211_BAND_2GHZ : NL80211_BAND_5GHZ;
390 gushort freq = __channel_to_frequency(channel, band);
392 meshd_check_null_ret_error("service", service, MESHD_ERROR_INVALID_PARAMETER);
393 meshd_check_null_ret_error("connection", service->connection,
394 MESHD_ERROR_INVALID_PARAMETER);
395 meshd_check_null_ret_error("_gproxy_connman_technology",
396 _gproxy_connman_technology, MESHD_ERROR_IO_ERROR);
398 g_variant_dict_init(&dict, NULL);
399 g_variant_dict_insert(&dict, "Name", "s", mesh_id);
400 g_variant_dict_insert(&dict, "Frequency", "q", freq);
401 var_dict = g_variant_dict_end(&dict);
403 variant = g_dbus_proxy_call_sync(_gproxy_connman_technology, "MeshCommands",
404 g_variant_new("(sv)", "MeshSpecificScan", var_dict),
405 G_DBUS_CALL_FLAGS_NONE,
408 MESH_LOGD("Successfully requested. [MeshSpecificScan]");
410 MESH_LOGE("Failed DBus call [%s]", error->message);
412 return MESHD_ERROR_IO_ERROR;
415 return MESHD_ERROR_NONE;
418 int mesh_ipc_mesh_cancel_scan(mesh_service *service)
420 GVariant *variant = NULL;
421 GError *error = NULL;
422 GVariant *var_dict = NULL;
425 meshd_check_null_ret_error("service", service, MESHD_ERROR_INVALID_PARAMETER);
426 meshd_check_null_ret_error("connection", service->connection,
427 MESHD_ERROR_INVALID_PARAMETER);
428 meshd_check_null_ret_error("_gproxy_connman_technology",
429 _gproxy_connman_technology, MESHD_ERROR_IO_ERROR);
431 g_variant_dict_init(&dict, NULL);
432 var_dict = g_variant_dict_end(&dict);
434 variant = g_dbus_proxy_call_sync(_gproxy_connman_technology, "MeshCommands",
435 g_variant_new("(sv)", "AbortScan", var_dict),
436 G_DBUS_CALL_FLAGS_NONE,
439 MESH_LOGD("Successfully requested. [AbortScan]");
441 MESH_LOGE("Failed DBus call [%s]", error->message);
443 return MESHD_ERROR_IO_ERROR;
446 return MESHD_ERROR_NONE;
449 static void _on_scan_result_destroy(gpointer data)
451 mesh_scan_result_s *scan_item = (mesh_scan_result_s *)data;
454 g_free(scan_item->mesh_id);
455 g_free(scan_item->bssid);
456 g_free(scan_item->object_path);
460 static void _get_joined_network(mesh_service *service, GVariant *variant)
462 GVariantIter *peer = NULL;
463 GVariantIter *property = NULL;
465 GVariant *val = NULL;
468 gchar *var_string = NULL;
469 const gchar* obj_path = NULL;
470 const gchar* buf = NULL;
472 g_variant_get(variant, "(a(oa{sv}))", &peer);
473 while ((child = g_variant_iter_next_value(peer))) {
474 mesh_network_info_s *joined_info = NULL;
475 gboolean valid_state = TRUE;
477 MESH_LOGD(" Child : [%s]", g_variant_get_type_string(child));
478 var_string = g_variant_print(child, FALSE);
479 MESH_LOGD(" %s", var_string);
482 g_variant_get(child, "(oa{sv})", &obj_path, &property);
483 MESH_LOGD(" Object: [%s]", obj_path);
484 if (NULL == obj_path) {
485 MESH_LOGE("Null object");
489 /* Create an information structure for joined network */
490 joined_info = g_try_new0(mesh_network_info_s, 1);
491 if (NULL == joined_info) {
492 MESH_LOGE("Failed to allocate !");
496 while (g_variant_iter_loop(property, "{sv}", &key, &val)) {
497 if (strcasecmp(key, "Name") == 0) {
498 buf = g_variant_get_string(val, &len);
499 joined_info->mesh_id = g_strdup(buf);
501 else if (strcasecmp(key, "Address") == 0) {
502 buf = g_variant_get_string(val, &len);
503 joined_info->bssid = g_strdup(buf);
505 else if (strcasecmp(key, "State") == 0) {
506 buf = g_variant_get_string(val, &len);
507 MESH_LOGD(" State : %s", buf);
509 /* Skip ignorable state */
510 if (g_strcmp0(buf, "idle") == 0
511 || g_strcmp0(buf, "disconnect") == 0
512 || g_strcmp0(buf, "failure") == 0) {
517 else if (strcasecmp(key, "Frequency") == 0) {
518 joined_info->channel = __frequency_to_channel(g_variant_get_uint16(val));
522 /* Skip ignorable state */
523 if (FALSE == valid_state) {
524 g_free(joined_info->mesh_id);
525 g_free(joined_info->bssid);
529 MESH_LOGD(" Mesh ID : %s", joined_info->mesh_id);
530 MESH_LOGD(" BSSID : %s", joined_info->bssid);
531 MESH_LOGD(" Channel : %d", joined_info->channel);
532 service->joined_network = joined_info;
534 g_variant_iter_free(property);
536 /* If found, stop loop iteration */
539 g_variant_iter_free(peer);
542 static void _get_mesh_peers(mesh_service *service, GVariant *variant)
544 GVariantIter *peer = NULL;
545 GVariantIter *property = NULL;
547 GVariant *val = NULL;
550 gchar *var_string = NULL;
551 const gchar* obj_path = NULL;
553 g_variant_get(variant, "(a(oa{sv}))", &peer);
554 //while (g_variant_iter_next(peer, "oa{sv}", &tmp, &property)) {
555 while ((child = g_variant_iter_next_value(peer))) {
556 mesh_scan_result_s *scan_info = NULL;
558 scan_info = g_try_new0(mesh_scan_result_s, 1);
559 if (NULL == scan_info) {
560 MESH_LOGE("Failed to allocate !");
564 MESH_LOGD(" Child : [%s]", g_variant_get_type_string(child));
565 var_string = g_variant_print(child, FALSE);
566 MESH_LOGD(" %s", var_string);
569 g_variant_get(child, "(oa{sv})", &obj_path, &property);
570 if (NULL == obj_path) {
571 MESH_LOGE("Null object");
575 MESH_LOGD(" Obj path : [%s]", obj_path);
576 scan_info->object_path = g_strdup(obj_path);
578 while (g_variant_iter_loop(property, "{sv}", &key, &val)) {
579 if (strcasecmp(key, "Name") == 0) {
580 const char *buf = g_variant_get_string(val, &len);
581 scan_info->mesh_id = g_strdup(buf);
582 MESH_LOGD(" Mesh ID : %s", scan_info->mesh_id);
584 else if (strcasecmp(key, "Address") == 0) {
585 const char *buf = g_variant_get_string(val, &len);
586 scan_info->bssid = g_strdup(buf);
587 MESH_LOGD(" BSSID : %s", scan_info->bssid);
589 else if (strcasecmp(key, "Frequency") == 0) {
590 scan_info->channel = __frequency_to_channel(g_variant_get_uint16(val));
591 MESH_LOGD(" Channel : %d", scan_info->channel);
593 else if (strcasecmp(key, "Strength") == 0) {
594 scan_info->rssi = (gint)g_variant_get_byte(val);
595 MESH_LOGD(" RSSI : %d", scan_info->rssi);
599 service->scanned_mesh_network =
600 g_list_prepend(service->scanned_mesh_network, scan_info);
602 g_variant_iter_free(property);
604 g_variant_iter_free(peer);
607 int mesh_ipc_get_mesh_peers(mesh_service *service)
609 GVariant *variant = NULL;
610 GError *error = NULL;
612 meshd_check_null_ret_error("service", service, MESHD_ERROR_INVALID_PARAMETER);
613 meshd_check_null_ret_error("connection", service->connection,
614 MESHD_ERROR_INVALID_PARAMETER);
615 meshd_check_null_ret_error("_gproxy_connman",
616 _gproxy_connman, MESHD_ERROR_IO_ERROR);
618 variant = g_dbus_proxy_call_sync(_gproxy_connman, "GetMeshPeers",
620 G_DBUS_CALL_FLAGS_NONE,
623 MESH_LOGD("Successfully requested. [GetMeshPeers]");
625 if (service->scanned_mesh_network) {
626 g_list_free_full(service->scanned_mesh_network, _on_scan_result_destroy);
627 service->scanned_mesh_network = NULL;
630 _get_mesh_peers(service, variant);
632 /* List item is saved with reversed order for efficiency. */
633 service->scanned_mesh_network =
634 g_list_reverse(service->scanned_mesh_network);
636 MESH_LOGE("Failed DBus call [%s]", error->message);
638 return MESHD_ERROR_IO_ERROR;
641 return MESHD_ERROR_NONE;
644 int mesh_ipc_get_joined_mesh_network(mesh_service *service)
646 GVariant *variant = NULL;
647 GError *error = NULL;
649 meshd_check_null_ret_error("service", service, MESHD_ERROR_INVALID_PARAMETER);
650 meshd_check_null_ret_error("connection", service->connection,
651 MESHD_ERROR_INVALID_PARAMETER);
652 meshd_check_null_ret_error("_gproxy_connman",
653 _gproxy_connman, MESHD_ERROR_IO_ERROR);
655 variant = g_dbus_proxy_call_sync(_gproxy_connman, "GetMeshPeers",
657 G_DBUS_CALL_FLAGS_NONE,
660 MESH_LOGD("Successfully requested. [GetMeshPeers]");
662 if (service->joined_network) {
663 g_free(service->joined_network->mesh_id);
664 g_free(service->joined_network->bssid);
665 g_free(service->joined_network);
666 service->joined_network = NULL;
669 _get_joined_network(service, variant);
671 MESH_LOGE("Failed DBus call [%s]", error->message);
673 return MESHD_ERROR_IO_ERROR;
676 return MESHD_ERROR_NONE;
679 int mesh_ipc_create_network(mesh_service *service, gchar *mesh_id, gint channel,
682 GVariant *variant = NULL;
683 GError *error = NULL;
684 GVariant *var_dict = NULL;
685 GVariantBuilder builder;
686 const gchar* secu = (security == 0) ? "none" : "SAE";
688 enum nl80211_band band = (channel <= 14) ? NL80211_BAND_2GHZ : NL80211_BAND_5GHZ;
689 gushort freq = __channel_to_frequency(channel, band);
691 meshd_check_null_ret_error("service", service, MESHD_ERROR_INVALID_PARAMETER);
692 meshd_check_null_ret_error("connection", service->connection,
693 MESHD_ERROR_INVALID_PARAMETER);
694 meshd_check_null_ret_error("_gproxy_connman_technology",
695 _gproxy_connman_technology, MESHD_ERROR_IO_ERROR);
697 g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}"));
698 g_variant_builder_open(&builder, G_VARIANT_TYPE("a{sv}"));
700 g_variant_builder_open(&builder, G_VARIANT_TYPE("{sv}"));
701 g_variant_builder_add(&builder, "s", "Name");
702 g_variant_builder_add(&builder, "v", g_variant_new_string(mesh_id));
703 g_variant_builder_close(&builder); /* {sv} */
705 g_variant_builder_open(&builder, G_VARIANT_TYPE("{sv}"));
706 g_variant_builder_add(&builder, "s", "Frequency");
707 g_variant_builder_add(&builder, "v", g_variant_new_uint16(freq));
708 g_variant_builder_close(&builder); /* {sv} */
710 g_variant_builder_open(&builder, G_VARIANT_TYPE("{sv}"));
711 g_variant_builder_add(&builder, "s", "Security");
712 g_variant_builder_add(&builder, "v", g_variant_new_string(secu));
713 g_variant_builder_close(&builder); /* {sv} */
715 g_variant_builder_close(&builder); /* a{sv} */
717 var_dict = g_variant_builder_end(&builder);
719 variant = g_dbus_proxy_call_sync(_gproxy_connman_technology, "MeshCommands",
720 g_variant_new("(sv)", "MeshCreateNetwork", var_dict),
721 G_DBUS_CALL_FLAGS_NONE,
724 MESH_LOGD("Successfully requested. [MeshCreateNetwork]");
726 MESH_LOGE("Failed DBus call [%s]", error->message);
728 return MESHD_ERROR_IO_ERROR;
731 return MESHD_ERROR_NONE;
734 int mesh_ipc_connect_network(mesh_service *service, mesh_scan_result_s *info)
736 GVariant *variant = NULL;
737 GError *error = NULL;
739 meshd_check_null_ret_error("service", service, MESHD_ERROR_INVALID_PARAMETER);
740 meshd_check_null_ret_error("info", info, MESHD_ERROR_INVALID_PARAMETER);
742 variant = g_dbus_connection_call_sync(service->connection,
745 CONNMAN_INTERFACE_MESH,
748 G_DBUS_CALL_FLAGS_NONE,
751 MESH_LOGD("Successfully requested. [Connect]");
753 LOGE("Failed DBus call [%s]", error->message);
755 return MESHD_ERROR_IO_ERROR;
758 return MESHD_ERROR_NONE;
761 int mesh_ipc_disconnect_network(mesh_service *service, mesh_scan_result_s *info)
763 GVariant *variant = NULL;
764 GError *error = NULL;
766 meshd_check_null_ret_error("service", service, MESHD_ERROR_INVALID_PARAMETER);
767 meshd_check_null_ret_error("info", info, MESHD_ERROR_INVALID_PARAMETER);
769 variant = g_dbus_connection_call_sync(service->connection,
772 CONNMAN_INTERFACE_MESH,
775 G_DBUS_CALL_FLAGS_NONE,
778 MESH_LOGD("Successfully requested. [Disconnect]");
780 LOGE("Failed DBus call [%s]", error->message);
782 return MESHD_ERROR_IO_ERROR;
785 return MESHD_ERROR_NONE;
788 int mesh_ipc_remove_network(mesh_service *service, mesh_scan_result_s *info)
790 GVariant *variant = NULL;
791 GError *error = NULL;
793 meshd_check_null_ret_error("service", service, MESHD_ERROR_INVALID_PARAMETER);
794 meshd_check_null_ret_error("info", info, MESHD_ERROR_INVALID_PARAMETER);
796 variant = g_dbus_connection_call_sync(service->connection,
799 CONNMAN_INTERFACE_MESH,
802 G_DBUS_CALL_FLAGS_NONE,
805 MESH_LOGD("Successfully requested. [Remove]");
807 LOGE("Failed DBus call [%s]", error->message);
809 return MESHD_ERROR_IO_ERROR;
812 return MESHD_ERROR_NONE;