#include "mesh.h"
#include "mesh-log.h"
#include "mesh-util.h"
+#include "mesh-gdbus.h"
+#include "mesh-service.h"
#include "mesh-service-interface.h"
#include "mesh-generated-code.h"
#include "mesh-interface.h"
static NetMesh *meshd_dbus_object;
+static Manager *meshd_activator_dbus_object;
/* global list to care resource handle for each client */
static GList *meshd_dbus_client_list;
return MESHD_ERROR_NONE;
}
-static gboolean _meshd_dbus_handle_enable(NetMesh *object,
+static gboolean _meshd_dbus_handle_enable(Manager *object,
GDBusMethodInvocation *invocation,
gpointer user_data)
{
if (service->mesh_activated) {
/* Already activated */
- net_mesh_complete_enable(object, invocation,
- MESHD_ERROR_OPERATION_FAILED);
- } else {
- /* Do API response first */
- net_mesh_complete_enable(object, invocation, ret);
- service->mesh_activated = TRUE;
+ manager_complete_enable(object, invocation, MESHD_ERROR_NONE);
+ goto FINISH;
}
+ /* Do API response first */
+ manager_complete_enable(object, invocation, ret);
+ service->mesh_activated = TRUE;
+
meshd_check_null_ret_error("info", info, FALSE);
+ /* Register event handler first */
+ ret = mesh_request_register_event_handler();
+ if (MESHD_ERROR_NONE != ret)
+ MESH_LOGE("Failed to register mesh event handler !! [%d]", ret);
+
ret = mesh_interface_initialize(service->interface_info);
if (MESHD_ERROR_NONE != ret) {
MESH_LOGE("Failed to mesh_interface_initialize [%d]", ret);
goto FINISH;
}
- ret = mesh_request_enable_mesh_gate(info->base_interface,
- info->mesh_interface, info->mesh_id, info->mesh_channel);
- if (MESHD_ERROR_NONE != ret) {
- MESH_LOGE("Failed to mesh_request_enable_mesh_gate [%d]", ret);
- goto FINISH;
- }
-
- ret = mesh_request_create_bridge(info->bridge_interface,
- info->mesh_interface, info->external_interface);
- if (MESHD_ERROR_NONE != ret) {
- MESH_LOGE("Failed to mesh_request_create_bridge [%d]", ret);
- goto FINISH;
- }
-#if 0
- ret = mesh_request_specific_scan(info->mesh_interface,
- info->mesh_id, info->mesh_channel);
- if (MESHD_ERROR_NONE != ret) {
- MESH_LOGE("Failed to mesh_request_specific_scan [%d]", ret);
- }
-
- ret = mesh_dhcp_request(info->bridge_interface);
- if (MESHD_ERROR_NONE != ret) {
- MESH_LOGE("Failed to mesh_dhcp_request [%d]", ret);
- }
-#endif
-
FINISH:
- net_mesh_emit_mesh_enabled(object, ret);
+ net_mesh_emit_mesh_enabled(meshd_dbus_get_object(), ret);
return TRUE;
}
-static gboolean _meshd_dbus_handle_disable(NetMesh *object,
+static gboolean _meshd_dbus_handle_disable(Manager *object,
GDBusMethodInvocation *invocation,
gpointer user_data)
{
meshd_check_null_ret_error("info", info, FALSE);
- if (FALSE == service->mesh_activated) {
- MESH_LOGD("Mesh network is not activated yet");
- ret = MESHD_ERROR_OPERATION_FAILED;
- goto FINISH;
- }
+ /* Make response first */
+ manager_complete_disable(object, invocation, ret);
- ret = mesh_request_disable_mesh_gate(info->mesh_interface);
- if (MESHD_ERROR_NONE != ret) {
- MESH_LOGE("Failed to mesh_request_disable_mesh_gate");
- goto FINISH;
- }
+ ret = mesh_request_unregister_event_handler();
+ if (MESHD_ERROR_NONE != ret)
+ MESH_LOGE("Failed to unregister mesh event handler !! [%d]", ret);
- ret = mesh_request_remove_bridge(info->bridge_interface);
- if (MESHD_ERROR_NONE != ret) {
- MESH_LOGE("Failed to mesh_request_remove_bridge");
- }
-
-FINISH:
- net_mesh_complete_disable(object, invocation, ret);
+ /* Terminate daemon */
+ meshd_service_exit(service);
return TRUE;
}
meshd_check_null_ret_error("info", info, FALSE);
- ret = mesh_request_scan(info->mesh_interface);
- if (MESHD_ERROR_NONE != ret) {
- MESH_LOGE("Failed to mesh_request_scan");
- }
+ ret = mesh_request_scan(service);
+ if (MESHD_ERROR_NONE != ret)
+ MESH_LOGE("Failed to mesh_request_scan !");
net_mesh_complete_scan(object, invocation, ret);
meshd_check_null_ret_error("info", info, FALSE);
- ret = mesh_request_specific_scan(info->mesh_interface, mesh_id, channel);
- if (MESHD_ERROR_NONE != ret) {
- MESH_LOGE("Failed to mesh_request_specific_scan");
- }
+ ret = mesh_request_specific_scan(service, mesh_id, channel);
+ if (MESHD_ERROR_NONE != ret)
+ MESH_LOGE("Failed to mesh_request_specific_scan !");
net_mesh_complete_specific_scan(object, invocation, ret);
{
int ret = MESHD_ERROR_NONE;
mesh_service *service = (mesh_service *)user_data;
- mesh_interface_s *info = service->interface_info;
- ret = mesh_request_cancel_scan(info->mesh_interface);
- if (MESHD_ERROR_NONE != ret) {
+ ret = mesh_request_cancel_scan(service);
+ if (MESHD_ERROR_NONE != ret)
MESH_LOGE("Failed to mesh_request_cancel_scan");
- }
net_mesh_complete_cancel_scan(object, invocation, ret);
if (scan_item) {
g_free(scan_item->mesh_id);
g_free(scan_item->bssid);
+ g_free(scan_item->object_path);
+ }
+ g_free(scan_item);
+}
+
+static void _on_peer_info_destroy(gpointer data)
+{
+ mesh_peer_info_s *peer = (mesh_peer_info_s *)data;
+ if (peer)
+ g_free(peer->address);
+ g_free(peer);
+}
+
+static void _on_station_list_destroy(gpointer data)
+{
+ mesh_station_info_s *info = (mesh_station_info_s*)data;
+
+ if (info) {
+ g_free(info->bssid);
+ g_free(info);
+ }
+}
+
+static void _on_mpath_list_destroy(gpointer data)
+{
+ mesh_mpath_info_s *info = (mesh_mpath_info_s*)data;
+
+ if (info) {
+ g_free(info->dest_addr);
+ g_free(info->next_hop);
+ g_free(info->interface);
+ g_free(info);
}
}
{
int ret = MESHD_ERROR_NONE;
mesh_service *service = (mesh_service *)user_data;
- mesh_interface_s *info = service->interface_info;
GVariantBuilder builder;
GVariant* networks;
MESH_LOGD("Request to get scanned mesh network list");
- /* TODO: Return scan results */
- /*
- * struct mesh_found_network_s {
- * char *mesh_id;
- * char *bssid;
- * int channel;
- * int rssi;
- * int data_rate;
- *};
- */
-
- ret = mesh_request_get_scan_result(info->mesh_interface, &service->scanned_mesh_network);
- if (MESHD_ERROR_NONE != ret) {
- MESH_LOGE("Failed to mesh_request_cancel_scan");
+ ret = mesh_request_get_networks(service);
+ if (MESHD_ERROR_NONE != ret)
+ MESH_LOGE("Failed to mesh_request_get_networks");
- g_dbus_method_invocation_return_error(invocation,
- G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Request Failed");
- } else {
- /* TODO: Get station information and make variant data */
- g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
+ g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
- /* For each network item */
- g_variant_builder_open(&builder, G_VARIANT_TYPE_VARDICT);
- g_variant_builder_add(&builder, "{sv}", "mesh_id", g_variant_new_string("meshnet"));
- g_variant_builder_add(&builder, "{sv}", "bssid", g_variant_new_string("7c:dd:90:62:37:cf"));
- g_variant_builder_add(&builder, "{sv}", "rssi", g_variant_new_uint32(-65));
- g_variant_builder_add(&builder, "{sv}", "channel", g_variant_new_uint32(161));
- g_variant_builder_add(&builder, "{sv}", "data_rate", g_variant_new_uint32(300));
- g_variant_builder_close(&builder);
+ /* scanned_mesh_network would be filled above request */
+ iter = service->scanned_mesh_network;
+ while (iter != NULL) {
+ scan_item = (mesh_scan_result_s*)iter->data;
g_variant_builder_open(&builder, G_VARIANT_TYPE_VARDICT);
- g_variant_builder_add(&builder, "{sv}", "mesh_id", g_variant_new_string("meshnet"));
- g_variant_builder_add(&builder, "{sv}", "bssid", g_variant_new_string("7c:dd:90:62:37:ce"));
- g_variant_builder_add(&builder, "{sv}", "rssi", g_variant_new_uint32(-50));
- g_variant_builder_add(&builder, "{sv}", "channel", g_variant_new_uint32(6));
- g_variant_builder_add(&builder, "{sv}", "data_rate", g_variant_new_uint32(150));
+ g_variant_builder_add(&builder, "{sv}", "mesh_id",
+ g_variant_new_string(scan_item->mesh_id));
+ g_variant_builder_add(&builder, "{sv}", "bssid",
+ g_variant_new_string(scan_item->bssid));
+ g_variant_builder_add(&builder, "{sv}", "rssi",
+ g_variant_new_int32(scan_item->rssi));
+ g_variant_builder_add(&builder, "{sv}", "channel",
+ g_variant_new_uint32(scan_item->channel));
+ g_variant_builder_add(&builder, "{sv}", "security",
+ g_variant_new_uint32((int)scan_item->security));
+ g_variant_builder_add(&builder, "{sv}", "state",
+ g_variant_new_uint32(scan_item->state));
g_variant_builder_close(&builder);
- iter = service->scanned_mesh_network;
- while (iter != NULL) {
- scan_item = (mesh_scan_result_s*)iter->data;
-
- g_variant_builder_open(&builder, G_VARIANT_TYPE_VARDICT);
- g_variant_builder_add(&builder, "{sv}", "mesh_id",
- g_variant_new_string(scan_item->mesh_id));
- g_variant_builder_add(&builder, "{sv}", "bssid",
- g_variant_new_string(scan_item->bssid));
- g_variant_builder_add(&builder, "{sv}", "rssi",
- g_variant_new_uint32(scan_item->rssi));
- g_variant_builder_add(&builder, "{sv}", "channel",
- g_variant_new_uint32(scan_item->channel));
- g_variant_builder_add(&builder, "{sv}", "data_rate",
- g_variant_new_uint32(scan_item->data_rate));
- g_variant_builder_close(&builder);
-
- iter = g_list_next(iter);
- }
+ iter = g_list_next(iter);
+ }
- /* Clear scan list */
- g_list_free_full(service->scanned_mesh_network, _on_scan_result_destroy);
- service->scanned_mesh_network = NULL;
+ networks = g_variant_builder_end(&builder);
- networks = g_variant_builder_end(&builder);
- net_mesh_complete_get_found_mesh_networks(object, invocation, networks, ret);
- }
+ net_mesh_complete_get_found_mesh_networks(object, invocation, networks, ret);
return TRUE;
}
static gboolean _meshd_dbus_handle_enable_mesh(NetMesh *object,
- GDBusMethodInvocation *invocation)
+ GDBusMethodInvocation *invocation,
+ gpointer user_data)
{
int ret = MESHD_ERROR_NONE;
+ mesh_service *service = (mesh_service *)user_data;
- MESH_LOGD("Not implemented yet !");
+ /* It handles creating virtual network and bridge */
+ ret = mesh_request_enable_network(service);
+ if (MESHD_ERROR_NONE != ret)
+ MESH_LOGE("Failed to mesh_request_enable_network [%d]", ret);
- /* TODO: Create or join mesh network and create bridge */
+#if 0
+ /* Detect external network state (i.e. Ethernet)
+ and decide to make gate enabled */
+ ret = mesh_request_set_mesh_gate(info->bridge_interface,
+ info->mesh_interface, info->external_interface);
+ if (MESHD_ERROR_NONE != ret)
+ MESH_LOGE("Failed to mesh_request_set_mesh_gate [%d]", ret);
+#endif
net_mesh_complete_enable_mesh(object, invocation, ret);
}
static gboolean _meshd_dbus_handle_disable_mesh(NetMesh *object,
- GDBusMethodInvocation *invocation)
+ GDBusMethodInvocation *invocation,
+ gpointer user_data)
{
int ret = MESHD_ERROR_NONE;
+ mesh_service *service = (mesh_service *)user_data;
+ mesh_interface_s *info = service->interface_info;
- MESH_LOGD("Not implemented yet !");
+ meshd_check_null_ret_error("info", info, FALSE);
- /* TODO: Destroy bridge and return from mesh to infra mode */
+ if (FALSE == service->mesh_activated) {
+ MESH_LOGD("Mesh network is not activated yet");
+ ret = MESHD_ERROR_OPERATION_FAILED;
+ net_mesh_complete_disable_mesh(object, invocation, ret);
+ return TRUE;
+ }
+
+ ret = mesh_request_disable_network(service);
+ if (MESHD_ERROR_NONE != ret)
+ MESH_LOGE("Failed to disable mesh network !");
+ /* Make response */
net_mesh_complete_disable_mesh(object, invocation, ret);
return TRUE;
}
static gboolean _meshd_dbus_handle_get_joined_mesh_network(NetMesh *object,
- GDBusMethodInvocation *invocation)
+ GDBusMethodInvocation *invocation,
+ gpointer user_data)
+{
+ int ret = MESHD_ERROR_NONE;
+ mesh_service *service = (mesh_service *)user_data;
+ mesh_network_info_s *joined = NULL;
+
+ ret = mesh_request_get_joined_network(service);
+ if (MESHD_ERROR_NONE == ret) {
+ joined = service->joined_network;
+ if (joined) {
+ net_mesh_complete_get_joined_mesh_network(object, invocation,
+ joined->mesh_id, joined->bssid,
+ joined->channel, (int)joined->security,
+ joined->state, ret);
+ } else {
+ net_mesh_complete_get_joined_mesh_network(object, invocation,
+ "", "", 0, 0, 0, MESHD_ERROR_NO_DATA);
+ }
+ } else {
+ net_mesh_complete_get_joined_mesh_network(object, invocation,
+ "", "", 0, 0, 0, ret);
+ }
+
+ return TRUE;
+}
+
+static gboolean _meshd_dbus_handle_get_connected_peers(NetMesh *object,
+ GDBusMethodInvocation *invocation,
+ gpointer user_data)
{
int ret = MESHD_ERROR_NONE;
+ mesh_service *service = (mesh_service *)user_data;
+
+ GVariantBuilder builder;
+ GVariant* peer_list;
+ GList *iter = NULL;
+ mesh_peer_info_s *peer = NULL;
+
+ MESH_LOGD("Request to get connected peers");
+
+ ret = mesh_request_get_connected_peers(service);
+ if (MESHD_ERROR_NONE != ret)
+ MESH_LOGE("Failed to mesh_request_get_connected_peers");
+ g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
+
+ iter = service->connected_mesh_peers;
+ while (iter != NULL) {
+ peer = (mesh_peer_info_s*)iter->data;
+
+ g_variant_builder_open(&builder, G_VARIANT_TYPE_VARDICT);
+ g_variant_builder_add(&builder, "{sv}", "Address",
+ g_variant_new_string(peer->address));
+ g_variant_builder_close(&builder);
- gchar *meshid = strdup("meshnet");
- gchar *bssid = strdup("7c:dd:90:d8:2a:64");
- gint channel = 161;
- gint max_speed = 866;
+ iter = g_list_next(iter);
+ }
- MESH_LOGD("Not implemented yet !");
- net_mesh_complete_get_joined_mesh_network(object, invocation, meshid, bssid, channel,
- max_speed, ret);
+ peer_list = g_variant_builder_end(&builder);
- free(meshid);
- free(bssid);
+ net_mesh_complete_get_connected_peers(object, invocation, peer_list, ret);
return TRUE;
}
static gboolean _meshd_dbus_handle_set_gate(NetMesh *object,
- GDBusMethodInvocation *invocation, gboolean stp, gint gate_announce)
+ GDBusMethodInvocation *invocation, gboolean stp, gboolean gate_announce,
+ gpointer user_data)
{
int ret = MESHD_ERROR_NONE;
+ mesh_service *service = (mesh_service *)user_data;
+ mesh_interface_s *info = service->interface_info;
- MESH_LOGD("Not implemented yet !");
- MESH_LOGD("stp = %d", stp);
+ MESH_LOGD("STP = %d", stp);
MESH_LOGD("gate_announce = %d", gate_announce);
- /* TODO: Set stp and gate_announce */
+ /* Set STP and gate_announce */
+ ret = mesh_request_set_mesh_gate(info->bridge_interface,
+ info->mesh_interface, info->external_interface);
+ if (MESHD_ERROR_NONE != ret)
+ MESH_LOGE("Failed to mesh_request_set_mesh_gate [%d]", ret);
net_mesh_complete_set_gate(object, invocation, ret);
}
static gboolean _meshd_dbus_handle_unset_gate(NetMesh *object,
- GDBusMethodInvocation *invocation)
+ GDBusMethodInvocation *invocation,
+ gpointer user_data)
{
int ret = MESHD_ERROR_NONE;
+ mesh_service *service = (mesh_service *)user_data;
+ mesh_interface_s *info = service->interface_info;
- MESH_LOGD("Not implemented yet !");
-
- /* TODO: Check softAP interface and execute it */
+ ret = mesh_request_unset_mesh_gate(info->bridge_interface,
+ info->mesh_interface, info->external_interface);
+ if (MESHD_ERROR_NONE != ret)
+ MESH_LOGE("Failed to mesh_request_unset_mesh_gate [%d]", ret);
net_mesh_complete_unset_gate(object, invocation, ret);
}
static gboolean _meshd_dbus_handle_set_softap(NetMesh *object,
- GDBusMethodInvocation *invocation, gchar *ssid, gchar *key,
- gchar *mode, gint channel, gint visibility, gint max_sta, gint security)
+ GDBusMethodInvocation *invocation,
+ gchar *ssid, gchar *passphrase,
+ gchar *mode, gint channel, gint visibility, gint max_sta,
+ gint security, gpointer user_data)
{
int ret = MESHD_ERROR_NONE;
+ mesh_service *service = (mesh_service *)user_data;
+ mesh_interface_s *info = service->interface_info;
- MESH_LOGD("Not implemented yet !");
- MESH_LOGD("ssid = %s", ssid);
- MESH_LOGD("key = %s", key);
- MESH_LOGD("mode = %s", mode);
- MESH_LOGD("channel = %d", channel);
- MESH_LOGD("visibility = %d", visibility);
- MESH_LOGD("max_sta = %d", max_sta);
- MESH_LOGD("security = %d", security);
+ MESH_LOGD("SSID : %s", ssid);
+ MESH_LOGD("mode : %s", mode);
+ MESH_LOGD("channel : %d", channel);
+ MESH_LOGD("visibility: %d", visibility);
+ MESH_LOGD("max_sta : %d", max_sta);
+ MESH_LOGD("security : %d", security);
- /* TODO: Save softAP information */
+ /* Save softAP information */
+ ret = mesh_request_set_softap_config(info->softap_interface,
+ ssid, mode, channel, visibility, max_sta,
+ security, passphrase);
+ if (MESHD_ERROR_NONE != ret)
+ MESH_LOGE("Failed to mesh_request_set_softap_config [%d]", ret);
net_mesh_complete_set_softap(object, invocation, ret);
}
static gboolean _meshd_dbus_handle_enable_softap(NetMesh *object,
- GDBusMethodInvocation *invocation)
+ GDBusMethodInvocation *invocation, gpointer user_data)
{
int ret = MESHD_ERROR_NONE;
+ mesh_service *service = (mesh_service *)user_data;
+ mesh_interface_s *info = service->interface_info;
- MESH_LOGD("Not implemented yet !");
-
- /* TODO: Check softAP interface and execute it */
+ /* Check softAP interface and execute it */
+ ret = mesh_request_enable_softap(info->bridge_interface, info->softap_interface);
+ if (MESHD_ERROR_NONE != ret)
+ MESH_LOGE("Failed to mesh_request_enable_softap [%d]", ret);
net_mesh_complete_enable_softap(object, invocation, ret);
}
static gboolean _meshd_dbus_handle_disable_softap(NetMesh *object,
- GDBusMethodInvocation *invocation)
+ GDBusMethodInvocation *invocation, gpointer user_data)
{
int ret = MESHD_ERROR_NONE;
+ mesh_service *service = (mesh_service *)user_data;
+ mesh_interface_s *info = service->interface_info;
- MESH_LOGD("Not implemented yet !");
-
- /* TODO: Destroy softap */
+ /* Destroy softAP */
+ ret = mesh_request_disable_softap(info->bridge_interface, info->softap_interface);
+ if (MESHD_ERROR_NONE != ret)
+ MESH_LOGE("Failed to mesh_request_disable_softap [%d]", ret);
net_mesh_complete_disable_softap(object, invocation, ret);
return TRUE;
}
-static gboolean _meshd_dbus_handle_add_mesh_network(NetMesh *object,
+static gboolean _meshd_dbus_handle_create_mesh_network(NetMesh *object,
GDBusMethodInvocation *invocation,
gchar *mesh_id, gint channel, gint security,
gpointer user_data)
{
int ret = MESHD_ERROR_NONE;
mesh_service *service = (mesh_service *)user_data;
+ meshd_security_type_e sec = (1 == security) ? MESHD_SECURITY_SAE : MESHD_SECURITY_NONE;
- ret = mesh_request_add_mesh_network(service, mesh_id, channel, security);
+ ret = mesh_request_create_mesh_network(service, mesh_id, channel, sec);
- net_mesh_complete_add_mesh_network(object, invocation, ret);
+ net_mesh_complete_create_mesh_network(object, invocation, ret);
return TRUE;
}
-static gboolean _meshd_dbus_handle_get_saved_mesh_network(NetMesh *object,
+static gboolean _meshd_dbus_handle_connect_mesh_network(NetMesh *object,
GDBusMethodInvocation *invocation,
+ gchar *mesh_id, gint channel, gint security, gchar *passphrase,
gpointer user_data)
{
int ret = MESHD_ERROR_NONE;
mesh_service *service = (mesh_service *)user_data;
+ meshd_security_type_e sec = (1 == security) ? MESHD_SECURITY_SAE : MESHD_SECURITY_NONE;
- ret = mesh_request_get_saved_mesh_network(service);
+ ret = mesh_request_connect_mesh_network(service, mesh_id, channel, sec, passphrase);
- net_mesh_complete_get_saved_mesh_network(object, invocation, ret);
+ net_mesh_complete_connect_mesh_network(object, invocation, ret);
return TRUE;
}
-
-static gboolean _meshd_dbus_handle_select_saved_mesh_network(NetMesh *object,
+static gboolean _meshd_dbus_handle_disconnect_mesh_network(NetMesh *object,
GDBusMethodInvocation *invocation,
gchar *mesh_id, gint channel, gint security,
gpointer user_data)
{
int ret = MESHD_ERROR_NONE;
mesh_service *service = (mesh_service *)user_data;
+ meshd_security_type_e sec = (1 == security) ? MESHD_SECURITY_SAE : MESHD_SECURITY_NONE;
- ret = mesh_request_select_saved_mesh_network(service, mesh_id, channel, security);
+ ret = mesh_request_disconnect_mesh_network(service, mesh_id, channel, sec);
- net_mesh_complete_select_saved_mesh_network(object, invocation, ret);
+ net_mesh_complete_disconnect_mesh_network(object, invocation, ret);
return TRUE;
}
-static gboolean _meshd_dbus_handle_forget_saved_mesh_network(NetMesh *object,
+static gboolean _meshd_dbus_handle_forget_mesh_network(NetMesh *object,
GDBusMethodInvocation *invocation,
gchar *mesh_id, gint channel, gint security,
gpointer user_data)
{
int ret = MESHD_ERROR_NONE;
mesh_service *service = (mesh_service *)user_data;
+ meshd_security_type_e sec = (1 == security) ? MESHD_SECURITY_SAE : MESHD_SECURITY_NONE;
- ret = mesh_request_forget_saved_mesh_network(service, mesh_id, channel, security);
+ ret = mesh_request_remove_mesh_network(service, mesh_id, channel, sec);
- net_mesh_complete_forget_saved_mesh_network(object, invocation, ret);
+ net_mesh_complete_forget_mesh_network(object, invocation, ret);
+
+ return TRUE;
+}
+
+static gboolean _meshd_dbus_handle_set_interfaces(NetMesh *object,
+ GDBusMethodInvocation *invocation,
+ gchar *mesh, gchar *gate, gchar *softap,
+ gpointer user_data)
+{
+ int ret = MESHD_ERROR_NONE;
+ mesh_service *service = (mesh_service *)user_data;
+ mesh_interface_s *info = service->interface_info;
+
+ g_free(info->mesh_interface);
+ info->mesh_interface = g_strdup(mesh);
+
+ g_free(info->external_interface);
+ info->external_interface = g_strdup(gate);
+
+ g_free(info->softap_interface);
+ info->softap_interface = g_strdup(softap);
+
+ MESH_LOGD("Interface configuration for mesh network :");
+ MESH_LOGD(" Base : [%s]", info->base_interface);
+ MESH_LOGD(" Mesh : [%s]", info->mesh_interface);
+ MESH_LOGD(" Bridge : [%s]", info->bridge_interface);
+ MESH_LOGD(" SoftAP : [%s]", info->softap_interface);
+ MESH_LOGD(" External: [%s]", info->external_interface);
+
+ net_mesh_complete_set_interfaces(object, invocation, ret);
return TRUE;
}
static gboolean _meshd_dbus_handle_get_station_info(NetMesh *object,
- GDBusMethodInvocation *invocation)
+ GDBusMethodInvocation *invocation,
+ gpointer user_data)
{
int ret = MESHD_ERROR_NONE;
GVariantBuilder builder;
GVariant* station;
+ GList *iter = NULL;
- MESH_LOGD("Not implemented yet !");
+ mesh_service *service = (mesh_service *)user_data;
+ mesh_interface_s *info = service->interface_info;
+
+ /* Clear mesh station list */
+ g_list_free_full(service->station_list, _on_station_list_destroy);
+ service->station_list = NULL;
- /* TODO: Get station infomation and make variant data */
+ ret = mesh_request_get_station_info(
+ info->mesh_interface, &service->station_list);
+ if (MESHD_ERROR_NONE != ret) {
+ MESH_LOGE("Failed to mesh_request_get_station_info");
+ g_dbus_method_invocation_return_error(invocation,
+ G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Request Failed");
+ } else {
/*
* sh-3.2# iw mesh0 station dump
* Station 7c:dd:90:62:37:cf (on mesh0)
* tx retries: 0
* tx failed: 0
* beacon loss: 0
- * signal: -64 dBm
+ * signal: -64 dBm
* signal avg: -63 dBm
* tx bitrate: 54.0 MBit/s
* rx bitrate: 5.5 MBit/s
* short slot time:yes
* connected time: 256 seconds
*/
- g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
- g_variant_builder_add(&builder, "{sv}", "station", g_variant_new_string("7c:dd:90:62:37:cf"));
- g_variant_builder_add(&builder, "{sv}", "inactive_time", g_variant_new_uint32(1685));
- g_variant_builder_add(&builder, "{sv}", "rx_bytes", g_variant_new_uint32(34174));
- g_variant_builder_add(&builder, "{sv}", "rx_packets", g_variant_new_uint32(1181));
- g_variant_builder_add(&builder, "{sv}", "tx_bytes", g_variant_new_uint32(6877));
- g_variant_builder_add(&builder, "{sv}", "tx_packets", g_variant_new_uint32(76));
- g_variant_builder_add(&builder, "{sv}", "tx_retries", g_variant_new_uint32(0));
- g_variant_builder_add(&builder, "{sv}", "tx_failed", g_variant_new_uint32(0));
- g_variant_builder_add(&builder, "{sv}", "beacon_loss", g_variant_new_uint32(0));
- g_variant_builder_add(&builder, "{sv}", "signal", g_variant_new_int32(-64));
- g_variant_builder_add(&builder, "{sv}", "signal_avg", g_variant_new_int32(-63));
- g_variant_builder_add(&builder, "{sv}", "tx_birrate", g_variant_new_uint32(540)); /* 10 times */
- g_variant_builder_add(&builder, "{sv}", "rx_birrate", g_variant_new_uint32(55)); /* 10 times */
- g_variant_builder_add(&builder, "{sv}", "mesh_llid", g_variant_new_uint32(51731));
- g_variant_builder_add(&builder, "{sv}", "mesh_plid", g_variant_new_uint32(35432));
- g_variant_builder_add(&builder, "{sv}", "mesh_plink", g_variant_new_uint32(1)); /* 0 : DISCON, 1 : ESTAB */
- g_variant_builder_add(&builder, "{sv}", "mesh_local_PS_mode", g_variant_new_uint32(1)); /* 0 : INACTIVE, 1 : ACTIVE */
- g_variant_builder_add(&builder, "{sv}", "mesh_peer_PS_mode", g_variant_new_uint32(1)); /* 0 : INACTIVE, 1 : ACTIVE */
- g_variant_builder_add(&builder, "{sv}", "mesh_none_peer_PS_mode", g_variant_new_uint32(1)); /* 0 : INACTIVE, 1 : ACTIVE */
- g_variant_builder_add(&builder, "{sv}", "authroized", g_variant_new_boolean(TRUE));
- g_variant_builder_add(&builder, "{sv}", "associated", g_variant_new_boolean(TRUE));
- g_variant_builder_add(&builder, "{sv}", "preamble",g_variant_new_string("long"));
- g_variant_builder_add(&builder, "{sv}", "WMM_WME", g_variant_new_boolean(TRUE));
- g_variant_builder_add(&builder, "{sv}", "MFP", g_variant_new_boolean(FALSE));
- g_variant_builder_add(&builder, "{sv}", "TDLS_peer", g_variant_new_boolean(FALSE));
- g_variant_builder_add(&builder, "{sv}", "DTIM_period", g_variant_new_uint32(0));
- g_variant_builder_add(&builder, "{sv}", "beacon_interval", g_variant_new_uint32(1000));
- g_variant_builder_add(&builder, "{sv}", "short_slot_time", g_variant_new_boolean(TRUE));
- g_variant_builder_add(&builder, "{sv}", "connected_time", g_variant_new_uint32(256));
- station = g_variant_builder_end(&builder);
-
- net_mesh_complete_get_station_info(object, invocation, station, ret);
-
- g_object_unref(station);
+ /* Get station information and make variant data */
+ g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
+
+ iter = service->station_list;
+ while (iter != NULL) {
+ mesh_station_info_s *item = (mesh_station_info_s*)iter->data;
+
+ g_variant_builder_open(&builder, G_VARIANT_TYPE_VARDICT);
+ g_variant_builder_add(&builder, "{sv}", "bssid",
+ g_variant_new_string(item->bssid));
+ g_variant_builder_add(&builder, "{sv}", "inactive_time",
+ g_variant_new_uint32(item->inactive_time));
+ g_variant_builder_add(&builder, "{sv}", "rx_bytes",
+ g_variant_new_uint64(item->rx_bytes));
+ g_variant_builder_add(&builder, "{sv}", "rx_packets",
+ g_variant_new_uint32(item->rx_packets));
+ g_variant_builder_add(&builder, "{sv}", "tx_bytes",
+ g_variant_new_uint64(item->tx_bytes));
+ g_variant_builder_add(&builder, "{sv}", "tx_packets",
+ g_variant_new_uint32(item->tx_packets));
+ g_variant_builder_add(&builder, "{sv}", "tx_retries",
+ g_variant_new_uint32(item->tx_retries));
+ g_variant_builder_add(&builder, "{sv}", "tx_failed",
+ g_variant_new_uint32(item->tx_failed));
+ g_variant_builder_add(&builder, "{sv}", "beacon_loss",
+ g_variant_new_uint32(item->beacon_loss));
+ g_variant_builder_add(&builder, "{sv}", "beacon_rx",
+ g_variant_new_uint64(item->beacon_rx));
+ g_variant_builder_add(&builder, "{sv}", "rx_drop_misc",
+ g_variant_new_uint64(item->rx_drop_misc));
+ g_variant_builder_add(&builder, "{sv}", "signal",
+ g_variant_new_int32(item->rssi));
+ g_variant_builder_add(&builder, "{sv}", "signal_avg",
+ g_variant_new_int32(item->rssi_avg));
+ g_variant_builder_add(&builder, "{sv}", "tx_bitrate",
+ g_variant_new_uint32(item->tx_bitrate)); /* 10 times */
+ g_variant_builder_add(&builder, "{sv}", "rx_bitrate",
+ g_variant_new_uint32(item->rx_bitrate)); /* 10 times */
+ g_variant_builder_add(&builder, "{sv}", "mesh_llid",
+ g_variant_new_uint16(item->llid));
+ g_variant_builder_add(&builder, "{sv}", "mesh_plid",
+ g_variant_new_uint16(item->plid));
+ g_variant_builder_add(&builder, "{sv}", "mesh_plink",
+ g_variant_new_byte(item->mesh_plink)); /* 0 : DISCON, 1 : ESTAB */
+ g_variant_builder_add(&builder, "{sv}", "local_ps_mode",
+ g_variant_new_uint32(item->local_ps_mode)); /* 0 : INACTIVE, 1 : ACTIVE */
+ g_variant_builder_add(&builder, "{sv}", "peer_ps_mode",
+ g_variant_new_uint32(item->peer_ps_mode)); /* 0 : INACTIVE, 1 : ACTIVE */
+ g_variant_builder_add(&builder, "{sv}", "non_peer_ps_mode",
+ g_variant_new_uint32(item->non_peer_ps_mode)); /* 0 : INACTIVE, 1 : ACTIVE */
+ g_variant_builder_add(&builder, "{sv}", "authorized",
+ g_variant_new_boolean(item->authorized));
+ g_variant_builder_add(&builder, "{sv}", "associated",
+ g_variant_new_boolean(item->associated));
+ g_variant_builder_add(&builder, "{sv}", "preamble",
+ g_variant_new_boolean(item->preamble));
+ g_variant_builder_add(&builder, "{sv}", "WMM_WME",
+ g_variant_new_boolean(item->wme));
+ g_variant_builder_add(&builder, "{sv}", "MFP",
+ g_variant_new_boolean(item->mfp));
+ g_variant_builder_add(&builder, "{sv}", "TDLS_peer",
+ g_variant_new_boolean(item->tdls_peer));
+ g_variant_builder_add(&builder, "{sv}", "DTIM_period",
+ g_variant_new_byte(item->dtim_period));
+ g_variant_builder_add(&builder, "{sv}", "beacon_interval",
+ g_variant_new_uint16(item->beacon_interval));
+ g_variant_builder_add(&builder, "{sv}", "short_slot_time",
+ g_variant_new_boolean(item->short_slot_time));
+ g_variant_builder_add(&builder, "{sv}", "connected_time",
+ g_variant_new_uint32(item->connected_time));
+ g_variant_builder_close(&builder);
+
+ iter = g_list_next(iter);
+ }
+
+ station = g_variant_builder_end(&builder);
+ net_mesh_complete_get_station_info(object, invocation, station, ret);
+
+ g_object_unref(station);
+ }
return TRUE;
}
static gboolean _meshd_dbus_handle_get_mpath_info(NetMesh *object,
- GDBusMethodInvocation *invocation)
+ GDBusMethodInvocation *invocation,
+ gpointer user_data)
{
int ret = MESHD_ERROR_NONE;
GVariantBuilder builder;
- GVariant* dump_data;
+ GVariant* mpath_data;
+ GList *iter = NULL;
- MESH_LOGD("Not implemented yet !");
+ mesh_service *service = (mesh_service *)user_data;
+ mesh_interface_s *info = service->interface_info;
- /* TODO: Get mesh path infomation and make variant data */
+ /* Clear mesh path list */
+ g_list_free_full(service->mpath_list, _on_mpath_list_destroy);
+ service->mpath_list = NULL;
- // ret = _meshd_get_mpath_dump();
+ ret = mesh_request_get_mpath_info(
+ info->mesh_interface, &service->mpath_list);
+ if (MESHD_ERROR_NONE != ret) {
+ MESH_LOGE("Failed to mesh_request_get_mpath_info");
+ g_dbus_method_invocation_return_error(invocation,
+ G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Request Failed");
+ } else {
/*
* Example) sh-3.2# iw mesh0 mpath dump
* DEST ADDR NEXT HOP IFACE SN METRIC QLEN EXPTIME DTIM DRET FLAGS
* 7c:dd:90:62:37:cf 7c:dd:90:62:37:cf mesh0 221 152 0 10 100 0 0x5
*/
- g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
- g_variant_builder_add(&builder, "{sv}", "DEST_ADDR", g_variant_new_string("7c:dd:90:62:37:cf"));
- g_variant_builder_add(&builder, "{sv}", "NEXT_HOP", g_variant_new_string("7c:dd:90:62:37:cf"));
- g_variant_builder_add(&builder, "{sv}", "IFACE", g_variant_new_string("mesh0"));
- g_variant_builder_add(&builder, "{sv}", "SN", g_variant_new_uint32(221));
- g_variant_builder_add(&builder, "{sv}", "METRIC", g_variant_new_uint32(152));
- g_variant_builder_add(&builder, "{sv}", "QLEN", g_variant_new_uint32(0));
- g_variant_builder_add(&builder, "{sv}", "EXPTIME", g_variant_new_uint32(10));
- g_variant_builder_add(&builder, "{sv}", "DTIM", g_variant_new_uint32(100));
- g_variant_builder_add(&builder, "{sv}", "DRET", g_variant_new_uint32(0));
- g_variant_builder_add(&builder, "{sv}", "FLAGS", g_variant_new_uint32(0x05));
-
- g_variant_builder_add(&builder, "{sv}", "DEST_ADDR", g_variant_new_string("7c:dd:90:63:21:34"));
- g_variant_builder_add(&builder, "{sv}", "NEXT_HOP", g_variant_new_string("7c:dd:90:62:37:cf"));
- g_variant_builder_add(&builder, "{sv}", "IFACE", g_variant_new_string("mesh0"));
- g_variant_builder_add(&builder, "{sv}", "SN", g_variant_new_uint32(221));
- g_variant_builder_add(&builder, "{sv}", "METRIC", g_variant_new_uint32(152));
- g_variant_builder_add(&builder, "{sv}", "QLEN", g_variant_new_uint32(0));
- g_variant_builder_add(&builder, "{sv}", "EXPTIME", g_variant_new_uint32(10));
- g_variant_builder_add(&builder, "{sv}", "DTIM", g_variant_new_uint32(100));
- g_variant_builder_add(&builder, "{sv}", "DRET", g_variant_new_uint32(0));
- g_variant_builder_add(&builder, "{sv}", "FLAGS", g_variant_new_uint32(0x05));
- dump_data = g_variant_builder_end(&builder);
-
- net_mesh_complete_get_mpath_info(object, invocation, dump_data, ret);
-
- g_object_unref(dump_data);
+ /* Get mesh path information and make variant data */
+ g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
+
+ iter = service->mpath_list;
+ while (iter != NULL) {
+ mesh_mpath_info_s *item = (mesh_mpath_info_s*)iter->data;
+
+ g_variant_builder_open(&builder, G_VARIANT_TYPE_VARDICT);
+ g_variant_builder_add(&builder, "{sv}", "DEST_ADDR",
+ g_variant_new_string(item->dest_addr));
+ g_variant_builder_add(&builder, "{sv}", "NEXT_HOP",
+ g_variant_new_string(item->next_hop));
+ g_variant_builder_add(&builder, "{sv}", "IFACE",
+ g_variant_new_string(item->interface));
+ g_variant_builder_add(&builder, "{sv}", "SN",
+ g_variant_new_uint32(item->sn));
+ g_variant_builder_add(&builder, "{sv}", "METRIC",
+ g_variant_new_uint32(item->metric));
+ g_variant_builder_add(&builder, "{sv}", "QLEN",
+ g_variant_new_uint32(item->qlen));
+ g_variant_builder_add(&builder, "{sv}", "EXPTIME",
+ g_variant_new_uint32(item->exptime));
+ g_variant_builder_add(&builder, "{sv}", "DTIM",
+ g_variant_new_uint32(item->discovery_timeout));
+ g_variant_builder_add(&builder, "{sv}", "DRET",
+ g_variant_new_byte(item->discovery_retries));
+ g_variant_builder_add(&builder, "{sv}", "FLAGS",
+ g_variant_new_byte(item->flags));
+ g_variant_builder_close(&builder);
+
+ iter = g_list_next(iter);
+ }
+
+ mpath_data = g_variant_builder_end(&builder);
+ net_mesh_complete_get_mpath_info(object, invocation, mpath_data, ret);
+
+ g_object_unref(mpath_data);
+ }
return TRUE;
}
+static void _meshd_dbus_on_activator_bus_acquired(GDBusConnection *conn,
+ const gchar *name, gpointer user_data)
+{
+ gboolean ret;
+ GError *error = NULL;
+ mesh_service *service = (mesh_service *)user_data;
+
+ NOTUSED(name);
+
+ meshd_activator_dbus_object = manager_skeleton_new();
+ if (NULL == meshd_activator_dbus_object) {
+ MESH_LOGE("manager_skeleton_new() Fail");
+ return;
+ }
+
+ g_signal_connect(meshd_activator_dbus_object, "handle-enable",
+ G_CALLBACK(_meshd_dbus_handle_enable), service);
+ g_signal_connect(meshd_activator_dbus_object, "handle-disable",
+ G_CALLBACK(_meshd_dbus_handle_disable), service);
+
+ ret = g_dbus_interface_skeleton_export(
+ G_DBUS_INTERFACE_SKELETON(meshd_activator_dbus_object),
+ conn, MESH_DBUS_MANAGER_OBJPATH, &error);
+ if (FALSE == ret) {
+ MESH_LOGE("g_dbus_interface_skeleton_export() Fail(%s)", error->message);
+ g_error_free(error);
+ }
+}
+
static void _meshd_dbus_on_bus_acquired(GDBusConnection *conn, const gchar *name,
gpointer user_data)
{
return;
}
- g_signal_connect(meshd_dbus_object, "handle-enable",
- G_CALLBACK(_meshd_dbus_handle_enable), service);
- g_signal_connect(meshd_dbus_object, "handle-disable",
- G_CALLBACK(_meshd_dbus_handle_disable), service);
g_signal_connect(meshd_dbus_object, "handle-scan",
G_CALLBACK(_meshd_dbus_handle_scan), service);
g_signal_connect(meshd_dbus_object, "handle-specific-scan",
G_CALLBACK(_meshd_dbus_handle_disable_mesh), service);
g_signal_connect(meshd_dbus_object, "handle-get-joined-mesh-network",
G_CALLBACK(_meshd_dbus_handle_get_joined_mesh_network), service);
+ g_signal_connect(meshd_dbus_object, "handle-get-connected-peers",
+ G_CALLBACK(_meshd_dbus_handle_get_connected_peers), service);
g_signal_connect(meshd_dbus_object, "handle-set-gate",
G_CALLBACK(_meshd_dbus_handle_set_gate), service);
- g_signal_connect(meshd_dbus_object, "handle-unset-mesh",
+ g_signal_connect(meshd_dbus_object, "handle-unset-gate",
G_CALLBACK(_meshd_dbus_handle_unset_gate), service);
g_signal_connect(meshd_dbus_object, "handle-set-softap",
G_CALLBACK(_meshd_dbus_handle_set_softap), service);
G_CALLBACK(_meshd_dbus_handle_enable_softap), service);
g_signal_connect(meshd_dbus_object, "handle-disable-softap",
G_CALLBACK(_meshd_dbus_handle_disable_softap), service);
- g_signal_connect(meshd_dbus_object, "handle-add-mesh-network",
- G_CALLBACK(_meshd_dbus_handle_add_mesh_network), service);
- g_signal_connect(meshd_dbus_object, "handle-get-saved-mesh-network",
- G_CALLBACK(_meshd_dbus_handle_get_saved_mesh_network), service);
- g_signal_connect(meshd_dbus_object, "handle-select-saved-mesh-network",
- G_CALLBACK(_meshd_dbus_handle_select_saved_mesh_network), service);
- g_signal_connect(meshd_dbus_object, "handle-forget-saved-mesh-network",
- G_CALLBACK(_meshd_dbus_handle_forget_saved_mesh_network), service);
+ g_signal_connect(meshd_dbus_object, "handle-create-mesh-network",
+ G_CALLBACK(_meshd_dbus_handle_create_mesh_network), service);
+ g_signal_connect(meshd_dbus_object, "handle-connect-mesh-network",
+ G_CALLBACK(_meshd_dbus_handle_connect_mesh_network), service);
+ g_signal_connect(meshd_dbus_object, "handle-disconnect-mesh-network",
+ G_CALLBACK(_meshd_dbus_handle_disconnect_mesh_network), service);
+ g_signal_connect(meshd_dbus_object, "handle-forget-mesh-network",
+ G_CALLBACK(_meshd_dbus_handle_forget_mesh_network), service);
+ g_signal_connect(meshd_dbus_object, "handle-set-interfaces",
+ G_CALLBACK(_meshd_dbus_handle_set_interfaces), service);
g_signal_connect(meshd_dbus_object, "handle-get-station-info",
G_CALLBACK(_meshd_dbus_handle_get_station_info), service);
g_signal_connect(meshd_dbus_object, "handle-get-mpath-info",
static gboolean _meshd_dbus_interface_init(mesh_service *service)
{
guint id;
+ guint activation_dbus_id;
meshd_check_null_ret_error("service", service, FALSE);
id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
return FALSE;
}
+ /* Get D-Bus owner to activate mesh service daemon */
+ activation_dbus_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
+ MESH_DBUS_INTERFACE".manager",
+ G_BUS_NAME_OWNER_FLAGS_REPLACE,
+ _meshd_dbus_on_activator_bus_acquired,
+ NULL,
+ NULL,
+ service,
+ NULL);
+
service->dbus_id = id;
+ service->activation_dbus_id = activation_dbus_id;
service->interface_info = g_new0(mesh_interface_s, 1);
service->scanned_mesh_network = NULL;
+ /* Initialize DBus sendor logic */
+ meshd_dbus_start(service);
+
return TRUE;
}
mesh_interface_s *info = NULL;
meshd_check_null_ret("service", service);
+ /* De-Initialize DBus sendor logic */
+ meshd_dbus_stop(service);
+
g_bus_unown_name(service->dbus_id);
+ g_bus_unown_name(service->activation_dbus_id);
info = service->interface_info;
meshd_check_null_ret("info", info);
if (info->external_interface)
g_free(info->external_interface);
+ if (service->joined_network) {
+ g_free(service->joined_network->mesh_id);
+ g_free(service->joined_network->bssid);
+ g_free(service->joined_network);
+ service->joined_network = NULL;
+ }
+
+ /* Clear scan list */
+ g_list_free_full(service->scanned_mesh_network, _on_scan_result_destroy);
+ service->scanned_mesh_network = NULL;
+
+ /* Clear connected peers list */
+ g_list_free_full(service->connected_mesh_peers, _on_peer_info_destroy);
+ service->connected_mesh_peers = NULL;
+
g_free(service->interface_info);
service->interface_info = NULL;
}
- /**< mesh service interface initialization */
+/**< Mesh service interface initialization */
gboolean meshd_service_interface_init(mesh_service *service)
{
guint ret;
/* Initialize dbus interface */
ret = _meshd_dbus_interface_init(service);
if (FALSE == ret) {
- MESH_LOGE("zigbee_service_dbus_interface_init failed!!!");
+ MESH_LOGE("_meshd_dbus_interface_init failed!!!");
return FALSE;
}
return TRUE;
}
-/**< Zigbee service interface de-initialization */
+/**< Mesh service interface de-initialization */
void meshd_service_interface_deinit(mesh_service *service)
{
meshd_check_null_ret("service", service);