Subject: Re: tc regression?

From: Patrick McHardy <[email-masked]>
Date: Mon, 23 Jun 2008 15:59:18 +0200

Patrick McHardy wrote:
> Badalian Vyacheslav wrote:
>> Hello all.
>>
>> Ditrib: Gentoo (i hope its not gentoo bug...)
>>
>> I try update package to "sys-apps/iproute2-2.6.25.20080417" and see 
>> that filter can't del filter...
>>
>> # tc filter show dev eth1 | grep 4:29:d1
>> filter parent 1: protocol ip pref 5 u32 fh 4:29:d1 order 209 key ht 4 
>> bkt 29 flowid 1:b7aa
>>
>> # tc filter del dev eth1 parent 1: pref 5 handle 4:29:d1 u32
>> RTNETLINK answers: Invalid argument
>> We have an error talking to the kernel
>>
>> after rollback to package"sys-apps/iproute2-2.6.24.20080108" all 
>> deleted normal...
> 
> The current iproute version uses "protocol all" by default
> if its not specified. This is actually only useful for creating
> new filters, on deletion an unset protocol is treated as wildcard.
> 
> Does this patch fix it?

Oops, buggy patch. This one should work.

diff --git a/tc/tc_filter.c b/tc/tc_filter.c
index db44dec..880b887 100644
--- a/tc/tc_filter.c
+++ b/tc/tc_filter.c
@@ -54,7 +54,7 @@ int tc_filter_modify(int cmd, unsigned flags, int argc, char **argv)
 	} req;
 	struct filter_util *q = NULL;
 	__u32 prio = 0;
-	__u32 protocol = ETH_P_ALL;
+	__u32 protocol = 0;
 	int protocol_set = 0;
 	char *fhandle = NULL;
 	char  d[16];
@@ -72,6 +72,9 @@ int tc_filter_modify(int cmd, unsigned flags, int argc, char **argv)
 	req.n.nlmsg_type = cmd;
 	req.t.tcm_family = AF_UNSPEC;
 
+	if (cmd == RTM_NEWTFILTER && flags & NLM_F_CREATE)
+		protocol = ETH_P_ALL;
+
 	while (argc > 0) {
 		if (strcmp(*argv, "dev") == 0) {
 			NEXT_ARG();