platform: add nm_platform_link_set_netns() function
authorStjepan Gros <stjepan.gros@gmail.com>
Tue, 8 Mar 2016 12:02:58 +0000 (13:02 +0100)
committerThomas Haller <thaller@redhat.com>
Tue, 15 Mar 2016 11:56:58 +0000 (12:56 +0100)
[thaller@redhat.com: cherry-picked original patch and modified
  slightly]

src/platform/nm-linux-platform.c
src/platform/nm-platform.c
src/platform/nm-platform.h

index 3536fd4..e2ff1f6 100644 (file)
@@ -4051,6 +4051,31 @@ link_refresh (NMPlatform *platform, int ifindex)
        return !!cache_lookup_link (platform, ifindex);
 }
 
+static gboolean
+link_set_netns (NMPlatform *platform,
+                int ifindex,
+                int netns_fd)
+{
+       nm_auto_nlmsg struct nl_msg *nlmsg = NULL;
+
+       _LOGD ("link: move link %d to network namespace with fd %d", ifindex, netns_fd);
+
+       nlmsg = _nl_msg_new_link (RTM_NEWLINK,
+                                 0,
+                                 ifindex,
+                                 NULL,
+                                 0,
+                                 0);
+       if (!nlmsg)
+               return FALSE;
+
+       NLA_PUT (nlmsg, IFLA_NET_NS_FD, 4, &netns_fd);
+       return do_change_link (platform, ifindex, nlmsg) == NM_PLATFORM_ERROR_SUCCESS;
+
+nla_put_failure:
+       g_return_val_if_reached (FALSE);
+}
+
 static NMPlatformError
 link_change_flags (NMPlatform *platform,
                    int ifindex,
@@ -6164,6 +6189,8 @@ nm_linux_platform_class_init (NMLinuxPlatformClass *klass)
 
        platform_class->link_refresh = link_refresh;
 
+       platform_class->link_set_netns = link_set_netns;
+
        platform_class->link_set_up = link_set_up;
        platform_class->link_set_down = link_set_down;
        platform_class->link_set_arp = link_set_arp;
index 8659cff..89f385e 100644 (file)
@@ -667,6 +667,32 @@ nm_platform_link_delete (NMPlatform *self, int ifindex)
        return klass->link_delete (self, ifindex);
 }
 
+/**
+ * nm_platform_link_set_netns:
+ * @self: platform instance
+ * @ifindex: Interface index
+ * @netns_fd: the file descriptor for the new netns.
+ *
+ * Returns: %TRUE on success.
+ */
+gboolean
+nm_platform_link_set_netns (NMPlatform *self, int ifindex, int netns_fd)
+{
+       const NMPlatformLink *pllink;
+
+       _CHECK_SELF (self, klass, FALSE);
+
+       g_return_val_if_fail (ifindex > 0, FALSE);
+       g_return_val_if_fail (netns_fd > 0, FALSE);
+
+       pllink = nm_platform_link_get (self, ifindex);
+       if (!pllink)
+               return FALSE;
+
+       _LOGD ("link: ifindex %d changing network namespace to %d", ifindex, netns_fd);
+       return klass->link_set_netns (self, ifindex, netns_fd);
+}
+
 /**
  * nm_platform_link_get_index:
  * @self: platform instance
index 1f4f373..8c97f76 100644 (file)
@@ -491,6 +491,9 @@ typedef struct {
        gboolean (*link_get_unmanaged) (NMPlatform *, int ifindex, gboolean *unmanaged);
 
        gboolean (*link_refresh) (NMPlatform *, int ifindex);
+
+       gboolean (*link_set_netns) (NMPlatform *, int ifindex, int netns_fd);
+
        void (*process_events) (NMPlatform *self);
 
        gboolean (*link_set_up) (NMPlatform *, int ifindex, gboolean *out_no_firmware);
@@ -698,6 +701,8 @@ NMPlatformError nm_platform_link_bond_add (NMPlatform *self, const char *name, c
 NMPlatformError nm_platform_link_team_add (NMPlatform *self, const char *name, const NMPlatformLink **out_link);
 gboolean nm_platform_link_delete (NMPlatform *self, int ifindex);
 
+gboolean nm_platform_link_set_netns (NMPlatform *self, int ifindex, int netns_fd);
+
 /* convienience methods to lookup the link and access fields of NMPlatformLink. */
 int nm_platform_link_get_ifindex (NMPlatform *self, const char *name);
 const char *nm_platform_link_get_name (NMPlatform *self, int ifindex);