From 720a2e8d990707749b2cafa77ab3cd2b8241ec47 Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Wed, 18 Jul 2007 11:49:55 +0200 Subject: [PATCH] TC action parsing bug fix > > Is it a bug that: > > # tc filter add dev eth0 parent 1: protocol ip prio 0 handle 0xfffffff > fw police rate 1 burst 1 mpu 0 mtu 1 action drop > ^^^^^^^^^^^ > creates a filter that looks like: > > # tc filter ls dev eth0 > filter parent 1: protocol ip pref 49152 fw > filter parent 1: protocol ip pref 49152 fw handle 0xfffffff police 0x1 > rate 0bit burst 0b mtu 1b action reclassify > ^^^^^^^^^^^^^^^^^ > ref -543190236 bind 4 > > (which reclassifies and thus lets 0xfffffff-marked packets through). > > I'm pretty sure this used to work under 2.4.x (though I no longer have a > 2.4 box to test with), but it hasn't worked on any of the 2.6.x kernels > I've tried (with both iproute2-ss060323 and 070710). Good catch. It seems this is merely a parsing error, iproute doesn't have an "action" parameter and aborts parsing, so it uses the default value of "RECLASSIFY". It never had this parameter, so this patch removes it from the help text and makes it return an error. --- tc/m_police.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tc/m_police.c b/tc/m_police.c index 36a7719d9..62e37f9dc 100644 --- a/tc/m_police.c +++ b/tc/m_police.c @@ -37,7 +37,7 @@ static void usage(void) fprintf(stderr, "Usage: ... police rate BPS burst BYTES[/BYTES] [ mtu BYTES[/BYTES] ]\n"); fprintf(stderr, " [ peakrate BPS ] [ avrate BPS ]\n"); fprintf(stderr, " [ ACTIONTERM ]\n"); - fprintf(stderr, "Old Syntax ACTIONTERM := action [/NOTEXCEEDACT] \n"); + fprintf(stderr, "Old Syntax ACTIONTERM := [/NOTEXCEEDACT] \n"); fprintf(stderr, "New Syntax ACTIONTERM := conform-exceed [/NOTEXCEEDACT] \n"); fprintf(stderr, "Where: *EXCEEDACT := pipe | ok | reclassify | drop | continue \n"); fprintf(stderr, "Where: pipe is only valid for new syntax \n"); @@ -236,7 +236,8 @@ int act_parse_police(struct action_util *a,int *argc_p, char ***argv_p, int tca_ } else if (strcmp(*argv, "help") == 0) { usage(); } else { - break; + fprintf(stderr, "What is \"%s\"?\n", *argv); + return -1; } ok++; argc--; argv++; -- 2.47.2