From: Susant Sahani Date: Mon, 10 Feb 2020 07:05:35 +0000 (+0900) Subject: network: add support for qdisc handle X-Git-Tag: v245-rc2~64^2~1 X-Git-Url: http://git-history.diyao.me/?a=commitdiff_plain;h=d8b2396d3458a8d473afb07632682e2eab6a6d7f;p=systemd%2F.git network: add support for qdisc handle --- 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 ingress. This is mandatory. + + + Handle= + + 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. + + @@ -2301,6 +2309,14 @@ + + Handle= + + 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. + + + DelaySec= @@ -2357,6 +2373,14 @@ + + Handle= + + 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. + + + LatencySec= @@ -2436,6 +2460,14 @@ + + Handle= + + 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. + + + PerturbPeriodSec= @@ -2459,6 +2491,14 @@ + + Handle= + + 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. + + + PacketLimit= @@ -2515,6 +2555,14 @@ + + Handle= + + 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. + + + PacketLimit= @@ -2597,6 +2645,14 @@ + + Handle= + + 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. + + + PacketLimit= @@ -2690,6 +2746,15 @@ clsact or ingress. Defaults to root. + + + Handle= + + 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. + + + Id= 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=