]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: Geneve add support for inherit for TTL
authorSusant Sahani <ssahani@gmail.com>
Sat, 11 May 2019 02:38:57 +0000 (08:08 +0530)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 11 May 2019 22:39:13 +0000 (00:39 +0200)
man/systemd.netdev.xml
src/network/netdev/geneve.c
src/network/netdev/geneve.h
src/network/netdev/netdev-gperf.gperf

index 0143bfb1c605ddd6a6c22a66de4be12bbca8249c..42632a6540ec6212833ee5d925015a29097bc417 100644 (file)
       <varlistentry>
         <term><varname>TTL=</varname></term>
         <listitem>
-          <para>Specifies the TTL value to use in outgoing packets. Takes a number in the range 0-255.
-          When unset or set to 0, the kernel's default will be used meaning that packets TTL will be set from
+          <para>Accepts the same key in <literal>[VXLAN]</literal> section except when unset or
+          set to 0, the kernel's default will be used meaning that packets TTL will be set from
           <filename>/proc/sys/net/ipv4/ip_default_ttl</filename>.</para>
         </listitem>
       </varlistentry>
index 1b1cd2fc9e4e9ac0c48068772b88674c9dda9691..3dc8f083cc64709395d8ac7cbc21540344d37dcc 100644 (file)
@@ -102,7 +102,11 @@ static int netdev_geneve_create(NetDev *netdev) {
                         return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_REMOTE/IFLA_GENEVE_REMOTE6 attribute: %m");
         }
 
-        if (v->ttl > 0) {
+        if (v->inherit) {
+                r = sd_netlink_message_append_u8(m, IFLA_GENEVE_TTL_INHERIT, 1);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_TTL_INHERIT attribute: %m");
+        } else {
                 r = sd_netlink_message_append_u8(m, IFLA_GENEVE_TTL, v->ttl);
                 if (r < 0)
                         return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_TTL attribute: %m");
@@ -271,6 +275,47 @@ int config_parse_geneve_flow_label(const char *unit,
         return 0;
 }
 
+int config_parse_geneve_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) {
+        Geneve *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 Geneve TTL '%s', ignoring assignment: %m", rvalue);
+                        return 0;
+                }
+
+                if (f > 255) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0,
+                                   "Invalid Geneve TTL '%s'. TTL must be <= 255. Ignoring assignment.", rvalue);
+                        return 0;
+                }
+
+                v->ttl = f;
+        }
+
+        return 0;
+}
+
 static int netdev_geneve_verify(NetDev *netdev, const char *filename) {
         Geneve *v = GENEVE(netdev);
 
index 5f2f27c9bb395f55f64d3cc2fa8b1e909df2a102..32f7f038ba05551ab01a7b024a9b58b57ba8f3d6 100644 (file)
@@ -34,6 +34,7 @@ struct Geneve {
         bool udpcsum;
         bool udp6zerocsumtx;
         bool udp6zerocsumrx;
+        bool inherit;
 
         GeneveDF geneve_df;
         union in_addr_union remote;
@@ -49,3 +50,4 @@ CONFIG_PARSER_PROTOTYPE(config_parse_geneve_vni);
 CONFIG_PARSER_PROTOTYPE(config_parse_geneve_address);
 CONFIG_PARSER_PROTOTYPE(config_parse_geneve_flow_label);
 CONFIG_PARSER_PROTOTYPE(config_parse_geneve_df);
+CONFIG_PARSER_PROTOTYPE(config_parse_geneve_ttl);
index 8f43088f13d0664f3f36e99e172ea4c76a5c3905..e18d746befc9248182b85035af22e8881b51e769 100644 (file)
@@ -128,7 +128,7 @@ VXLAN.IPDoNotFragment,                    config_parse_df,
 GENEVE.Id,                                config_parse_geneve_vni,                   0,                             offsetof(Geneve, id)
 GENEVE.Remote,                            config_parse_geneve_address,               0,                             offsetof(Geneve, remote)
 GENEVE.TOS,                               config_parse_uint8,                        0,                             offsetof(Geneve, tos)
-GENEVE.TTL,                               config_parse_uint8,                        0,                             offsetof(Geneve, ttl)
+GENEVE.TTL,                               config_parse_geneve_ttl,                   0,                             offsetof(Geneve, ttl)
 GENEVE.UDPChecksum,                       config_parse_bool,                         0,                             offsetof(Geneve, udpcsum)
 GENEVE.UDP6ZeroCheckSumRx,                config_parse_bool,                         0,                             offsetof(Geneve, udp6zerocsumrx)
 GENEVE.UDP6ZeroChecksumRx,                config_parse_bool,                         0,                             offsetof(Geneve, udp6zerocsumrx)