ip link: support "add TYPE vrf", improve --help
VRF interfaces have a mandatory table parameter, which needs to be specified using a RTNL attribute. function old new delta do_add_or_delete 1150 1254 +104 packed_usage 32444 32546 +102 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 2/0 up/down: 206/0) Total: 206 bytes Signed-off-by: Jan Luebbe <jluebbe@debian.org> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
b083e8cc53
commit
79cda9522a
@ -155,11 +155,60 @@
|
|||||||
//usage:
|
//usage:
|
||||||
//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
|
//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
|
||||||
//usage:#define iplink_trivial_usage
|
//usage:#define iplink_trivial_usage
|
||||||
//usage: "set IFACE [up|down] [arp on|off] | show [IFACE]"
|
//usage: /*Usage:iplink*/"set IFACE [up|down] [arp on|off] [multicast on|off]\n"
|
||||||
//usage:#define iplink_full_usage "\n\n"
|
//usage: " [promisc on|off] [mtu NUM] [name NAME] [qlen NUM] [address MAC]"
|
||||||
//usage: "iplink set IFACE [up|down] [arp on|off] [multicast on|off] [promisc on|off]\n"
|
// * short help shows only "set" command, long help continues (with just one "\n")
|
||||||
//usage: " [mtu NUM] [name NAME] [qlen NUM] [address MAC]\n"
|
// * and shows all other commands:
|
||||||
|
//usage:#define iplink_full_usage "\n"
|
||||||
|
//usage: "iplink add [link IFACE] IFACE [address MAC] type TYPE [ARGS]\n"
|
||||||
|
//usage: "iplink delete IFACE type TYPE [ARGS]\n"
|
||||||
|
//usage: " TYPE ARGS := vlan VLANARGS | vrf table NUM\n"
|
||||||
|
//usage: " VLANARGS := id VLANID [protocol 802.1q|802.1ad] [reorder_hdr on|off]\n"
|
||||||
|
//usage: " [gvrp on|off] [mvrp on|off] [loose_binding on|off]\n"
|
||||||
//usage: "iplink show [IFACE]"
|
//usage: "iplink show [IFACE]"
|
||||||
|
//upstream man ip-link:
|
||||||
|
//=====================
|
||||||
|
//ip link add [link DEV] [ name ] NAME
|
||||||
|
// [ txqueuelen PACKETS ]
|
||||||
|
// [ address LLADDR ]
|
||||||
|
// [ broadcast LLADDR ]
|
||||||
|
// [ mtu MTU ] [index IDX ]
|
||||||
|
// [ numtxqueues QUEUE_COUNT ]
|
||||||
|
// [ numrxqueues QUEUE_COUNT ]
|
||||||
|
// type TYPE [ ARGS ]
|
||||||
|
// ip link delete { DEVICE | dev DEVICE | group DEVGROUP } type TYPE [ ARGS ]
|
||||||
|
// ip link set { DEVICE | dev DEVICE | group DEVGROUP } [ { up | down } ]
|
||||||
|
// [ arp { on | off } ]
|
||||||
|
// [ dynamic { on | off } ]
|
||||||
|
// [ multicast { on | off } ]
|
||||||
|
// [ allmulticast { on | off } ]
|
||||||
|
// [ promisc { on | off } ]
|
||||||
|
// [ trailers { on | off } ]
|
||||||
|
// [ txqueuelen PACKETS ]
|
||||||
|
// [ name NEWNAME ]
|
||||||
|
// [ address LLADDR ]
|
||||||
|
// [ broadcast LLADDR ]
|
||||||
|
// [ mtu MTU ]
|
||||||
|
// [ netns { PID | NAME } ]
|
||||||
|
// [ link-netnsid ID ]
|
||||||
|
// [ alias NAME ]
|
||||||
|
// [ vf NUM [ mac LLADDR ]
|
||||||
|
// [ vlan VLANID [ qos VLAN-QOS ] ]
|
||||||
|
// [ rate TXRATE ]
|
||||||
|
// [ spoofchk { on | off} ]
|
||||||
|
// [ query_rss { on | off} ]
|
||||||
|
// [ state { auto | enable | disable} ] ]
|
||||||
|
// [ trust { on | off} ] ]
|
||||||
|
// [ master DEVICE ]
|
||||||
|
// [ nomaster ]
|
||||||
|
// [ addrgenmode { eui64 | none | stable_secret | random } ]
|
||||||
|
// [ protodown { on | off } ]
|
||||||
|
// ip link show [ DEVICE | group GROUP ] [up] [master DEV] [type TYPE]
|
||||||
|
// ip link help [ TYPE ]
|
||||||
|
//TYPE := { vlan | veth | vcan | dummy | ifb | macvlan | macvtap |
|
||||||
|
// bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan |
|
||||||
|
// gre | gretap | ip6gre | ip6gretap | vti | nlmon |
|
||||||
|
// bond_slave | ipvlan | geneve | bridge_slave | vrf }
|
||||||
//usage:
|
//usage:
|
||||||
//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
|
//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
|
||||||
//usage:#define iproute_trivial_usage
|
//usage:#define iproute_trivial_usage
|
||||||
|
@ -525,6 +525,24 @@ static void vlan_parse_opt(char **argv, struct nlmsghdr *n, unsigned int size)
|
|||||||
addattr_l(n, size, IFLA_VLAN_FLAGS, &flags, sizeof(flags));
|
addattr_l(n, size, IFLA_VLAN_FLAGS, &flags, sizeof(flags));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void vrf_parse_opt(char **argv, struct nlmsghdr *n, unsigned int size)
|
||||||
|
{
|
||||||
|
/* IFLA_VRF_TABLE is an enum, not a define -
|
||||||
|
* can't test "defined(IFLA_VRF_TABLE)".
|
||||||
|
*/
|
||||||
|
#if !defined(IFLA_VRF_MAX)
|
||||||
|
# define IFLA_VRF_TABLE 1
|
||||||
|
#endif
|
||||||
|
uint32_t table;
|
||||||
|
|
||||||
|
if (strcmp(*argv, "table") != 0)
|
||||||
|
invarg_1_to_2(*argv, "type vrf");
|
||||||
|
|
||||||
|
NEXT_ARG();
|
||||||
|
table = get_u32(*argv, "table");
|
||||||
|
addattr_l(n, size, IFLA_VRF_TABLE, &table, sizeof(table));
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef NLMSG_TAIL
|
#ifndef NLMSG_TAIL
|
||||||
#define NLMSG_TAIL(nmsg) \
|
#define NLMSG_TAIL(nmsg) \
|
||||||
((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))
|
((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))
|
||||||
@ -563,6 +581,8 @@ static int do_add_or_delete(char **argv, const unsigned rtm)
|
|||||||
if (rtm == RTM_NEWLINK)
|
if (rtm == RTM_NEWLINK)
|
||||||
req.n.nlmsg_flags |= NLM_F_CREATE|NLM_F_EXCL;
|
req.n.nlmsg_flags |= NLM_F_CREATE|NLM_F_EXCL;
|
||||||
|
|
||||||
|
/* NB: update iplink_full_usage if you extend this code */
|
||||||
|
|
||||||
while (*argv) {
|
while (*argv) {
|
||||||
arg = index_in_substrings(keywords, *argv);
|
arg = index_in_substrings(keywords, *argv);
|
||||||
if (arg == ARG_type) {
|
if (arg == ARG_type) {
|
||||||
@ -582,7 +602,7 @@ static int do_add_or_delete(char **argv, const unsigned rtm)
|
|||||||
} else if (arg == ARG_address) {
|
} else if (arg == ARG_address) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
address_str = *argv;
|
address_str = *argv;
|
||||||
dbg("address_str:'%s'", name_str);
|
dbg("address_str:'%s'", address_str);
|
||||||
} else {
|
} else {
|
||||||
if (arg == ARG_dev) {
|
if (arg == ARG_dev) {
|
||||||
if (dev_str)
|
if (dev_str)
|
||||||
@ -609,6 +629,8 @@ static int do_add_or_delete(char **argv, const unsigned rtm)
|
|||||||
|
|
||||||
if (strcmp(type_str, "vlan") == 0)
|
if (strcmp(type_str, "vlan") == 0)
|
||||||
vlan_parse_opt(argv, &req.n, sizeof(req));
|
vlan_parse_opt(argv, &req.n, sizeof(req));
|
||||||
|
else if (strcmp(type_str, "vrf") == 0)
|
||||||
|
vrf_parse_opt(argv, &req.n, sizeof(req));
|
||||||
|
|
||||||
data->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)data;
|
data->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)data;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user