Skip to contentSkip to conversation

tc: fix ipv6 filter selector attribute for some prefix lengths

PATCH In review Yulia Kartseva 3 participants 5 messages Sep 25, 2017 – Oct 1, 2017

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
index 5815be9..14b9588 100644
@@ -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)
#1 lore raw
Quoted 32 lines · On Mon, 25 Sep 2017 11:12:38 -0700 Yulia Kartseva <[email protected]>…

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 +0 -0
index 5815be9..14b9588 100644

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.

#2 lore raw

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_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 +0 -0
index 5815be9..14b9588 100644

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.

Signature · 1 line
C уважением, Юлия
tc/f_u32.c +1 -2
index 479b3f1..a8d07b3 100644
@@ -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)
#3 lore raw

PATCH v2 1/1 tc: fix ipv6 filter selector attribute for some prefix lengths

In reply to Stephen Hemminger

Wrong 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
index 5815be9..14b9588 100644
@@ -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
#4 lore raw
Quoted 11 lines · On Sat, 30 Sep 2017 20:18:40 -0700 Yulia Kartseva <[email protected]> wrote:

Wrong 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

Quoted 3 lines

v2: previous patch was made with a wrong repo

That came through correctly. Applied.