* iproute2 / match / meta bug?
@ 2008-07-29 5:43 Denys Fedoryshchenko
2008-07-29 5:54 ` Patrick McHardy
0 siblings, 1 reply; 8+ messages in thread
From: Denys Fedoryshchenko @ 2008-07-29 5:43 UTC (permalink / raw)
To: netdev; +Cc: Stephen Hemminger
Kernel 2.6.26, iproute2 latest release. All required modules is loaded.
What did i miss or doing wrong?
tc filter add dev ifb0 protocol all basic match "meta(rt_iif eq tap0)" classid 1:100
tc -s -d filter show dev ifb0
filter parent 1: protocol all pref 49152 basic
filter parent 1: protocol all pref 49152 basic handle 0x1 flowid 1:100
meta(-1 eq -1)
Whatever i try - it doesn't work
./tc filter add dev ifb0 protocol all basic match meta \(rt_iif eq tap0\) classid 1:100
But if i do
tc filter add dev ifb0 protocol all basic match u32\(u32 0x01020300 0xFFFFFF00 at 12\) classid 1:100
i will get everything "right"
filter parent 1: protocol all pref 49151 basic
filter parent 1: protocol all pref 49151 basic handle 0x1 flowid 1:100
u32(01020300/ffffff00 at 12)
Sure i will try to debug and find bug by myself, but i am not sure i can do that :-)
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: iproute2 / match / meta bug?
2008-07-29 5:43 iproute2 / match / meta bug? Denys Fedoryshchenko
@ 2008-07-29 5:54 ` Patrick McHardy
2008-07-29 6:11 ` Denys Fedoryshchenko
2008-07-29 6:18 ` Denys Fedoryshchenko
0 siblings, 2 replies; 8+ messages in thread
From: Patrick McHardy @ 2008-07-29 5:54 UTC (permalink / raw)
To: Denys Fedoryshchenko; +Cc: netdev, Stephen Hemminger
Denys Fedoryshchenko wrote:
> Kernel 2.6.26, iproute2 latest release. All required modules is loaded.
> What did i miss or doing wrong?
>
> tc filter add dev ifb0 protocol all basic match "meta(rt_iif eq tap0)" classid 1:100
>
> tc -s -d filter show dev ifb0
> filter parent 1: protocol all pref 49152 basic
> filter parent 1: protocol all pref 49152 basic handle 0x1 flowid 1:100
> meta(-1 eq -1)
>
> Whatever i try - it doesn't work
> ./tc filter add dev ifb0 protocol all basic match meta \(rt_iif eq tap0\) classid 1:100
>
You probably need to add support for skb->iif in case the
packet didn't went through IPv4.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: iproute2 / match / meta bug?
2008-07-29 5:54 ` Patrick McHardy
@ 2008-07-29 6:11 ` Denys Fedoryshchenko
2008-07-29 6:18 ` Patrick McHardy
2008-07-29 6:18 ` Denys Fedoryshchenko
1 sibling, 1 reply; 8+ messages in thread
From: Denys Fedoryshchenko @ 2008-07-29 6:11 UTC (permalink / raw)
To: Patrick McHardy; +Cc: netdev, Stephen Hemminger
Well, the issue not with ifb0 only. It is just not parsing rules correctly i think:
rich tc # ./tc filter add dev ifb0 protocol all basic match meta\(protocol eq 1234\) classid 1:100
rich tc # ./tc filter add dev ifb0 protocol all basic match meta\(data_len eq 1234\) classid 1:100
filter parent 1: protocol all pref 49151 basic
filter parent 1: protocol all pref 49151 basic handle 0x1 flowid 1:100
meta(-1 eq 1234)
filter parent 1: protocol all pref 49152 basic
filter parent 1: protocol all pref 49152 basic handle 0x1 flowid 1:100
meta(-1 eq 1234)
On Tuesday 29 July 2008, Patrick McHardy wrote:
> Denys Fedoryshchenko wrote:
> > Kernel 2.6.26, iproute2 latest release. All required modules is loaded.
> > What did i miss or doing wrong?
> >
> > tc filter add dev ifb0 protocol all basic match "meta(rt_iif eq tap0)" classid 1:100
> >
> > tc -s -d filter show dev ifb0
> > filter parent 1: protocol all pref 49152 basic
> > filter parent 1: protocol all pref 49152 basic handle 0x1 flowid 1:100
> > meta(-1 eq -1)
> >
> > Whatever i try - it doesn't work
> > ./tc filter add dev ifb0 protocol all basic match meta \(rt_iif eq tap0\) classid 1:100
> >
>
> You probably need to add support for skb->iif in case the
> packet didn't went through IPv4.
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: iproute2 / match / meta bug?
2008-07-29 5:54 ` Patrick McHardy
2008-07-29 6:11 ` Denys Fedoryshchenko
@ 2008-07-29 6:18 ` Denys Fedoryshchenko
1 sibling, 0 replies; 8+ messages in thread
From: Denys Fedoryshchenko @ 2008-07-29 6:18 UTC (permalink / raw)
To: Patrick McHardy; +Cc: netdev, Stephen Hemminger
Code is a bit out of my understanding, but
tc/em_meta.c
num = bstrtoul(arg);
if (num != LONG_MAX) {
obj->kind = TCF_META_TYPE_INT << 12;
obj->kind |= TCF_META_ID_VALUE;
*dst = (unsigned long) num;
return bstr_next(arg);
}
num is always -1 in my case
If i change
num = bstrtoul(arg);
if (num != -1) {
obj->kind = TCF_META_TYPE_INT << 12;
obj->kind |= TCF_META_ID_VALUE;
*dst = (unsigned long) num;
return bstr_next(arg);
}
Everything works correctly.
example:
filter parent 1: protocol all pref 49151 basic
filter parent 1: protocol all pref 49151 basic handle 0x1 flowid 1:100
meta(rt_iif mask 0x00000000 eq 1234)
Seems just typo?
On Tuesday 29 July 2008, Patrick McHardy wrote:
> Denys Fedoryshchenko wrote:
> > Kernel 2.6.26, iproute2 latest release. All required modules is loaded.
> > What did i miss or doing wrong?
> >
> > tc filter add dev ifb0 protocol all basic match "meta(rt_iif eq tap0)" classid 1:100
> >
> > tc -s -d filter show dev ifb0
> > filter parent 1: protocol all pref 49152 basic
> > filter parent 1: protocol all pref 49152 basic handle 0x1 flowid 1:100
> > meta(-1 eq -1)
> >
> > Whatever i try - it doesn't work
> > ./tc filter add dev ifb0 protocol all basic match meta \(rt_iif eq tap0\) classid 1:100
> >
>
> You probably need to add support for skb->iif in case the
> packet didn't went through IPv4.
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: iproute2 / match / meta bug?
2008-07-29 6:11 ` Denys Fedoryshchenko
@ 2008-07-29 6:18 ` Patrick McHardy
2008-07-29 6:25 ` Denys Fedoryshchenko
0 siblings, 1 reply; 8+ messages in thread
From: Patrick McHardy @ 2008-07-29 6:18 UTC (permalink / raw)
To: Denys Fedoryshchenko; +Cc: netdev, Stephen Hemminger
Denys Fedoryshchenko wrote:
> Well, the issue not with ifb0 only. It is just not parsing rules correctly i think:
>
> rich tc # ./tc filter add dev ifb0 protocol all basic match meta\(protocol eq 1234\) classid 1:100
> rich tc # ./tc filter add dev ifb0 protocol all basic match meta\(data_len eq 1234\) classid 1:100
>
> filter parent 1: protocol all pref 49151 basic
> filter parent 1: protocol all pref 49151 basic handle 0x1 flowid 1:100
> meta(-1 eq 1234)
>
> filter parent 1: protocol all pref 49152 basic
> filter parent 1: protocol all pref 49152 basic handle 0x1 flowid 1:100
> meta(-1 eq 1234)
>
Works fine here with a fresh git checkout:
# tc filter add dev dummy0 protocol all parent 1: basic match
meta\(protocol eq 1234\) classid 1:100
# tc -s -d filter show dev dummy0
filter parent 1: protocol all pref 49151 basic
filter parent 1: protocol all pref 49151 basic handle 0x1 flowid 1:100
meta(protocol mask 0x00000000 eq 1234)
filter parent 1: protocol all pref 49152 basic
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: iproute2 / match / meta bug?
2008-07-29 6:18 ` Patrick McHardy
@ 2008-07-29 6:25 ` Denys Fedoryshchenko
2008-07-29 6:35 ` Denys Fedoryshchenko
0 siblings, 1 reply; 8+ messages in thread
From: Denys Fedoryshchenko @ 2008-07-29 6:25 UTC (permalink / raw)
To: Patrick McHardy; +Cc: netdev, Stephen Hemminger
According man of stroul
RETURN VALUE
The strtoul() function returns either the result of the conversion or, if there was a leading minus sign, the negation of the result
of the conversion represented as an unsigned value, unless the original (non-negated) value would overflow; in the latter case, str-
toul() returns ULONG_MAX and sets the global variable errno to ERANGE. Precisely the same holds for strtoull() (with ULLONG_MAX
instead of ULONG_MAX).
ULONG_MAX is NOT LONG_MAX
So it must not work i guess (2.6.26 release).
Maybe in git it is fixed, dunno, i will check it now.
On Tuesday 29 July 2008, Patrick McHardy wrote:
> Denys Fedoryshchenko wrote:
> > Well, the issue not with ifb0 only. It is just not parsing rules correctly i think:
> >
> > rich tc # ./tc filter add dev ifb0 protocol all basic match meta\(protocol eq 1234\) classid 1:100
> > rich tc # ./tc filter add dev ifb0 protocol all basic match meta\(data_len eq 1234\) classid 1:100
> >
> > filter parent 1: protocol all pref 49151 basic
> > filter parent 1: protocol all pref 49151 basic handle 0x1 flowid 1:100
> > meta(-1 eq 1234)
> >
> > filter parent 1: protocol all pref 49152 basic
> > filter parent 1: protocol all pref 49152 basic handle 0x1 flowid 1:100
> > meta(-1 eq 1234)
> >
>
> Works fine here with a fresh git checkout:
>
> # tc filter add dev dummy0 protocol all parent 1: basic match
> meta\(protocol eq 1234\) classid 1:100
> # tc -s -d filter show dev dummy0
> filter parent 1: protocol all pref 49151 basic
> filter parent 1: protocol all pref 49151 basic handle 0x1 flowid 1:100
> meta(protocol mask 0x00000000 eq 1234)
>
> filter parent 1: protocol all pref 49152 basic
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: iproute2 / match / meta bug?
2008-07-29 6:25 ` Denys Fedoryshchenko
@ 2008-07-29 6:35 ` Denys Fedoryshchenko
2008-07-29 8:16 ` Denys Fedoryshchenko
0 siblings, 1 reply; 8+ messages in thread
From: Denys Fedoryshchenko @ 2008-07-29 6:35 UTC (permalink / raw)
To: Patrick McHardy; +Cc: netdev, Stephen Hemminger
Yes, there is typo seems, i check git also, bug is there.
No idea how it works with you :-\ Maybe on your arch ULONG_MAX == LONG_MAX
So at least patch looks like: (maybe it is incorrect, i will resend if required from work as attachment)
diff -Naur iproute2/tc/em_meta.c b/tc/em_meta.c
--- iproute2/tc/em_meta.c 2008-07-29 06:31:51.000000000 +0000
+++ b/tc/em_meta.c 2008-07-29 06:31:38.000000000 +0000
@@ -262,7 +262,7 @@
}
num = bstrtoul(arg);
- if (num != LONG_MAX) {
+ if (num != ULONG_MAX) {
obj->kind = TCF_META_TYPE_INT << 12;
obj->kind |= TCF_META_ID_VALUE;
*dst = (unsigned long) num;
@@ -320,7 +320,7 @@
a = bstr_next(a);
shift = bstrtoul(a);
- if (shift == LONG_MAX) {
+ if (shift == ULONG_MAX) {
PARSE_ERR(a, "meta: invalid shift, must " \
"be numeric");
return PARSE_FAILURE;
@@ -338,7 +338,7 @@
a = bstr_next(a);
mask = bstrtoul(a);
- if (mask == LONG_MAX) {
+ if (mask == ULONG_MAX) {
PARSE_ERR(a, "meta: invalid mask, must be " \
"numeric");
return PARSE_FAILURE;
because
unsigned long bstrtoul(const struct bstr *b)
{
char *inv = NULL;
unsigned long l;
char buf[b->len+1];
memcpy(buf, b->data, b->len);
buf[b->len] = '\0';
l = strtoul(buf, &inv, 0);
if (l == ULONG_MAX || inv == buf)
return ULONG_MAX;
return l;
}
On Tuesday 29 July 2008, Denys Fedoryshchenko wrote:
> According man of stroul
>
> RETURN VALUE
> The strtoul() function returns either the result of the conversion or, if there was a leading minus sign, the negation of the result
> of the conversion represented as an unsigned value, unless the original (non-negated) value would overflow; in the latter case, str-
> toul() returns ULONG_MAX and sets the global variable errno to ERANGE. Precisely the same holds for strtoull() (with ULLONG_MAX
> instead of ULONG_MAX).
>
> ULONG_MAX is NOT LONG_MAX
>
> So it must not work i guess (2.6.26 release).
> Maybe in git it is fixed, dunno, i will check it now.
>
>
> On Tuesday 29 July 2008, Patrick McHardy wrote:
> > Denys Fedoryshchenko wrote:
> > > Well, the issue not with ifb0 only. It is just not parsing rules correctly i think:
> > >
> > > rich tc # ./tc filter add dev ifb0 protocol all basic match meta\(protocol eq 1234\) classid 1:100
> > > rich tc # ./tc filter add dev ifb0 protocol all basic match meta\(data_len eq 1234\) classid 1:100
> > >
> > > filter parent 1: protocol all pref 49151 basic
> > > filter parent 1: protocol all pref 49151 basic handle 0x1 flowid 1:100
> > > meta(-1 eq 1234)
> > >
> > > filter parent 1: protocol all pref 49152 basic
> > > filter parent 1: protocol all pref 49152 basic handle 0x1 flowid 1:100
> > > meta(-1 eq 1234)
> > >
> >
> > Works fine here with a fresh git checkout:
> >
> > # tc filter add dev dummy0 protocol all parent 1: basic match
> > meta\(protocol eq 1234\) classid 1:100
> > # tc -s -d filter show dev dummy0
> > filter parent 1: protocol all pref 49151 basic
> > filter parent 1: protocol all pref 49151 basic handle 0x1 flowid 1:100
> > meta(protocol mask 0x00000000 eq 1234)
> >
> > filter parent 1: protocol all pref 49152 basic
> >
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe netdev" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at http://vger.kernel.org/majordomo-info.html
> >
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: iproute2 / match / meta bug?
2008-07-29 6:35 ` Denys Fedoryshchenko
@ 2008-07-29 8:16 ` Denys Fedoryshchenko
0 siblings, 0 replies; 8+ messages in thread
From: Denys Fedoryshchenko @ 2008-07-29 8:16 UTC (permalink / raw)
To: Patrick McHardy; +Cc: netdev, Stephen Hemminger
It seems that parser broken there (em_meta.c) too.
It won't recognize "quoted"/string parameter. For example:
'meta(dev eq "tap0")' will not work
but
'meta(dev eq 1234)' will work
and so on...
example is broken too, there is no more such parameter as indev i guess.
I am trying now to make it understand rt_iif as name, but seems i am stuck with parser, because it doesn't work even with things it must recognize.
And because of my weak programming skills seems it is trivial for someone to fix and implement rt_iif recognition by interface name (using ll_name_to_index i guess?)
, but it's near impossible for me.
Anybody can help?
If not - i will try to do by myself, but it will take ages.
On Tuesday 29 July 2008, Denys Fedoryshchenko wrote:
> Yes, there is typo seems, i check git also, bug is there.
> No idea how it works with you :-\ Maybe on your arch ULONG_MAX == LONG_MAX
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2008-07-29 8:16 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-07-29 5:43 iproute2 / match / meta bug? Denys Fedoryshchenko
2008-07-29 5:54 ` Patrick McHardy
2008-07-29 6:11 ` Denys Fedoryshchenko
2008-07-29 6:18 ` Patrick McHardy
2008-07-29 6:25 ` Denys Fedoryshchenko
2008-07-29 6:35 ` Denys Fedoryshchenko
2008-07-29 8:16 ` Denys Fedoryshchenko
2008-07-29 6:18 ` Denys Fedoryshchenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).