|
@@ -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;
|