[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox-cvs
Subject:    [git commit] tc: fix for parsing of "dev IFACE" and printing of "class list"
From:       Denys Vlasenko <vda.linux () googlemail ! com>
Date:       2021-07-11 12:50:04
Message-ID: 20210711121954.28A499547C () busybox ! osuosl ! org
[Download RAW message or body]

commit: https://git.busybox.net/busybox/commit/?id=f5f336e787fd8367d24de5fe3b341ebffb74c2c2
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

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>
---
 networking/tc.c | 42 ++++++++++++++++++++++--------------------
 1 file 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)
 #if 0 /* IMPOSSIBLE */
 	if (cid == TC_H_ROOT)
 		return xasprintf("root");
-	else
 #endif
 	if (cid == TC_H_UNSPEC)
 		return xasprintf("none");
-	else if (TC_H_MAJ(cid) == 0)
+	if (TC_H_MAJ(cid) == 0)
 		return xasprintf(":%x", TC_H_MIN(cid));
-	else if (TC_H_MIN(cid) == 0)
+	if (TC_H_MIN(cid) == 0)
 		return xasprintf("%x:", TC_H_MAJ(cid)>>16);
-	else
-		return xasprintf("%x:%x", TC_H_MAJ(cid)>>16, TC_H_MIN(cid));
+	return xasprintf("%x:%x", TC_H_MAJ(cid)>>16, TC_H_MIN(cid));
 }
 
 /* Get a qdisc handle.  Return 0 on success, !0 otherwise.  */
@@ -376,8 +374,10 @@ static FAST_FUNC int print_qdisc(
 			prio_print_opt(tb[TCA_OPTIONS]);
 		} else if (qqq == 1) { /* class based queuing */
 			cbq_print_opt(tb[TCA_OPTIONS]);
-		} else
-			bb_error_msg("unknown %s", name);
+		} else {
+			/* don't know how to print options for this qdisc */
+			printf("(options for %s)", name);
+		}
 	}
 	bb_putchar('\n');
 	return 0;
@@ -405,7 +405,7 @@ static FAST_FUNC int print_class(
 		return -1;
 	}
 	/* not the desired interface? */
-	if (filter_qdisc && TC_H_MAJ(msg->tcm_handle^filter_qdisc))
+	if (filter_qdisc && TC_H_MAJ(msg->tcm_handle ^ filter_qdisc))
 		return 0;
 	memset (tb, 0, sizeof(tb));
 	parse_rtattr(tb, TCA_MAX, TCA_RTA(msg), len);
@@ -418,8 +418,8 @@ static FAST_FUNC int print_class(
 
 	name = (char*)RTA_DATA(tb[TCA_KIND]);
 	classid = !msg->tcm_handle ? NULL : print_tc_classid(
-				filter_qdisc ? TC_H_MIN(msg->tcm_parent) : msg->tcm_parent);
-	printf ("class %s %s", name, classid);
+				filter_qdisc ? TC_H_MIN(msg->tcm_handle) : msg->tcm_handle);
+	printf ("class %s %s ", name, classid);
 	if (ENABLE_FEATURE_CLEAN_UP)
 		free(classid);
 
@@ -445,8 +445,10 @@ static FAST_FUNC int print_class(
 		} else if (qqq == 1) { /* class based queuing */
 			/* cbq_print_copt() is identical to cbq_print_opt(). */
 			cbq_print_opt(tb[TCA_OPTIONS]);
-		} else
-			bb_error_msg("unknown %s", name);
+		} else {
+			/* don't know how to print options for this class */
+			printf("(options for %s)", name);
+		}
 	}
 	bb_putchar('\n');
 
@@ -511,12 +513,11 @@ int tc_main(int argc UNUSED_PARAM, char **argv)
 	ret = EXIT_SUCCESS;
 
 	obj = index_in_substrings(objects, *argv++);
-
 	if (obj < 0)
 		bb_show_usage();
-	if (!*argv)
-		cmd = CMD_show; /* list is the default */
-	else {
+
+	cmd = CMD_show; /* list (aka show) is the default */
+	if (*argv) {
 		cmd = index_in_substrings(commands, *argv);
 		if (cmd < 0)
 			invarg_1_to_2(*argv, argv[-1]);
@@ -538,16 +539,17 @@ int tc_main(int argc UNUSED_PARAM, char **argv)
 			msg.tcm_ifindex = xll_name_to_index(dev);
 			if (cmd >= CMD_show)
 				filter_ifindex = msg.tcm_ifindex;
-		} else
-		if ((arg == ARG_qdisc && obj == OBJ_class && cmd >= CMD_show)
-		 || (arg == ARG_handle && obj == OBJ_qdisc && cmd == CMD_change)
+			continue;
+		}
+		if ((arg == ARG_qdisc && obj == OBJ_class && cmd >= CMD_show)    /* tc class show|list qdisc HANDLE */
+		 || (arg == ARG_handle && obj == OBJ_qdisc && cmd == CMD_change) /* tc qdisc change handle HANDLE */
 		) {
 			NEXT_ARG();
 			/* We don't care about duparg2("qdisc handle",*argv) for now */
 			if (get_qdisc_handle(&filter_qdisc, *argv))
 				invarg_1_to_2(*argv, "qdisc");
 		} else
-		if (obj != OBJ_qdisc
+		if (obj != OBJ_qdisc /* tc class|filter root|parent | tc filter preference|priority|protocol */
 		 && (arg == ARG_root
 		    || arg == ARG_parent
 		    || (obj == OBJ_filter && arg >= ARG_pref)
_______________________________________________
busybox-cvs mailing list
busybox-cvs@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox-cvs
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic