diff options
author | Susant Sahani <ssahani@vmware.com> | 2020-02-10 16:05:35 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2020-02-10 17:48:53 +0900 |
commit | d8b2396d3458a8d473afb07632682e2eab6a6d7f (patch) | |
tree | 945bd8ad09ff1475147f9129081af1d8d0d8a0b1 | |
parent | bfcdc872604a007465b8eb5e235d33bc07b361f7 (diff) | |
download | systemd-d8b2396d3458a8d473afb07632682e2eab6a6d7f.tar.gz |
network: add support for qdisc handle
-rw-r--r-- | man/systemd.network.xml | 65 | ||||
-rw-r--r-- | src/network/networkd-network-gperf.gperf | 8 | ||||
-rw-r--r-- | src/network/tc/qdisc.c | 49 | ||||
-rw-r--r-- | src/network/tc/qdisc.h | 1 | ||||
-rw-r--r-- | test/fuzz/fuzz-network-parser/directives.network | 8 |
5 files changed, 130 insertions, 1 deletions
diff --git a/man/systemd.network.xml b/man/systemd.network.xml index d61e3472c1..862ad031bd 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -2282,6 +2282,14 @@ 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> @@ -2302,6 +2310,14 @@ </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> <para>Specifies the fixed amount of delay to be added to all packets going out of the @@ -2358,6 +2374,14 @@ </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> <para>Specifies the latency parameter, which specifies the maximum amount of time a @@ -2437,6 +2461,14 @@ </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> <para>Specifies the interval in seconds for queue algorithm perturbation. Defaults to unset.</para> @@ -2460,6 +2492,14 @@ </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> <para>Specifies the hard lmit on the queue size in number of packets. When this limit is reached, incoming packets are @@ -2516,6 +2556,14 @@ </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> <para>Specifies the hard limit on the real queue size. When this limit is reached, incoming packets are @@ -2598,6 +2646,14 @@ </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> <para>Specifies the hard limit on the real queue size. When this limit is reached, incoming packets are @@ -2690,6 +2746,15 @@ <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> diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index c2c9bd5f55..134f1535d6 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -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) diff --git a/src/network/tc/qdisc.c b/src/network/tc/qdisc.c index 0d622c8aaf..0619e894cc 100644 --- a/src/network/tc/qdisc.c +++ b/src/network/tc/qdisc.c @@ -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; +} diff --git a/src/network/tc/qdisc.h b/src/network/tc/qdisc.h index b1753e4d95..8e4a70de53 100644 --- a/src/network/tc/qdisc.h +++ b/src/network/tc/qdisc.h @@ -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" diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network index cfee5db02f..2b41239b74 100644 --- a/test/fuzz/fuzz-network-parser/directives.network +++ b/test/fuzz/fuzz-network-parser/directives.network @@ -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= |