netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC 1/3] [RFC iproute2-next] tc: f_u32: Rename commands and functions ip6 to ipv6 to unify naming
@ 2021-06-08 15:33 Anton Danilov
  2021-06-08 15:33 ` [RFC 2/3] [RFC iproute2-next] tc: f_u32: Fix the ipv6 pretty printing Anton Danilov
  2021-06-08 15:33 ` [RFC 3/3] [RFC iproute2-next] tc: f_u32: fix the pretty print of ipv4 filters Anton Danilov
  0 siblings, 2 replies; 5+ messages in thread
From: Anton Danilov @ 2021-06-08 15:33 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev, Anton Danilov

Before patch:
~$ tc filter add dev dummy0 parent 1: protocol ipv6 prio 10 \
    u32 match ip6 src aa:bb:cc:dd::/128 flowid 1:1

After patch:
~$ tc filter add dev dummy0 parent 1: protocol ipv6 prio 10 \
    u32 match ipv6 src aa:bb:cc:dd::/128 flowid 1:1

Signed-off-by: Anton Danilov <littlesmilingcloud@gmail.com>
---
 tc/f_u32.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/tc/f_u32.c b/tc/f_u32.c
index 2ed5254a..3fd3eb17 100644
--- a/tc/f_u32.c
+++ b/tc/f_u32.c
@@ -35,7 +35,7 @@ static void explain(void)
 		"or         u32 divisor DIVISOR\n"
 		"\n"
 		"Where: SELECTOR := SAMPLE SAMPLE ...\n"
-		"       SAMPLE := { ip | ip6 | udp | tcp | icmp | u{32|16|8} | mark }\n"
+		"       SAMPLE := { ip | ipv6 | udp | tcp | icmp | u{32|16|8} | mark }\n"
 		"                 SAMPLE_ARGS [ divisor DIVISOR ]\n"
 		"       FILTERID := X:Y:Z\n"
 		"\nNOTE: CLASSID is parsed at hexadecimal input.\n");
@@ -356,7 +356,7 @@ static int parse_ip_addr(int *argc_p, char ***argv_p, struct tc_u32_sel *sel,
 	return res;
 }
 
