diff options
author | Jan Luebbe <jluebbe@debian.org> | 2018-02-20 19:28:02 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-02-20 19:29:05 +0100 |
commit | 79cda9522ad390f1bdb7ba1025b1c81bbd1613e6 (patch) | |
tree | 3b990f1e4c9f948e1340221788671130c29fb51a | |
parent | b083e8cc538ba6b27e19da541ca6a0f7ceb7daee (diff) | |
download | busybox-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.c | 57 | ||||
-rw-r--r-- | networking/libiproute/iplink.c | 24 |
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 | ||
528 | static 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 | } |