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:
parent
a936a73fc2
commit
95cd2a6204
11
ip/iplink.c
11
ip/iplink.c
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue