]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: VXLAN support keyword 'inherit' for TTL
authorSusant Sahani <ssahani@gmail.com>
Fri, 10 May 2019 12:05:24 +0000 (17:35 +0530)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 10 May 2019 18:41:04 +0000 (20:41 +0200)
man/systemd.netdev.xml
src/network/netdev/netdev-gperf.gperf
src/network/netdev/vxlan.c
src/network/netdev/vxlan.h

index 21c7ba827060835521f21e679f4fd75f6295be9f..0143bfb1c605ddd6a6c22a66de4be12bbca8249c 100644 (file)
       <varlistentry>
         <term><varname>TTL=</varname></term>
         <listitem>
-          <para>A fixed Time To Live N on Virtual eXtensible Local
-          Area Network packets. N is a number in the range 1–255. 0
-          is a special value meaning that packets inherit the TTL
-          value.</para>
+          <para>A fixed Time To Live N on Virtual eXtensible Local Area Network packets.
+          Takes <literal>inherit</literal> or a number in the range 0–255. 0 is a special
+          value meaning inherit the inner protocol's TTL value. <literal>inherit</literal>
+          means that it will inherit the outer protocol's TTL value.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
index 2a7ea9692fda22abcba9bbb2ce99cec2f7a21ac3..8f43088f13d0664f3f36e99e172ea4c76a5c3905 100644 (file)
@@ -102,7 +102,7 @@ VXLAN.Group,                              config_parse_vxlan_address,
 VXLAN.Local,                              config_parse_vxlan_address,                0,                             offsetof(VxLan, local)
 VXLAN.Remote,                             config_parse_vxlan_address,                0,                             offsetof(VxLan, remote)
 VXLAN.TOS,                                config_parse_unsigned,                     0,                             offsetof(VxLan, tos)
-VXLAN.TTL,                                config_parse_unsigned,                     0,                             offsetof(VxLan, ttl)
+VXLAN.TTL,                                config_parse_vxlan_ttl,                    0,                             offsetof(VxLan, ttl)
 VXLAN.MacLearning,                        config_parse_bool,                         0,                             offsetof(VxLan, learning)
 VXLAN.ARPProxy,                           config_parse_bool,                         0,                             offsetof(VxLan, arp_proxy)
 VXLAN.ReduceARPProxy,                     config_parse_bool,                         0,                             offsetof(VxLan, arp_proxy)
index 126f6138a366c2ae3c3b471bf1f909c292dbb6fd..e24537083b64fbecc18e10835906214020236bc7 100644 (file)
@@ -65,7 +65,11 @@ static int netdev_vxlan_fill_message_create(NetDev *netdev, Link *link, sd_netli
         if (r < 0)
                 return log_netdev_error_errno(netdev, r, "Could not append IFLA_VXLAN_LINK attribute: %m");
 
-        if (v->ttl != 0) {
+        if (v->inherit) {
+                r = sd_netlink_message_append_flag(m, IFLA_VXLAN_TTL_INHERIT);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_VXLAN_TTL_INHERIT attribute: %m");
+        } else {
                 r = sd_netlink_message_append_u8(m, IFLA_VXLAN_TTL, v->ttl);
                 if (r < 0)
                         return log_netdev_error_errno(netdev, r, "Could not append IFLA_VXLAN_TTL attribute: %m");
@@ -288,6 +292,47 @@ int config_parse_flow_label(const char *unit,
         return 0;
 }
 
+int config_parse_vxlan_ttl(const char *unit,
+                           const char *filename,
+                           unsigned line,
+                           const char *section,
+                           unsigned section_line,
+                           const char *lvalue,
+                           int ltype,
+                           const char *rvalue,
+                            void *data,
+                           void *userdata) {
+        VxLan *v = userdata;
+        unsigned f;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        if (streq(rvalue, "inherit"))
+                v->inherit = true;
+        else {
+                r = safe_atou(rvalue, &f);
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r,
+                                   "Failed to parse VXLAN TTL '%s', ignoring assignment: %m", rvalue);
+                        return 0;
+                }
+
+                if (f > 255) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0,
+                                   "Invalid VXLAN TTL '%s'. TTL must be <= 255. Ignoring assignment.", rvalue);
+                        return 0;
+                }
+
+                v->ttl = f;
+        }
+
+        return 0;
+}
+
 static int netdev_vxlan_verify(NetDev *netdev, const char *filename) {
         VxLan *v = VXLAN(netdev);
 
index d448e3ccfe288b2945d5a054ff2e9e826b283d14..0c61bba2b89de3b3753a80f0a46ce2df1baf7a77 100644 (file)
@@ -55,6 +55,7 @@ struct VxLan {
         bool remote_csum_rx;
         bool group_policy;
         bool generic_protocol_extension;
+        bool inherit;
 
         struct ifla_vxlan_port_range port_range;
 };
@@ -69,3 +70,4 @@ CONFIG_PARSER_PROTOTYPE(config_parse_vxlan_address);
 CONFIG_PARSER_PROTOTYPE(config_parse_port_range);
 CONFIG_PARSER_PROTOTYPE(config_parse_flow_label);
 CONFIG_PARSER_PROTOTYPE(config_parse_df);
+CONFIG_PARSER_PROTOTYPE(config_parse_vxlan_ttl);