Message ID | 1523969574-3279-1-git-send-email-liuhangbin@gmail.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
Series | [PATCHv2,net-next] vxlan: add ttl inherit support | expand |
From: Hangbin Liu <liuhangbin@gmail.com> Date: Tue, 17 Apr 2018 20:52:54 +0800 > 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 <jbenc@redhat.com> > Signed-off-by: Hangbin Liu <liuhangbin@gmail.com> I already applied V1 of your patch. Furthermore, this commit message would cause your signoffs and other tags to be removed due to the "---" deliminator. I generally encourage people to leave the change history text _in_ the commit message anyways. It is useful information for the future.
On Tue, Apr 17, 2018 at 03:16:27PM -0400, David Miller wrote: > From: Hangbin Liu <liuhangbin@gmail.com> > Date: Tue, 17 Apr 2018 20:52:54 +0800 > > > 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 <jbenc@redhat.com> > > Signed-off-by: Hangbin Liu <liuhangbin@gmail.com> > > I already applied V1 of your patch. > > Furthermore, this commit message would cause your signoffs and other tags > to be removed due to the "---" deliminator. > > I generally encourage people to leave the change history text _in_ the > commit message anyways. It is useful information for the future. Thanks for the reminding. I will keep this in mind. Cheers Hangbin
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)
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 <jbenc@redhat.com> Signed-off-by: Hangbin Liu <liuhangbin@gmail.com> --- 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(-)