summaryrefslogtreecommitdiff
path: root/src/platform
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform')
-rw-r--r--src/platform/nm-linux-platform.c29
-rw-r--r--src/platform/nm-platform.c11
-rw-r--r--src/platform/nm-platform.h6
3 files changed, 42 insertions, 4 deletions
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index 7fde0a7ae0..ac7f6e8aab 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -138,6 +138,7 @@ struct libnl_vtable
void *handle;
int (*f_nl_has_capability) (int capability);
+ int (*f_rtnl_link_get_link_netnsid) (const struct rtnl_link *link, gint32 *out_link_netnsid);
};
static int
@@ -158,11 +159,14 @@ _nl_get_vtable (void)
if (handle) {
vtable.handle = handle;
vtable.f_nl_has_capability = dlsym (handle, "nl_has_capability");
+ vtable.f_rtnl_link_get_link_netnsid = dlsym (handle, "rtnl_link_get_link_netnsid");
}
if (!vtable.f_nl_has_capability)
vtable.f_nl_has_capability = &_nl_f_nl_has_capability;
+ debug ("libnl: rtnl_link_get_link_netnsid() %s", vtable.f_rtnl_link_get_link_netnsid ? "supported" : "not supported");
+
g_return_val_if_fail (handle, &vtable);
g_return_val_if_fail (&nl_connect == (int (*)(struct nl_sock *, int)) dlsym (handle, "nl_connect"), &vtable);
}
@@ -176,6 +180,20 @@ _nl_has_capability (int capability)
return (_nl_get_vtable ()->f_nl_has_capability) (capability);
}
+static int
+_rtnl_link_get_link_netnsid (const struct rtnl_link *link, gint32 *out_link_netnsid)
+{
+ const struct libnl_vtable *vtable;
+
+ g_return_val_if_fail (link, -NLE_INVAL);
+ g_return_val_if_fail (out_link_netnsid, -NLE_INVAL);
+
+ vtable = _nl_get_vtable ();
+ return vtable->f_rtnl_link_get_link_netnsid
+ ? vtable->f_rtnl_link_get_link_netnsid (link, out_link_netnsid)
+ : -NLE_OPNOTSUPP;
+}
+
/* Automatic deallocation of local variables */
#define auto_nl_object __attribute__((cleanup(_nl_auto_nl_object)))
static void
@@ -981,6 +999,7 @@ _nmp_vt_cmd_plobj_init_from_nl_link (NMPlatform *platform, NMPlatformObject *_ob
gboolean completed_from_cache_val = FALSE;
gboolean *completed_from_cache = complete_from_cache ? &completed_from_cache_val : NULL;
const NMPObject *link_cached = NULL;
+ int parent;
nm_assert (memcmp (obj, ((char [sizeof (NMPObjectLink)]) { 0 }), sizeof (NMPObjectLink)) == 0);
@@ -1000,7 +1019,15 @@ _nmp_vt_cmd_plobj_init_from_nl_link (NMPlatform *platform, NMPlatformObject *_ob
obj->flags = rtnl_link_get_flags (nlo);
obj->connected = NM_FLAGS_HAS (obj->flags, IFF_LOWER_UP);
obj->master = rtnl_link_get_master (nlo);
- obj->parent = rtnl_link_get_link (nlo);
+ parent = rtnl_link_get_link (nlo);
+ if (parent > 0) {
+ gint32 link_netnsid;
+
+ if (_rtnl_link_get_link_netnsid (nlo, &link_netnsid) == 0)
+ obj->parent = NM_PLATFORM_LINK_OTHER_NETNS;
+ else
+ obj->parent = parent;
+ }
obj->mtu = rtnl_link_get_mtu (nlo);
obj->arptype = rtnl_link_get_arptype (nlo);
diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c
index fd1f5bd029..b1d4b3b14d 100644
--- a/src/platform/nm-platform.c
+++ b/src/platform/nm-platform.c
@@ -446,8 +446,11 @@ nm_platform_link_get_all (NMPlatform *self)
g_warn_if_fail (g_hash_table_contains (unseen, GINT_TO_POINTER (item->master)));
}
if (item->parent != 0) {
- g_warn_if_fail (item->parent > 0);
- g_warn_if_fail (item->parent != item->ifindex);
+ if (item->parent != NM_PLATFORM_LINK_OTHER_NETNS) {
+ g_warn_if_fail (item->parent > 0);
+ g_warn_if_fail (item->parent != item->ifindex);
+ g_warn_if_fail (g_hash_table_contains (unseen, GINT_TO_POINTER (item->parent)));
+ }
}
}
#endif
@@ -2359,8 +2362,10 @@ nm_platform_link_to_string (const NMPlatformLink *link)
else
master[0] = 0;
- if (link->parent)
+ if (link->parent > 0)
g_snprintf (parent, sizeof (parent), "@%d", link->parent);
+ else if (link->parent == NM_PLATFORM_LINK_OTHER_NETNS)
+ g_strlcpy (parent, "@other-netns", sizeof (parent));
else
parent[0] = 0;
diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h
index 59e8901140..a357918b7e 100644
--- a/src/platform/nm-platform.h
+++ b/src/platform/nm-platform.h
@@ -85,6 +85,8 @@ typedef enum {
_NM_PLATFORM_REASON_CACHE_CHECK_INTERNAL,
} NMPlatformReason;
+#define NM_PLATFORM_LINK_OTHER_NETNS (-1)
+
#define __NMPlatformObject_COMMON \
int ifindex; \
;
@@ -103,6 +105,10 @@ struct _NMPlatformLink {
gboolean initialized;
int master;
+
+ /* rtnl_link_get_link(), IFLA_LINK.
+ * If IFLA_LINK_NETNSID indicates that the parent is in another namespace,
+ * this field be set to (negative) NM_PLATFORM_LINK_OTHER_NETNS. */
int parent;
/* rtnl_link_get_arptype(), ifinfomsg.ifi_type. */