Add function to get link information as variant 20/195520/2
authorYu <jiung.yu@samsung.com>
Fri, 14 Dec 2018 02:09:01 +0000 (11:09 +0900)
committerYu <jiung.yu@samsung.com>
Fri, 14 Dec 2018 09:08:40 +0000 (18:08 +0900)
Change-Id: I74ff424572c5f07bce6f48479b0b2733c53a44d4
Signed-off-by: Yu Jiung <jiung.yu@samsung.com>
include/inm-rtnl.h
src/inm-gdbus.c
src/inm-rtnl.c

index 074d31ba30a6b8a3ba6d783f2780fd1c2e4b354c..44c7c60054659a702bcc11ebffc9e5848e54b4bb 100644 (file)
@@ -42,6 +42,8 @@ typedef enum {
 int inm_rtnl_mon_init(void);
 int inm_rtnl_mon_deinit(void);
 
+int inm_rtnl_get_links_variant(GVariant **gvar_links);
+
 #ifdef __cplusplus
 }
 #endif
index 3ae15f36c763bb79a652d92a11a2a582ec4edefa..680a486fb431eb0c17ba5e62d7dc940e12c3db10 100644 (file)
@@ -32,6 +32,7 @@
 #include "inm-manager.h"
 #include "inm-util.h"
 #include "inm-manager-log.h"
+#include "inm-rtnl.h"
 #include "inm-error.h"
 #include "inm-gdbus.h"
 
@@ -944,8 +945,16 @@ static inline void __handle_get_links(GVariant *parameters,
                                            GDBusMethodInvocation *invocation)
 {
        GVariant *arg = NULL;
+       int ret = 0;
 
        __INM_FUNC_ENTER__;
+       ret = inm_rtnl_get_links_variant(&arg);
+       if (ret != INM_MANAGER_ERROR_NONE) {
+               INM_LOGW("Failed to get links");
+               __dbus_return_err(INM_MANAGER_ERROR_OPERATION_FAILED, invocation);
+               __INM_FUNC_EXIT__;
+               return;
+       }
 
        g_dbus_method_invocation_return_value(invocation, arg);
        __INM_FUNC_EXIT__;
index 109ab7fc8096ccab60ceea19d5fe038cebfb93c3..ce931ef086a2e82a1247a615f7649bfc2b730962 100644 (file)
@@ -1067,6 +1067,134 @@ static void __clear_all_nl_data()
                util_nl_data_destroy(&(nl_data_arr[type]));
 }
 
+static GVariant *__inm_rtnl_link_get_ifname(inm_rtnl_link_s *p_link)
+{
+       GVariant *ret = NULL;
+
+       ret = g_variant_new_string(p_link->iface_name);
+
+       return ret;
+}
+
+static GVariant *__inm_rtnl_link_get_ifidx(inm_rtnl_link_s *p_link)
+{
+       GVariant *ret = NULL;
+
+       ret = g_variant_new_int32(p_link->if_idx);
+
+       return ret;
+}
+
+static GVariant *__inm_rtnl_link_get_flags(inm_rtnl_link_s *p_link)
+{
+       GVariant *ret = NULL;
+
+       ret = g_variant_new_int32(p_link->flags);
+
+       return ret;
+}
+
+static GVariant *__inm_rtnl_link_get_operation_state(inm_rtnl_link_s *p_link)
+{
+       GVariant *ret = NULL;
+
+       ret = g_variant_new_int32(p_link->operation_state);
+
+       return ret;
+}
+
+static GVariant *__inm_rtnl_link_get_received_bytes(inm_rtnl_link_s *p_link)
+{
+       GVariant *ret = NULL;
+
+       ret = g_variant_new_uint64(p_link->received_bytes);
+
+       return ret;
+}
+
+static GVariant *__inm_rtnl_link_get_sent_bytes(inm_rtnl_link_s *p_link)
+{
+       GVariant *ret = NULL;
+
+       ret = g_variant_new_uint64(p_link->sent_bytes);
+
+       return ret;
+}
+
+static void __inm_rtnl_link_build(inm_rtnl_link_s *p_link, GVariantBuilder *gb_link)
+{
+       if (p_link->iface_name)
+               g_variant_builder_add(gb_link,
+                                         "{sv}",
+                                         "IfaceName",
+                                         __inm_rtnl_link_get_ifname(p_link));
+       g_variant_builder_add(gb_link,
+                             "{sv}",
+                             "IfIdx",
+                                 __inm_rtnl_link_get_ifidx(p_link));
+       g_variant_builder_add(gb_link,
+                             "{sv}",
+                             "Flags",
+                                 __inm_rtnl_link_get_flags(p_link));
+       g_variant_builder_add(gb_link,
+                             "{sv}",
+                             "OperationState",
+                                 __inm_rtnl_link_get_operation_state(p_link));
+       g_variant_builder_add(gb_link,
+                             "{sv}",
+                             "ReceivedBytes",
+                                 __inm_rtnl_link_get_received_bytes(p_link));
+       g_variant_builder_add(gb_link,
+                             "{sv}",
+                             "SentBytes",
+                                 __inm_rtnl_link_get_sent_bytes(p_link));
+}
+
+static void __inm_rtnl_get_link_variant(gpointer data, gpointer user_data)
+{
+       GVariantBuilder *outer = NULL;
+       GVariantBuilder *inner = NULL;
+       inm_rtnl_link_s *p_link = NULL;
+
+       outer = (GVariantBuilder *)user_data;
+       p_link = (inm_rtnl_link_s *)data;
+
+       inner = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+
+       __inm_rtnl_link_build(p_link, inner);
+
+       g_variant_builder_add(outer,
+                             "(ia{sv})",
+                                 p_link->if_idx,
+                             inner);
+
+       g_variant_builder_unref(inner);
+}
+
+int inm_rtnl_get_links_variant(GVariant **gvar_links)
+{
+       GVariantBuilder *builder = NULL;
+       int ret = INM_RTNL_ERROR_NONE;
+
+       __INM_FUNC_ENTER__;
+
+       if (g_list_links == NULL || g_list_length(g_list_links) == 0) {
+               INM_LOGW("No links");
+               return INM_RTNL_ERROR_OPERATION_FAILED;
+       }
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a(ia{sv})"));
+       g_list_foreach(g_list_links,
+                       __inm_rtnl_get_link_variant,
+                       builder);
+
+       *gvar_links = g_variant_new("(a(ia{sv}))", builder);
+       g_variant_builder_unref(builder);
+
+       __INM_FUNC_EXIT__;
+       return ret;
+}
+
 int inm_rtnl_mon_init(void)
 {
        __INM_FUNC_ENTER__;