iplink: enable to specify index when changing netns

When an interface is moved to another netns, it's possible to specify a
new ifindex. Let's add this support.

Link: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=eeb85a14ee34
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: David Ahern <dsahern@kernel.org>
This commit is contained in:
Nicolas Dichtel 2021-10-12 11:34:05 +02:00 committed by David Ahern
parent a936a73fc2
commit 95cd2a6204
1 changed files with 9 additions and 2 deletions

View File

@ -579,6 +579,7 @@ static int iplink_parse_vf(int vf, int *argcp, char ***argvp,
int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type) int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type)
{ {
bool move_netns = false;
char *name = NULL; char *name = NULL;
char *dev = NULL; char *dev = NULL;
char *link = NULL; char *link = NULL;
@ -684,6 +685,7 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type)
IFLA_NET_NS_PID, &netns, 4); IFLA_NET_NS_PID, &netns, 4);
else else
invarg("Invalid \"netns\" value\n", *argv); invarg("Invalid \"netns\" value\n", *argv);
move_netns = true;
} else if (strcmp(*argv, "multicast") == 0) { } else if (strcmp(*argv, "multicast") == 0) {
NEXT_ARG(); NEXT_ARG();
req->i.ifi_change |= IFF_MULTICAST; req->i.ifi_change |= IFF_MULTICAST;
@ -981,9 +983,11 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type)
} }
} }
if (!(req->n.nlmsg_flags & NLM_F_CREATE) && index) { if (index &&
(!(req->n.nlmsg_flags & NLM_F_CREATE) &&
!move_netns)) {
fprintf(stderr, fprintf(stderr,
"index can be used only when creating devices.\n"); "index can be used only when creating devices or when moving device to another netns.\n");
exit(-1); exit(-1);
} }
@ -1020,6 +1024,9 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type)
/* Not renaming to the same name */ /* Not renaming to the same name */
if (name == dev) if (name == dev)
name = NULL; name = NULL;
if (index)
addattr32(&req->n, sizeof(*req), IFLA_NEW_IFINDEX, index);
} else { } else {
if (name != dev) { if (name != dev) {
fprintf(stderr, fprintf(stderr,