For ip tunnels tos can be 0 when not configured, 1 when
inherited from encapsulated packet and rest specifying
diffserv (rfc2474) or tos (rfc1349) bits. It is stored
in packet tos/diffserv field and returned in tos
netlink attribute to userspace.

Simplify and unify tos printing by using print_0xhex()
and print_string() instead of fprintf() to output values.

Signed-off-by: Serhey Popovych <serhe.popov...@gmail.com>
---
 ip/iplink_geneve.c |   23 ++++++++---------------
 ip/iplink_vxlan.c  |   19 ++++++++-----------
 ip/link_gre.c      |   23 ++++++++---------------
 ip/link_iptnl.c    |   22 ++++++++--------------
 4 files changed, 32 insertions(+), 55 deletions(-)

diff --git a/ip/iplink_geneve.c b/ip/iplink_geneve.c
index 5a0afd4..2d0a041 100644
--- a/ip/iplink_geneve.c
+++ b/ip/iplink_geneve.c
@@ -228,7 +228,7 @@ static void geneve_print_opt(struct link_util *lu, FILE *f, 
struct rtattr *tb[])
 {
        __u32 vni;
        __u8 ttl = 0;
-       __u8 tos;
+       __u8 tos = 0;
 
        if (!tb)
                return;
@@ -270,20 +270,13 @@ static void geneve_print_opt(struct link_util *lu, FILE 
*f, struct rtattr *tb[])
        else
                print_string(PRINT_FP, NULL, "ttl %s ", "inherit");
 
-       if (tb[IFLA_GENEVE_TOS] &&
-           (tos = rta_getattr_u8(tb[IFLA_GENEVE_TOS]))) {
-               if (is_json_context()) {
-                       print_0xhex(PRINT_JSON, "tos", "%#x", tos);
-               } else {
-                       if (tos == 1) {
-                               print_string(PRINT_FP,
-                                            "tos",
-                                            "tos %s ",
-                                            "inherit");
-                       } else {
-                               fprintf(f, "tos %#x ", tos);
-                       }
-               }
+       if (tb[IFLA_GENEVE_TOS])
+               tos = rta_getattr_u8(tb[IFLA_GENEVE_TOS]);
+       if (tos) {
+               if (is_json_context() || tos != 1)
+                       print_0xhex(PRINT_ANY, "tos", "tos 0x%x ", tos);
+               else
+                       print_string(PRINT_FP, NULL, "tos %s ", "inherit");
        }
 
        if (tb[IFLA_GENEVE_LABEL]) {
diff --git a/ip/iplink_vxlan.c b/ip/iplink_vxlan.c
index b9c335d..88b5662 100644
--- a/ip/iplink_vxlan.c
+++ b/ip/iplink_vxlan.c
@@ -395,7 +395,7 @@ static void vxlan_print_opt(struct link_util *lu, FILE *f, 
struct rtattr *tb[])
 {
        __u32 vni;
        __u8 ttl = 0;
-       __u8 tos;
+       __u8 tos = 0;
        __u32 maxaddr;
 
        if (!tb)
@@ -515,16 +515,13 @@ static void vxlan_print_opt(struct link_util *lu, FILE 
*f, struct rtattr *tb[])
        if (tb[IFLA_VXLAN_L3MISS] && rta_getattr_u8(tb[IFLA_VXLAN_L3MISS]))
                print_bool(PRINT_ANY, "l3miss", "l3miss ", true);
 
-       if (tb[IFLA_VXLAN_TOS] &&
-           (tos = rta_getattr_u8(tb[IFLA_VXLAN_TOS]))) {
-               if (is_json_context()) {
-                       print_0xhex(PRINT_JSON, "tos", "%#x", tos);
-               } else {
-                       if (tos == 1)
-                               fprintf(f, "tos %s ", "inherit");
-                       else
-                               fprintf(f, "tos %#x ", tos);
-               }
+       if (tb[IFLA_VXLAN_TOS])
+               tos = rta_getattr_u8(tb[IFLA_VXLAN_TOS]);
+       if (tos) {
+               if (is_json_context() || tos != 1)
+                       print_0xhex(PRINT_ANY, "tos", "tos 0x%x ", tos);
+               else
+                       print_string(PRINT_FP, NULL, "tos %s ", "inherit");
        }
 
        if (tb[IFLA_VXLAN_TTL])
diff --git a/ip/link_gre.c b/ip/link_gre.c
index 1cf7f4e..490d7db 100644
--- a/ip/link_gre.c
+++ b/ip/link_gre.c
@@ -362,6 +362,7 @@ static void gre_print_direct_opt(FILE *f, struct rtattr 
*tb[])
        unsigned int iflags = 0;
        unsigned int oflags = 0;
        __u8 ttl = 0;
+       __u8 tos = 0;
 
        if (tb[IFLA_GRE_REMOTE]) {
                unsigned int addr = rta_getattr_u32(tb[IFLA_GRE_REMOTE]);
@@ -397,21 +398,13 @@ static void gre_print_direct_opt(FILE *f, struct rtattr 
*tb[])
        else
                print_string(PRINT_FP, NULL, "ttl %s ", "inherit");
 
-       if (tb[IFLA_GRE_TOS] && rta_getattr_u8(tb[IFLA_GRE_TOS])) {
-               int tos = rta_getattr_u8(tb[IFLA_GRE_TOS]);
-
-               if (is_json_context()) {
-                       SPRINT_BUF(b1);
-
-                       snprintf(b1, sizeof(b1), "0x%x", tos);
-                       print_string(PRINT_JSON, "tos", NULL, b1);
-               } else {
-                       fputs("tos ", f);
-                       if (tos == 1)
-                               fputs("inherit ", f);
-                       else
-                               fprintf(f, "0x%x ", tos);
-               }
+       if (tb[IFLA_GRE_TOS])
+               tos = rta_getattr_u8(tb[IFLA_GRE_TOS]);
+       if (tos) {
+               if (is_json_context() || tos != 1)
+                       print_0xhex(PRINT_ANY, "tos", "tos 0x%x ", tos);
+               else
+                       print_string(PRINT_FP, NULL, "tos %s ", "inherit");
        }
 
        if (tb[IFLA_GRE_PMTUDISC]) {
diff --git a/ip/link_iptnl.c b/ip/link_iptnl.c
index 93e1a1b..7fda580 100644
--- a/ip/link_iptnl.c
+++ b/ip/link_iptnl.c
@@ -366,6 +366,7 @@ static void iptunnel_print_opt(struct link_util *lu, FILE 
*f, struct rtattr *tb[
        const char *remote = "any";
        __u16 prefixlen, type;
        __u8 ttl = 0;
+       __u8 tos = 0;
 
        if (!tb)
                return;
@@ -424,20 +425,13 @@ static void iptunnel_print_opt(struct link_util *lu, FILE 
*f, struct rtattr *tb[
        else
                print_string(PRINT_FP, NULL, "ttl %s ", "inherit");
 
-       if (tb[IFLA_IPTUN_TOS]) {
-               int tos = rta_getattr_u8(tb[IFLA_IPTUN_TOS]);
-
-               if (tos) {
-                       if (is_json_context()) {
-                               print_0xhex(PRINT_JSON, "tos", "%#x", tos);
-                       } else {
-                               fputs("tos ", f);
-                               if (tos == 1)
-                                       fputs("inherit ", f);
-                               else
-                                       fprintf(f, "0x%x ", tos);
-                       }
-               }
+       if (tb[IFLA_IPTUN_TOS])
+               tos = rta_getattr_u8(tb[IFLA_IPTUN_TOS]);
+       if (tos) {
+               if (is_json_context() || tos != 1)
+                       print_0xhex(PRINT_ANY, "tos", "tos 0x%x ", tos);
+               else
+                       print_string(PRINT_FP, NULL, "tos %s ", "inherit");
        }
 
        if (tb[IFLA_IPTUN_PMTUDISC] && rta_getattr_u8(tb[IFLA_IPTUN_PMTUDISC]))
-- 
1.7.10.4

Reply via email to