From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hangbin Liu Subject: [PATCH iproute2-next] geneve: fix ttl inherit behavior Date: Thu, 27 Sep 2018 15:27:37 +0800 Message-ID: <1538033257-32244-1-git-send-email-liuhangbin@gmail.com> Cc: Stephen Hemminger , David Ahern , Phil Sutter , Hangbin Liu To: netdev@vger.kernel.org Return-path: Received: from mail-pg1-f170.google.com ([209.85.215.170]:39527 "EHLO mail-pg1-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727272AbeI0No4 (ORCPT ); Thu, 27 Sep 2018 09:44:56 -0400 Received: by mail-pg1-f170.google.com with SMTP id 85-v6so1265524pge.6 for ; Thu, 27 Sep 2018 00:28:05 -0700 (PDT) Sender: netdev-owner@vger.kernel.org List-ID: Currently when we add geneve with "ttl inherit", we set ttl to 0, which is actually use whatever default value instead of inherit the inner protocol's ttl value. To respect compatibility with old behavior and make a difference between 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. Reported-by: Jianlin Shi Signed-off-by: Hangbin Liu --- include/uapi/linux/if_link.h | 1 + ip/iplink_geneve.c | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h index f4a9715..02d7bdf 100644 --- a/include/uapi/linux/if_link.h +++ b/include/uapi/linux/if_link.h @@ -552,6 +552,7 @@ enum { IFLA_GENEVE_UDP_ZERO_CSUM6_TX, IFLA_GENEVE_UDP_ZERO_CSUM6_RX, IFLA_GENEVE_LABEL, + IFLA_GENEVE_TTL_INHERIT, __IFLA_GENEVE_MAX }; #define IFLA_GENEVE_MAX (__IFLA_GENEVE_MAX - 1) diff --git a/ip/iplink_geneve.c b/ip/iplink_geneve.c index 26e70ff..c417842 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]); -- 2.5.5