#include <inttypes.h>
#include <net/if.h>
+#include <linux/rtnetlink.h>
#include <netlink/addr.h>
#include <netlink/route/addr.h>
#include <netlink/route/link.h>
static gboolean is_initialized = FALSE;
static GList *g_list_links;
+typedef enum {
+ INM_RTNL_LINK_SCOPE_NOWHERE,
+ INM_RTNL_LINK_SCOPE_HOST,
+ INM_RTNL_LINK_SCOPE_LINK,
+ INM_RTNL_LINK_SCOPE_SITE,
+ INM_RTNL_LINK_SCOPE_UNIVERSE,
+} inm_link_scope_e;
+
typedef struct {
int if_idx;
int family;
g_string_append_printf(rtnl_addr_gs,
"<Rtnl addr address:%s>",
nl_addr2str(p_nl_addr, buf, sizeof(buf)));
+ g_string_append_printf(rtnl_addr_gs,
+ "<Rtnl addr scope:%d>",
+ rtnl_addr_get_scope(p_rtnl_addr));
log_str = g_string_free(rtnl_addr_gs, FALSE);
if (log_str) {
return ret;
}
+static inline int __translate_rt_to_link_scope(int scope)
+{
+ int link_scope;
+
+ switch (scope) {
+ case RT_SCOPE_UNIVERSE:
+ link_scope = INM_RTNL_LINK_SCOPE_UNIVERSE;
+ break;
+ case RT_SCOPE_SITE:
+ link_scope = INM_RTNL_LINK_SCOPE_SITE;
+ break;
+ case RT_SCOPE_LINK:
+ link_scope = INM_RTNL_LINK_SCOPE_LINK;
+ break;
+ case RT_SCOPE_HOST:
+ link_scope = INM_RTNL_LINK_SCOPE_HOST;
+ break;
+ case RT_SCOPE_NOWHERE:
+ link_scope = INM_RTNL_LINK_SCOPE_NOWHERE;
+ break;
+ default:
+ link_scope = INM_RTNL_LINK_SCOPE_NOWHERE;
+ break;
+ }
+ return link_scope;
+}
+
static GVariant *__inm_rtnl_addr_get_scope(inm_rtnl_addr_s *p_addr)
{
GVariant *ret = NULL;
- ret = g_variant_new_int32(p_addr->scope);
+ ret = g_variant_new_int32(__translate_rt_to_link_scope(p_addr->scope));
return ret;
}