aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Luebbe <jluebbe@debian.org>2018-02-20 19:28:02 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-02-20 19:29:05 +0100
commit79cda9522ad390f1bdb7ba1025b1c81bbd1613e6 (patch)
tree3b990f1e4c9f948e1340221788671130c29fb51a
parentb083e8cc538ba6b27e19da541ca6a0f7ceb7daee (diff)
downloadbusybox-w32-79cda9522ad390f1bdb7ba1025b1c81bbd1613e6.tar.gz
busybox-w32-79cda9522ad390f1bdb7ba1025b1c81bbd1613e6.tar.bz2
busybox-w32-79cda9522ad390f1bdb7ba1025b1c81bbd1613e6.zip
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>
-rw-r--r--networking/ip.c57
-rw-r--r--networking/libiproute/iplink.c24
2 files changed, 76 insertions, 5 deletions
diff --git a/networking/ip.c b/networking/ip.c
index 0bc0edc57..665f9bcce 100644
--- a/networking/ip.c
+++ b/networking/ip.c
@@ -155,11 +155,60 @@
155//usage: 155//usage:
156//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79 156//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
157//usage:#define iplink_trivial_usage 157//usage:#define iplink_trivial_usage
158//usage: "set IFACE [up|down] [arp on|off] | show [IFACE]" 158//usage: /*Usage:iplink*/"set IFACE [up|down] [arp on|off] [multicast on|off]\n"
159//usage:#define iplink_full_usage "\n\n" 159//usage: " [promisc on|off] [mtu NUM] [name NAME] [qlen NUM] [address MAC]"
160//usage: "iplink set IFACE [up|down] [arp on|off] [multicast on|off] [promisc on|off]\n" 160// * short help shows only "set" command, long help continues (with just one "\n")
161//usage: " [mtu NUM] [name NAME] [qlen NUM] [address MAC]\n" 161// * and shows all other commands:
162//usage:#define iplink_full_usage "\n"
163//usage: "iplink add [link IFACE] IFACE [address MAC] type TYPE [ARGS]\n"
164//usage: "iplink delete IFACE type TYPE [ARGS]\n"
165//usage: " TYPE ARGS := vlan VLANARGS | vrf table NUM\n"
166//usage: " VLANARGS := id VLANID [protocol 802.1q|802.1ad] [reorder_hdr on|off]\n"
167//usage: " [gvrp on|off] [mvrp on|off] [loose_binding on|off]\n"
162//usage: "iplink show [IFACE]" 168//usage: "iplink show [IFACE]"
169//upstream man ip-link:
170//=====================
171//ip link add [link DEV] [ name ] NAME
172// [ txqueuelen PACKETS ]
173// [ address LLADDR ]
174// [ broadcast LLADDR ]
175// [ mtu MTU ] [index IDX ]
176// [ numtxqueues QUEUE_COUNT ]
177// [ numrxqueues QUEUE_COUNT ]
178// type TYPE [ ARGS ]
179// ip link delete { DEVICE | dev DEVICE | group DEVGROUP } type TYPE [ ARGS ]
180// ip link set { DEVICE | dev DEVICE | group DEVGROUP } [ { up | down } ]
181// [ arp { on | off } ]
182// [ dynamic { on | off } ]
183// [ multicast { on | off } ]
184// [ allmulticast { on | off } ]
185// [ promisc { on | off } ]
186// [ trailers { on | off } ]
187// [ txqueuelen PACKETS ]
188// [ name NEWNAME ]
189// [ address LLADDR ]
190// [ broadcast LLADDR ]
191// [ mtu MTU ]
192// [ netns { PID | NAME } ]
193// [ link-netnsid ID ]
194// [ alias NAME ]
195// [ vf NUM [ mac LLADDR ]
196// [ vlan VLANID [ qos VLAN-QOS ] ]
197// [ rate TXRATE ]
198// [ spoofchk { on | off} ]
199// [ query_rss { on | off} ]
200// [ state { auto | enable | disable} ] ]
201// [ trust { on | off} ] ]
202// [ master DEVICE ]
203// [ nomaster ]
204// [ addrgenmode { eui64 | none | stable_secret | random } ]
205// [ protodown { on | off } ]
206// ip link show [ DEVICE | group GROUP ] [up] [master DEV] [type TYPE]
207// ip link help [ TYPE ]
208//TYPE := { vlan | veth | vcan | dummy | ifb | macvlan | macvtap |
209// bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan |
210// gre | gretap | ip6gre | ip6gretap | vti | nlmon |
211// bond_slave | ipvlan | geneve | bridge_slave | vrf }
163//usage: 212//usage:
164//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79 213//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
165//usage:#define iproute_trivial_usage 214//usage:#define iproute_trivial_usage
diff --git a/networking/libiproute/iplink.c b/networking/libiproute/iplink.c
index f38fba055..312283318 100644
--- a/networking/libiproute/iplink.c
+++ b/networking/libiproute/iplink.c
@@ -525,6 +525,24 @@ static void vlan_parse_opt(char **argv, struct nlmsghdr *n, unsigned int size)
525 addattr_l(n, size, IFLA_VLAN_FLAGS, &flags, sizeof(flags)); 525 addattr_l(n, size, IFLA_VLAN_FLAGS, &flags, sizeof(flags));
526} 526}
527 527
528static void vrf_parse_opt(char **argv, struct nlmsghdr *n, unsigned int size)
529{
530/* IFLA_VRF_TABLE is an enum, not a define -
531 * can't test "defined(IFLA_VRF_TABLE)".
532 */
533#if !defined(IFLA_VRF_MAX)
534# define IFLA_VRF_TABLE 1
535#endif
536 uint32_t table;
537
538 if (strcmp(*argv, "table") != 0)
539 invarg_1_to_2(*argv, "type vrf");
540
541 NEXT_ARG();
542 table = get_u32(*argv, "table");
543 addattr_l(n, size, IFLA_VRF_TABLE, &table, sizeof(table));
544}
545
528#ifndef NLMSG_TAIL 546#ifndef NLMSG_TAIL
529#define NLMSG_TAIL(nmsg) \ 547#define NLMSG_TAIL(nmsg) \
530 ((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len))) 548 ((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))
@@ -563,6 +581,8 @@ static int do_add_or_delete(char **argv, const unsigned rtm)
563 if (rtm == RTM_NEWLINK) 581 if (rtm == RTM_NEWLINK)
564 req.n.nlmsg_flags |= NLM_F_CREATE|NLM_F_EXCL; 582 req.n.nlmsg_flags |= NLM_F_CREATE|NLM_F_EXCL;
565 583
584 /* NB: update iplink_full_usage if you extend this code */
585
566 while (*argv) { 586 while (*argv) {
567 arg = index_in_substrings(keywords, *argv); 587 arg = index_in_substrings(keywords, *argv);
568 if (arg == ARG_type) { 588 if (arg == ARG_type) {
@@ -582,7 +602,7 @@ static int do_add_or_delete(char **argv, const unsigned rtm)
582 } else if (arg == ARG_address) { 602 } else if (arg == ARG_address) {
583 NEXT_ARG(); 603 NEXT_ARG();
584 address_str = *argv; 604 address_str = *argv;
585 dbg("address_str:'%s'", name_str); 605 dbg("address_str:'%s'", address_str);
586 } else { 606 } else {
587 if (arg == ARG_dev) { 607 if (arg == ARG_dev) {
588 if (dev_str) 608 if (dev_str)
@@ -609,6 +629,8 @@ static int do_add_or_delete(char **argv, const unsigned rtm)
609 629
610 if (strcmp(type_str, "vlan") == 0) 630 if (strcmp(type_str, "vlan") == 0)
611 vlan_parse_opt(argv, &req.n, sizeof(req)); 631 vlan_parse_opt(argv, &req.n, sizeof(req));
632 else if (strcmp(type_str, "vrf") == 0)
633 vrf_parse_opt(argv, &req.n, sizeof(req));
612 634
613 data->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)data; 635 data->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)data;
614 } 636 }