From patchwork Tue Apr 17 12:52:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hangbin Liu X-Patchwork-Id: 899249 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="hfvR2a1c"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40QQCy1BVdz9s0W for ; Tue, 17 Apr 2018 22:53:34 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753424AbeDQMxc (ORCPT ); Tue, 17 Apr 2018 08:53:32 -0400 Received: from mail-pl0-f66.google.com ([209.85.160.66]:42280 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753370AbeDQMxa (ORCPT ); Tue, 17 Apr 2018 08:53:30 -0400 Received: by mail-pl0-f66.google.com with SMTP id t20-v6so11934117ply.9 for ; Tue, 17 Apr 2018 05:53:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Adcbhuc6qzUfr3RDv6byxuo3ouX6Gkk2bsyd/58Hav4=; b=hfvR2a1c9aT2ySFKZazyEFglSvLtaoUIntMA2HVAf17ezJD8PqlxIGRNzAXKslwkpo hBM5Cipt2/qej2nG2mGtDHAGM7v8KcNM6hMxeIWFcFgjLL3m0bquUh3/bz1JIGQg/8Vm IwNMaQAfSa1zb18OalRnxE0kakR7lDkfBhw7MfUO8Tgt0DPwALOihv5HISeyrKS3g/E8 t0DsmdI4yNaYKuycm34F0OeSZ4TaPRpl5MIVAHtm8fssPKB9VHUCTOdZ9h4DBiIuWfP+ ya2qvTKRSvrvgrBAcN1CTYGCbjyTxl4x4Zjs8sqK0YSslSkbdHIZUEswpdvE5teD+2YR ieXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Adcbhuc6qzUfr3RDv6byxuo3ouX6Gkk2bsyd/58Hav4=; b=KNwCIgb37B+V2PZqabPUqT9mAGPsibebLu/++uL0/GTP+1i/V5M1i+4EXwSMqmT0Uf MUBV065l3x6olKRguCavkVCDp5SyQpXoPTIVcTFPofbdI9ePb5cKj9HWES2mJXR/2ILH rs14sFAGu2p0v8JCZqyXcmveJ4kF8cHyRJSLkCxgG5AsaQ6HvEVQ6jLskuTa9EuEtwJ7 F0y4F/t4qsNjbjw1jHAAwVp7L1hsAGjCd1dEanMnkckbAP+CIfhmfZocx9zzLGwegP99 JHYalIuhbKA8kB1mtGtDur/1IQ4Etj+anRuVLu85gXgevBzFc5HZDH19mRSwmDUDxajz PM4Q== X-Gm-Message-State: ALQs6tDB/Moud3E/QYpjVAoKdMtFkpuFhuEg4ObPSZjRBzHYrdFARPWO 4s3Kt1+0JmzzlTrCjtf3iQsztpXw X-Google-Smtp-Source: AIpwx4+bPBdqAcPLtRdIlogqMUcN3jercg//U9GT0QWIJunAzwKN0sZTOH1g4xdVJ0lPQkLCFWxfsg== X-Received: by 2002:a17:902:bb8c:: with SMTP id m12-v6mr1981302pls.53.1523969610050; Tue, 17 Apr 2018 05:53:30 -0700 (PDT) Received: from leo.usersys.redhat.com ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id t1sm29434537pgs.47.2018.04.17.05.53.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Apr 2018 05:53:29 -0700 (PDT) From: Hangbin Liu To: netdev@vger.kernel.org Cc: Jiri Benc , Xin Long , "David S. Miller" , Stefano Brivio , Hangbin Liu Subject: [PATCHv2 net-next] vxlan: add ttl inherit support Date: Tue, 17 Apr 2018 20:52:54 +0800 Message-Id: <1523969574-3279-1-git-send-email-liuhangbin@gmail.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1523945488-27487-1-git-send-email-liuhangbin@gmail.com> References: <1523945488-27487-1-git-send-email-liuhangbin@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Like tos inherit, ttl inherit should also means inherit the inner protocol's ttl values, which actually not implemented in vxlan yet. But we could not treat ttl == 0 as "use the inner TTL", because that would be used also when the "ttl" option is not specified and that would be a behavior change, and breaking real use cases. So add a different attribute IFLA_VXLAN_TTL_INHERIT when "ttl inherit" is specified. --- v2: As suggested by Stefano, clean up function ip_tunnel_get_ttl(). Suggested-by: Jiri Benc Signed-off-by: Hangbin Liu --- drivers/net/vxlan.c | 17 ++++++++++++++--- include/net/ip_tunnels.h | 12 ++++++++++++ include/net/vxlan.h | 1 + include/uapi/linux/if_link.h | 1 + 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index aa5f034..209a840 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c @@ -2085,9 +2085,13 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev, local_ip = vxlan->cfg.saddr; dst_cache = &rdst->dst_cache; md->gbp = skb->mark; - ttl = vxlan->cfg.ttl; - if (!ttl && vxlan_addr_multicast(dst)) - ttl = 1; + if (flags & VXLAN_F_TTL_INHERIT) { + ttl = ip_tunnel_get_ttl(old_iph, skb); + } else { + ttl = vxlan->cfg.ttl; + if (!ttl && vxlan_addr_multicast(dst)) + ttl = 1; + } tos = vxlan->cfg.tos; if (tos == 1) @@ -2709,6 +2713,7 @@ static const struct nla_policy vxlan_policy[IFLA_VXLAN_MAX + 1] = { [IFLA_VXLAN_GBP] = { .type = NLA_FLAG, }, [IFLA_VXLAN_GPE] = { .type = NLA_FLAG, }, [IFLA_VXLAN_REMCSUM_NOPARTIAL] = { .type = NLA_FLAG }, + [IFLA_VXLAN_TTL_INHERIT] = { .type = NLA_FLAG }, }; static int vxlan_validate(struct nlattr *tb[], struct nlattr *data[], @@ -3254,6 +3259,12 @@ static int vxlan_nl2conf(struct nlattr *tb[], struct nlattr *data[], if (data[IFLA_VXLAN_TTL]) conf->ttl = nla_get_u8(data[IFLA_VXLAN_TTL]); + if (data[IFLA_VXLAN_TTL_INHERIT]) { + if (changelink) + return -EOPNOTSUPP; + conf->flags |= VXLAN_F_TTL_INHERIT; + } + if (data[IFLA_VXLAN_LABEL]) conf->label = nla_get_be32(data[IFLA_VXLAN_LABEL]) & IPV6_FLOWLABEL_MASK; diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h index cbe5add..5a8ab9f 100644 --- a/include/net/ip_tunnels.h +++ b/include/net/ip_tunnels.h @@ -377,6 +377,18 @@ static inline u8 ip_tunnel_get_dsfield(const struct iphdr *iph, return 0; } +static inline u8 ip_tunnel_get_ttl(const struct iphdr *iph, + const struct sk_buff *skb) +{ + if (skb->protocol == htons(ETH_P_IP)) + return iph->ttl; + + if (skb->protocol == htons(ETH_P_IPV6)) + return ((const struct ipv6hdr *)iph)->hop_limit; + + return 0; +} + /* Propogate ECN bits out */ static inline u8 ip_tunnel_ecn_encap(u8 tos, const struct iphdr *iph, const struct sk_buff *skb) diff --git a/include/net/vxlan.h b/include/net/vxlan.h index ad73d8b..b99a02ae 100644 --- a/include/net/vxlan.h +++ b/include/net/vxlan.h @@ -262,6 +262,7 @@ struct vxlan_dev { #define VXLAN_F_COLLECT_METADATA 0x2000 #define VXLAN_F_GPE 0x4000 #define VXLAN_F_IPV6_LINKLOCAL 0x8000 +#define VXLAN_F_TTL_INHERIT 0x10000 /* Flags that are used in the receive path. These flags must match in * order for a socket to be shareable diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h index 11d0c0e..e771a63 100644 --- a/include/uapi/linux/if_link.h +++ b/include/uapi/linux/if_link.h @@ -516,6 +516,7 @@ enum { IFLA_VXLAN_COLLECT_METADATA, IFLA_VXLAN_LABEL, IFLA_VXLAN_GPE, + IFLA_VXLAN_TTL_INHERIT, __IFLA_VXLAN_MAX }; #define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1)