All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH iproute2 v2 0/2] vxlan: option printing
@ 2023-05-25 15:50 Stephen Hemminger
  2023-05-25 15:50 ` [PATCH iproute2 v2 1/2] vxlan: use print_nll for gbp and gpe Stephen Hemminger
  2023-05-25 15:50 ` [PATCH iproute2 v2 2/2] vxlan: make option printing more consistent Stephen Hemminger
  0 siblings, 2 replies; 3+ messages in thread
From: Stephen Hemminger @ 2023-05-25 15:50 UTC (permalink / raw)
  To: netdev; +Cc: Stephen Hemminger

This patchset makes printing of vxlan details more consistent.

Before:
$ ip -d link show dev vxlan0
4: vxlan0: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether e6:a4:54:b2:34:85 brd ff:ff:ff:ff:ff:ff promiscuity 0  allmulti 0 minmtu 68 maxmtu 65535 
    vxlan id 42 group 239.1.1.1 dev enp2s0 srcport 0 0 dstport 4789 ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 64000 gso_max_segs 64 tso_max_size 64000 tso_max_segs 64 gro_max_size 65536 

After:
$ ip -d link show dev vxlan0
4: vxlan0: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether e6:a4:54:b2:34:85 brd ff:ff:ff:ff:ff:ff promiscuity 0  allmulti 0 minmtu 68 maxmtu 65535 
    vxlan id 42 group 239.1.1.1 dev enp2s0 srcport 0 0 dstport 4789 ttl auto ageing 300 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 64000 gso_max_segs 64 tso_max_size 64000 tso_max_segs 64 gro_max_size 65536

And JSON output is more complete
$ ip -j -p -d link show dev vxlan0
[ {
        "ifindex": 4,
        "ifname": "vxlan0",
        "flags": [ "BROADCAST","MULTICAST" ],
        "mtu": 1450,
        "qdisc": "noop",
        "operstate": "DOWN",
        "linkmode": "DEFAULT",
        "group": "default",
        "txqlen": 1000,
        "link_type": "ether",
        "address": "e6:a4:54:b2:34:85",
        "broadcast": "ff:ff:ff:ff:ff:ff",
        "promiscuity": 0,
        "allmulti": 0,
        "min_mtu": 68,
        "max_mtu": 65535,
        "linkinfo": {
            "info_kind": "vxlan",
            "info_data": {
                "external": false,
                "id": 42,
                "group": "239.1.1.1",
                "link": "enp2s0",
                "port_range": {
                    "low": 0,
                    "high": 0
                },
                "port": 4789,
                "learning": true,
                "proxy": false,
                "rsc": false,
                "l2miss": false,
                "l3miss": false,
                "ttl": 0,
                "df": "unset",
                "ageing": 300,
                "udp_csum": true,
                "udp_zero_csum6_tx": false,
                "udp_zero_csum6_rx": false,
                "remcsum_tx": false,
                "remcsum_rx": false
            }
        },
        "inet6_addr_gen_mode": "eui64",
        "num_tx_queues": 1,
        "num_rx_queues": 1,
        "gso_max_size": 64000,
        "gso_max_segs": 64,
        "tso_max_size": 64000,
        "tso_max_segs": 64,
        "gro_max_size": 65536
    } ]



Stephen Hemminger (2):
  vxlan: use print_nll for gbp and gpe
  vxlan: make option printing more consistent

 include/json_print.h |  9 +++++
 ip/iplink_vxlan.c    | 84 ++++++++++++++++----------------------------
 lib/json_print.c     | 19 ++++++++++
 3 files changed, 58 insertions(+), 54 deletions(-)

-- 
2.39.2


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

* [PATCH iproute2 v2 1/2] vxlan: use print_nll for gbp and gpe
  2023-05-25 15:50 [PATCH iproute2 v2 0/2] vxlan: option printing Stephen Hemminger
