diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-04-06 15:55:29 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-04-06 15:55:29 +0200 |
commit | a7386bb35b474987f0e82337b7fe524220336d32 (patch) | |
tree | 13df04c6938ddcc20b2e7c2f4749539147d7caa6 | |
parent | 4f0b540d08f5912b273c427218cc665512b12de5 (diff) | |
download | busybox-w32-a7386bb35b474987f0e82337b7fe524220336d32.tar.gz busybox-w32-a7386bb35b474987f0e82337b7fe524220336d32.tar.bz2 busybox-w32-a7386bb35b474987f0e82337b7fe524220336d32.zip |
ip link: tidying up
Misplaced comment. --help was wrong: dynamic on|off is not supported.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | networking/ip.c | 7 | ||||
-rw-r--r-- | networking/libiproute/iplink.c | 309 |
2 files changed, 146 insertions, 170 deletions
diff --git a/networking/ip.c b/networking/ip.c index 0f52b19dd..620795881 100644 --- a/networking/ip.c +++ b/networking/ip.c | |||
@@ -154,11 +154,8 @@ | |||
154 | //usage:#define iplink_trivial_usage | 154 | //usage:#define iplink_trivial_usage |
155 | //usage: "set IFACE [up|down] [arp on|off] | show [IFACE]" | 155 | //usage: "set IFACE [up|down] [arp on|off] | show [IFACE]" |
156 | //usage:#define iplink_full_usage "\n\n" | 156 | //usage:#define iplink_full_usage "\n\n" |
157 | //usage: "iplink set IFACE [up|down]\n" | 157 | //usage: "iplink set IFACE [up|down] [arp on|off] [multicast on|off] [mtu MTU]\n" |
158 | //usage: " [arp on|off]\n" | 158 | //usage: " [name NAME] [qlen NUM] [address MAC]\n" |
159 | //usage: " [dynamic on|off]\n" | ||
160 | //usage: " [multicast on|off]\n" | ||
161 | //usage: " [mtu MTU]\n" | ||
162 | //usage: "iplink show [IFACE]" | 159 | //usage: "iplink show [IFACE]" |
163 | //usage: | 160 | //usage: |
164 | //usage:#define iproute_trivial_usage | 161 | //usage:#define iproute_trivial_usage |
diff --git a/networking/libiproute/iplink.c b/networking/libiproute/iplink.c index ae3ef0ceb..f00c40215 100644 --- a/networking/libiproute/iplink.c +++ b/networking/libiproute/iplink.c | |||
@@ -52,6 +52,9 @@ struct ifla_vlan_flags { | |||
52 | # define dbg(...) ((void)0) | 52 | # define dbg(...) ((void)0) |
53 | #endif | 53 | #endif |
54 | 54 | ||
55 | |||
56 | #define str_on_off "on\0""off\0" | ||
57 | |||
55 | /* Exits on error */ | 58 | /* Exits on error */ |
56 | static int get_ctl_fd(void) | 59 | static int get_ctl_fd(void) |
57 | { | 60 | { |
@@ -204,12 +207,14 @@ static int do_set(char **argv) | |||
204 | struct ifreq ifr0, ifr1; | 207 | struct ifreq ifr0, ifr1; |
205 | char *newname = NULL; | 208 | char *newname = NULL; |
206 | int htype, halen; | 209 | int htype, halen; |
210 | /* If you add stuff here, update iplink_full_usage */ | ||
207 | static const char keywords[] ALIGN1 = | 211 | static const char keywords[] ALIGN1 = |
208 | "up\0""down\0""name\0""mtu\0""qlen\0""multicast\0" | 212 | "up\0""down\0""name\0""mtu\0""qlen\0""multicast\0" |
209 | "arp\0""address\0""dev\0"; | 213 | "arp\0""address\0" |
214 | "dev\0" /* must be last */; | ||
210 | enum { ARG_up = 0, ARG_down, ARG_name, ARG_mtu, ARG_qlen, ARG_multicast, | 215 | enum { ARG_up = 0, ARG_down, ARG_name, ARG_mtu, ARG_qlen, ARG_multicast, |
211 | ARG_arp, ARG_addr, ARG_dev }; | 216 | ARG_arp, ARG_addr, |
212 | static const char str_on_off[] ALIGN1 = "on\0""off\0"; | 217 | ARG_dev }; |
213 | enum { PARM_on = 0, PARM_off }; | 218 | enum { PARM_on = 0, PARM_off }; |
214 | smalluint key; | 219 | smalluint key; |
215 | 220 | ||
@@ -240,6 +245,7 @@ static int do_set(char **argv) | |||
240 | NEXT_ARG(); | 245 | NEXT_ARG(); |
241 | newaddr = *argv; | 246 | newaddr = *argv; |
242 | } else if (key >= ARG_dev) { | 247 | } else if (key >= ARG_dev) { |
248 | /* ^^^^^^ ">=" here results in "dev IFACE" treated as default */ | ||
243 | if (key == ARG_dev) { | 249 | if (key == ARG_dev) { |
244 | NEXT_ARG(); | 250 | NEXT_ARG(); |
245 | } | 251 | } |
@@ -247,6 +253,7 @@ static int do_set(char **argv) | |||
247 | duparg2("dev", *argv); | 253 | duparg2("dev", *argv); |
248 | dev = *argv; | 254 | dev = *argv; |
249 | } else { | 255 | } else { |
256 | /* "on|off" options */ | ||
250 | int param; | 257 | int param; |
251 | NEXT_ARG(); | 258 | NEXT_ARG(); |
252 | param = index_in_strings(str_on_off, *argv); | 259 | param = index_in_strings(str_on_off, *argv); |
@@ -268,6 +275,140 @@ static int do_set(char **argv) | |||
268 | flags |= IFF_NOARP; | 275 | flags |= IFF_NOARP; |
269 | } | 276 | } |
270 | } | 277 | } |
278 | |||
279 | /* Other keywords recognized by iproute2-3.12.0: */ | ||
280 | #if 0 | ||
281 | } else if (matches(*argv, "broadcast") == 0 || | ||
282 | strcmp(*argv, "brd") == 0) { | ||
283 | NEXT_ARG(); | ||
284 | len = ll_addr_a2n(abuf, sizeof(abuf), *argv); | ||
285 | if (len < 0) | ||
286 | return -1; | ||
287 | addattr_l(&req->n, sizeof(*req), IFLA_BROADCAST, abuf, len); | ||
288 | } else if (matches(*argv, "txqueuelen") == 0 || | ||
289 | strcmp(*argv, "qlen") == 0 || | ||
290 | matches(*argv, "txqlen") == 0) { | ||
291 | NEXT_ARG(); | ||
292 | if (qlen != -1) | ||
293 | duparg("txqueuelen", *argv); | ||
294 | if (get_integer(&qlen, *argv, 0)) | ||
295 | invarg_1_to_2(*argv, "txqueuelen"); | ||
296 | addattr_l(&req->n, sizeof(*req), IFLA_TXQLEN, &qlen, 4); | ||
297 | } else if (strcmp(*argv, "netns") == 0) { | ||
298 | NEXT_ARG(); | ||
299 | if (netns != -1) | ||
300 | duparg("netns", *argv); | ||
301 | if ((netns = get_netns_fd(*argv)) >= 0) | ||
302 | addattr_l(&req->n, sizeof(*req), IFLA_NET_NS_FD, &netns, 4); | ||
303 | else if (get_integer(&netns, *argv, 0) == 0) | ||
304 | addattr_l(&req->n, sizeof(*req), IFLA_NET_NS_PID, &netns, 4); | ||
305 | else | ||
306 | invarg_1_to_2(*argv, "netns"); | ||
307 | } else if (strcmp(*argv, "allmulticast") == 0) { | ||
308 | NEXT_ARG(); | ||
309 | req->i.ifi_change |= IFF_ALLMULTI; | ||
310 | if (strcmp(*argv, "on") == 0) { | ||
311 | req->i.ifi_flags |= IFF_ALLMULTI; | ||
312 | } else if (strcmp(*argv, "off") == 0) { | ||
313 | req->i.ifi_flags &= ~IFF_ALLMULTI; | ||
314 | } else | ||
315 | return on_off("allmulticast", *argv); | ||
316 | } else if (strcmp(*argv, "promisc") == 0) { | ||
317 | NEXT_ARG(); | ||
318 | req->i.ifi_change |= IFF_PROMISC; | ||
319 | if (strcmp(*argv, "on") == 0) { | ||
320 | req->i.ifi_flags |= IFF_PROMISC; | ||
321 | } else if (strcmp(*argv, "off") == 0) { | ||
322 | req->i.ifi_flags &= ~IFF_PROMISC; | ||
323 | } else | ||
324 | return on_off("promisc", *argv); | ||
325 | } else if (strcmp(*argv, "trailers") == 0) { | ||
326 | NEXT_ARG(); | ||
327 | req->i.ifi_change |= IFF_NOTRAILERS; | ||
328 | if (strcmp(*argv, "off") == 0) { | ||
329 | req->i.ifi_flags |= IFF_NOTRAILERS; | ||
330 | } else if (strcmp(*argv, "on") == 0) { | ||
331 | req->i.ifi_flags &= ~IFF_NOTRAILERS; | ||
332 | } else | ||
333 | return on_off("trailers", *argv); | ||
334 | } else if (strcmp(*argv, "vf") == 0) { | ||
335 | struct rtattr *vflist; | ||
336 | NEXT_ARG(); | ||
337 | if (get_integer(&vf, *argv, 0)) { | ||
338 | invarg_1_to_2(*argv, "vf"); | ||
339 | } | ||
340 | vflist = addattr_nest(&req->n, sizeof(*req), | ||
341 | IFLA_VFINFO_LIST); | ||
342 | len = iplink_parse_vf(vf, &argc, &argv, req); | ||
343 | if (len < 0) | ||
344 | return -1; | ||
345 | addattr_nest_end(&req->n, vflist); | ||
346 | } else if (matches(*argv, "master") == 0) { | ||
347 | int ifindex; | ||
348 | NEXT_ARG(); | ||
349 | ifindex = ll_name_to_index(*argv); | ||
350 | if (!ifindex) | ||
351 | invarg_1_to_2(*argv, "master"); | ||
352 | addattr_l(&req->n, sizeof(*req), IFLA_MASTER, | ||
353 | &ifindex, 4); | ||
354 | } else if (matches(*argv, "nomaster") == 0) { | ||
355 | int ifindex = 0; | ||
356 | addattr_l(&req->n, sizeof(*req), IFLA_MASTER, | ||
357 | &ifindex, 4); | ||
358 | } else if (matches(*argv, "dynamic") == 0) { | ||
359 | NEXT_ARG(); | ||
360 | req->i.ifi_change |= IFF_DYNAMIC; | ||
361 | if (strcmp(*argv, "on") == 0) { | ||
362 | req->i.ifi_flags |= IFF_DYNAMIC; | ||
363 | } else if (strcmp(*argv, "off") == 0) { | ||
364 | req->i.ifi_flags &= ~IFF_DYNAMIC; | ||
365 | } else | ||
366 | return on_off("dynamic", *argv); | ||
367 | } else if (matches(*argv, "alias") == 0) { | ||
368 | NEXT_ARG(); | ||
369 | addattr_l(&req->n, sizeof(*req), IFLA_IFALIAS, | ||
370 | *argv, strlen(*argv)); | ||
371 | argc--; argv++; | ||
372 | break; | ||
373 | } else if (strcmp(*argv, "group") == 0) { | ||
374 | NEXT_ARG(); | ||
375 | if (*group != -1) | ||
376 | duparg("group", *argv); | ||
377 | if (rtnl_group_a2n(group, *argv)) | ||
378 | invarg_1_to_2(*argv, "group"); | ||
379 | } else if (strcmp(*argv, "mode") == 0) { | ||
380 | int mode; | ||
381 | NEXT_ARG(); | ||
382 | mode = get_link_mode(*argv); | ||
383 | if (mode < 0) | ||
384 | invarg_1_to_2(*argv, "mode"); | ||
385 | addattr8(&req->n, sizeof(*req), IFLA_LINKMODE, mode); | ||
386 | } else if (strcmp(*argv, "state") == 0) { | ||
387 | int state; | ||
388 | NEXT_ARG(); | ||
389 | state = get_operstate(*argv); | ||
390 | if (state < 0) | ||
391 | invarg_1_to_2(*argv, "state"); | ||
392 | addattr8(&req->n, sizeof(*req), IFLA_OPERSTATE, state); | ||
393 | } else if (matches(*argv, "numtxqueues") == 0) { | ||
394 | NEXT_ARG(); | ||
395 | if (numtxqueues != -1) | ||
396 | duparg("numtxqueues", *argv); | ||
397 | if (get_integer(&numtxqueues, *argv, 0)) | ||
398 | invarg_1_to_2(*argv, "numtxqueues"); | ||
399 | addattr_l(&req->n, sizeof(*req), IFLA_NUM_TX_QUEUES, | ||
400 | &numtxqueues, 4); | ||
401 | } else if (matches(*argv, "numrxqueues") == 0) { | ||
402 | NEXT_ARG(); | ||
403 | if (numrxqueues != -1) | ||
404 | duparg("numrxqueues", *argv); | ||
405 | if (get_integer(&numrxqueues, *argv, 0)) | ||
406 | invarg_1_to_2(*argv, "numrxqueues"); | ||
407 | addattr_l(&req->n, sizeof(*req), IFLA_NUM_RX_QUEUES, | ||
408 | &numrxqueues, 4); | ||
409 | } | ||
410 | #endif | ||
411 | |||
271 | argv++; | 412 | argv++; |
272 | } | 413 | } |
273 | 414 | ||
@@ -322,10 +463,6 @@ static void vlan_parse_opt(char **argv, struct nlmsghdr *n, unsigned int size) | |||
322 | "802.1q\0" | 463 | "802.1q\0" |
323 | "802.1ad\0" | 464 | "802.1ad\0" |
324 | ; | 465 | ; |
325 | static const char str_on_off[] ALIGN1 = | ||
326 | "on\0" | ||
327 | "off\0" | ||
328 | ; | ||
329 | enum { | 466 | enum { |
330 | ARG_id = 0, | 467 | ARG_id = 0, |
331 | ARG_reorder_hdr, | 468 | ARG_reorder_hdr, |
@@ -520,164 +657,6 @@ static int do_add_or_delete(char **argv, const unsigned rtm) | |||
520 | return 0; | 657 | return 0; |
521 | } | 658 | } |
522 | 659 | ||
523 | /* Other keywords recognized by iproute2-3.12.0: */ | ||
524 | #if 0 | ||
525 | } else if (matches(*argv, "broadcast") == 0 || | ||
526 | strcmp(*argv, "brd") == 0) { | ||
527 | NEXT_ARG(); | ||
528 | len = ll_addr_a2n(abuf, sizeof(abuf), *argv); | ||
529 | if (len < 0) | ||
530 | return -1; | ||
531 | addattr_l(&req->n, sizeof(*req), IFLA_BROADCAST, abuf, len); | ||
532 | } else if (matches(*argv, "txqueuelen") == 0 || | ||
533 | strcmp(*argv, "qlen") == 0 || | ||
534 | matches(*argv, "txqlen") == 0) { | ||
535 | NEXT_ARG(); | ||
536 | if (qlen != -1) | ||
537 | duparg("txqueuelen", *argv); | ||
538 | if (get_integer(&qlen, *argv, 0)) | ||
539 | invarg_1_to_2(*argv, "txqueuelen"); | ||
540 | addattr_l(&req->n, sizeof(*req), IFLA_TXQLEN, &qlen, 4); | ||
541 | } else if (strcmp(*argv, "mtu") == 0) { | ||
542 | NEXT_ARG(); | ||
543 | if (mtu != -1) | ||
544 | duparg("mtu", *argv); | ||
545 | if (get_integer(&mtu, *argv, 0)) | ||
546 | invarg_1_to_2(*argv, "mtu"); | ||
547 | addattr_l(&req->n, sizeof(*req), IFLA_MTU, &mtu, 4); | ||
548 | } else if (strcmp(*argv, "netns") == 0) { | ||
549 | NEXT_ARG(); | ||
550 | if (netns != -1) | ||
551 | duparg("netns", *argv); | ||
552 | if ((netns = get_netns_fd(*argv)) >= 0) | ||
553 | addattr_l(&req->n, sizeof(*req), IFLA_NET_NS_FD, &netns, 4); | ||
554 | else if (get_integer(&netns, *argv, 0) == 0) | ||
555 | addattr_l(&req->n, sizeof(*req), IFLA_NET_NS_PID, &netns, 4); | ||
556 | else | ||
557 | invarg_1_to_2(*argv, "netns"); | ||
558 | } else if (strcmp(*argv, "multicast") == 0) { | ||
559 | NEXT_ARG(); | ||
560 | req->i.ifi_change |= IFF_MULTICAST; | ||
561 | if (strcmp(*argv, "on") == 0) { | ||
562 | req->i.ifi_flags |= IFF_MULTICAST; | ||
563 | } else if (strcmp(*argv, "off") == 0) { | ||
564 | req->i.ifi_flags &= ~IFF_MULTICAST; | ||
565 | } else | ||
566 | return on_off("multicast", *argv); | ||
567 | } else if (strcmp(*argv, "allmulticast") == 0) { | ||
568 | NEXT_ARG(); | ||
569 | req->i.ifi_change |= IFF_ALLMULTI; | ||
570 | if (strcmp(*argv, "on") == 0) { | ||
571 | req->i.ifi_flags |= IFF_ALLMULTI; | ||
572 | } else if (strcmp(*argv, "off") == 0) { | ||
573 | req->i.ifi_flags &= ~IFF_ALLMULTI; | ||
574 | } else | ||
575 | return on_off("allmulticast", *argv); | ||
576 | } else if (strcmp(*argv, "promisc") == 0) { | ||
577 | NEXT_ARG(); | ||
578 | req->i.ifi_change |= IFF_PROMISC; | ||
579 | if (strcmp(*argv, "on") == 0) { | ||
580 | req->i.ifi_flags |= IFF_PROMISC; | ||
581 | } else if (strcmp(*argv, "off") == 0) { | ||
582 | req->i.ifi_flags &= ~IFF_PROMISC; | ||
583 | } else | ||
584 | return on_off("promisc", *argv); | ||
585 | } else if (strcmp(*argv, "trailers") == 0) { | ||
586 | NEXT_ARG(); | ||
587 | req->i.ifi_change |= IFF_NOTRAILERS; | ||
588 | if (strcmp(*argv, "off") == 0) { | ||
589 | req->i.ifi_flags |= IFF_NOTRAILERS; | ||
590 | } else if (strcmp(*argv, "on") == 0) { | ||
591 | req->i.ifi_flags &= ~IFF_NOTRAILERS; | ||
592 | } else | ||
593 | return on_off("trailers", *argv); | ||
594 | } else if (strcmp(*argv, "arp") == 0) { | ||
595 | NEXT_ARG(); | ||
596 | req->i.ifi_change |= IFF_NOARP; | ||
597 | if (strcmp(*argv, "on") == 0) { | ||
598 | req->i.ifi_flags &= ~IFF_NOARP; | ||
599 | } else if (strcmp(*argv, "off") == 0) { | ||
600 | req->i.ifi_flags |= IFF_NOARP; | ||
601 | } else | ||
602 | return on_off("noarp", *argv); | ||
603 | } else if (strcmp(*argv, "vf") == 0) { | ||
604 | struct rtattr *vflist; | ||
605 | NEXT_ARG(); | ||
606 | if (get_integer(&vf, *argv, 0)) { | ||
607 | invarg_1_to_2(*argv, "vf"); | ||
608 | } | ||
609 | vflist = addattr_nest(&req->n, sizeof(*req), | ||
610 | IFLA_VFINFO_LIST); | ||
611 | len = iplink_parse_vf(vf, &argc, &argv, req); | ||
612 | if (len < 0) | ||
613 | return -1; | ||
614 | addattr_nest_end(&req->n, vflist); | ||
615 | } else if (matches(*argv, "master") == 0) { | ||
616 | int ifindex; | ||
617 | NEXT_ARG(); | ||
618 | ifindex = ll_name_to_index(*argv); | ||
619 | if (!ifindex) | ||
620 | invarg_1_to_2(*argv, "master"); | ||
621 | addattr_l(&req->n, sizeof(*req), IFLA_MASTER, | ||
622 | &ifindex, 4); | ||
623 | } else if (matches(*argv, "nomaster") == 0) { | ||
624 | int ifindex = 0; | ||
625 | addattr_l(&req->n, sizeof(*req), IFLA_MASTER, | ||
626 | &ifindex, 4); | ||
627 | } else if (matches(*argv, "dynamic") == 0) { | ||
628 | NEXT_ARG(); | ||
629 | req->i.ifi_change |= IFF_DYNAMIC; | ||
630 | if (strcmp(*argv, "on") == 0) { | ||
631 | req->i.ifi_flags |= IFF_DYNAMIC; | ||
632 | } else if (strcmp(*argv, "off") == 0) { | ||
633 | req->i.ifi_flags &= ~IFF_DYNAMIC; | ||
634 | } else | ||
635 | return on_off("dynamic", *argv); | ||
636 | } else if (matches(*argv, "alias") == 0) { | ||
637 | NEXT_ARG(); | ||
638 | addattr_l(&req->n, sizeof(*req), IFLA_IFALIAS, | ||
639 | *argv, strlen(*argv)); | ||
640 | argc--; argv++; | ||
641 | break; | ||
642 | } else if (strcmp(*argv, "group") == 0) { | ||
643 | NEXT_ARG(); | ||
644 | if (*group != -1) | ||
645 | duparg("group", *argv); | ||
646 | if (rtnl_group_a2n(group, *argv)) | ||
647 | invarg_1_to_2(*argv, "group"); | ||
648 | } else if (strcmp(*argv, "mode") == 0) { | ||
649 | int mode; | ||
650 | NEXT_ARG(); | ||
651 | mode = get_link_mode(*argv); | ||
652 | if (mode < 0) | ||
653 | invarg_1_to_2(*argv, "mode"); | ||
654 | addattr8(&req->n, sizeof(*req), IFLA_LINKMODE, mode); | ||
655 | } else if (strcmp(*argv, "state") == 0) { | ||
656 | int state; | ||
657 | NEXT_ARG(); | ||
658 | state = get_operstate(*argv); | ||
659 | if (state < 0) | ||
660 | invarg_1_to_2(*argv, "state"); | ||
661 | addattr8(&req->n, sizeof(*req), IFLA_OPERSTATE, state); | ||
662 | } else if (matches(*argv, "numtxqueues") == 0) { | ||
663 | NEXT_ARG(); | ||
664 | if (numtxqueues != -1) | ||
665 | duparg("numtxqueues", *argv); | ||
666 | if (get_integer(&numtxqueues, *argv, 0)) | ||
667 | invarg_1_to_2(*argv, "numtxqueues"); | ||
668 | addattr_l(&req->n, sizeof(*req), IFLA_NUM_TX_QUEUES, | ||
669 | &numtxqueues, 4); | ||
670 | } else if (matches(*argv, "numrxqueues") == 0) { | ||
671 | NEXT_ARG(); | ||
672 | if (numrxqueues != -1) | ||
673 | duparg("numrxqueues", *argv); | ||
674 | if (get_integer(&numrxqueues, *argv, 0)) | ||
675 | invarg_1_to_2(*argv, "numrxqueues"); | ||
676 | addattr_l(&req->n, sizeof(*req), IFLA_NUM_RX_QUEUES, | ||
677 | &numrxqueues, 4); | ||
678 | } | ||
679 | #endif | ||
680 | |||
681 | /* Return value becomes exitcode. It's okay to not return at all */ | 660 | /* Return value becomes exitcode. It's okay to not return at all */ |
682 | int FAST_FUNC do_iplink(char **argv) | 661 | int FAST_FUNC do_iplink(char **argv) |
683 | { | 662 | { |