]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: tc-cake: add support to specify RTT
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 17 Nov 2022 09:11:38 +0000 (18:11 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 17 Nov 2022 12:13:42 +0000 (21:13 +0900)
man/systemd.network.xml
src/network/networkd-network-gperf.gperf
src/network/tc/cake.c
src/network/tc/cake.h

index 9c11c5c3dd4814cf5e6df29a321dc4832abc6586..3b33159c04cb4710b1c0484d2a995ae443e513db 100644 (file)
@@ -4026,6 +4026,16 @@ Token=prefixstable:2002:da8:1::</programlisting></para>
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>RTTSec=</varname></term>
+        <listitem>
+          <para>Specifies the RTT for the filter. Takes a timespan. Typical values are e.g. 100us for
+          extremely high-performance 10GigE+ networks like datacentre, 1ms for non-WiFi LAN connections,
+          100ms for typical internet connections. Defaults to unset, and the kernel's default will be used.
+          </para>
+        </listitem>
+      </varlistentry>
+
     </variablelist>
   </refsect1>
 
index 70dead97ab1f3464317b2a481d10273f4a518f8d..00255b46a677b50842814e34f99155808a02758a 100644 (file)
@@ -420,6 +420,7 @@ CAKE.PriorityQueueingPreset,                 config_parse_cake_priority_queueing
 CAKE.FirewallMark,                           config_parse_cake_fwmark,                                 QDISC_KIND_CAKE,               0
 CAKE.Wash,                                   config_parse_cake_tristate,                               QDISC_KIND_CAKE,               0
 CAKE.SplitGSO,                               config_parse_cake_tristate,                               QDISC_KIND_CAKE,               0
+CAKE.RTTSec,                                 config_parse_cake_rtt,                                    QDISC_KIND_CAKE,               0
 ControlledDelay.Parent,                      config_parse_qdisc_parent,                                QDISC_KIND_CODEL,              0
 ControlledDelay.Handle,                      config_parse_qdisc_handle,                                QDISC_KIND_CODEL,              0
 ControlledDelay.PacketLimit,                 config_parse_controlled_delay_u32,                        QDISC_KIND_CODEL,              0
index 8d770b08964810862d88af3035f7e5e931eb04d9..c056ec9e0485c1711dcbbe815204309bc24ae18f 100644 (file)
@@ -118,6 +118,12 @@ static int cake_fill_message(Link *link, QDisc *qdisc, sd_netlink_message *req)
                         return r;
         }
 
+        if (c->rtt > 0) {
+                r = sd_netlink_message_append_u32(req, TCA_CAKE_RTT, c->rtt);
+                if (r < 0)
+                        return r;
+        }
+
         r = sd_netlink_message_close_container(req);
         if (r < 0)
                 return r;
@@ -605,6 +611,64 @@ int config_parse_cake_fwmark(
         return 0;
 }
 
+int config_parse_cake_rtt(
+                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) {
+
+        _cleanup_(qdisc_free_or_set_invalidp) QDisc *qdisc = NULL;
+        CommonApplicationsKeptEnhanced *c;
+        Network *network = ASSERT_PTR(data);
+        usec_t t;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+
+        r = qdisc_new_static(QDISC_KIND_CAKE, network, filename, section_line, &qdisc);
+        if (r == -ENOMEM)
+                return log_oom();
+        if (r < 0) {
+                log_syntax(unit, LOG_WARNING, filename, line, r,
+                           "More than one kind of queueing discipline, ignoring assignment: %m");
+                return 0;
+        }
+
+        c = CAKE(qdisc);
+
+        if (isempty(rvalue)) {
+                c->rtt = 0;
+                TAKE_PTR(qdisc);
+                return 0;
+        }
+
+        r = parse_sec(rvalue, &t);
+        if (r < 0) {
+                log_syntax(unit, LOG_WARNING, filename, line, r,
+                           "Failed to parse '%s=', ignoring assignment: %s",
+                           lvalue, rvalue);
+                return 0;
+        }
+        if (t <= 0 || t > UINT32_MAX) {
+                log_syntax(unit, LOG_WARNING, filename, line, 0,
+                           "Invalid '%s=', ignoring assignment: %s",
+                           lvalue, rvalue);
+                return 0;
+        }
+
+        c->rtt = t;
+        TAKE_PTR(qdisc);
+        return 0;
+}
+
 const QDiscVTable cake_vtable = {
         .object_size = sizeof(CommonApplicationsKeptEnhanced),
         .tca_kind = "cake",
index ff68cedabf4e3f5cded8d04a25757dfc0253e02d..418d9744a35336930c99f54ec152eaf40fe864b5 100644 (file)
@@ -63,7 +63,7 @@ typedef struct CommonApplicationsKeptEnhanced {
         /* Other parameters */
         int wash;
         int split_gso;
-
+        usec_t rtt;
 } CommonApplicationsKeptEnhanced;
 
 DEFINE_QDISC_CAST(CAKE, CommonApplicationsKeptEnhanced);
@@ -77,3 +77,4 @@ CONFIG_PARSER_PROTOTYPE(config_parse_cake_compensation_mode);
 CONFIG_PARSER_PROTOTYPE(config_parse_cake_flow_isolation_mode);
 CONFIG_PARSER_PROTOTYPE(config_parse_cake_priority_queueing_preset);
 CONFIG_PARSER_PROTOTYPE(config_parse_cake_fwmark);
+CONFIG_PARSER_PROTOTYPE(config_parse_cake_rtt);