Fix mesh network interfaces
authorJiwan Kim <ji-wan.kim@samsung.com>
Tue, 30 May 2017 07:22:07 +0000 (16:22 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Mon, 17 Jul 2017 02:35:36 +0000 (11:35 +0900)
- Fix a bug on mesh network creation
- Add interface 'disconnect'

introspection/mesh.xml
src/mesh-gdbus.c
src/mesh-service-interface.c

index b0b852b..1dc36c2 100644 (file)
                        <arg type="i" name="security" direction="in"/>\r
                        <arg type="u" name="result" direction="out"/>\r
                </method>\r
+               <method name="disconnect_mesh_network">\r
+                       <arg type="s" name="mesh_id" direction="in"/>\r
+                       <arg type="i" name="channel" direction="in"/>\r
+                       <arg type="i" name="security" direction="in"/>\r
+                       <arg type="u" name="result" direction="out"/>\r
+               </method>\r
                <method name="forget_mesh_network">\r
                        <arg type="s" name="mesh_id" direction="in"/>\r
                        <arg type="i" name="channel" direction="in"/>\r
index 68e6db0..b9b65f9 100644 (file)
@@ -488,7 +488,13 @@ static void _get_joined_network(mesh_service *service, GVariant *variant)
                tmp = g_variant_dict_lookup_value(dict, "State", G_VARIANT_TYPE_STRING);
                if (NULL == tmp) continue;
                buf = g_variant_get_string(tmp, &len);
-               if (g_strcmp0(buf, "association") != 0 && g_strcmp0(buf, "connected") != 0)
+               MESH_LOGD("  Object: [%s]", obj_path);
+               MESH_LOGD("  State : [%s]", buf);
+
+               /* Skip ignorable state */
+               if (g_strcmp0(buf, "idle") == 0
+                       && g_strcmp0(buf, "disconnect") == 0
+                       && g_strcmp0(buf, "failure") == 0)
                        continue;
 
                /* Create an information structure for joined network */
@@ -517,6 +523,9 @@ static void _get_joined_network(mesh_service *service, GVariant *variant)
                service->joined_network = joined_info;
 
                g_variant_iter_free(property);
+
+               /* If found, stop loop iteration */
+               break;
        }
        g_variant_iter_free(peer);
 }
@@ -663,7 +672,7 @@ int mesh_ipc_create_network(mesh_service *service, gchar *mesh_id, gint channel,
        GVariant *variant = NULL;
        GError *error = NULL;
        GVariant *var_dict = NULL;
-       GVariantDict dict;
+       GVariantBuilder builder;
        const gchar* secu = (security == 0) ? "none" : "SAE";
 
        enum nl80211_band band = (channel <= 14) ? NL80211_BAND_2GHZ : NL80211_BAND_5GHZ;
@@ -675,11 +684,27 @@ int mesh_ipc_create_network(mesh_service *service, gchar *mesh_id, gint channel,
        meshd_check_null_ret_error("_gproxy_connman_technology",
                        _gproxy_connman_technology, MESHD_ERROR_IO_ERROR);
 
-       g_variant_dict_init(&dict, NULL);
-       g_variant_dict_insert(&dict, "Name", "s", mesh_id);
-       g_variant_dict_insert(&dict, "Frequency", "q", freq);
-       g_variant_dict_insert(&dict, "Security", "s", secu);
-       var_dict = g_variant_dict_end(&dict);
+       g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}"));
+       g_variant_builder_open(&builder, G_VARIANT_TYPE("a{sv}"));
+
+       g_variant_builder_open(&builder, G_VARIANT_TYPE("{sv}"));
+       g_variant_builder_add(&builder, "s", "Name");
+       g_variant_builder_add(&builder, "v", g_variant_new_string(mesh_id));
+       g_variant_builder_close(&builder); /* {sv} */
+
+       g_variant_builder_open(&builder, G_VARIANT_TYPE("{sv}"));
+       g_variant_builder_add(&builder, "s", "Frequency");
+       g_variant_builder_add(&builder, "v", g_variant_new_uint16(freq));
+       g_variant_builder_close(&builder); /* {sv} */
+
+       g_variant_builder_open(&builder, G_VARIANT_TYPE("{sv}"));
+       g_variant_builder_add(&builder, "s", "Security");
+       g_variant_builder_add(&builder, "v", g_variant_new_string(secu));
+       g_variant_builder_close(&builder); /* {sv} */
+
+       g_variant_builder_close(&builder); /* a{sv} */
+
+       var_dict = g_variant_builder_end(&builder);
 
        variant = g_dbus_proxy_call_sync(_gproxy_connman_technology, "MeshCommands",
                                g_variant_new("(sv)", "MeshCreateNetwork", var_dict),
index b30d111..d10704d 100644 (file)
@@ -734,6 +734,20 @@ static gboolean _meshd_dbus_handle_connect_mesh_network(NetMesh *object,
 
        return TRUE;
 }
+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;
+
+       ret = mesh_request_ipc_disconnect_mesh_network(service, mesh_id, channel, security);
+
+       net_mesh_complete_disconnect_mesh_network(object, invocation, ret);
+
+       return TRUE;
+}
 
 static gboolean _meshd_dbus_handle_forget_mesh_network(NetMesh *object,
                GDBusMethodInvocation *invocation,
@@ -745,7 +759,7 @@ static gboolean _meshd_dbus_handle_forget_mesh_network(NetMesh *object,
 
        //ret = mesh_request_forget_saved_mesh_network(&service->saved_mesh_network,
        //              mesh_id, channel, security);
-       ret = mesh_request_ipc_disconnect_mesh_network(service,
+       ret = mesh_request_ipc_remove_mesh_network(service,
                        mesh_id, channel, security);
 
        net_mesh_complete_forget_mesh_network(object, invocation, ret);
@@ -1105,6 +1119,8 @@ static void _meshd_dbus_on_bus_acquired(GDBusConnection *conn, const gchar *name
                        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",