2 * Network Configuration Module
4 * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved.
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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
24 #include <wifi-manager.h>
27 #include "wmesh-log.h"
28 #include "wmesh-util.h"
29 #include "wmesh-gdbus.h"
30 #include "wmesh-service.h"
31 #include "wmesh-peer-monitor.h"
32 #include "wmesh-service-interface.h"
33 #include "wmesh-generated-code.h"
35 #include "wmesh-request.h"
36 #include "wmesh-interface.h"
38 static NetWmesh *meshd_dbus_object;
39 static Manager *meshd_activator_dbus_object;
41 /* global list to care resource handle for each client */
42 static GList *meshd_dbus_client_list;
43 static GMutex meshd_dbus_client_list_mutex;
45 typedef struct _meshd_dbus_client_s {
47 } meshd_dbus_client_s;
49 #define CASE_TO_STR(x) case x: return #x;
52 static const char* wifi_error_to_string(wifi_manager_error_e err)
55 /* CHECK: List all enum values here */
56 CASE_TO_STR(WIFI_MANAGER_ERROR_NONE)
57 CASE_TO_STR(WIFI_MANAGER_ERROR_INVALID_PARAMETER)
58 CASE_TO_STR(WIFI_MANAGER_ERROR_OUT_OF_MEMORY)
59 CASE_TO_STR(WIFI_MANAGER_ERROR_INVALID_OPERATION)
60 CASE_TO_STR(WIFI_MANAGER_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED)
61 CASE_TO_STR(WIFI_MANAGER_ERROR_OPERATION_FAILED)
62 CASE_TO_STR(WIFI_MANAGER_ERROR_NO_CONNECTION)
63 CASE_TO_STR(WIFI_MANAGER_ERROR_NOW_IN_PROGRESS)
64 CASE_TO_STR(WIFI_MANAGER_ERROR_ALREADY_EXISTS)
65 CASE_TO_STR(WIFI_MANAGER_ERROR_OPERATION_ABORTED)
66 CASE_TO_STR(WIFI_MANAGER_ERROR_DHCP_FAILED)
67 CASE_TO_STR(WIFI_MANAGER_ERROR_INVALID_KEY)
68 CASE_TO_STR(WIFI_MANAGER_ERROR_NO_REPLY)
69 CASE_TO_STR(WIFI_MANAGER_ERROR_SECURITY_RESTRICTED)
70 CASE_TO_STR(WIFI_MANAGER_ERROR_ALREADY_INITIALIZED)
71 CASE_TO_STR(WIFI_MANAGER_ERROR_PERMISSION_DENIED)
72 CASE_TO_STR(WIFI_MANAGER_ERROR_NOT_SUPPORTED)
74 return "WIFI_MANAGER_ERROR_UNKNOWN";
79 NetWmesh* wmeshd_dbus_get_object()
81 return meshd_dbus_object;
85 int64_t wmeshd_dbus_generate_signal_number()
92 static int _wmeshd_dbus_client_list_cleanup(GList *client_list)
94 meshd_dbus_client_s *client;
96 wmeshd_check_null_ret_error("client_list", client_list, FALSE);
98 client = client_list->data;
100 free(client->bus_name);
101 client->bus_name = NULL;
103 g_list_free(client_list);
105 return WMESHD_ERROR_NONE;
108 static int _wmeshd_dbus_client_list_compare_bus_name(const void *a, const void *b)
110 const meshd_dbus_client_s *client = a;
112 return g_strcmp0(client->bus_name, b);
116 static inline GList* _wmeshd_dbus_client_list_find_client(const gchar *owner)
118 return g_list_find_custom(meshd_dbus_client_list, owner,
119 _wmeshd_dbus_client_list_compare_bus_name);
122 static void _wmeshd_dbus_name_owner_changed_cb(GDBusConnection *conn,
123 const gchar *sender_name,
124 const gchar *object_path,
125 const gchar *interface_name,
126 const gchar *signal_name,
127 GVariant *parameters,
131 GList *client = NULL;
132 gchar *name, *old_owner, *new_owner;
135 NOTUSED(sender_name);
136 NOTUSED(object_path);
137 NOTUSED(interface_name);
138 NOTUSED(signal_name);
141 g_variant_get(parameters, "(&s&s&s)", &name, &old_owner, &new_owner);
143 if (0 == strlen(new_owner)) {
144 g_mutex_lock(&meshd_dbus_client_list_mutex);
145 client = _wmeshd_dbus_client_list_find_client(old_owner);
146 if (client) { /* found bus name in our bus list */
147 /* LCOV_EXCL_START */
148 WMESH_LOGD("bus(%s) stopped", old_owner);
149 meshd_dbus_client_list = g_list_remove_link(meshd_dbus_client_list, client);
152 g_mutex_unlock(&meshd_dbus_client_list_mutex);
155 /* LCOV_EXCL_START */
156 ret = _wmeshd_dbus_client_list_cleanup(client);
157 if (WMESHD_ERROR_NONE != ret)
158 WMESH_LOGE("_wmeshd_dbus_client_list_cleanup() Fail(%d)", ret);
164 static int _wmeshd_dbus_subscribe_name_owner_changed(GDBusConnection *conn)
168 id = g_dbus_connection_signal_subscribe(conn,
169 "org.freedesktop.DBus", /* bus name */
170 "org.freedesktop.DBus", /* interface */
171 "NameOwnerChanged", /* member */
172 "/org/freedesktop/DBus", /* path */
174 G_DBUS_SIGNAL_FLAGS_NONE,
175 _wmeshd_dbus_name_owner_changed_cb,
179 /* LCOV_EXCL_START */
180 WMESH_LOGE("g_dbus_connection_signal_subscribe() Fail");
181 return WMESHD_ERROR_IO_ERROR;
185 return WMESHD_ERROR_NONE;
188 static gboolean _wmeshd_dbus_handle_enable(Manager *object,
189 GDBusMethodInvocation *invocation,
192 int ret = WMESHD_ERROR_NONE;
193 wmesh_service *service = (wmesh_service *)user_data;
194 wmesh_interface_s *info = service->interface_info;
196 wifi_manager_h wifi_handle = NULL;
197 bool wifi_activated = false;
199 /* Initialize Wi-Fi driver */
200 ret = wifi_manager_initialize(&wifi_handle);
201 if (WIFI_MANAGER_ERROR_NONE != ret) {
202 /* LCOV_EXCL_START */
203 WMESH_LOGE("Failed to get wifi manager handle ! [%s(%X)]",
204 wifi_error_to_string(ret), ret);
208 wifi_manager_is_activated(wifi_handle, &wifi_activated);
209 if (false == wifi_activated) {
210 /* LCOV_EXCL_START */
211 ret = wifi_manager_activate(wifi_handle, NULL, NULL);
212 if (WIFI_MANAGER_ERROR_NONE != ret)
213 WMESH_LOGE("Failed to activate wifi ! [%s(%X)]",
214 wifi_error_to_string(ret), ret);
217 wifi_manager_deinitialize(wifi_handle);
219 if (service->mesh_activated) {
220 /* LCOV_EXCL_START */
221 /* Already activated */
222 manager_complete_enable(object, invocation, WMESHD_ERROR_NONE);
227 /* Do API response first */
228 manager_complete_enable(object, invocation, ret);
229 service->mesh_activated = TRUE;
231 wmeshd_check_null_ret_error("info", info, FALSE);
233 /* Register event handler first */
234 ret = wmesh_request_register_event_handler(service);
235 if (WMESHD_ERROR_IN_PROGRESS == ret) {
236 /* LCOV_EXCL_START */
237 WMESH_LOGE("Currently set netlink event handler !! [%d]", ret);
238 ret = WMESHD_ERROR_NONE;
240 } else if (WMESHD_ERROR_NONE != ret) {
241 WMESH_LOGE("Failed to register mesh event handler !! [%d]", ret); //LCOV_EXCL_LINE
244 ret = wmesh_interface_initialize(service->interface_info);
245 if (WMESHD_ERROR_NONE != ret) {
246 /* LCOV_EXCL_START */
247 WMESH_LOGE("Failed to wmesh_interface_initialize [%d]", ret);
253 net_wmesh_emit_mesh_enabled(wmeshd_dbus_get_object(), ret);
258 static gboolean _wmeshd_dbus_handle_disable(Manager *object,
259 GDBusMethodInvocation *invocation,
262 int ret = WMESHD_ERROR_NONE;
263 wmesh_service *service = (wmesh_service *)user_data;
264 wmesh_interface_s *info = service->interface_info;
266 wmeshd_check_null_ret_error("info", info, FALSE);
268 /* Make response first */
269 manager_complete_disable(object, invocation, ret);
271 ret = wmesh_request_unregister_event_handler();
272 if (WMESHD_ERROR_NONE != ret)
273 WMESH_LOGE("Failed to unregister mesh event handler !! [%d]", ret); //LCOV_EXCL_LINE
275 /* Terminate daemon */
276 wmeshd_service_exit(service);
281 static gboolean _wmeshd_dbus_handle_scan(NetWmesh *object,
282 GDBusMethodInvocation *invocation,
285 int ret = WMESHD_ERROR_NONE;
286 wmesh_service *service = (wmesh_service *)user_data;
287 wmesh_interface_s *info = service->interface_info;
289 wmeshd_check_null_ret_error("info", info, FALSE);
291 ret = wmesh_request_scan(service);
292 if (WMESHD_ERROR_NONE != ret)
293 WMESH_LOGE("Failed to wmesh_request_scan !"); //LCOV_EXCL_LINE
295 net_wmesh_complete_scan(object, invocation, ret);
300 static gboolean _wmeshd_dbus_handle_specific_scan(NetWmesh *object,
301 GDBusMethodInvocation *invocation,
306 int ret = WMESHD_ERROR_NONE;
307 wmesh_service *service = (wmesh_service *)user_data;
308 wmesh_interface_s *info = service->interface_info;
310 wmeshd_check_null_ret_error("info", info, FALSE);
312 ret = wmesh_request_specific_scan(service, mesh_id, channel);
313 if (WMESHD_ERROR_NONE != ret)
314 WMESH_LOGE("Failed to wmesh_request_specific_scan !"); //LCOV_EXCL_LINE
316 net_wmesh_complete_specific_scan(object, invocation, ret);
321 static gboolean _wmeshd_dbus_handle_cancel_scan(NetWmesh *object,
322 GDBusMethodInvocation *invocation,
325 int ret = WMESHD_ERROR_NONE;
326 wmesh_service *service = (wmesh_service *)user_data;
328 ret = wmesh_request_cancel_scan(service);
329 if (WMESHD_ERROR_NONE != ret)
330 WMESH_LOGE("Failed to wmesh_request_cancel_scan"); //LCOV_EXCL_LINE
332 net_wmesh_complete_cancel_scan(object, invocation, ret);
337 /* LCOV_EXCL_START */
338 static void _on_scan_result_destroy(gpointer data)
340 wmesh_scan_result_s *scan_item = (wmesh_scan_result_s *)data;
343 g_free(scan_item->mesh_id);
344 g_free(scan_item->bssid);
345 g_free(scan_item->object_path);
350 static void _on_peer_info_destroy(gpointer data)
352 wmesh_peer_info_s *peer = (wmesh_peer_info_s *)data;
354 g_free(peer->address);
358 static void _on_station_list_destroy(gpointer data)
360 wmesh_station_info_s *info = (wmesh_station_info_s*)data;
368 static void _on_mpath_list_destroy(gpointer data)
370 wmesh_mpath_info_s *info = (wmesh_mpath_info_s*)data;
373 g_free(info->dest_addr);
374 g_free(info->next_hop);
375 g_free(info->interface);
381 static gboolean _wmeshd_dbus_handle_get_found_mesh_networks(NetWmesh *object,
382 GDBusMethodInvocation *invocation,
385 int ret = WMESHD_ERROR_NONE;
386 wmesh_service *service = (wmesh_service *)user_data;
388 GVariantBuilder builder;
391 wmesh_scan_result_s *scan_item = NULL;
393 WMESH_LOGD("Request to get scanned mesh network list");
395 ret = wmesh_request_get_networks(service);
396 if (WMESHD_ERROR_NONE != ret)
397 WMESH_LOGE("Failed to wmesh_request_get_networks"); //LCOV_EXCL_LINE
399 g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
401 /* scanned_mesh_network would be filled above request */
402 iter = service->scanned_mesh_network;
403 while (iter != NULL) {
404 /* LCOV_EXCL_START */
405 scan_item = (wmesh_scan_result_s*)iter->data;
407 g_variant_builder_open(&builder, G_VARIANT_TYPE_VARDICT);
408 g_variant_builder_add(&builder, "{sv}", "mesh_id",
409 g_variant_new_string(scan_item->mesh_id));
410 g_variant_builder_add(&builder, "{sv}", "bssid",
411 g_variant_new_string(scan_item->bssid));
412 g_variant_builder_add(&builder, "{sv}", "rssi",
413 g_variant_new_int32(scan_item->rssi));
414 g_variant_builder_add(&builder, "{sv}", "channel",
415 g_variant_new_uint32(scan_item->channel));
416 g_variant_builder_add(&builder, "{sv}", "data_rate",
417 g_variant_new_int32(scan_item->data_rate));
418 g_variant_builder_add(&builder, "{sv}", "security",
419 g_variant_new_uint32((int)scan_item->security));
420 g_variant_builder_add(&builder, "{sv}", "state",
421 g_variant_new_uint32(scan_item->state));
422 g_variant_builder_close(&builder);
424 iter = g_list_next(iter);
428 networks = g_variant_builder_end(&builder);
430 net_wmesh_complete_get_found_mesh_networks(object, invocation, networks, ret);
435 static gboolean _wmeshd_dbus_handle_enable_mesh(NetWmesh *object,
436 GDBusMethodInvocation *invocation,
439 int ret = WMESHD_ERROR_NONE;
440 wmesh_service *service = (wmesh_service *)user_data;
442 /* It handles creating virtual network and bridge */
443 ret = wmesh_request_enable_network(service);
444 if (WMESHD_ERROR_NONE != ret)
445 WMESH_LOGE("Failed to wmesh_request_enable_network [%d]", ret); //LCOV_EXCL_LINE
447 wmesh_start_monitor_service(service);
449 net_wmesh_complete_enable_mesh(object, invocation, ret);
454 static gboolean _wmeshd_dbus_handle_disable_mesh(NetWmesh *object,
455 GDBusMethodInvocation *invocation,
458 int ret = WMESHD_ERROR_NONE;
459 wmesh_service *service = (wmesh_service *)user_data;
460 wmesh_interface_s *info = service->interface_info;
462 wmeshd_check_null_ret_error("info", info, FALSE);
464 if (FALSE == service->mesh_activated) {
465 /* LCOV_EXCL_START */
466 WMESH_LOGD("Mesh network is not activated yet");
467 ret = WMESHD_ERROR_OPERATION_FAILED;
468 net_wmesh_complete_disable_mesh(object, invocation, ret);
473 ret = wmesh_request_disable_network(service);
474 if (WMESHD_ERROR_NONE != ret)
475 WMESH_LOGE("Failed to disable mesh network !"); //LCOV_EXCL_LINE
477 /* Stop Mesh Node Monitoring Service */
478 wmesh_stop_monitor_service(service);
480 net_wmesh_complete_disable_mesh(object, invocation, ret);
485 static gboolean _wmeshd_dbus_handle_is_mesh_enabled(NetWmesh *object,
486 GDBusMethodInvocation *invocation,
489 int ret = WMESHD_ERROR_NONE;
490 gboolean state = TRUE;
491 wmesh_service *service = (wmesh_service *)user_data;
493 /* It handles creating virtual network and bridge */
494 ret = wmesh_interface_check(service->interface_info->mesh_interface);
495 if (WMESHD_ERROR_NONE != ret) {
496 /* LCOV_EXCL_START */
497 WMESH_LOGE("Mesh Interface doesn't exists");
502 net_wmesh_complete_is_mesh_enabled(object, invocation, state);
507 static gboolean _wmeshd_dbus_handle_is_joined(NetWmesh *object,
508 GDBusMethodInvocation *invocation,
511 int ret = WMESHD_ERROR_NONE;
512 gboolean state = FALSE;
513 wmesh_service *service = (wmesh_service *)user_data;
515 ret = wmesh_request_get_joined_network(service);
516 if (WMESHD_ERROR_NONE == ret) {
517 /* LCOV_EXCL_START */
518 if (service->joined_network)
523 net_wmesh_complete_is_joined(object, invocation, state, ret);
528 static gboolean _wmeshd_dbus_handle_get_joined_mesh_network(NetWmesh *object,
529 GDBusMethodInvocation *invocation,
532 int ret = WMESHD_ERROR_NONE;
533 wmesh_service *service = (wmesh_service *)user_data;
534 wmesh_network_info_s *joined = NULL;
536 ret = wmesh_request_get_joined_network(service);
537 if (WMESHD_ERROR_NONE == ret) {
538 joined = service->joined_network;
540 /* LCOV_EXCL_START */
541 net_wmesh_complete_get_joined_mesh_network(object, invocation,
542 joined->mesh_id, joined->bssid,
543 joined->channel, (int)joined->security,
544 joined->state, joined->ipv4_type, joined->ipv4_address,
545 joined->ipv4_netmask, ret);
548 net_wmesh_complete_get_joined_mesh_network(object, invocation,
549 "", "", 0, 0, 0, 0, "", "", WMESHD_ERROR_NO_DATA); /* LCOV_EXCL_LINE */
552 net_wmesh_complete_get_joined_mesh_network(object, invocation,
553 "", "", 0, 0, 0, 0, "", "", ret); /* LCOV_EXCL_LINE */
559 static gboolean _wmeshd_dbus_handle_get_connected_peers(NetWmesh *object,
560 GDBusMethodInvocation *invocation,
563 int ret = WMESHD_ERROR_NONE;
564 wmesh_service *service = (wmesh_service *)user_data;
566 GVariantBuilder builder;
569 wmesh_peer_info_s *peer = NULL;
571 WMESH_LOGD("Request to get connected peers");
573 ret = wmesh_request_get_connected_peers(service);
574 if (WMESHD_ERROR_NONE != ret)
575 WMESH_LOGE("Failed to wmesh_request_get_connected_peers"); //LCOV_EXCL_LINE
576 g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
578 iter = service->connected_mesh_peers;
579 while (iter != NULL) {
580 /* LCOV_EXCL_START */
581 peer = (wmesh_peer_info_s*)iter->data;
583 g_variant_builder_open(&builder, G_VARIANT_TYPE_VARDICT);
584 g_variant_builder_add(&builder, "{sv}", "Address",
585 g_variant_new_string(peer->address));
586 g_variant_builder_close(&builder);
588 iter = g_list_next(iter);
592 peer_list = g_variant_builder_end(&builder);
594 net_wmesh_complete_get_connected_peers(object, invocation, peer_list, ret);
599 static gboolean _wmeshd_dbus_handle_set_gate(NetWmesh *object,
600 GDBusMethodInvocation *invocation, gint16 gate_announce, guint hwmp_root_mode,
601 gboolean stp, gpointer user_data)
603 int ret = WMESHD_ERROR_NONE;
604 wmesh_service *service = (wmesh_service *)user_data;
605 wmesh_interface_s *info = service->interface_info;
607 WMESH_LOGD("gate_announce = %d", gate_announce);
608 WMESH_LOGD("HWMP_Root_Mode = %d", hwmp_root_mode);
609 WMESH_LOGD("STP = %d", stp);
611 info->gate_announce = gate_announce;
612 info->hwmp_root_mode = hwmp_root_mode;
615 /* Set STP and gate_announce for connmand */
616 ret = wmesh_gdbus_set_mesh_gate(service);
617 if (WMESHD_ERROR_NONE != ret)
618 WMESH_LOGE("Failed to wmesh_gdbus_set_mesh_gate [%d]", ret); //LCOV_EXCL_LINE
620 /* Set STP and gate_announce right now */
621 ret = wmesh_request_set_mesh_gate(info->bridge_interface,
622 info->mesh_interface, info->external_interface);
623 if (WMESHD_ERROR_NONE != ret)
624 WMESH_LOGE("Failed to wmesh_gdbus_set_mesh_gate [%d]", ret); //LCOV_EXCL_LINE
627 net_wmesh_complete_set_gate(object, invocation, ret);
632 static gboolean _wmeshd_dbus_handle_unset_gate(NetWmesh *object,
633 GDBusMethodInvocation *invocation,
636 int ret = WMESHD_ERROR_NONE;
637 wmesh_service *service = (wmesh_service *)user_data;
638 wmesh_interface_s *info = service->interface_info;
640 info->gate_announce = 0;
641 info->hwmp_root_mode = 0;
644 /* Set STP and gate_announce for connmand */
645 ret = wmesh_gdbus_set_mesh_gate(service);
646 if (WMESHD_ERROR_NONE != ret)
647 WMESH_LOGE("Failed to wmesh_gdbus_set_mesh_gate [%d]", ret); //LCOV_EXCL_LINE
649 /* Unset STP and Gate Annouce right now */
650 ret = wmesh_request_unset_mesh_gate(info->bridge_interface,
651 info->mesh_interface, info->external_interface);
652 if (WMESHD_ERROR_NONE != ret)
653 WMESH_LOGE("Failed to wmesh_request_unset_mesh_gate [%d]", ret); //LCOV_EXCL_LINE
655 net_wmesh_complete_unset_gate(object, invocation, ret);
660 static gboolean _wmeshd_dbus_handle_set_softap(NetWmesh *object,
661 GDBusMethodInvocation *invocation,
662 gchar *ssid, gchar *passphrase,
663 gchar *mode, gint channel, gint visibility, gint max_sta,
664 gint security, gpointer user_data)
666 int ret = WMESHD_ERROR_NONE;
667 wmesh_service *service = (wmesh_service *)user_data;
668 wmesh_interface_s *info = service->interface_info;
670 WMESH_LOGD("SSID : %s", ssid);
671 WMESH_LOGD("mode : %s", mode);
672 WMESH_LOGD("channel : %d", channel);
673 WMESH_LOGD("visibility: %d", visibility);
674 WMESH_LOGD("max_sta : %d", max_sta);
675 WMESH_LOGD("security : %d", security);
677 /* Save softAP information */
678 ret = wmesh_request_set_softap_config(info->softap_interface,
679 ssid, mode, channel, visibility, max_sta,
680 security, passphrase);
681 if (WMESHD_ERROR_NONE != ret)
682 WMESH_LOGE("Failed to wmesh_request_set_softap_config [%d]", ret); //LCOV_EXCL_LINE
684 net_wmesh_complete_set_softap(object, invocation, ret);
689 static gboolean _wmeshd_dbus_handle_get_softap(NetWmesh *object,
690 GDBusMethodInvocation *invocation, gpointer user_data)
692 int ret = WMESHD_ERROR_NONE;
693 wmesh_service *service = (wmesh_service *)user_data;
694 char *interface, *ssid, *mode, *passphrase;
695 int channel, visibility, max_sta, security;
696 (void) service; // unused
698 /* Get softAP information */
699 ret = wmesh_request_get_softap_config(&interface, &ssid, &mode, &channel,
700 &visibility, &max_sta, &security, &passphrase);
701 if (WMESHD_ERROR_NONE != ret) {
702 /* LCOV_EXCL_START */
703 WMESH_LOGE("Failed to wmesh_request_get_softap_config [%d]", ret);
704 net_wmesh_complete_get_softap(object, invocation, "", "", 0, 0, 0, 0,
710 WMESH_LOGD("SSID : %s", ssid);
711 WMESH_LOGD("mode : %s", mode);
712 WMESH_LOGD("channel : %d", channel);
713 WMESH_LOGD("visibility: %d", visibility);
714 WMESH_LOGD("max_sta : %d", max_sta);
715 WMESH_LOGD("security : %d", security);
716 WMESH_LOGD("Passphrase : %s", passphrase ? passphrase : "NULL");
719 net_wmesh_complete_get_softap(object, invocation, ssid, mode, channel,
720 visibility, max_sta, security, passphrase, ret); /* LCOV_EXCL_LINE */
722 net_wmesh_complete_get_softap(object, invocation, ssid, mode, channel,
723 visibility, max_sta, security, "", ret); /* LCOV_EXCL_LINE */
728 static gboolean _wmeshd_dbus_handle_enable_softap(NetWmesh *object,
729 GDBusMethodInvocation *invocation, gpointer user_data)
731 int ret = WMESHD_ERROR_NONE;
732 wmesh_service *service = (wmesh_service *)user_data;
733 wmesh_interface_s *info = service->interface_info;
735 /* Check softAP interface and execute it */
736 ret = wmesh_request_enable_softap(info->bridge_interface, info->softap_interface);
737 if (WMESHD_ERROR_NONE != ret)
738 WMESH_LOGE("Failed to wmesh_request_enable_softap [%d]", ret); //LCOV_EXCL_LINE
740 net_wmesh_complete_enable_softap(object, invocation, ret);
745 static gboolean _wmeshd_dbus_handle_disable_softap(NetWmesh *object,
746 GDBusMethodInvocation *invocation, gpointer user_data)
748 int ret = WMESHD_ERROR_NONE;
749 wmesh_service *service = (wmesh_service *)user_data;
750 wmesh_interface_s *info = service->interface_info;
753 ret = wmesh_request_disable_softap(info->bridge_interface, info->softap_interface);
754 if (WMESHD_ERROR_NONE != ret)
755 WMESH_LOGE("Failed to wmesh_request_disable_softap [%d]", ret); //LCOV_EXCL_LINE
757 net_wmesh_complete_disable_softap(object, invocation, ret);
762 static gboolean _wmeshd_dbus_handle_is_softap_enabled(NetWmesh *object,
763 GDBusMethodInvocation *invocation, gpointer user_data)
768 /* Check SoftAP status */
769 status = wmesh_request_check_softap_status();
770 WMESH_LOGD("SoftAP is %s", status ? "enabled" : "disabled");
772 net_wmesh_complete_is_softap_enabled(object, invocation, status);
777 static gboolean _wmeshd_dbus_handle_create_mesh_network(NetWmesh *object,
778 GDBusMethodInvocation *invocation,
779 gchar *mesh_id, gint channel, gint security,
782 int ret = WMESHD_ERROR_NONE;
783 wmesh_service *service = (wmesh_service *)user_data;
784 wmeshd_security_type_e sec = (1 == security) ? WMESHD_SECURITY_SAE : WMESHD_SECURITY_NONE;
786 ret = wmesh_request_create_mesh_network(service, mesh_id, channel, sec);
788 net_wmesh_complete_create_mesh_network(object, invocation, ret);
793 static gboolean _wmeshd_dbus_handle_connect_mesh_network(NetWmesh *object,
794 GDBusMethodInvocation *invocation,
795 gchar *mesh_id, gint channel, gint security, gchar *passphrase,
798 int ret = WMESHD_ERROR_NONE;
799 wmesh_service *service = (wmesh_service *)user_data;
800 wmeshd_security_type_e sec = (1 == security) ? WMESHD_SECURITY_SAE : WMESHD_SECURITY_NONE;
802 ret = wmesh_request_connect_mesh_network(service, mesh_id, channel, sec, passphrase);
804 net_wmesh_complete_connect_mesh_network(object, invocation, ret);
808 static gboolean _wmeshd_dbus_handle_disconnect_mesh_network(NetWmesh *object,
809 GDBusMethodInvocation *invocation,
810 gchar *mesh_id, gint channel, gint security,
813 int ret = WMESHD_ERROR_NONE;
814 wmesh_service *service = (wmesh_service *)user_data;
815 wmeshd_security_type_e sec = (1 == security) ? WMESHD_SECURITY_SAE : WMESHD_SECURITY_NONE;
817 ret = wmesh_request_disconnect_mesh_network(service, mesh_id, channel, sec);
819 net_wmesh_complete_disconnect_mesh_network(object, invocation, ret);
824 static gboolean _wmeshd_dbus_handle_forget_mesh_network(NetWmesh *object,
825 GDBusMethodInvocation *invocation,
826 gchar *mesh_id, gint channel, gint security,
829 int ret = WMESHD_ERROR_NONE;
830 wmesh_service *service = (wmesh_service *)user_data;
831 wmeshd_security_type_e sec = (1 == security) ? WMESHD_SECURITY_SAE : WMESHD_SECURITY_NONE;
833 ret = wmesh_request_remove_mesh_network(service, mesh_id, channel, sec);
835 net_wmesh_complete_forget_mesh_network(object, invocation, ret);
840 static gboolean _wmeshd_dbus_handle_set_interfaces(NetWmesh *object,
841 GDBusMethodInvocation *invocation,
842 gchar *mesh, gchar *gate, gchar *softap,
845 int ret = WMESHD_ERROR_NONE;
846 wmesh_service *service = (wmesh_service *)user_data;
847 wmesh_interface_s *info = service->interface_info;
849 g_free(info->mesh_interface);
850 info->mesh_interface = g_strdup(mesh);
852 g_free(info->external_interface);
853 info->external_interface = g_strdup(gate);
855 g_free(info->softap_interface);
856 info->softap_interface = g_strdup(softap);
858 WMESH_LOGD("Interface configuration for mesh network :");
859 WMESH_LOGD(" Base : [%s]", info->base_interface);
860 WMESH_LOGD(" Mesh : [%s]", info->mesh_interface);
861 WMESH_LOGD(" Bridge : [%s]", info->bridge_interface);
862 WMESH_LOGD(" SoftAP : [%s]", info->softap_interface);
863 WMESH_LOGD(" External: [%s]", info->external_interface);
865 net_wmesh_complete_set_interfaces(object, invocation, ret);
870 static gboolean _wmeshd_dbus_handle_get_station_info(NetWmesh *object,
871 GDBusMethodInvocation *invocation, gint station_type,
874 int ret = WMESHD_ERROR_NONE;
876 GVariantBuilder builder;
880 wmesh_service *service = (wmesh_service *)user_data;
881 wmesh_interface_s *info = service->interface_info;
883 if (station_type == WMESHD_STATION_TYPE_MESH_POINT) {
884 /* LCOV_EXCL_START */
885 /* Clear mesh station list */
886 g_list_free_full(service->station_list, _on_station_list_destroy);
887 service->station_list = NULL;
889 ret = wmesh_request_get_station_info(
890 info->mesh_interface, &service->station_list);
891 } else if (station_type == WMESHD_STATION_TYPE_SOFTAP) {
892 /* Clear softAP station list */
893 g_list_free_full(service->softap_station_list,
894 _on_station_list_destroy);
895 service->softap_station_list = NULL;
897 ret = wmesh_request_get_station_info(
898 info->softap_interface,
899 &service->softap_station_list);
901 WMESH_LOGE("Invalid station type");
903 g_dbus_method_invocation_return_error(invocation,
904 G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Invalid station type");
910 if (WMESHD_ERROR_NONE != ret) {
911 /* LCOV_EXCL_START */
912 WMESH_LOGE("Failed to wmesh_request_get_station_info");
914 g_dbus_method_invocation_return_error(invocation,
915 G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Request Failed");
919 * sh-3.2# iw mesh0 station dump
920 * Station 7c:dd:90:62:37:cf (on mesh0)
921 * inactive time: 1685 ms
930 * signal avg: -63 dBm
931 * tx bitrate: 54.0 MBit/s
932 * rx bitrate: 5.5 MBit/s
936 * mesh local PS mode: ACTIVE
937 * mesh peer PS mode: ACTIVE
938 * mesh non-peer PS mode: ACTIVE
947 * beacon interval:1000
948 * short slot time:yes
949 * connected time: 256 seconds
952 /* LCOV_EXCL_START */
953 /* Get station information and make variant data */
954 g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
956 if (station_type == WMESHD_STATION_TYPE_MESH_POINT)
957 iter = service->station_list;
959 iter = service->softap_station_list;
961 while (iter != NULL) {
962 wmesh_station_info_s *item = (wmesh_station_info_s*)iter->data;
964 g_variant_builder_open(&builder, G_VARIANT_TYPE_VARDICT);
965 g_variant_builder_add(&builder, "{sv}", "bssid",
966 g_variant_new_string(item->bssid));
967 g_variant_builder_add(&builder, "{sv}", "inactive_time",
968 g_variant_new_uint32(item->inactive_time));
969 g_variant_builder_add(&builder, "{sv}", "rx_bytes",
970 g_variant_new_uint64(item->rx_bytes));
971 g_variant_builder_add(&builder, "{sv}", "rx_packets",
972 g_variant_new_uint32(item->rx_packets));
973 g_variant_builder_add(&builder, "{sv}", "tx_bytes",
974 g_variant_new_uint64(item->tx_bytes));
975 g_variant_builder_add(&builder, "{sv}", "tx_packets",
976 g_variant_new_uint32(item->tx_packets));
977 g_variant_builder_add(&builder, "{sv}", "tx_retries",
978 g_variant_new_uint32(item->tx_retries));
979 g_variant_builder_add(&builder, "{sv}", "tx_failed",
980 g_variant_new_uint32(item->tx_failed));
981 g_variant_builder_add(&builder, "{sv}", "beacon_loss",
982 g_variant_new_uint32(item->beacon_loss));
983 g_variant_builder_add(&builder, "{sv}", "beacon_rx",
984 g_variant_new_uint64(item->beacon_rx));
985 g_variant_builder_add(&builder, "{sv}", "rx_drop_misc",
986 g_variant_new_uint64(item->rx_drop_misc));
987 g_variant_builder_add(&builder, "{sv}", "signal",
988 g_variant_new_int32(item->rssi));
989 g_variant_builder_add(&builder, "{sv}", "signal_avg",
990 g_variant_new_int32(item->rssi_avg));
991 g_variant_builder_add(&builder, "{sv}", "tx_bitrate",
992 g_variant_new_uint32(item->tx_bitrate)); /* 10 times */
993 g_variant_builder_add(&builder, "{sv}", "rx_bitrate",
994 g_variant_new_uint32(item->rx_bitrate)); /* 10 times */
995 if (station_type == WMESHD_STATION_TYPE_MESH_POINT) {
996 g_variant_builder_add(&builder, "{sv}", "mesh_llid",
997 g_variant_new_uint16(item->llid));
998 g_variant_builder_add(&builder, "{sv}", "mesh_plid",
999 g_variant_new_uint16(item->plid));
1000 g_variant_builder_add(&builder, "{sv}", "mesh_plink",
1001 g_variant_new_byte(item->mesh_plink)); /* 0 : DISCON, 1 : ESTAB */
1002 g_variant_builder_add(&builder, "{sv}", "local_ps_mode",
1003 g_variant_new_uint32(item->local_ps_mode)); /* 0 : INACTIVE, 1 : ACTIVE */
1004 g_variant_builder_add(&builder, "{sv}", "peer_ps_mode",
1005 g_variant_new_uint32(item->peer_ps_mode)); /* 0 : INACTIVE, 1 : ACTIVE */
1006 g_variant_builder_add(&builder, "{sv}", "non_peer_ps_mode",
1007 g_variant_new_uint32(item->non_peer_ps_mode)); /* 0 : INACTIVE, 1 : ACTIVE */
1009 g_variant_builder_add(&builder, "{sv}", "authorized",
1010 g_variant_new_boolean(item->authorized));
1011 g_variant_builder_add(&builder, "{sv}", "authenticated",
1012 g_variant_new_boolean(item->authenticated));
1013 g_variant_builder_add(&builder, "{sv}", "associated",
1014 g_variant_new_boolean(item->associated));
1015 g_variant_builder_add(&builder, "{sv}", "preamble",
1016 g_variant_new_boolean(item->preamble));
1017 g_variant_builder_add(&builder, "{sv}", "WMM_WME",
1018 g_variant_new_boolean(item->wme));
1019 g_variant_builder_add(&builder, "{sv}", "MFP",
1020 g_variant_new_boolean(item->mfp));
1021 g_variant_builder_add(&builder, "{sv}", "TDLS_peer",
1022 g_variant_new_boolean(item->tdls_peer));
1023 g_variant_builder_add(&builder, "{sv}", "DTIM_period",
1024 g_variant_new_byte(item->dtim_period));
1025 g_variant_builder_add(&builder, "{sv}", "beacon_interval",
1026 g_variant_new_uint16(item->beacon_interval));
1027 g_variant_builder_add(&builder, "{sv}", "short_slot_time",
1028 g_variant_new_boolean(item->short_slot_time));
1029 g_variant_builder_add(&builder, "{sv}", "connected_time",
1030 g_variant_new_uint32(item->connected_time));
1031 g_variant_builder_close(&builder);
1033 iter = g_list_next(iter);
1036 station = g_variant_builder_end(&builder);
1037 net_wmesh_complete_get_station_info(object, invocation, station, ret);
1039 g_object_unref(station);
1041 /* LCOV_EXCL_STOP */
1046 static gboolean _wmeshd_dbus_handle_get_mpath_info(NetWmesh *object,
1047 GDBusMethodInvocation *invocation,
1050 int ret = WMESHD_ERROR_NONE;
1051 GVariantBuilder builder;
1052 GVariant* mpath_data;
1055 wmesh_service *service = (wmesh_service *)user_data;
1056 wmesh_interface_s *info = service->interface_info;
1058 /* Clear mesh path list */
1059 g_list_free_full(service->mpath_list, _on_mpath_list_destroy);
1060 service->mpath_list = NULL;
1062 ret = wmesh_request_get_mpath_info(
1063 info->mesh_interface, &service->mpath_list);
1064 if (WMESHD_ERROR_NONE != ret) {
1065 /* LCOV_EXCL_START */
1066 WMESH_LOGE("Failed to wmesh_request_get_mpath_info");
1068 g_dbus_method_invocation_return_error(invocation,
1069 G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Request Failed");
1070 /* LCOV_EXCL_STOP */
1073 * Example) sh-3.2# iw mesh0 mpath dump
1074 * DEST ADDR NEXT HOP IFACE SN METRIC QLEN EXPTIME DTIM DRET FLAGS
1075 * 7c:dd:90:62:37:cf 7c:dd:90:62:37:cf mesh0 221 152 0 10 100 0 0x5
1078 /* LCOV_EXCL_START */
1079 /* Get mesh path information and make variant data */
1080 g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
1082 iter = service->mpath_list;
1083 while (iter != NULL) {
1084 wmesh_mpath_info_s *item = (wmesh_mpath_info_s*)iter->data;
1086 g_variant_builder_open(&builder, G_VARIANT_TYPE_VARDICT);
1087 g_variant_builder_add(&builder, "{sv}", "DEST_ADDR",
1088 g_variant_new_string(item->dest_addr));
1089 g_variant_builder_add(&builder, "{sv}", "NEXT_HOP",
1090 g_variant_new_string(item->next_hop));
1091 g_variant_builder_add(&builder, "{sv}", "IFACE",
1092 g_variant_new_string(item->interface));
1093 g_variant_builder_add(&builder, "{sv}", "SN",
1094 g_variant_new_uint32(item->sn));
1095 g_variant_builder_add(&builder, "{sv}", "METRIC",
1096 g_variant_new_uint32(item->metric));
1097 g_variant_builder_add(&builder, "{sv}", "QLEN",
1098 g_variant_new_uint32(item->qlen));
1099 g_variant_builder_add(&builder, "{sv}", "EXPTIME",
1100 g_variant_new_uint32(item->exptime));
1101 g_variant_builder_add(&builder, "{sv}", "DTIM",
1102 g_variant_new_uint32(item->discovery_timeout));
1103 g_variant_builder_add(&builder, "{sv}", "DRET",
1104 g_variant_new_byte(item->discovery_retries));
1105 g_variant_builder_add(&builder, "{sv}", "FLAGS",
1106 g_variant_new_byte(item->flags));
1107 g_variant_builder_close(&builder);
1109 iter = g_list_next(iter);
1112 mpath_data = g_variant_builder_end(&builder);
1113 net_wmesh_complete_get_mpath_info(object, invocation, mpath_data, ret);
1115 g_object_unref(mpath_data);
1116 /* LCOV_EXCL_STOP */
1122 static gboolean _wmeshd_dbus_handle_get_meshconf_info(NetWmesh *object,
1123 GDBusMethodInvocation *invocation,
1126 int ret = WMESHD_ERROR_NONE;
1127 GVariantBuilder builder;
1128 GVariant* meshconf_data;
1129 wmesh_meshconf_info_s *item;
1131 wmesh_service *service = (wmesh_service *)user_data;
1133 ret = wmesh_request_get_meshconf_info(service);
1134 if (WMESHD_ERROR_NONE != ret) {
1135 /* LCOV_EXCL_START */
1136 WMESH_LOGE("Failed to wmesh_request_get_mpath_info");
1138 g_dbus_method_invocation_return_error(invocation,
1139 G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Request Failed");
1140 /* LCOV_EXCL_STOP */
1142 /* Get mesh path information and make variant data */
1143 g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}"));
1145 item = service->meshconf;
1147 g_variant_builder_add(&builder, "{sv}", "RETRY_TIMEOUT",
1148 g_variant_new_uint16(item->retry_timeout));
1149 g_variant_builder_add(&builder, "{sv}", "HWMP_MAX_PREQ_RETRIES",
1150 g_variant_new_byte(item->hwmp_max_preq_retries));
1151 g_variant_builder_add(&builder, "{sv}", "CONFIRM_TIMEOUT",
1152 g_variant_new_uint16(item->confirm_timeout));
1153 g_variant_builder_add(&builder, "{sv}", "PATH_REFRESH_TIME",
1154 g_variant_new_uint32(item->path_refresh_time));
1155 g_variant_builder_add(&builder, "{sv}", "HOLDING_TIMEOUT",
1156 g_variant_new_uint16(item->holding_timeout));
1157 g_variant_builder_add(&builder, "{sv}", "MIN_DISC_TIMEOUT",
1158 g_variant_new_uint16(item->min_disc_timeout));
1159 g_variant_builder_add(&builder, "{sv}", "MAX_PEER_LINKS",
1160 g_variant_new_uint16(item->max_peer_links));
1161 g_variant_builder_add(&builder, "{sv}", "HWMP_PREQ_MIN_INTERVAL",
1162 g_variant_new_uint16(item->hwmp_preq_min_interval));
1163 g_variant_builder_add(&builder, "{sv}", "TTL",
1164 g_variant_new_byte(item->ttl));
1165 g_variant_builder_add(&builder, "{sv}", "HWMP_ACTIVE_PATH_TIMEOUT",
1166 g_variant_new_uint32(item->hwmp_active_path_timeout));
1167 g_variant_builder_add(&builder, "{sv}", "ELEMENT_TTL",
1168 g_variant_new_byte(item->element_ttl));
1169 g_variant_builder_add(&builder, "{sv}", "HWMP_RANN_INTERVAL",
1170 g_variant_new_uint16(item->hwmp_rann_interval));
1171 g_variant_builder_add(&builder, "{sv}", "GATE_ANNOUNCEMENTS",
1172 g_variant_new_byte(item->gate_announcements));
1175 meshconf_data = g_variant_builder_end(&builder);
1176 net_wmesh_complete_get_meshconf_info(object, invocation, meshconf_data,
1179 g_object_unref(meshconf_data);
1182 g_free(service->meshconf);
1187 static void _wmeshd_dbus_on_activator_bus_acquired(GDBusConnection *conn,
1188 const gchar *name, gpointer user_data)
1191 GError *error = NULL;
1192 wmesh_service *service = (wmesh_service *)user_data;
1196 meshd_activator_dbus_object = manager_skeleton_new();
1197 if (NULL == meshd_activator_dbus_object) {
1198 /* LCOV_EXCL_START */
1199 WMESH_LOGE("manager_skeleton_new() Fail");
1201 /* LCOV_EXCL_STOP */
1204 g_signal_connect(meshd_activator_dbus_object, "handle-enable",
1205 G_CALLBACK(_wmeshd_dbus_handle_enable), service);
1206 g_signal_connect(meshd_activator_dbus_object, "handle-disable",
1207 G_CALLBACK(_wmeshd_dbus_handle_disable), service);
1209 ret = g_dbus_interface_skeleton_export(
1210 G_DBUS_INTERFACE_SKELETON(meshd_activator_dbus_object),
1211 conn, WMESH_DBUS_MANAGER_OBJPATH, &error);
1213 /* LCOV_EXCL_START */
1214 WMESH_LOGE("g_dbus_interface_skeleton_export() Fail(%s)", error->message);
1215 g_error_free(error);
1216 /* LCOV_EXCL_STOP */
1220 static void _wmeshd_dbus_on_bus_acquired(GDBusConnection *conn, const gchar *name,
1224 GError *error = NULL;
1225 wmesh_service *service = (wmesh_service *)user_data;
1229 meshd_dbus_object = net_wmesh_skeleton_new();
1230 if (NULL == meshd_dbus_object) {
1231 /* LCOV_EXCL_START */
1232 WMESH_LOGE("net_wmesh_skeleton_new() Fail");
1234 /* LCOV_EXCL_STOP */
1237 g_signal_connect(meshd_dbus_object, "handle-scan",
1238 G_CALLBACK(_wmeshd_dbus_handle_scan), service);
1239 g_signal_connect(meshd_dbus_object, "handle-specific-scan",
1240 G_CALLBACK(_wmeshd_dbus_handle_specific_scan), service);
1241 g_signal_connect(meshd_dbus_object, "handle-cancel-scan",
1242 G_CALLBACK(_wmeshd_dbus_handle_cancel_scan), service);
1243 g_signal_connect(meshd_dbus_object, "handle-get-found-mesh-networks",
1244 G_CALLBACK(_wmeshd_dbus_handle_get_found_mesh_networks), service);
1245 g_signal_connect(meshd_dbus_object, "handle-enable-mesh",
1246 G_CALLBACK(_wmeshd_dbus_handle_enable_mesh), service);
1247 g_signal_connect(meshd_dbus_object, "handle-disable-mesh",
1248 G_CALLBACK(_wmeshd_dbus_handle_disable_mesh), service);
1249 g_signal_connect(meshd_dbus_object, "handle-is-mesh-enabled",
1250 G_CALLBACK(_wmeshd_dbus_handle_is_mesh_enabled), service);
1251 g_signal_connect(meshd_dbus_object, "handle-is-joined",
1252 G_CALLBACK(_wmeshd_dbus_handle_is_joined), service);
1253 g_signal_connect(meshd_dbus_object, "handle-get-joined-mesh-network",
1254 G_CALLBACK(_wmeshd_dbus_handle_get_joined_mesh_network), service);
1255 g_signal_connect(meshd_dbus_object, "handle-get-connected-peers",
1256 G_CALLBACK(_wmeshd_dbus_handle_get_connected_peers), service);
1257 g_signal_connect(meshd_dbus_object, "handle-set-gate",
1258 G_CALLBACK(_wmeshd_dbus_handle_set_gate), service);
1259 g_signal_connect(meshd_dbus_object, "handle-unset-gate",
1260 G_CALLBACK(_wmeshd_dbus_handle_unset_gate), service);
1261 g_signal_connect(meshd_dbus_object, "handle-set-softap",
1262 G_CALLBACK(_wmeshd_dbus_handle_set_softap), service);
1263 g_signal_connect(meshd_dbus_object, "handle-get-softap",
1264 G_CALLBACK(_wmeshd_dbus_handle_get_softap), service);
1265 g_signal_connect(meshd_dbus_object, "handle-enable-softap",
1266 G_CALLBACK(_wmeshd_dbus_handle_enable_softap), service);
1267 g_signal_connect(meshd_dbus_object, "handle-disable-softap",
1268 G_CALLBACK(_wmeshd_dbus_handle_disable_softap), service);
1269 g_signal_connect(meshd_dbus_object, "handle-is-softap-enabled",
1270 G_CALLBACK(_wmeshd_dbus_handle_is_softap_enabled), NULL);
1271 g_signal_connect(meshd_dbus_object, "handle-create-mesh-network",
1272 G_CALLBACK(_wmeshd_dbus_handle_create_mesh_network), service);
1273 g_signal_connect(meshd_dbus_object, "handle-connect-mesh-network",
1274 G_CALLBACK(_wmeshd_dbus_handle_connect_mesh_network), service);
1275 g_signal_connect(meshd_dbus_object, "handle-disconnect-mesh-network",
1276 G_CALLBACK(_wmeshd_dbus_handle_disconnect_mesh_network), service);
1277 g_signal_connect(meshd_dbus_object, "handle-forget-mesh-network",
1278 G_CALLBACK(_wmeshd_dbus_handle_forget_mesh_network), service);
1279 g_signal_connect(meshd_dbus_object, "handle-set-interfaces",
1280 G_CALLBACK(_wmeshd_dbus_handle_set_interfaces), service);
1281 g_signal_connect(meshd_dbus_object, "handle-get-station-info",
1282 G_CALLBACK(_wmeshd_dbus_handle_get_station_info), service);
1283 g_signal_connect(meshd_dbus_object, "handle-get-mpath-info",
1284 G_CALLBACK(_wmeshd_dbus_handle_get_mpath_info), service);
1285 g_signal_connect(meshd_dbus_object, "handle-get-meshconf-info",
1286 G_CALLBACK(_wmeshd_dbus_handle_get_meshconf_info), service);
1288 ret = g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(meshd_dbus_object),
1289 conn, WMESH_DBUS_OBJPATH, &error);
1291 /* LCOV_EXCL_START */
1292 WMESH_LOGE("g_dbus_interface_skeleton_export() Fail(%s)", error->message);
1293 g_error_free(error);
1294 /* LCOV_EXCL_STOP */
1297 ret = _wmeshd_dbus_subscribe_name_owner_changed(conn);
1298 if (WMESHD_ERROR_NONE != ret) {
1299 /* LCOV_EXCL_START */
1300 WMESH_LOGE("_wmeshd_dbus_subscribe_name_owner_changed() Fail(%d)", ret);
1302 /* LCOV_EXCL_STOP */
1306 /* LCOV_EXCL_START */
1307 static void _wmeshd_dbus_on_name_lost(GDBusConnection *conn, const gchar *name,
1313 WMESH_LOGD("Lost the name %s", name);
1315 /* LCOV_EXCL_STOP */
1317 static void _wmeshd_dbus_on_name_acquired(GDBusConnection *conn, const gchar *name,
1323 WMESH_LOGD("Acquired the name %s", name);
1326 static gboolean _wmeshd_dbus_interface_init(wmesh_service *service)
1329 guint activation_dbus_id;
1330 wmeshd_check_null_ret_error("service", service, FALSE);
1332 id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
1333 WMESH_DBUS_INTERFACE,
1334 G_BUS_NAME_OWNER_FLAGS_REPLACE,
1335 _wmeshd_dbus_on_bus_acquired,
1336 _wmeshd_dbus_on_name_acquired,
1337 _wmeshd_dbus_on_name_lost,
1341 /* LCOV_EXCL_START */
1342 WMESH_LOGE("g_bus_own_name() Fail");
1344 /* LCOV_EXCL_STOP */
1347 /* Get D-Bus owner to activate mesh service daemon */
1348 activation_dbus_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
1349 WMESH_DBUS_INTERFACE".manager",
1350 G_BUS_NAME_OWNER_FLAGS_REPLACE,
1351 _wmeshd_dbus_on_activator_bus_acquired,
1357 service->dbus_id = id;
1358 service->activation_dbus_id = activation_dbus_id;
1359 service->interface_info = g_new0(wmesh_interface_s, 1);
1360 service->scanned_mesh_network = NULL;
1362 /* Initialize DBus sendor logic */
1363 wmeshd_dbus_start(service);
1368 static void _wmeshd_dbus_deinit(wmesh_service *service)
1370 wmesh_interface_s *info = NULL;
1371 wmeshd_check_null_ret("service", service);
1373 /* De-Initialize DBus sendor logic */
1374 wmeshd_dbus_stop(service);
1376 g_bus_unown_name(service->dbus_id);
1377 g_bus_unown_name(service->activation_dbus_id);
1379 info = service->interface_info;
1380 wmeshd_check_null_ret("info", info);
1381 if (info->bridge_interface)
1382 g_free(info->bridge_interface);
1383 if (info->base_interface)
1384 g_free(info->base_interface);
1385 if (info->mesh_interface)
1386 g_free(info->mesh_interface);
1387 if (info->softap_interface)
1388 g_free(info->softap_interface);
1389 if (info->external_interface)
1390 g_free(info->external_interface);
1392 if (service->joined_network) {
1393 /* LCOV_EXCL_START */
1394 g_free(service->joined_network->mesh_id);
1395 g_free(service->joined_network->bssid);
1396 g_free(service->joined_network);
1397 service->joined_network = NULL;
1398 /* LCOV_EXCL_STOP */
1401 /* Clear scan list */
1402 if (service->scanned_mesh_network)
1403 g_list_free_full(service->scanned_mesh_network, _on_scan_result_destroy); /* LCOV_EXCL_LINE */
1404 service->scanned_mesh_network = NULL;
1406 /* Clear connected peers list */
1407 if (service->connected_mesh_peers)
1408 g_list_free_full(service->connected_mesh_peers, _on_peer_info_destroy); /* LCOV_EXCL_LINE */
1409 service->connected_mesh_peers = NULL;
1411 /* Clear mesh path list */
1412 if (service->mpath_list)
1413 g_list_free_full(service->mpath_list, _on_mpath_list_destroy); /* LCOV_EXCL_LINE */
1414 service->mpath_list = NULL;
1416 /* Clear mesh station list */
1417 if (service->station_list)
1418 g_list_free_full(service->station_list, _on_station_list_destroy); /* LCOV_EXCL_LINE */
1419 service->station_list = NULL;
1421 /* Clear mesh station list */
1422 if (service->softap_station_list)
1423 g_list_free_full(service->softap_station_list, _on_station_list_destroy); /* LCOV_EXCL_LINE */
1424 service->softap_station_list = NULL;
1426 g_free(service->interface_info);
1427 service->interface_info = NULL;
1430 /**< Mesh service interface initialization */
1431 gboolean wmeshd_service_interface_init(wmesh_service *service)
1434 wmeshd_check_null_ret_error("service", service, FALSE);
1436 /* Initialize dbus interface */
1437 ret = _wmeshd_dbus_interface_init(service);
1439 /* LCOV_EXCL_START */
1440 WMESH_LOGE("_wmeshd_dbus_interface_init failed!!!");
1442 /* LCOV_EXCL_STOP */
1448 /**< Mesh service interface de-initialization */
1449 void wmeshd_service_interface_deinit(wmesh_service *service)
1451 wmeshd_check_null_ret("service", service);
1453 /* De-initialize dbus interface */
1454 _wmeshd_dbus_deinit(service);