aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2017-04-06 15:55:29 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2017-04-06 15:55:29 +0200
commita7386bb35b474987f0e82337b7fe524220336d32 (patch)
tree13df04c6938ddcc20b2e7c2f4749539147d7caa6
parent4f0b540d08f5912b273c427218cc665512b12de5 (diff)
downloadbusybox-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.c7
-rw-r--r--networking/libiproute/iplink.c309
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 */
56static int get_ctl_fd(void) 59static 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 */
682int FAST_FUNC do_iplink(char **argv) 661int FAST_FUNC do_iplink(char **argv)
683{ 662{