aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2021-07-11 14:50:04 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2021-07-11 14:50:04 +0200
commitf5f336e787fd8367d24de5fe3b341ebffb74c2c2 (patch)
tree513104ab2332a6db50471d82b99a5cc600c2170d
parent39aabfe8f033c9c62acf676b660dc979714d26a7 (diff)
downloadbusybox-w32-f5f336e787fd8367d24de5fe3b341ebffb74c2c2.tar.gz
busybox-w32-f5f336e787fd8367d24de5fe3b341ebffb74c2c2.tar.bz2
busybox-w32-f5f336e787fd8367d24de5fe3b341ebffb74c2c2.zip
tc: fix for parsing of "dev IFACE" and printing of "class list"
First part (parsing fix) is from Steffen Nurpmeso <steffen@sdaoden.eu> function old new delta .rodata 104120 104138 +18 print_qdisc 469 464 -5 tc_main 980 969 -11 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/2 up/down: 18/-16) Total: 2 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--networking/tc.c42
1 files changed, 22 insertions, 20 deletions
diff --git a/networking/tc.c b/networking/tc.c
index 510684443..46ad23d8b 100644
--- a/networking/tc.c
+++ b/networking/tc.c
@@ -111,16 +111,14 @@ static char* print_tc_classid(uint32_t cid)
111#if 0 /* IMPOSSIBLE */ 111#if 0 /* IMPOSSIBLE */
112 if (cid == TC_H_ROOT) 112 if (cid == TC_H_ROOT)
113 return xasprintf("root"); 113 return xasprintf("root");
114 else
115#endif 114#endif
116 if (cid == TC_H_UNSPEC) 115 if (cid == TC_H_UNSPEC)
117 return xasprintf("none"); 116 return xasprintf("none");
118 else if (TC_H_MAJ(cid) == 0) 117 if (TC_H_MAJ(cid) == 0)
119 return xasprintf(":%x", TC_H_MIN(cid)); 118 return xasprintf(":%x", TC_H_MIN(cid));
120 else if (TC_H_MIN(cid) == 0) 119 if (TC_H_MIN(cid) == 0)
121 return xasprintf("%x:", TC_H_MAJ(cid)>>16); 120 return xasprintf("%x:", TC_H_MAJ(cid)>>16);
122 else 121 return xasprintf("%x:%x", TC_H_MAJ(cid)>>16, TC_H_MIN(cid));
123 return xasprintf("%x:%x", TC_H_MAJ(cid)>>16, TC_H_MIN(cid));
124} 122}
125 123
126/* Get a qdisc handle. Return 0 on success, !0 otherwise. */ 124/* Get a qdisc handle. Return 0 on success, !0 otherwise. */
@@ -376,8 +374,10 @@ static FAST_FUNC int print_qdisc(
376 prio_print_opt(tb[TCA_OPTIONS]); 374 prio_print_opt(tb[TCA_OPTIONS]);
377 } else if (qqq == 1) { /* class based queuing */ 375 } else if (qqq == 1) { /* class based queuing */
378 cbq_print_opt(tb[TCA_OPTIONS]); 376 cbq_print_opt(tb[TCA_OPTIONS]);
379 } else 377 } else {
380 bb_error_msg("unknown %s", name); 378 /* don't know how to print options for this qdisc */
379 printf("(options for %s)", name);
380 }
381 } 381 }
382 bb_putchar('\n'); 382 bb_putchar('\n');
383 return 0; 383 return 0;
@@ -405,7 +405,7 @@ static FAST_FUNC int print_class(
405 return -1; 405 return -1;
406 } 406 }
407 /* not the desired interface? */ 407 /* not the desired interface? */
408 if (filter_qdisc && TC_H_MAJ(msg->tcm_handle^filter_qdisc)) 408 if (filter_qdisc && TC_H_MAJ(msg->tcm_handle ^ filter_qdisc))
409 return 0; 409 return 0;
410 memset (tb, 0, sizeof(tb)); 410 memset (tb, 0, sizeof(tb));
411 parse_rtattr(tb, TCA_MAX, TCA_RTA(msg), len); 411 parse_rtattr(tb, TCA_MAX, TCA_RTA(msg), len);
@@ -418,8 +418,8 @@ static FAST_FUNC int print_class(
418 418
419 name = (char*)RTA_DATA(tb[TCA_KIND]); 419 name = (char*)RTA_DATA(tb[TCA_KIND]);
420 classid = !msg->tcm_handle ? NULL : print_tc_classid( 420 classid = !msg->tcm_handle ? NULL : print_tc_classid(
421 filter_qdisc ? TC_H_MIN(msg->tcm_parent) : msg->tcm_parent); 421 filter_qdisc ? TC_H_MIN(msg->tcm_handle) : msg->tcm_handle);
422 printf ("class %s %s", name, classid); 422 printf ("class %s %s ", name, classid);
423 if (ENABLE_FEATURE_CLEAN_UP) 423 if (ENABLE_FEATURE_CLEAN_UP)
424 free(classid); 424 free(classid);
425 425
@@ -445,8 +445,10 @@ static FAST_FUNC int print_class(
445 } else if (qqq == 1) { /* class based queuing */ 445 } else if (qqq == 1) { /* class based queuing */
446 /* cbq_print_copt() is identical to cbq_print_opt(). */ 446 /* cbq_print_copt() is identical to cbq_print_opt(). */
447 cbq_print_opt(tb[TCA_OPTIONS]); 447 cbq_print_opt(tb[TCA_OPTIONS]);
448 } else 448 } else {
449 bb_error_msg("unknown %s", name); 449 /* don't know how to print options for this class */
450 printf("(options for %s)", name);
451 }
450 } 452 }
451 bb_putchar('\n'); 453 bb_putchar('\n');
452 454
@@ -511,12 +513,11 @@ int tc_main(int argc UNUSED_PARAM, char **argv)
511 ret = EXIT_SUCCESS; 513 ret = EXIT_SUCCESS;
512 514
513 obj = index_in_substrings(objects, *argv++); 515 obj = index_in_substrings(objects, *argv++);
514
515 if (obj < 0) 516 if (obj < 0)
516 bb_show_usage(); 517 bb_show_usage();
517 if (!*argv) 518
518 cmd = CMD_show; /* list is the default */ 519 cmd = CMD_show; /* list (aka show) is the default */
519 else { 520 if (*argv) {
520 cmd = index_in_substrings(commands, *argv); 521 cmd = index_in_substrings(commands, *argv);
521 if (cmd < 0) 522 if (cmd < 0)
522 invarg_1_to_2(*argv, argv[-1]); 523 invarg_1_to_2(*argv, argv[-1]);
@@ -538,16 +539,17 @@ int tc_main(int argc UNUSED_PARAM, char **argv)
538 msg.tcm_ifindex = xll_name_to_index(dev); 539 msg.tcm_ifindex = xll_name_to_index(dev);
539 if (cmd >= CMD_show) 540 if (cmd >= CMD_show)
540 filter_ifindex = msg.tcm_ifindex; 541 filter_ifindex = msg.tcm_ifindex;
541 } else 542 continue;
542 if ((arg == ARG_qdisc && obj == OBJ_class && cmd >= CMD_show) 543 }
543 || (arg == ARG_handle && obj == OBJ_qdisc && cmd == CMD_change) 544 if ((arg == ARG_qdisc && obj == OBJ_class && cmd >= CMD_show) /* tc class show|list qdisc HANDLE */
545 || (arg == ARG_handle && obj == OBJ_qdisc && cmd == CMD_change) /* tc qdisc change handle HANDLE */
544 ) { 546 ) {
545 NEXT_ARG(); 547 NEXT_ARG();
546 /* We don't care about duparg2("qdisc handle",*argv) for now */ 548 /* We don't care about duparg2("qdisc handle",*argv) for now */
547 if (get_qdisc_handle(&filter_qdisc, *argv)) 549 if (get_qdisc_handle(&filter_qdisc, *argv))
548 invarg_1_to_2(*argv, "qdisc"); 550 invarg_1_to_2(*argv, "qdisc");
549 } else 551 } else
550 if (obj != OBJ_qdisc 552 if (obj != OBJ_qdisc /* tc class|filter root|parent | tc filter preference|priority|protocol */
551 && (arg == ARG_root 553 && (arg == ARG_root
552 || arg == ARG_parent 554 || arg == ARG_parent
553 || (obj == OBJ_filter && arg >= ARG_pref) 555 || (obj == OBJ_filter && arg >= ARG_pref)