]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: add support for qdisc handle
authorSusant Sahani <ssahani@vmware.com>
Mon, 10 Feb 2020 07:05:35 +0000 (16:05 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 10 Feb 2020 08:48:53 +0000 (17:48 +0900)
man/systemd.network.xml
src/network/networkd-network-gperf.gperf
src/network/tc/qdisc.c
src/network/tc/qdisc.h
test/fuzz/fuzz-network-parser/directives.network

index d61e3472c1636352630adb306d92513de5aaf990..862ad031bdce0b7569c14a0466cfd167a90a4e70 100644 (file)
           or <literal>ingress</literal>. This is mandatory.</para>
         </listitem>
       </varlistentry>
+
+      <varlistentry>
+        <term><varname>Handle=</varname></term>
+        <listitem>
+          <para>Specifies the major number of unique identifier of the qdisc, known as the handle.
+          Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
+        </listitem>
+      </varlistentry>
     </variablelist>
   </refsect1>
 
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>Handle=</varname></term>
+        <listitem>
+          <para>Specifies the major number of unique identifier of the qdisc, known as the handle.
+          Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
+        </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>DelaySec=</varname></term>
         <listitem>
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>Handle=</varname></term>
+        <listitem>
+          <para>Specifies the major number of unique identifier of the qdisc, known as the handle.
+          Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
+        </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>LatencySec=</varname></term>
         <listitem>
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>Handle=</varname></term>
+        <listitem>
+          <para>Specifies the major number of unique identifier of the qdisc, known as the handle.
+          Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
+        </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>PerturbPeriodSec=</varname></term>
         <listitem>
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>Handle=</varname></term>
+        <listitem>
+          <para>Specifies the major number of unique identifier of the qdisc, known as the handle.
+          Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
+        </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>PacketLimit=</varname></term>
         <listitem>
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>Handle=</varname></term>
+        <listitem>
+          <para>Specifies the major number of unique identifier of the qdisc, known as the handle.
+          Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
+        </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>PacketLimit=</varname></term>
         <listitem>
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>Handle=</varname></term>
+        <listitem>
+          <para>Specifies the major number of unique identifier of the qdisc, known as the handle.
+          Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
+        </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>PacketLimit=</varname></term>
         <listitem>
           <literal>clsact</literal> or <literal>ingress</literal>. Defaults to <literal>root</literal>.</para>
         </listitem>
       </varlistentry>
+
+      <varlistentry>
+        <term><varname>Handle=</varname></term>
+        <listitem>
+          <para>Specifies the major number of unique identifier of the qdisc, known as the handle.
+          Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
+        </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>Id=</varname></term>
         <listitem>
index c2c9bd5f55c0ac33531d4301096447d5e5d606f1..134f1535d607ff87d45f807494740e569c473bee 100644 (file)
@@ -252,13 +252,16 @@ CAN.SamplePoint,                             config_parse_permille,
 CAN.RestartSec,                              config_parse_sec,                                         0,                             offsetof(Network, can_restart_us)
 CAN.TripleSampling,                          config_parse_tristate,                                    0,                             offsetof(Network, can_triple_sampling)
 QDisc.Parent,                                config_parse_qdisc_parent,                                _QDISC_KIND_INVALID,           0
+QDisc.Handle,                                config_parse_qdisc_handle,                                _QDISC_KIND_INVALID,           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
 ControlledDelay.TargetSec,                   config_parse_controlled_delay_usec,                       QDISC_KIND_CODEL,              0
 ControlledDelay.IntervalSec,                 config_parse_controlled_delay_usec,                       QDISC_KIND_CODEL,              0
 ControlledDelay.CEThresholdSec,              config_parse_controlled_delay_usec,                       QDISC_KIND_CODEL,              0
 ControlledDelay.ECN,                         config_parse_controlled_delay_bool,                       QDISC_KIND_CODEL,              0
 FairQueueing.Parent,                         config_parse_qdisc_parent,                                QDISC_KIND_FQ,                 0
+FairQueueing.Handle,                         config_parse_qdisc_handle,                                QDISC_KIND_FQ,                 0
 FairQueueing.PacketLimit,                    config_parse_fair_queueing_u32,                           QDISC_KIND_FQ,                 0
 FairQueueing.FlowLimit,                      config_parse_fair_queueing_u32,                           QDISC_KIND_FQ,                 0
 FairQueueing.Quantum,                        config_parse_fair_queueing_size,                          QDISC_KIND_FQ,                 0
@@ -269,6 +272,7 @@ FairQueueing.OrphanMask,                     config_parse_fair_queueing_u32,
 FairQueueing.Pacing,                         config_parse_fair_queueing_bool,                          QDISC_KIND_FQ,                 0
 FairQueueing.CEThresholdSec,                 config_parse_fair_queueing_usec,                          QDISC_KIND_FQ,                 0
 FairQueueingControlledDelay.Parent,          config_parse_qdisc_parent,                                QDISC_KIND_FQ_CODEL,           0
+FairQueueingControlledDelay.Handle,          config_parse_qdisc_handle,                                QDISC_KIND_FQ_CODEL,           0
 FairQueueingControlledDelay.PacketLimit,     config_parse_fair_queueing_controlled_delay_u32,          QDISC_KIND_FQ_CODEL,           0
 FairQueueingControlledDelay.MemoryLimit,     config_parse_fair_queueing_controlled_delay_size,         QDISC_KIND_FQ_CODEL,           0
 FairQueueingControlledDelay.Flows,           config_parse_fair_queueing_controlled_delay_u32,          QDISC_KIND_FQ_CODEL,           0
@@ -278,14 +282,17 @@ FairQueueingControlledDelay.IntervalSec,     config_parse_fair_queueing_controll
 FairQueueingControlledDelay.CEThresholdSec,  config_parse_fair_queueing_controlled_delay_usec,         QDISC_KIND_FQ_CODEL,           0
 FairQueueingControlledDelay.ECN,             config_parse_fair_queueing_controlled_delay_bool,         QDISC_KIND_FQ_CODEL,           0
 NetworkEmulator.Parent,                      config_parse_qdisc_parent,                                QDISC_KIND_NETEM,              0
+NetworkEmulator.Handle,                      config_parse_qdisc_handle,                                QDISC_KIND_NETEM,              0
 NetworkEmulator.DelaySec,                    config_parse_network_emulator_delay,                      QDISC_KIND_NETEM,              0
 NetworkEmulator.DelayJitterSec,              config_parse_network_emulator_delay,                      QDISC_KIND_NETEM,              0
 NetworkEmulator.LossRate,                    config_parse_network_emulator_rate,                       QDISC_KIND_NETEM,              0
 NetworkEmulator.DuplicateRate,               config_parse_network_emulator_rate,                       QDISC_KIND_NETEM,              0
 NetworkEmulator.PacketLimit,                 config_parse_network_emulator_packet_limit,               QDISC_KIND_NETEM,              0
 StochasticFairnessQueueing.Parent,           config_parse_qdisc_parent,                                QDISC_KIND_SFQ,                0
+StochasticFairnessQueueing.Handle,           config_parse_qdisc_handle,                                QDISC_KIND_SFQ,                0
 StochasticFairnessQueueing.PerturbPeriodSec, config_parse_stochastic_fairness_queueing_perturb_period, QDISC_KIND_SFQ,                0
 TokenBucketFilter.Parent,                    config_parse_qdisc_parent,                                QDISC_KIND_TBF,                0
+TokenBucketFilter.Handle,                    config_parse_qdisc_handle,                                QDISC_KIND_TBF,                0
 TokenBucketFilter.Rate,                      config_parse_token_bucket_filter_size,                    QDISC_KIND_TBF,                0
 TokenBucketFilter.Burst,                     config_parse_token_bucket_filter_size,                    QDISC_KIND_TBF,                0
 TokenBucketFilter.LimitSize,                 config_parse_token_bucket_filter_size,                    QDISC_KIND_TBF,                0
@@ -294,6 +301,7 @@ TokenBucketFilter.MPUBytes,                  config_parse_token_bucket_filter_si
 TokenBucketFilter.PeakRate,                  config_parse_token_bucket_filter_size,                    QDISC_KIND_TBF,                0
 TokenBucketFilter.LatencySec,                config_parse_token_bucket_filter_latency,                 QDISC_KIND_TBF,                0
 TrivialLinkEqualizer.Parent,                 config_parse_qdisc_parent,                                QDISC_KIND_TEQL,               0
+TrivialLinkEqualizer.Handle,                 config_parse_qdisc_handle,                                QDISC_KIND_TEQL,               0
 TrivialLinkEqualizer.Id,                     config_parse_trivial_link_equalizer_id,                   QDISC_KIND_TEQL,               0
 /* backwards compatibility: do not add new entries to this section */
 Network.IPv4LL,                              config_parse_ipv4ll,                                      0,                             offsetof(Network, link_local)
index 0d622c8aaf366670c8cff359923a815764986afb..0619e894cca94da4d3f8abdbd60eceb4b79fc2de 100644 (file)
@@ -270,7 +270,8 @@ int config_parse_qdisc_parent(
 
         if (streq(rvalue, "root")) {
                 qdisc->parent = TC_H_ROOT;
-                qdisc->handle = TC_H_UNSPEC;
+                if (qdisc->handle == 0)
+                        qdisc->handle = TC_H_UNSPEC;
         } else if (streq(rvalue, "clsact")) {
                 qdisc->parent = TC_H_CLSACT;
                 qdisc->handle = TC_H_MAKE(TC_H_CLSACT, 0);
@@ -296,3 +297,49 @@ int config_parse_qdisc_parent(
 
         return 0;
 }
+
+int config_parse_qdisc_handle(
+                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;
+        Network *network = data;
+        uint16_t n;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = qdisc_new_static(ltype, network, filename, section_line, &qdisc);
+        if (r < 0)
+                return r;
+
+        if (isempty(rvalue)) {
+                qdisc->handle = TC_H_UNSPEC;
+                qdisc = NULL;
+                return 0;
+        }
+
+        r = safe_atou16_full(rvalue, 16, &n);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Failed to parse 'Handle=', ignoring assignment: %s",
+                           rvalue);
+                return 0;
+        }
+
+        qdisc->handle = (uint32_t) n << 16;
+        qdisc = NULL;
+
+        return 0;
+}
index b1753e4d9545c1844829349a67d8a9bb83a994c5..8e4a70de539f158105d32a69a859b83a38e995dc 100644 (file)
@@ -66,6 +66,7 @@ int qdisc_section_verify(QDisc *qdisc, bool *has_root, bool *has_clsact);
 DEFINE_NETWORK_SECTION_FUNCTIONS(QDisc, qdisc_free);
 
 CONFIG_PARSER_PROTOTYPE(config_parse_qdisc_parent);
+CONFIG_PARSER_PROTOTYPE(config_parse_qdisc_handle);
 
 #include "codel.h"
 #include "fq-codel.h"
index cfee5db02f7b2ebd005cd2b1531aefba3bf0af18..2b41239b745817f49d6ce4b6e0aaf20861239d12 100644 (file)
@@ -272,8 +272,10 @@ Id=
 Gateway=
 [QDisc]
 Parent=
+Handle=
 [NetworkEmulator]
 Parent=
+Handle=
 DelaySec=
 DelayJitterSec=
 LossRate=
@@ -281,6 +283,7 @@ DuplicateRate=
 PacketLimit=
 [TokenBucketFilter]
 Parent=
+Handle=
 Rate=
 Burst=
 LimitSize=
@@ -290,9 +293,11 @@ PeakRate=
 LatencySec=
 [StochasticFairnessQueueing]
 Parent=
+Handle=
 PerturbPeriodSec=
 [FairQueueingControlledDelay]
 Parent=
+Handle=
 PacketLimit=
 MemoryLimit=
 Flows=
@@ -303,6 +308,7 @@ CEThresholdSec=
 ECN=
 [FairQueueing]
 Parent=
+Handle=
 PacketLimit=
 FlowLimit=
 Quantum=
@@ -314,6 +320,7 @@ Pacing=
 CEThresholdSec=
 [ControlledDelay]
 Parent=
+Handle=
 PacketLimit=
 TargetSec=
 IntervalSec=
@@ -328,4 +335,5 @@ NetworkEmulatorDuplicateRate=
 NetworkEmulatorPacketLimit=
 [TrivialLinkEqualizer]
 Parent=
+Handle=
 Id=