@@ -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 show);
+
+static inline int print_bool_opt(enum output_type type,
+ const char *key, bool value, bool show)
+{
+ return print_color_bool_opt(type, COLOR_NONE, key, value, show);
+}
+
/* A backdoor to the size formatter. Please use print_size() instead. */
char *sprint_size(__u32 sz, char *buf);
@@ -427,15 +427,15 @@ 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);
+#define PRINT_VXLAN_OPTION(attr, opt, expect) \
+ if (tb[attr]) { \
+ __u8 opt = rta_getattr_u8(tb[attr]); \
+ print_bool_opt(PRINT_ANY, #opt, opt, \
+ opt != expect || show_details > 1); \
}
- if (tb[IFLA_VXLAN_VNIFILTER] &&
- rta_getattr_u8(tb[IFLA_VXLAN_VNIFILTER])) {
- print_bool(PRINT_ANY, "vnifilter", "vnifilter", true);
- }
+ PRINT_VXLAN_OPTION(IFLA_VXLAN_COLLECT_METADATA, external, false);
+ PRINT_VXLAN_OPTION(IFLA_VXLAN_VNIFILTER, vnifilter, false);
if (tb[IFLA_VXLAN_ID] &&
RTA_PAYLOAD(tb[IFLA_VXLAN_ID]) >= sizeof(__u32)) {
@@ -529,25 +529,11 @@ static void vxlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
"dstport %u ",
rta_getattr_be16(tb[IFLA_VXLAN_PORT]));
- 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);
- }
-
- if (tb[IFLA_VXLAN_PROXY] && rta_getattr_u8(tb[IFLA_VXLAN_PROXY]))
- print_bool(PRINT_ANY, "proxy", "proxy ", true);
-
- if (tb[IFLA_VXLAN_RSC] && rta_getattr_u8(tb[IFLA_VXLAN_RSC]))
- print_bool(PRINT_ANY, "rsc", "rsc ", true);
-
- if (tb[IFLA_VXLAN_L2MISS] && rta_getattr_u8(tb[IFLA_VXLAN_L2MISS]))
- print_bool(PRINT_ANY, "l2miss", "l2miss ", true);
-
- if (tb[IFLA_VXLAN_L3MISS] && rta_getattr_u8(tb[IFLA_VXLAN_L3MISS]))
- print_bool(PRINT_ANY, "l3miss", "l3miss ", true);
+ PRINT_VXLAN_OPTION(IFLA_VXLAN_LEARNING, learning, true);
+ PRINT_VXLAN_OPTION(IFLA_VXLAN_PROXY, proxy, false);
+ PRINT_VXLAN_OPTION(IFLA_VXLAN_RSC, rsc, false);
+ PRINT_VXLAN_OPTION(IFLA_VXLAN_L2MISS, l2miss, false);
+ PRINT_VXLAN_OPTION(IFLA_VXLAN_L3MISS, l3miss, false);
if (tb[IFLA_VXLAN_TOS])
tos = rta_getattr_u8(tb[IFLA_VXLAN_TOS]);
@@ -601,58 +587,17 @@ static void vxlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
((maxaddr = rta_getattr_u32(tb[IFLA_VXLAN_LIMIT])) != 0))
print_uint(PRINT_ANY, "limit", "maxaddr %u ", maxaddr);
- 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);
- }
- }
-
- 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);
- }
- }
-
- 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);
- }
- }
-
- 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);
+ PRINT_VXLAN_OPTION(IFLA_VXLAN_UDP_CSUM, udp_csum, true);
+ PRINT_VXLAN_OPTION(IFLA_VXLAN_UDP_ZERO_CSUM6_TX, udp_zero_csum6_tx, false);
+ PRINT_VXLAN_OPTION(IFLA_VXLAN_UDP_ZERO_CSUM6_RX, udp_zero_csum6_rx, false);
+ PRINT_VXLAN_OPTION(IFLA_VXLAN_REMCSUM_TX, remcsum_tx, false);
+ PRINT_VXLAN_OPTION(IFLA_VXLAN_REMCSUM_RX, remcsum_rx, false);
if (tb[IFLA_VXLAN_GBP])
print_null(PRINT_ANY, "gbp", "gbp ", NULL);
if (tb[IFLA_VXLAN_GPE])
print_null(PRINT_ANY, "gpe", "gpe ", NULL);
+#undef PRINT_VXLAN_OPTION
}
static void vxlan_print_help(struct link_util *lu, int argc, char **argv,
@@ -215,6 +215,25 @@ int print_color_bool(enum output_type type,
value ? "true" : "false");
}
+/* In JSON mode, acts like print_color_bool.
+ * Otherwise, will print key with prefix of "no" if false.
+ * The show flag is used to suppres printing in non-JSON mode
+ */
+int print_color_bool_opt(enum output_type type,
+ enum color_attr color,
+ const char *key,
+ bool value, bool show)
+{
+ int ret = 0;
+
+ if (_IS_JSON_CONTEXT(type))
+ jsonw_bool_field(_jw, key, value);
+ else if (_IS_FP_CONTEXT(type) && show)
+ 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,
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 unless the details setting is repeated. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- include/json_print.h | 9 +++++ ip/iplink_vxlan.c | 91 +++++++++----------------------------------- lib/json_print.c | 19 +++++++++ 3 files changed, 46 insertions(+), 73 deletions(-)