tc: fix ipv6 filter selector attribute for some prefix lengths
Subsystems (2)
PATCH 1/1 tc: fix ipv6 filter selector attribute for some prefix lengths
Wrong TCA_U32_SEL attribute packing if prefixLen AND 0x1f equals 0x1f. These are /31, /63, /95 and /127 prefix lengths.
Example:
# tc filter add dev eth0 protocol ipv6 parent b: prio 2307 u32 match ip6 dst face:b00f::/31 # tc filter show dev eth0 filter parent b: protocol ipv6 pref 2307 u32 filter parent b: protocol ipv6 pref 2307 u32 fh 800: ht divisor 1 filter parent b: protocol ipv6 pref 2307 u32 fh 800::800 order 2048 key ht 800 bkt 0 match faceb00f/ffffffff at 24
The correct match would be "faceb00e/fffffffe": don't count the last bit of the 4th byte as the network prefix. With fix:
# tc filter show dev eth0 filter parent b: protocol ipv6 pref 2307 u32 filter parent b: protocol ipv6 pref 2307 u32 fh 800: ht divisor 1 filter parent b: protocol ipv6 pref 2307 u32 fh 800::800 order 2048 key ht 800 bkt 0 match faceb00e/fffffffe at 24
tc/f_u32.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
tc/f_u32.c +1 -2
@@ -385,8 +385,7 @@ static int parse_ip6_addr(int *argc_p, char ***argv_p, plen = addr.bitlen;for (i =0 ; i < plen; i +=32 ) { -/* if (((i + 31) & ~0x1F) <= plen) { */ -if (i +31 <= plen) { +if (i +31 < plen) { res =pack_key (sel, addr.data[i /32 ],0xFFFFFFFF , off +4 * (i /32 ), offmask);if (res <0 )
Quoted 32 lines · On Mon, 25 Sep 2017 11:12:38 -0700 Yulia Kartseva <[email protected]>…
Wrong
TCA_U32_SELattribute packing if prefixLen AND0x1fequals0x1f. These are /31, /63, /95 and /127 prefix lengths.Example:
# tc filter add dev eth0 protocol ipv6 parent b: prio 2307 u32 match ip6 dst face:b00f::/31 # tc filter show dev eth0 filter parent b: protocol ipv6 pref 2307 u32 filter parent b: protocol ipv6 pref 2307 u32 fh 800: ht divisor 1 filter parent b: protocol ipv6 pref 2307 u32 fh 800::800 order 2048 key ht 800 bkt 0 match faceb00f/ffffffff at 24The correct match would be "faceb00e/fffffffe": don't count the last bit of the 4th byte as the network prefix. With fix:
# tc filter show dev eth0 filter parent b: protocol ipv6 pref 2307 u32 filter parent b: protocol ipv6 pref 2307 u32 fh 800: ht divisor 1 filter parent b: protocol ipv6 pref 2307 u32 fh 800::800 order 2048 key ht 800 bkt 0 match faceb00e/fffffffe at 24tc/f_u32.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)tc/f_u32.c +0
-0
tc/f_u32.c static int parse_ip6_addr(int *argc_p, char ***argv_p, · line 391
Quoted 9 lines
tc/f_u32.c +1
-2@@ -385,8 +385,7 @@ static int parse_ip6_addr(int *argc_p, char ***argv_p, plen = addr.bitlen;for (i =0 ; i < plen; i +=32 ) { -/* if (((i + 31) & ~0x1F) <= plen) { */ -if (i +31 <= plen) { +if (i +31 < plen) { res =pack_key (sel, addr.data[i /32 ],0xFFFFFFFF , off +4 * (i /32 ), offmask);if (res <0 )
This patch looks correct, but will not apply cleanly because the mail system that you submitted it with is removing whitespace. If possible use a different client, or send as an attachment.
Hello Stephen,
Sending as an attachment.
Thank you!
Quoted 49 lines · Stephen Hemminger
Quoted 32 lines · On Mon, 25 Sep 2017 11:12:38 -0700 Yulia Kartseva <[email protected]>…
Wrong
TCA_U32_SELattribute packing if prefixLen AND0x1fequals0x1f. These are /31, /63, /95 and /127 prefix lengths.Example:
# tc filter add dev eth0 protocol ipv6 parent b: prio 2307 u32 match ip6 dst face:b00f::/31 # tc filter show dev eth0 filter parent b: protocol ipv6 pref 2307 u32 filter parent b: protocol ipv6 pref 2307 u32 fh 800: ht divisor 1 filter parent b: protocol ipv6 pref 2307 u32 fh 800::800 order 2048 key ht 800 bkt 0 match faceb00f/ffffffff at 24The correct match would be "faceb00e/fffffffe": don't count the last bit of the 4th byte as the network prefix. With fix:
# tc filter show dev eth0 filter parent b: protocol ipv6 pref 2307 u32 filter parent b: protocol ipv6 pref 2307 u32 fh 800: ht divisor 1 filter parent b: protocol ipv6 pref 2307 u32 fh 800::800 order 2048 key ht 800 bkt 0 match faceb00e/fffffffe at 24tc/f_u32.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)tc/f_u32.c +0
-0tc/f_u32.c static int parse_ip6_addr(int *argc_p, char ***argv_p, · line 391
Quoted 9 lines
tc/f_u32.c +1
-2@@ -385,8 +385,7 @@ static int parse_ip6_addr(int *argc_p, char ***argv_p, plen = addr.bitlen;for (i =0 ; i < plen; i +=32 ) { -/* if (((i + 31) & ~0x1F) <= plen) { */ -if (i +31 <= plen) { +if (i +31 < plen) { res =pack_key (sel, addr.data[i /32 ],0xFFFFFFFF , off +4 * (i /32 ), offmask);if (res <0 )This patch looks correct, but will not apply cleanly because the mail system that you submitted it with is removing whitespace. If possible use a different client, or send as an attachment.
Signature · 1 line
C уважением, Юлия
tc/f_u32.c +1 -2
@@ -382,8 +382,7 @@ static int parse_ip6_addr(int *argc_p, char ***argv_p, plen = addr.bitlen;for (i=0 ; i<plen; i+=32 ) { -// if (((i+31)&~0x1F)<=plen) { -if (i +31 <= plen) { +if (i +31 < plen) { res =pack_key (sel, addr.data[i/32 ],0xFFFFFFFF , off+4 *(i/32 ), offmask);if (res <0 )
PATCH v2 1/1 tc: fix ipv6 filter selector attribute for some prefix lengths
In reply to Stephen HemmingerWrong TCA_U32_SEL attribute packing if prefixLen AND 0x1f equals 0x1f. These are /31, /63, /95 and /127 prefix lengths.
Example:
ip6 dst face:b00f::/31
filter parent b: protocol ipv6 pref 2307 u32
filter parent b: protocol ipv6 pref 2307 u32 fh 800: ht divisor 1 filter parent b: protocol ipv6 pref 2307 u32 fh 800::800 order 2048 key ht 800 bkt 0
match faceb00f/ffffffff at 24
v2: previous patch was made with a wrong repo
--- tc/f_u32.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
tc/f_u32.c +1 -2
@@ -385,8 +385,7 @@ static int parse_ip6_addr(int *argc_p, char ***argv_p, plen = addr.bitlen;for (i =0 ; i < plen; i +=32 ) { -/* if (((i + 31) & ~0x1F) <= plen) { */ -if (i +31 <= plen) { +if (i +31 < plen) { res =pack_key (sel, addr.data[i /32 ],0xFFFFFFFF , off +4 * (i /32 ), offmask);if (res <0 )
Signature · 1 line
2.9.5
Quoted 11 lines · On Sat, 30 Sep 2017 20:18:40 -0700 Yulia Kartseva <[email protected]> wrote:
Wrong
TCA_U32_SELattribute packing if prefixLen AND0x1fequals0x1f. These are /31, /63, /95 and /127 prefix lengths.Example:
ip6 dst face:b00f::/31
filter parent b: protocol ipv6 pref 2307 u32
filter parent b: protocol ipv6 pref 2307 u32 fh 800: ht divisor 1 filter parent b: protocol ipv6 pref 2307 u32 fh 800::800 order 2048 key ht 800 bkt 0
match faceb00f/ffffffff at 24
Quoted 3 lines
v2: previous patch was made with a wrong repo
Signed-off-by Yulia Kartseva <[email protected]>
That came through correctly. Applied.