-static int parse_ip6_addr(int *argc_p, char ***argv_p,
+static int parse_ipv6_addr(int *argc_p, char ***argv_p,
 			  struct tc_u32_sel *sel, int off)
 {
 	int res = -1;
@@ -403,7 +403,7 @@ static int parse_ip6_addr(int *argc_p, char ***argv_p,
 	return res;
 }
 
-static int parse_ip6_class(int *argc_p, char ***argv_p, struct tc_u32_sel *sel)
+static int parse_ipv6_class(int *argc_p, char ***argv_p, struct tc_u32_sel *sel)
 {
 	int res = -1;
 	int argc = *argc_p;
@@ -538,7 +538,7 @@ static int parse_ip(int *argc_p, char ***argv_p, struct tc_u32_sel *sel)
 	return res;
 }
 
-static int parse_ip6(int *argc_p, char ***argv_p, struct tc_u32_sel *sel)
+static int parse_ipv6(int *argc_p, char ***argv_p, struct tc_u32_sel *sel)
 {
 	int res = -1;
 	int argc = *argc_p;
@@ -549,13 +549,13 @@ static int parse_ip6(int *argc_p, char ***argv_p, struct tc_u32_sel *sel)
 
 	if (strcmp(*argv, "src") == 0) {
 		NEXT_ARG();
-		res = parse_ip6_addr(&argc, &argv, sel, 8);
+		res = parse_ipv6_addr(&argc, &argv, sel, 8);
 	} else if (strcmp(*argv, "dst") == 0) {
 		NEXT_ARG();
-		res = parse_ip6_addr(&argc, &argv, sel, 24);
-	} else if (strcmp(*argv, "priority") == 0) {
+		res = parse_ipv6_addr(&argc, &argv, sel, 24);
+	} else if (strcmp(*argv, "priority") == 0 || strcmp(*argv, "class") == 0) {
 		NEXT_ARG();
-		res = parse_ip6_class(&argc, &argv, sel);
+		res = parse_ipv6_class(&argc, &argv, sel);
 	} else if (strcmp(*argv, "protocol") == 0) {
 		NEXT_ARG();
 		res = parse_u8(&argc, &argv, sel, 6, 0);
@@ -712,9 +712,9 @@ static int parse_selector(int *argc_p, char ***argv_p,
 	} else if (matches(*argv, "ip") == 0) {
 		NEXT_ARG();
 		res = parse_ip(&argc, &argv, sel);
-	} else	if (matches(*argv, "ip6") == 0) {
+	} else	if (matches(*argv, "ip6") == 0 || matches(*argv, "ipv6") == 0) {
 		NEXT_ARG();
-		res = parse_ip6(&argc, &argv, sel);
+		res = parse_ipv6(&argc, &argv, sel);
 	} else if (matches(*argv, "udp") == 0) {
 		NEXT_ARG();
 		res = parse_udp(&argc, &argv, sel);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [RFC 2/3] [RFC iproute2-next] tc: f_u32: Fix the ipv6 pretty printing.
  2021-06-08 15:33 [RFC 1/3] [RFC iproute2-next] tc: f_u32: Rename commands and functions ip6 to ipv6 to unify naming Anton Danilov
@ 2021-06-08 15:33 ` Anton Danilov
  2021-06-15  2:57   ` Stephen Hemminger
  2021-06-08 15:33 ` [RFC 3/3] [RFC iproute2-next] tc: f_u32: fix the pretty print of ipv4 filters Anton Danilov
  1 sibling, 1 reply; 5+ messages in thread
From: Anton Danilov @ 2021-06-08 15:33 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev, Anton Danilov

Unexpectedly the print_ipv6 function is the copy-paste version of the print_ipv4 function. Fixed.

Before patch:

$ sudo tc -p -s f ls dev dummy0
filter parent 1: protocol ipv6 pref 30 u32 chain 0
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800: ht divisor 1
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0) (success 0 )
  match IP src 64.0.0.0/32 (success 0 )
  match IP dst 0.0.0.0/32 (success 0 )
  match sport 0, match dport 0 (success 0 )
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800::801 order 2049 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0) (success 0 )  (success 0 )  (success 0 )  (success 0 )
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800::802 order 2050 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0) (success 0 )
  match IP src 0.204.0.221/32 (success 0 )
  match IP dst 0.0.0.0/1 (success 0 )  (success 0 )  (success 0 )  (success 0 )
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800::803 order 2051 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0) (success 0 )
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800::804 order 2052 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0) (success 0 )
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800::805 order 2053 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0)
  match IP ihl 1 (success 0 )
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800::806 order 2054 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0) (success 0 )
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800::807 order 2055 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0) (success 0 )

After patch:

$ sudo tc -p -s f ls dev dummy0
filter parent 1: protocol ipv6 pref 30 u32 chain 0
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800: ht divisor 1
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0)
 match ipv6 src 2a02:26e0:4000::/128
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800::801 order 2049 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0)
 match ipv6 dst 2a02:26e0:4000::/128
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800::802 order 2050 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0)
 match ipv6 src aa:bb:cc:dd::/65
 match ipv6 dst aa:bb:cc:dd::/66
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800::803 order 2051 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0)
 match ipv6 class 0xff 0xff (success 0 )
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800::804 order 2052 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0)
 match ipv6 class 0x10 0xff (success 0 )
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800::805 order 2053 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0)
 match ipv6 class 0x10 0xf0 (success 0 )
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800::806 order 2054 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0)
 match ipv6 flowlabel 0xbcde 0xffff (success 0 )
filter parent 1: protocol ipv6 pref 30 u32 chain 0 fh 800::807 order 2055 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0)
 match ipv6 class 0x12 0xff
 match ipv6 flowlabel 0xbcde 0xffff (success 0 )

Signed-off-by: Anton Danilov <littlesmilingcloud@gmail.com>
---
 tc/f_u32.c | 152 +++++++++++++++++++++++++++++------------------------
 1 file changed, 82 insertions(+), 70 deletions(-)

diff --git a/tc/f_u32.c b/tc/f_u32.c
index 3fd3eb17..d7beb586 100644
--- a/tc/f_u32.c
+++ b/tc/f_u32.c
@@ -820,28 +820,28 @@ static int parse_hashkey(int *argc_p, char ***argv_p, struct tc_u32_sel *sel)
 	return 0;
 }
 
-static void print_ipv4(FILE *f, const struct tc_u32_key *key)
+static int print_ipv4(FILE *f, const struct tc_u32_key *key)
 {
 	char abuf[256];
 
+	if (key == NULL)
+		return 0;
+
 	switch (key->off) {
 	case 0:
 		switch (ntohl(key->mask)) {
 		case 0x0f000000:
-			fprintf(f, "\n  match IP ihl %u",
+			return fprintf(f, "\n  match IP ihl %u",
 				ntohl(key->val) >> 24);
-			return;
 		case 0x00ff0000:
-			fprintf(f, "\n  match IP dsfield %#x",
+			return fprintf(f, "\n  match IP dsfield %#x",
 				ntohl(key->val) >> 16);
-			return;
 		}
 		break;
 	case 8:
 		if (ntohl(key->mask) == 0x00ff0000) {
-			fprintf(f, "\n  match IP protocol %d",
+			return fprintf(f, "\n  match IP protocol %d",
 				ntohl(key->val) >> 16);
-			return;
 		}
 		break;
 	case 12:
@@ -849,12 +849,11 @@ static void print_ipv4(FILE *f, const struct tc_u32_key *key)
 			int bits = mask2bits(key->mask);
 
 			if (bits >= 0) {
-				fprintf(f, "\n  %s %s/%d",
+				return fprintf(f, "\n  %s %s/%d",
 					key->off == 12 ? "match IP src" : "match IP dst",
 					inet_ntop(AF_INET, &key->val,
 						  abuf, sizeof(abuf)),
 					bits);
-				return;
 			}
 		}
 		break;
@@ -862,87 +861,100 @@ static void print_ipv4(FILE *f, const struct tc_u32_key *key)
 	case 20:
 		switch (ntohl(key->mask)) {
 		case 0x0000ffff:
-			fprintf(f, "\n  match dport %u",
+			return fprintf(f, "\n  match dport %u",
 				ntohl(key->val) & 0xffff);
-			return;
 		case 0xffff0000:
-			fprintf(f, "\n  match sport %u",
+			return fprintf(f, "\n  match sport %u",
 				ntohl(key->val) >> 16);
-			return;
 		case 0xffffffff:
-			fprintf(f, "\n  match dport %u, match sport %u",
+			return fprintf(f, "\n  match dport %u, match sport %u",
 				ntohl(key->val) & 0xffff,
 				ntohl(key->val) >> 16);
 
-			return;
 		}
 		/* XXX: Default print_raw */
 	}
+
+	return 0;
 }
 
-static void print_ipv6(FILE *f, const struct tc_u32_key *key)
+static int print_ipv6(FILE *f, const struct tc_u32_key *key)
 {
 	char abuf[256];
 
+	static __u32 ipv6_src_addr[4];
+	static int ipv6_src_plen;
+	static __u32 ipv6_dst_addr[4];
+	static int ipv6_dst_plen;
+
+	int ret = 0;
+
+	if ((key == NULL || key->off >= 24) && ipv6_src_plen > 0) {
+		ret = fprintf(f, "\n match ipv6 src %s/%d",
+			inet_ntop(AF_INET6, ipv6_src_addr, abuf, sizeof(abuf)), ipv6_src_plen);
+		memset(ipv6_src_addr, 0, 16);
+		ipv6_src_plen = 0;
+	}
+
+	if (key == NULL && ipv6_dst_plen > 0) {
+		ret += fprintf(f, "\n match ipv6 dst %s/%d",
+			inet_ntop(AF_INET6, ipv6_dst_addr, abuf, sizeof(abuf)), ipv6_dst_plen);
+		memset(ipv6_dst_addr, 0, 16);
+		ipv6_dst_plen = 0;
+	}
+
+	if (key == NULL)
+		return ret;
+
 	switch (key->off) {
 	case 0:
-		switch (ntohl(key->mask)) {
-		case 0x0f000000:
-			fprintf(f, "\n  match IP ihl %u",
-				ntohl(key->val) >> 24);
-			return;
-		case 0x00ff0000:
-			fprintf(f, "\n  match IP dsfield %#x",
-				ntohl(key->val) >> 16);
-			return;
+		if (ntohl(key->mask) & 0x0ff00000) {
+			ret = fprintf(f, "\n match ipv6 class %#x %#x",
+				(ntohl(key->val) & 0x0ff00000) >> 20,
+				(ntohl(key->mask) & 0x0ff00000) >> 20);
+		}
+		if (ntohl(key->mask) & 0x000fffff) {
+			ret += fprintf(f, "\n match ipv6 flowlabel %#x %#x",
+				ntohl(key->val) & 0x000fffff,
+				ntohl(key->mask) & 0x000fffff);
 		}
+		return ret;
 		break;
-	case 8:
-		if (ntohl(key->mask) == 0x00ff0000) {
-			fprintf(f, "\n  match IP protocol %d",
-				ntohl(key->val) >> 16);
-			return;
+	case 4:
+		if (ntohl(key->mask) == 0x0000ff00) {
+			return fprintf(f, "\n  match ipv6 protocol %d",
+				ntohl(key->val) >> 8);
 		}
 		break;
+	case 8:
 	case 12:
-	case 16: {
-			int bits = mask2bits(key->mask);
-
-			if (bits >= 0) {
-				fprintf(f, "\n  %s %s/%d",
-					key->off == 12 ? "match IP src" : "match IP dst",
-					inet_ntop(AF_INET, &key->val,
-						  abuf, sizeof(abuf)),
-					bits);
-				return;
-			}
+	case 16:
+	case 20: {
+			ipv6_src_plen += mask2bits(key->mask);
+			ipv6_src_addr[(key->off - 8) / 4] = key->val;
 		}
 		break;
-
-	case 20:
-		switch (ntohl(key->mask)) {
-		case 0x0000ffff:
-			fprintf(f, "\n  match sport %u",
-				ntohl(key->val) & 0xffff);
-			return;
-		case 0xffff0000:
-			fprintf(f, "\n  match dport %u",
-				ntohl(key->val) >> 16);
-			return;
-		case 0xffffffff:
-			fprintf(f, "\n  match sport %u, match dport %u",
-				ntohl(key->val) & 0xffff,
-				ntohl(key->val) >> 16);
-
-			return;
+	case 24:
+	case 28:
+	case 32:
+	case 36: {
+			ipv6_dst_plen += mask2bits(key->mask);
+			ipv6_dst_addr[(key->off - 24) / 4] = key->val;
 		}
+		break;
+
 		/* XXX: Default print_raw */
 	}
+
+	return 0;
 }
 
-static void print_raw(FILE *f, const struct tc_u32_key *key)
+static int print_raw(FILE *f, const struct tc_u32_key *key)
 {
-	fprintf(f, "\n  match %08x/%08x at %s%d",
+	if (key == NULL)
+		return 0;
+
+	return fprintf(f, "\n  match %08x/%08x at %s%d",
 		(unsigned int)ntohl(key->val),
 		(unsigned int)ntohl(key->mask),
 		key->offmask ? "nexthdr+" : "",
@@ -952,14 +964,14 @@ static void print_raw(FILE *f, const struct tc_u32_key *key)
 static const struct {
 	__u16 proto;
 	__u16 pad;
-	void (*pprinter)(FILE *f, const struct tc_u32_key *key);
+	int (*pprinter)(FILE *f, const struct tc_u32_key *key);
 } u32_pprinters[] = {
 	{0,	   0, print_raw},
 	{ETH_P_IP, 0, print_ipv4},
 	{ETH_P_IPV6, 0, print_ipv6},
 };
 
-static void show_keys(FILE *f, const struct tc_u32_key *key)
+static int show_keys(FILE *f, const struct tc_u32_key *key)
 {
 	int i = 0;
 
@@ -969,8 +981,7 @@ static void show_keys(FILE *f, const struct tc_u32_key *key)
 	for (i = 0; i < ARRAY_SIZE(u32_pprinters); i++) {
 		if (u32_pprinters[i].proto == ntohs(f_proto)) {
 show_k:
-			u32_pprinters[i].pprinter(f, key);
-			return;
+			return u32_pprinters[i].pprinter(f, key);
 		}
 	}
 
@@ -1289,12 +1300,13 @@ static int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt,
 	if (sel) {
 		if (sel->nkeys) {
 			int i;
-
-			for (i = 0; i < sel->nkeys; i++) {
-				show_keys(f, sel->keys + i);
-				if (show_stats && NULL != pf)
-					fprintf(f, " (success %llu ) ",
-						(unsigned long long) pf->kcnts[i]);
+			// The ipv6 pretty printing requires an additional call at the end.
+			// Call the show_keys with the NULL value after call with last key.
+			for (i = 0; i <= sel->nkeys; i++) {
+				if (show_keys(f, i < sel->nkeys ? sel->keys + i : NULL))
+					if (i < sel->nkeys && show_stats && NULL != pf)
+						fprintf(f, " (success %llu ) ",
+							(unsigned long long) pf->kcnts[i]);
 			}
 		}
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [RFC 3/3] [RFC iproute2-next] tc: f_u32: fix the pretty print of ipv4 filters
  2021-06-08 15:33 [RFC 1/3] [RFC iproute2-next] tc: f_u32: Rename commands and functions ip6 to ipv6 to unify naming Anton Danilov
  2021-06-08 15:33 ` [RFC 2/3] [RFC iproute2-next] tc: f_u32: Fix the ipv6 pretty printing Anton Danilov
@ 2021-06-08 15:33 ` Anton Danilov
  1 sibling, 0 replies; 5+ messages in thread
From: Anton Danilov @ 2021-06-08 15:33 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev, Anton Danilov

~$: tc f add dev dummy0 parent 1: protocol ip prio 10 \
    u32 match ip ihl 10 0xf match ip dsfield 0x0a 0xff flowid 1:1

Before patch:

~$ sudo tc -p -s f ls dev dummy0
filter parent 1: protocol ip pref 10 u32 chain 0
filter parent 1: protocol ip pref 10 u32 chain 0 fh 801: ht divisor 1
filter parent 1: protocol ip pref 10 u32 chain 0 fh 801::801 order 2049 key ht 801 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0) (success 0 )

After patch:
~$ sudo tc -p -s f ls dev dummy0
filter parent 1: protocol ip pref 10 u32 chain 0
filter parent 1: protocol ip pref 10 u32 chain 0 fh 801: ht divisor 1
filter parent 1: protocol ip pref 10 u32 chain 0 fh 801::801 order 2049 key ht 801 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0)
  match ip ihl 10 0xf
  match ip dsfield 0xa 0xff (success 0 )

Signed-off-by: Anton Danilov <littlesmilingcloud@gmail.com>
---
 tc/f_u32.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/tc/f_u32.c b/tc/f_u32.c
index d7beb586..e60c787a 100644
--- a/tc/f_u32.c
+++ b/tc/f_u32.c
@@ -827,20 +827,25 @@ static int print_ipv4(FILE *f, const struct tc_u32_key *key)
 	if (key == NULL)
 		return 0;
 
+	int ret = 0;
+
 	switch (key->off) {
 	case 0:
-		switch (ntohl(key->mask)) {
-		case 0x0f000000:
-			return fprintf(f, "\n  match IP ihl %u",
-				ntohl(key->val) >> 24);
-		case 0x00ff0000:
-			return fprintf(f, "\n  match IP dsfield %#x",
-				ntohl(key->val) >> 16);
+		if (ntohl(key->mask) & 0x0f000000) {
+			ret = fprintf(f, "\n  match ip ihl %u %#x",
+				(ntohl(key->val) & 0x0f000000) >> 24,
+				(ntohl(key->mask) & 0x0f000000) >> 24);
+		}
+		if (ntohl(key->mask) & 0x00ff0000) {
+			ret += fprintf(f, "\n  match ip dsfield %#x %#x",
+				(ntohl(key->val) & 0x00ff0000) >> 16,
+				(ntohl(key->mask) & 0x00ff0000) >> 16);
 		}
+		return ret;
 		break;
 	case 8:
 		if (ntohl(key->mask) == 0x00ff0000) {
-			return fprintf(f, "\n  match IP protocol %d",
+			return fprintf(f, "\n  match ip protocol %d",
 				ntohl(key->val) >> 16);
 		}
 		break;
@@ -850,7 +855,7 @@ static int print_ipv4(FILE *f, const struct tc_u32_key *key)
 
 			if (bits >= 0) {
 				return fprintf(f, "\n  %s %s/%d",
-					key->off == 12 ? "match IP src" : "match IP dst",
+					key->off == 12 ? "match ip src" : "match ip dst",
 					inet_ntop(AF_INET, &key->val,
 						  abuf, sizeof(abuf)),
 					bits);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [RFC 2/3] [RFC iproute2-next] tc: f_u32: Fix the ipv6 pretty printing.
  2021-06-08 15:33 ` [RFC 2/3] [RFC iproute2-next] tc: f_u32: Fix the ipv6 pretty printing Anton Danilov
@ 2021-06-15  2:57   ` Stephen Hemminger
  2021-06-16 10:49     ` Anton Danilov
  0 siblings, 1 reply; 5+ messages in thread
From: Stephen Hemminger @ 2021-06-15  2:57 UTC (permalink / raw)
  To: Anton Danilov; +Cc: netdev

On Tue,  8 Jun 2021 18:33:08 +0300
Anton Danilov <littlesmilingcloud@gmail.com> wrote:

> -			fprintf(f, "\n  match IP protocol %d",
> +			return fprintf(f, "\n  match IP protocol %d",
>  				ntohl(key->val) >> 16);

Ok, but better yet, upgrade f_u32 to do proper JSON output.

> +			// The ipv6 pretty printing requires an additional call at the end.
> +			// Call the show_keys with the NULL value after call with last key.
> +			for (i = 0; i <= sel->nkeys; i++) {

iproute2 uses kernel style C so no C++ style comments please

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC 2/3] [RFC iproute2-next] tc: f_u32: Fix the ipv6 pretty printing.
  2021-06-15  2:57   ` Stephen Hemminger
@ 2021-06-16 10:49     ` Anton Danilov
  0 siblings, 0 replies; 5+ messages in thread
From: Anton Danilov @ 2021-06-16 10:49 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: Linux Kernel Network Developers

On Tue, 15 Jun 2021 at 05:57, Stephen Hemminger
<stephen@networkplumber.org> wrote:
> Ok, but better yet, upgrade f_u32 to do proper JSON output.

Yep, I'll send the JSON output patch soon.



--
Anton Danilov.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-06-16 10:50 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-08 15:33 [RFC 1/3] [RFC iproute2-next] tc: f_u32: Rename commands and functions ip6 to ipv6 to unify naming Anton Danilov
2021-06-08 15:33 ` [RFC 2/3] [RFC iproute2-next] tc: f_u32: Fix the ipv6 pretty printing Anton Danilov
2021-06-15  2:57   ` Stephen Hemminger
2021-06-16 10:49     ` Anton Danilov
2021-06-08 15:33 ` [RFC 3/3] [RFC iproute2-next] tc: f_u32: fix the pretty print of ipv4 filters Anton Danilov

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).