lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-Id: <20230525155035.7471-3-stephen@networkplumber.org> Date: Thu, 25 May 2023 08:50:35 -0700 From: Stephen Hemminger <stephen@...workplumber.org> To: netdev@...r.kernel.org Cc: Stephen Hemminger <stephen@...workplumber.org> Subject: [PATCH iproute2 v2 2/2] vxlan: make option printing more consistent 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@...workplumber.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
Powered by blists - more mailing lists