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,
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;
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
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);
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);