diff mbox series

[iproute2,v2] iplink: enable to specify index when changing netns

Message ID 20211012093405.18302-1-nicolas.dichtel@6wind.com (mailing list archive)
State Accepted
Delegated to: David Ahern
Headers show
Series [iproute2,v2] iplink: enable to specify index when changing netns | expand

Checks

Context Check Description
netdev/tree_selection success Not a local patch

Commit Message

Nicolas Dichtel Oct. 12, 2021, 9:34 a.m. UTC
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>
---

v1 -> v2:
  reuse index option instead adding a new option

 ip/iplink.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

Comments

David Ahern Oct. 16, 2021, 12:07 a.m. UTC | #1
On 10/12/21 3:34 AM, Nicolas Dichtel wrote:
> 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>
> ---
> 
> v1 -> v2:
>   reuse index option instead adding a new option
> 
>  ip/iplink.c | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
> 

applied to iproute2-next. Thanks,
diff mbox series

Patch

diff --git a/ip/iplink.c b/ip/iplink.c
index 18b2ea25b7c2..1d2776c3b5c9 100644
--- a/ip/iplink.c
+++ b/ip/iplink.c
@@ -578,6 +578,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)
 {
+	bool move_netns = false;
 	char *name = NULL;
 	char *dev = NULL;
 	char *link = NULL;
@@ -683,6 +684,7 @@  int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type)
 					  IFLA_NET_NS_PID, &netns, 4);
 			else
 				invarg("Invalid \"netns\" value\n", *argv);
+			move_netns = true;
 		} else if (strcmp(*argv, "multicast") == 0) {
 			NEXT_ARG();
 			req->i.ifi_change |= IFF_MULTICAST;
@@ -980,9 +982,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,
-			"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);
 	}
 
@@ -1019,6 +1023,9 @@  int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type)
 		/* Not renaming to the same name */
 		if (name == dev)
 			name = NULL;
+
+		if (index)
+			addattr32(&req->n, sizeof(*req), IFLA_NEW_IFINDEX, index);
 	} else {
 		if (name != dev) {
 			fprintf(stderr,