iplink: add support of IFLA_LINK_NETNSID attribute
This new attribute is now advertised by the kernel for x-netns interfaces.
It's also possible to set it when an interface is created (and thus creating a
x-netns interface with one single message).
Example:
$ ip netns add foo
$ ip netns add bar
$ ip -n foo netns set bar 15
$ ip -n foo link add ipip1 link-netnsid 15 type ipip remote 10.16.0.121 local 10.16.0.249
$ ip -n foo link ls ipip1
3: ipip1@NONE: <POINTOPOINT,NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default
link/ipip 10.16.0.249 peer 10.16.0.121 link-netnsid 15
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
This commit is contained in:
parent
d182ee1307
commit
ccdcbf35f1
|
|
@ -28,6 +28,7 @@
|
|||
#include <linux/netdevice.h>
|
||||
#include <linux/if_arp.h>
|
||||
#include <linux/sockios.h>
|
||||
#include <linux/net_namespace.h>
|
||||
|
||||
#include "rt_names.h"
|
||||
#include "utils.h"
|
||||
|
|
@ -614,9 +615,13 @@ int print_linkinfo(const struct sockaddr_nl *who,
|
|||
if (iflink == 0)
|
||||
fprintf(fp, "@NONE: ");
|
||||
else {
|
||||
fprintf(fp, "@%s: ", ll_idx_n2a(iflink, b1));
|
||||
m_flag = ll_index_to_flags(iflink);
|
||||
m_flag = !(m_flag & IFF_UP);
|
||||
if (tb[IFLA_LINK_NETNSID])
|
||||
fprintf(fp, "@if%d: ", iflink);
|
||||
else {
|
||||
fprintf(fp, "@%s: ", ll_idx_n2a(iflink, b1));
|
||||
m_flag = ll_index_to_flags(iflink);
|
||||
m_flag = !(m_flag & IFF_UP);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fprintf(fp, ": ");
|
||||
|
|
@ -678,6 +683,15 @@ int print_linkinfo(const struct sockaddr_nl *who,
|
|||
}
|
||||
}
|
||||
|
||||
if (tb[IFLA_LINK_NETNSID]) {
|
||||
int id = *(int*)RTA_DATA(tb[IFLA_LINK_NETNSID]);
|
||||
|
||||
if (id >= 0)
|
||||
fprintf(fp, " link-netnsid %d", id);
|
||||
else
|
||||
fprintf(fp, " link-netnsid unknown");
|
||||
}
|
||||
|
||||
if (tb[IFLA_PROMISCUITY] && show_details)
|
||||
fprintf(fp, " promiscuity %u ",
|
||||
*(int*)RTA_DATA(tb[IFLA_PROMISCUITY]));
|
||||
|
|
|
|||
10
ip/iplink.c
10
ip/iplink.c
|
|
@ -72,6 +72,7 @@ void iplink_usage(void)
|
|||
fprintf(stderr, " [ mtu MTU ]\n");
|
||||
fprintf(stderr, " [ netns PID ]\n");
|
||||
fprintf(stderr, " [ netns NAME ]\n");
|
||||
fprintf(stderr, " [ link-netnsid ID ]\n");
|
||||
fprintf(stderr, " [ alias NAME ]\n");
|
||||
fprintf(stderr, " [ vf NUM [ mac LLADDR ]\n");
|
||||
fprintf(stderr, " [ vlan VLANID [ qos VLAN-QOS ] ]\n");
|
||||
|
|
@ -386,6 +387,7 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
|
|||
int numtxqueues = -1;
|
||||
int numrxqueues = -1;
|
||||
int dev_index = 0;
|
||||
int link_netnsid = -1;
|
||||
|
||||
*group = -1;
|
||||
ret = argc;
|
||||
|
|
@ -588,6 +590,14 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
|
|||
addattr8(&req->n, sizeof(*req), IFLA_INET6_ADDR_GEN_MODE, mode);
|
||||
addattr_nest_end(&req->n, afs6);
|
||||
addattr_nest_end(&req->n, afs);
|
||||
} else if (matches(*argv, "link-netnsid") == 0) {
|
||||
NEXT_ARG();
|
||||
if (link_netnsid != -1)
|
||||
duparg("link-netnsid", *argv);
|
||||
if (get_integer(&link_netnsid, *argv, 0))
|
||||
invarg("Invalid \"link-netnsid\" value\n", *argv);
|
||||
addattr32(&req->n, sizeof(*req), IFLA_LINK_NETNSID,
|
||||
link_netnsid);
|
||||
} else {
|
||||
if (strcmp(*argv, "dev") == 0) {
|
||||
NEXT_ARG();
|
||||
|
|
|
|||
Loading…
Reference in New Issue