@ 2023-05-25 15:50 ` Stephen Hemminger
  2023-05-25 15:50 ` [PATCH iproute2 v2 2/2] vxlan: make option printing more consistent Stephen Hemminger
  1 sibling, 0 replies; 3+ messages in thread
From: Stephen Hemminger @ 2023-05-25 15:50 UTC (permalink / raw)
  To: netdev; +Cc: Stephen Hemminger

The Gbp and Gpe are presence, not booleans so use print_null()
for them

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 ip/iplink_vxlan.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/ip/iplink_vxlan.c b/ip/iplink_vxlan.c
index c7e0e1c47606..cb6745c74507 100644
--- a/ip/iplink_vxlan.c
+++ b/ip/iplink_vxlan.c
@@ -650,9 +650,9 @@ static void vxlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
 		print_bool(PRINT_ANY, "remcsum_rx", "remcsumrx ", true);
 
 	if (tb[IFLA_VXLAN_GBP])
-		print_bool(PRINT_ANY, "gbp", "gbp ", true);
+		print_null(PRINT_ANY, "gbp", "gbp ", NULL);
 	if (tb[IFLA_VXLAN_GPE])
-		print_bool(PRINT_ANY, "gpe", "gpe ", true);
+		print_null(PRINT_ANY, "gpe", "gpe ", NULL);
 }
 
 static void vxlan_print_help(struct link_util *lu, int argc, char **argv,
-- 
2.39.2


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

* [PATCH iproute2 v2 2/2] vxlan: make option printing more consistent
  2023-05-25 15:50 [PATCH iproute2 v2 0/2] vxlan: option printing Stephen Hemminger
  2023-05-25 15:50 ` [PATCH iproute2 v2 1/2] vxlan: use print_nll for gbp and gpe Stephen Hemminger
@ 2023-05-25 15:50 ` Stephen Hemminger
  1 sibling, 0 replies; 3+ messages in thread
From: Stephen Hemminger @ 2023-05-25 15:50 UTC (permalink / raw)
  To: netdev; +Cc: Stephen Hemminger

Add new helper function print_bool_opt() which prints
with no prefix and use it for vxlan options.

If the option matches the expected default value,
it is not printed if in non JSON mode.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 include/json_print.h |  9 +++++
 ip/iplink_vxlan.c    | 80 ++++++++++++++++----------------------------
 lib/json_print.c     | 19 +++++++++++
 3 files changed, 56 insertions(+), 52 deletions(-)

diff --git a/include/json_print.h b/include/json_print.h
index 91b34571ceb0..be1a99775fde 100644
--- a/include/json_print.h
+++ b/include/json_print.h
@@ -101,6 +101,15 @@ static inline int print_rate(bool use_iec, enum output_type t,
 	return print_color_rate(use_iec, t, COLOR_NONE, key, fmt, rate);
 }
 
+int print_color_bool_opt(enum output_type type, enum color_attr color,
+			 const char *key, bool value, bool expected);
+
+static inline int print_bool_opt(enum output_type type,
+				 const char *key, bool value, bool expected)
+{
+	return print_color_bool_opt(type, COLOR_NONE, key, value, expected);
+}
+
 /* A backdoor to the size formatter. Please use print_size() instead. */
 char *sprint_size(__u32 sz, char *buf);
 
diff --git a/ip/iplink_vxlan.c b/ip/iplink_vxlan.c
index cb6745c74507..fb37d426372d 100644
--- a/ip/iplink_vxlan.c
+++ b/ip/iplink_vxlan.c
@@ -427,15 +427,13 @@ static void vxlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
 	if (!tb)
 		return;
 
-	if (tb[IFLA_VXLAN_COLLECT_METADATA] &&
-	    rta_getattr_u8(tb[IFLA_VXLAN_COLLECT_METADATA])) {
-		print_bool(PRINT_ANY, "external", "external ", true);
-	}
+	if (tb[IFLA_VXLAN_COLLECT_METADATA])
+		print_bool_opt(PRINT_ANY, "external",
+			       rta_getattr_u8(tb[IFLA_VXLAN_COLLECT_METADATA]), false);
 
-	if (tb[IFLA_VXLAN_VNIFILTER] &&
-	    rta_getattr_u8(tb[IFLA_VXLAN_VNIFILTER])) {
-		print_bool(PRINT_ANY, "vnifilter", "vnifilter", true);
-	}
+	if (tb[IFLA_VXLAN_VNIFILTER])
+		print_bool_opt(PRINT_ANY, "vnifilter",
+			       rta_getattr_u8(tb[IFLA_VXLAN_VNIFILTER]), false);
 
 	if (tb[IFLA_VXLAN_ID] &&
 	    RTA_PAYLOAD(tb[IFLA_VXLAN_ID]) >= sizeof(__u32)) {
@@ -532,22 +530,24 @@ static void vxlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
 	if (tb[IFLA_VXLAN_LEARNING]) {
 		__u8 learning = rta_getattr_u8(tb[IFLA_VXLAN_LEARNING]);
 
-		print_bool(PRINT_JSON, "learning", NULL, learning);
-		if (!learning)
-			print_bool(PRINT_FP, NULL, "nolearning ", true);
+		print_bool_opt(PRINT_ANY, "learning", learning, true);
 	}
 
-	if (tb[IFLA_VXLAN_PROXY] && rta_getattr_u8(tb[IFLA_VXLAN_PROXY]))
-		print_bool(PRINT_ANY, "proxy", "proxy ", true);
+	if (tb[IFLA_VXLAN_PROXY])
+		print_bool_opt(PRINT_ANY, "proxy",
+			       rta_getattr_u8(tb[IFLA_VXLAN_PROXY]), false);
 
-	if (tb[IFLA_VXLAN_RSC] && rta_getattr_u8(tb[IFLA_VXLAN_RSC]))
-		print_bool(PRINT_ANY, "rsc", "rsc ", true);
+	if (tb[IFLA_VXLAN_RSC])
+		print_bool_opt(PRINT_ANY, "rsc",
+			       rta_getattr_u8(tb[IFLA_VXLAN_RSC]), false);
 
-	if (tb[IFLA_VXLAN_L2MISS] && rta_getattr_u8(tb[IFLA_VXLAN_L2MISS]))
-		print_bool(PRINT_ANY, "l2miss", "l2miss ", true);
+	if (tb[IFLA_VXLAN_L2MISS])
+		print_bool_opt(PRINT_ANY, "l2miss",
+			       rta_getattr_u8(tb[IFLA_VXLAN_L2MISS]), false);
 
-	if (tb[IFLA_VXLAN_L3MISS] && rta_getattr_u8(tb[IFLA_VXLAN_L3MISS]))
-		print_bool(PRINT_ANY, "l3miss", "l3miss ", true);
+	if (tb[IFLA_VXLAN_L3MISS])
+		print_bool_opt(PRINT_ANY, "l3miss",
+			       rta_getattr_u8(tb[IFLA_VXLAN_L3MISS]), false);
 
 	if (tb[IFLA_VXLAN_TOS])
 		tos = rta_getattr_u8(tb[IFLA_VXLAN_TOS]);
@@ -604,51 +604,27 @@ static void vxlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
 	if (tb[IFLA_VXLAN_UDP_CSUM]) {
 		__u8 udp_csum = rta_getattr_u8(tb[IFLA_VXLAN_UDP_CSUM]);
 
-		if (is_json_context()) {
-			print_bool(PRINT_ANY, "udp_csum", NULL, udp_csum);
-		} else {
-			if (!udp_csum)
-				fputs("no", f);
-			fputs("udpcsum ", f);
-		}
+		print_bool_opt(PRINT_ANY, "udp_csum", udp_csum, true);
 	}
 
 	if (tb[IFLA_VXLAN_UDP_ZERO_CSUM6_TX]) {
 		__u8 csum6 = rta_getattr_u8(tb[IFLA_VXLAN_UDP_ZERO_CSUM6_TX]);
 
-		if (is_json_context()) {
-			print_bool(PRINT_ANY,
-				   "udp_zero_csum6_tx", NULL, csum6);
-		} else {
-			if (!csum6)
-				fputs("no", f);
-			fputs("udp6zerocsumtx ", f);
-		}
+		print_bool_opt(PRINT_ANY, "udp_zero_csum6_tx", csum6, false);
 	}
 
 	if (tb[IFLA_VXLAN_UDP_ZERO_CSUM6_RX]) {
 		__u8 csum6 = rta_getattr_u8(tb[IFLA_VXLAN_UDP_ZERO_CSUM6_RX]);
 
-		if (is_json_context()) {
-			print_bool(PRINT_ANY,
-				   "udp_zero_csum6_rx",
-				   NULL,
-				   csum6);
-		} else {
-			if (!csum6)
-				fputs("no", f);
-			fputs("udp6zerocsumrx ", f);
-		}
+		print_bool_opt(PRINT_ANY, "udp_zero_csum6_rx", csum6, false);
 	}
 
-	if (tb[IFLA_VXLAN_REMCSUM_TX] &&
-	    rta_getattr_u8(tb[IFLA_VXLAN_REMCSUM_TX]))
-		print_bool(PRINT_ANY, "remcsum_tx", "remcsumtx ", true);
-
-	if (tb[IFLA_VXLAN_REMCSUM_RX] &&
-	    rta_getattr_u8(tb[IFLA_VXLAN_REMCSUM_RX]))
-		print_bool(PRINT_ANY, "remcsum_rx", "remcsumrx ", true);
-
+	if (tb[IFLA_VXLAN_REMCSUM_TX])
+		print_bool_opt(PRINT_ANY, "remcsum_tx",
+			       rta_getattr_u8(tb[IFLA_VXLAN_REMCSUM_TX]), false);
+	if (tb[IFLA_VXLAN_REMCSUM_RX])
+		print_bool_opt(PRINT_ANY, "remcsum_rx",
+			       rta_getattr_u8(tb[IFLA_VXLAN_REMCSUM_RX]), false);
 	if (tb[IFLA_VXLAN_GBP])
 		print_null(PRINT_ANY, "gbp", "gbp ", NULL);
 	if (tb[IFLA_VXLAN_GPE])
diff --git a/lib/json_print.c b/lib/json_print.c
index d7ee76b10de8..2dfddf713eb8 100644
--- a/lib/json_print.c
+++ b/lib/json_print.c
@@ -215,6 +215,25 @@ int print_color_bool(enum output_type type,
 				  value ? "true" : "false");
 }
 
+/* In JSON mode, acts like print_color_bool
+ * otherwise, if the value does not match expected value
+ *   then print key if true and key with prefix of "no" if false.
+ */
+int print_color_bool_opt(enum output_type type,
+			 enum color_attr color,
+			 const char *key,
+			 bool value, bool expected)
+{
+	int ret = 0;
+
+	if (_IS_JSON_CONTEXT(type))
+		jsonw_bool_field(_jw, key, value);
+	else if (_IS_FP_CONTEXT(type) && value != expected)
+		ret = color_fprintf(stdout, color, "%s%s ",
+				    value ? "" : "no", key);
+	return ret;
+}
+
 int print_color_on_off(enum output_type type,
 		       enum color_attr color,
 		       const char *key,
-- 
2.39.2


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

end of thread, other threads:[~2023-05-25 15:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-25 15:50 [PATCH iproute2 v2 0/2] vxlan: option printing Stephen Hemminger
2023-05-25 15:50 ` [PATCH iproute2 v2 1/2] vxlan: use print_nll for gbp and gpe Stephen Hemminger
2023-05-25 15:50 ` [PATCH iproute2 v2 2/2] vxlan: make option printing more consistent Stephen Hemminger

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.