platform: add nm_platform_link_set_netns() function
[thaller@redhat.com: cherry-picked original patch and modified slightly]
This commit is contained in:

committed by
Thomas Haller

parent
30fe52c766
commit
9995699116
@@ -4051,6 +4051,31 @@ link_refresh (NMPlatform *platform, int ifindex)
|
|||||||
return !!cache_lookup_link (platform, 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
|
static NMPlatformError
|
||||||
link_change_flags (NMPlatform *platform,
|
link_change_flags (NMPlatform *platform,
|
||||||
int ifindex,
|
int ifindex,
|
||||||
@@ -6164,6 +6189,8 @@ nm_linux_platform_class_init (NMLinuxPlatformClass *klass)
|
|||||||
|
|
||||||
platform_class->link_refresh = link_refresh;
|
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_up = link_set_up;
|
||||||
platform_class->link_set_down = link_set_down;
|
platform_class->link_set_down = link_set_down;
|
||||||
platform_class->link_set_arp = link_set_arp;
|
platform_class->link_set_arp = link_set_arp;
|
||||||
|
@@ -667,6 +667,32 @@ nm_platform_link_delete (NMPlatform *self, int ifindex)
|
|||||||
return klass->link_delete (self, 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:
|
* nm_platform_link_get_index:
|
||||||
* @self: platform instance
|
* @self: platform instance
|
||||||
|
@@ -491,6 +491,9 @@ typedef struct {
|
|||||||
gboolean (*link_get_unmanaged) (NMPlatform *, int ifindex, gboolean *unmanaged);
|
gboolean (*link_get_unmanaged) (NMPlatform *, int ifindex, gboolean *unmanaged);
|
||||||
|
|
||||||
gboolean (*link_refresh) (NMPlatform *, int ifindex);
|
gboolean (*link_refresh) (NMPlatform *, int ifindex);
|
||||||
|
|
||||||
|
gboolean (*link_set_netns) (NMPlatform *, int ifindex, int netns_fd);
|
||||||
|
|
||||||
void (*process_events) (NMPlatform *self);
|
void (*process_events) (NMPlatform *self);
|
||||||
|
|
||||||
gboolean (*link_set_up) (NMPlatform *, int ifindex, gboolean *out_no_firmware);
|
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);
|
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_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. */
|
/* convienience methods to lookup the link and access fields of NMPlatformLink. */
|
||||||
int nm_platform_link_get_ifindex (NMPlatform *self, const char *name);
|
int nm_platform_link_get_ifindex (NMPlatform *self, const char *name);
|
||||||
const char *nm_platform_link_get_name (NMPlatform *self, int ifindex);
|
const char *nm_platform_link_get_name (NMPlatform *self, int ifindex);
|
||||||
|
Reference in New Issue
Block a user