ip/tunnel: Correct and unify ttl/hoplimit printing
Both ttl/hoplimit is from 1 to 255. Zero has special meaning: use encapsulated packet value. In ip-link(8) -d output this looks like "ttl/hoplimit inherit". In JSON we have "int" type for ttl and therefore values from 0 (inherit) to 255. To do the best in handling ttl/hoplimit we need to accept both cases: missing attribute in netlink dump and zero value for "inherit"ed case. Last one is broken since JSON output introduction for gre/iptnl versions and was never true for gre6/ip6tnl. For all tunnels, except ip6tnl change JSON type from "int" to "uint" to reflect true nature of the ttl. Signed-off-by: Serhey Popovych <serhe.popovych@gmail.com> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
This commit is contained in:
parent
45d3a6efb2
commit
375560c4ab
|
|
@ -92,7 +92,10 @@ static void print_tunnel(struct ip6_tnl_parm2 *p)
|
|||
else
|
||||
printf(" encaplimit %u", p->encap_limit);
|
||||
|
||||
printf(" hoplimit %u", p->hop_limit);
|
||||
if (p->hop_limit)
|
||||
printf(" hoplimit %u", p->hop_limit);
|
||||
else
|
||||
printf(" hoplimit inherit");
|
||||
|
||||
if (p->flags & IP6_TNL_F_USE_ORIG_TCLASS)
|
||||
printf(" tclass inherit");
|
||||
|
|
|
|||
|
|
@ -227,6 +227,7 @@ static int geneve_parse_opt(struct link_util *lu, int argc, char **argv,
|
|||
static void geneve_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
|
||||
{
|
||||
__u32 vni;
|
||||
__u8 ttl = 0;
|
||||
__u8 tos;
|
||||
|
||||
if (!tb)
|
||||
|
|
@ -262,12 +263,12 @@ static void geneve_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
|
|||
}
|
||||
}
|
||||
|
||||
if (tb[IFLA_GENEVE_TTL]) {
|
||||
__u8 ttl = rta_getattr_u8(tb[IFLA_GENEVE_TTL]);
|
||||
|
||||
if (ttl)
|
||||
print_int(PRINT_ANY, "ttl", "ttl %d ", ttl);
|
||||
}
|
||||
if (tb[IFLA_GENEVE_TTL])
|
||||
ttl = rta_getattr_u8(tb[IFLA_GENEVE_TTL]);
|
||||
if (is_json_context() || ttl)
|
||||
print_uint(PRINT_ANY, "ttl", "ttl %u ", ttl);
|
||||
else
|
||||
print_string(PRINT_FP, NULL, "ttl %s ", "inherit");
|
||||
|
||||
if (tb[IFLA_GENEVE_TOS] &&
|
||||
(tos = rta_getattr_u8(tb[IFLA_GENEVE_TOS]))) {
|
||||
|
|
|
|||
|
|
@ -394,6 +394,7 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv,
|
|||
static void vxlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
|
||||
{
|
||||
__u32 vni;
|
||||
__u8 ttl = 0;
|
||||
__u8 tos;
|
||||
__u32 maxaddr;
|
||||
|
||||
|
|
@ -526,14 +527,12 @@ static void vxlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
|
|||
}
|
||||
}
|
||||
|
||||
if (tb[IFLA_VXLAN_TTL]) {
|
||||
__u8 ttl = rta_getattr_u8(tb[IFLA_VXLAN_TTL]);
|
||||
|
||||
if (ttl)
|
||||
print_int(PRINT_ANY, "ttl", "ttl %d ", ttl);
|
||||
else
|
||||
print_int(PRINT_JSON, "ttl", NULL, ttl);
|
||||
}
|
||||
if (tb[IFLA_VXLAN_TTL])
|
||||
ttl = rta_getattr_u8(tb[IFLA_VXLAN_TTL]);
|
||||
if (is_json_context() || ttl)
|
||||
print_uint(PRINT_ANY, "ttl", "ttl %u ", ttl);
|
||||
else
|
||||
print_string(PRINT_FP, NULL, "ttl %s ", "inherit");
|
||||
|
||||
if (tb[IFLA_VXLAN_LABEL]) {
|
||||
__u32 label = rta_getattr_u32(tb[IFLA_VXLAN_LABEL]);
|
||||
|
|
|
|||
|
|
@ -271,7 +271,7 @@ static void print_encap_ip(FILE *fp, struct rtattr *encap)
|
|||
rt_addr_n2a_rta(AF_INET, tb[LWTUNNEL_IP_DST]));
|
||||
|
||||
if (tb[LWTUNNEL_IP_TTL])
|
||||
fprintf(fp, "ttl %d ", rta_getattr_u8(tb[LWTUNNEL_IP_TTL]));
|
||||
fprintf(fp, "ttl %u ", rta_getattr_u8(tb[LWTUNNEL_IP_TTL]));
|
||||
|
||||
if (tb[LWTUNNEL_IP_TOS])
|
||||
fprintf(fp, "tos %d ", rta_getattr_u8(tb[LWTUNNEL_IP_TOS]));
|
||||
|
|
@ -326,7 +326,7 @@ static void print_encap_ip6(FILE *fp, struct rtattr *encap)
|
|||
rt_addr_n2a_rta(AF_INET6, tb[LWTUNNEL_IP6_DST]));
|
||||
|
||||
if (tb[LWTUNNEL_IP6_HOPLIMIT])
|
||||
fprintf(fp, "hoplimit %d ",
|
||||
fprintf(fp, "hoplimit %u ",
|
||||
rta_getattr_u8(tb[LWTUNNEL_IP6_HOPLIMIT]));
|
||||
|
||||
if (tb[LWTUNNEL_IP6_TC])
|
||||
|
|
|
|||
|
|
@ -326,7 +326,7 @@ static void print_tunnel(struct ip_tunnel_parm *p)
|
|||
}
|
||||
|
||||
if (p->iph.ttl)
|
||||
printf(" ttl %d", p->iph.ttl);
|
||||
printf(" ttl %u", p->iph.ttl);
|
||||
else
|
||||
printf(" ttl inherit");
|
||||
|
||||
|
|
|
|||
|
|
@ -361,6 +361,7 @@ static void gre_print_direct_opt(FILE *f, struct rtattr *tb[])
|
|||
const char *remote = "any";
|
||||
unsigned int iflags = 0;
|
||||
unsigned int oflags = 0;
|
||||
__u8 ttl = 0;
|
||||
|
||||
if (tb[IFLA_GRE_REMOTE]) {
|
||||
unsigned int addr = rta_getattr_u32(tb[IFLA_GRE_REMOTE]);
|
||||
|
|
@ -389,16 +390,12 @@ static void gre_print_direct_opt(FILE *f, struct rtattr *tb[])
|
|||
}
|
||||
}
|
||||
|
||||
if (tb[IFLA_GRE_TTL]) {
|
||||
__u8 ttl = rta_getattr_u8(tb[IFLA_GRE_TTL]);
|
||||
|
||||
if (ttl)
|
||||
print_int(PRINT_ANY, "ttl", "ttl %d ", ttl);
|
||||
else
|
||||
print_int(PRINT_JSON, "ttl", NULL, ttl);
|
||||
} else {
|
||||
if (tb[IFLA_GRE_TTL])
|
||||
ttl = rta_getattr_u8(tb[IFLA_GRE_TTL]);
|
||||
if (is_json_context() || ttl)
|
||||
print_uint(PRINT_ANY, "ttl", "ttl %u ", ttl);
|
||||
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]);
|
||||
|
|
|
|||
|
|
@ -382,6 +382,7 @@ static void gre_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
|
|||
unsigned int flags = 0;
|
||||
__u32 flowinfo = 0;
|
||||
struct in6_addr in6_addr_any = IN6ADDR_ANY_INIT;
|
||||
__u8 ttl = 0;
|
||||
|
||||
if (!tb)
|
||||
return;
|
||||
|
|
@ -423,14 +424,12 @@ static void gre_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
|
|||
}
|
||||
}
|
||||
|
||||
if (tb[IFLA_GRE_TTL]) {
|
||||
__u8 ttl = rta_getattr_u8(tb[IFLA_GRE_TTL]);
|
||||
|
||||
if (ttl)
|
||||
print_int(PRINT_ANY, "ttl", "hoplimit %d ", ttl);
|
||||
else
|
||||
print_int(PRINT_JSON, "ttl", NULL, ttl);
|
||||
}
|
||||
if (tb[IFLA_GRE_TTL])
|
||||
ttl = rta_getattr_u8(tb[IFLA_GRE_TTL]);
|
||||
if (is_json_context() || ttl)
|
||||
print_uint(PRINT_ANY, "ttl", "hoplimit %u ", ttl);
|
||||
else
|
||||
print_string(PRINT_FP, NULL, "hoplimit %s ", "inherit");
|
||||
|
||||
if (flags & IP6_TNL_F_IGN_ENCAP_LIMIT) {
|
||||
print_bool(PRINT_ANY,
|
||||
|
|
|
|||
|
|
@ -336,6 +336,7 @@ static void ip6tunnel_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb
|
|||
char s2[64];
|
||||
int flags = 0;
|
||||
__u32 flowinfo = 0;
|
||||
__u8 ttl = 0;
|
||||
|
||||
if (!tb)
|
||||
return;
|
||||
|
|
@ -386,12 +387,12 @@ static void ip6tunnel_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb
|
|||
}
|
||||
}
|
||||
|
||||
if (tb[IFLA_IPTUN_TTL]) {
|
||||
print_uint(PRINT_ANY,
|
||||
"ttl",
|
||||
"hoplimit %u ",
|
||||
rta_getattr_u8(tb[IFLA_IPTUN_TTL]));
|
||||
}
|
||||
if (tb[IFLA_IPTUN_TTL])
|
||||
ttl = rta_getattr_u8(tb[IFLA_IPTUN_TTL]);
|
||||
if (is_json_context() || ttl)
|
||||
print_uint(PRINT_ANY, "ttl", "hoplimit %u ", ttl);
|
||||
else
|
||||
print_string(PRINT_FP, NULL, "hoplimit %s ", "inherit");
|
||||
|
||||
if (flags & IP6_TNL_F_IGN_ENCAP_LIMIT) {
|
||||
print_bool(PRINT_ANY,
|
||||
|
|
|
|||
|
|
@ -365,6 +365,7 @@ static void iptunnel_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[
|
|||
const char *local = "any";
|
||||
const char *remote = "any";
|
||||
__u16 prefixlen, type;
|
||||
__u8 ttl = 0;
|
||||
|
||||
if (!tb)
|
||||
return;
|
||||
|
|
@ -416,16 +417,12 @@ static void iptunnel_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[
|
|||
}
|
||||
}
|
||||
|
||||
if (tb[IFLA_IPTUN_TTL]) {
|
||||
__u8 ttl = rta_getattr_u8(tb[IFLA_IPTUN_TTL]);
|
||||
|
||||
if (ttl)
|
||||
print_int(PRINT_ANY, "ttl", "ttl %d ", ttl);
|
||||
else
|
||||
print_int(PRINT_JSON, "ttl", NULL, ttl);
|
||||
} else {
|
||||
if (tb[IFLA_IPTUN_TTL])
|
||||
ttl = rta_getattr_u8(tb[IFLA_IPTUN_TTL]);
|
||||
if (is_json_context() || ttl)
|
||||
print_uint(PRINT_ANY, "ttl", "ttl %u ", ttl);
|
||||
else
|
||||
print_string(PRINT_FP, NULL, "ttl %s ", "inherit");
|
||||
}
|
||||
|
||||
if (tb[IFLA_IPTUN_TOS]) {
|
||||
int tos = rta_getattr_u8(tb[IFLA_IPTUN_TOS]);
|
||||
|
|
|
|||
Loading…
Reference in New Issue