From 35b857f9c6f1ff79ab333e13ae9637ee52b309bb Mon Sep 17 00:00:00 2001 From: Hangbin Liu Date: Mon, 22 Oct 2018 15:46:18 +0800 Subject: [PATCH] ip/geneve: fix ttl inherit behavior Currently when we add geneve with "ttl inherit", we only set ttl to 0, which is actually use whatever default value instead of inherit the inner protocol's ttl value. To make a difference with ttl inherit and ttl == 0, we add an attribute IFLA_GENEVE_TTL_INHERIT in kernel commit 52d0d404d39dd ("geneve: add ttl inherit support"). Now let's use "ttl inherit" to inherit the inner protocol's ttl, and use "ttl auto" to means "use whatever default value", the same behavior with ttl == 0. v2: 1) remove IFLA_GENEVE_TTL_INHERIT defination in if_link.h as it's already updated. 2) Still use addattr8() so we can enable/disable ttl inherit, as Michal suggested. v3: Update man page Reported-by: Jianlin Shi Signed-off-by: Hangbin Liu Signed-off-by: David Ahern --- ip/iplink_geneve.c | 20 +++++++++++++------- man/man8/ip-link.8.in | 4 +++- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/ip/iplink_geneve.c b/ip/iplink_geneve.c index 26e70ff4..c417842b 100644 --- a/ip/iplink_geneve.c +++ b/ip/iplink_geneve.c @@ -34,7 +34,7 @@ static void print_explain(FILE *f) "Where: VNI := 0-16777215\n" " ADDR := IP_ADDRESS\n" " TOS := { NUMBER | inherit }\n" - " TTL := { 1..255 | inherit }\n" + " TTL := { 1..255 | auto | inherit }\n" " LABEL := 0-1048575\n" ); } @@ -94,7 +94,9 @@ static int geneve_parse_opt(struct link_util *lu, int argc, char **argv, NEXT_ARG(); check_duparg(&attrs, IFLA_GENEVE_TTL, "ttl", *argv); - if (strcmp(*argv, "inherit") != 0) { + if (strcmp(*argv, "inherit") == 0) { + addattr8(n, 1024, IFLA_GENEVE_TTL_INHERIT, 1); + } else if (strcmp(*argv, "auto") != 0) { if (get_unsigned(&uval, *argv, 0)) invarg("invalid TTL", *argv); if (uval > 255) @@ -265,12 +267,16 @@ static void geneve_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) } } - 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 + if (tb[IFLA_GENEVE_TTL_INHERIT] && + rta_getattr_u8(tb[IFLA_GENEVE_TTL_INHERIT])) { print_string(PRINT_FP, NULL, "ttl %s ", "inherit"); + } else 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 ", "auto"); + } if (tb[IFLA_GENEVE_TOS]) tos = rta_getattr_u8(tb[IFLA_GENEVE_TOS]); diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in index ecbbd4f4..4489162b 100644 --- a/man/man8/ip-link.8.in +++ b/man/man8/ip-link.8.in @@ -1190,7 +1190,9 @@ the following additional arguments are supported: .sp .BI ttl " TTL" -- specifies the TTL value to use in outgoing packets. +- specifies the TTL value to use in outgoing packets. "0" or "auto" means +use whatever default value, "inherit" means inherit the inner protocol's +ttl. Default option is "0". .sp .BI tos " TOS"