Skip to content

Commit c09f335

Browse files
authored
Merge pull request systemd#14584 from ssahani/tc-handle
network:tc add support for qdisc handle
2 parents 99fdffa + 38d1255 commit c09f335

File tree

10 files changed

+147
-14
lines changed

10 files changed

+147
-14
lines changed

man/systemd.network.xml

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2282,6 +2282,14 @@
22822282
or <literal>ingress</literal>. This is mandatory.</para>
22832283
</listitem>
22842284
</varlistentry>
2285+
2286+
<varlistentry>
2287+
<term><varname>Handle=</varname></term>
2288+
<listitem>
2289+
<para>Specifies the major number of unique identifier of the qdisc, known as the handle.
2290+
Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
2291+
</listitem>
2292+
</varlistentry>
22852293
</variablelist>
22862294
</refsect1>
22872295

@@ -2301,6 +2309,14 @@
23012309
</listitem>
23022310
</varlistentry>
23032311

2312+
<varlistentry>
2313+
<term><varname>Handle=</varname></term>
2314+
<listitem>
2315+
<para>Specifies the major number of unique identifier of the qdisc, known as the handle.
2316+
Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
2317+
</listitem>
2318+
</varlistentry>
2319+
23042320
<varlistentry>
23052321
<term><varname>DelaySec=</varname></term>
23062322
<listitem>
@@ -2357,6 +2373,14 @@
23572373
</listitem>
23582374
</varlistentry>
23592375

2376+
<varlistentry>
2377+
<term><varname>Handle=</varname></term>
2378+
<listitem>
2379+
<para>Specifies the major number of unique identifier of the qdisc, known as the handle.
2380+
Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
2381+
</listitem>
2382+
</varlistentry>
2383+
23602384
<varlistentry>
23612385
<term><varname>LatencySec=</varname></term>
23622386
<listitem>
@@ -2436,6 +2460,14 @@
24362460
</listitem>
24372461
</varlistentry>
24382462

2463+
<varlistentry>
2464+
<term><varname>Handle=</varname></term>
2465+
<listitem>
2466+
<para>Specifies the major number of unique identifier of the qdisc, known as the handle.
2467+
Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
2468+
</listitem>
2469+
</varlistentry>
2470+
24392471
<varlistentry>
24402472
<term><varname>PerturbPeriodSec=</varname></term>
24412473
<listitem>
@@ -2459,6 +2491,14 @@
24592491
</listitem>
24602492
</varlistentry>
24612493

2494+
<varlistentry>
2495+
<term><varname>Handle=</varname></term>
2496+
<listitem>
2497+
<para>Specifies the major number of unique identifier of the qdisc, known as the handle.
2498+
Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
2499+
</listitem>
2500+
</varlistentry>
2501+
24622502
<varlistentry>
24632503
<term><varname>PacketLimit=</varname></term>
24642504
<listitem>
@@ -2515,6 +2555,14 @@
25152555
</listitem>
25162556
</varlistentry>
25172557

2558+
<varlistentry>
2559+
<term><varname>Handle=</varname></term>
2560+
<listitem>
2561+
<para>Specifies the major number of unique identifier of the qdisc, known as the handle.
2562+
Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
2563+
</listitem>
2564+
</varlistentry>
2565+
25182566
<varlistentry>
25192567
<term><varname>PacketLimit=</varname></term>
25202568
<listitem>
@@ -2597,6 +2645,14 @@
25972645
</listitem>
25982646
</varlistentry>
25992647

2648+
<varlistentry>
2649+
<term><varname>Handle=</varname></term>
2650+
<listitem>
2651+
<para>Specifies the major number of unique identifier of the qdisc, known as the handle.
2652+
Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
2653+
</listitem>
2654+
</varlistentry>
2655+
26002656
<varlistentry>
26012657
<term><varname>PacketLimit=</varname></term>
26022658
<listitem>
@@ -2690,6 +2746,15 @@
26902746
<literal>clsact</literal> or <literal>ingress</literal>. Defaults to <literal>root</literal>.</para>
26912747
</listitem>
26922748
</varlistentry>
2749+
2750+
<varlistentry>
2751+
<term><varname>Handle=</varname></term>
2752+
<listitem>
2753+
<para>Specifies the major number of unique identifier of the qdisc, known as the handle.
2754+
Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
2755+
</listitem>
2756+
</varlistentry>
2757+
26932758
<varlistentry>
26942759
<term><varname>Id=</varname></term>
26952760
<listitem>

src/network/networkd-network-gperf.gperf

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -252,23 +252,27 @@ CAN.SamplePoint, config_parse_permille,
252252
CAN.RestartSec, config_parse_sec, 0, offsetof(Network, can_restart_us)
253253
CAN.TripleSampling, config_parse_tristate, 0, offsetof(Network, can_triple_sampling)
254254
QDisc.Parent, config_parse_qdisc_parent, _QDISC_KIND_INVALID, 0
255+
QDisc.Handle, config_parse_qdisc_handle, _QDISC_KIND_INVALID, 0
255256
ControlledDelay.Parent, config_parse_qdisc_parent, QDISC_KIND_CODEL, 0
257+
ControlledDelay.Handle, config_parse_qdisc_handle, QDISC_KIND_CODEL, 0
256258
ControlledDelay.PacketLimit, config_parse_controlled_delay_u32, QDISC_KIND_CODEL, 0
257259
ControlledDelay.TargetSec, config_parse_controlled_delay_usec, QDISC_KIND_CODEL, 0
258260
ControlledDelay.IntervalSec, config_parse_controlled_delay_usec, QDISC_KIND_CODEL, 0
259261
ControlledDelay.CEThresholdSec, config_parse_controlled_delay_usec, QDISC_KIND_CODEL, 0
260262
ControlledDelay.ECN, config_parse_controlled_delay_bool, QDISC_KIND_CODEL, 0
261263
FairQueueing.Parent, config_parse_qdisc_parent, QDISC_KIND_FQ, 0
262-
FairQueueing.PacketLimit, config_parse_fair_queueing_u32, QDISC_KIND_FQ, 0
263-
FairQueueing.FlowLimit, config_parse_fair_queueing_u32, QDISC_KIND_FQ, 0
264-
FairQueueing.Quantum, config_parse_fair_queueing_size, QDISC_KIND_FQ, 0
265-
FairQueueing.InitialQuantum, config_parse_fair_queueing_size, QDISC_KIND_FQ, 0
266-
FairQueueing.MaximumRate, config_parse_fair_queueing_max_rate, QDISC_KIND_FQ, 0
267-
FairQueueing.Buckets, config_parse_fair_queueing_u32, QDISC_KIND_FQ, 0
268-
FairQueueing.OrphanMask, config_parse_fair_queueing_u32, QDISC_KIND_FQ, 0
269-
FairQueueing.Pacing, config_parse_fair_queueing_bool, QDISC_KIND_FQ, 0
270-
FairQueueing.CEThresholdSec, config_parse_fair_queueing_usec, QDISC_KIND_FQ, 0
264+
FairQueueing.Handle, config_parse_qdisc_handle, QDISC_KIND_FQ, 0
265+
FairQueueing.PacketLimit, config_parse_fair_queueing_u32, QDISC_KIND_FQ, 0
266+
FairQueueing.FlowLimit, config_parse_fair_queueing_u32, QDISC_KIND_FQ, 0
267+
FairQueueing.Quantum, config_parse_fair_queueing_size, QDISC_KIND_FQ, 0
268+
FairQueueing.InitialQuantum, config_parse_fair_queueing_size, QDISC_KIND_FQ, 0
269+
FairQueueing.MaximumRate, config_parse_fair_queueing_max_rate, QDISC_KIND_FQ, 0
270+
FairQueueing.Buckets, config_parse_fair_queueing_u32, QDISC_KIND_FQ, 0
271+
FairQueueing.OrphanMask, config_parse_fair_queueing_u32, QDISC_KIND_FQ, 0
272+
FairQueueing.Pacing, config_parse_fair_queueing_bool, QDISC_KIND_FQ, 0
273+
FairQueueing.CEThresholdSec, config_parse_fair_queueing_usec, QDISC_KIND_FQ, 0
271274
FairQueueingControlledDelay.Parent, config_parse_qdisc_parent, QDISC_KIND_FQ_CODEL, 0
275+
FairQueueingControlledDelay.Handle, config_parse_qdisc_handle, QDISC_KIND_FQ_CODEL, 0
272276
FairQueueingControlledDelay.PacketLimit, config_parse_fair_queueing_controlled_delay_u32, QDISC_KIND_FQ_CODEL, 0
273277
FairQueueingControlledDelay.MemoryLimit, config_parse_fair_queueing_controlled_delay_size, QDISC_KIND_FQ_CODEL, 0
274278
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
278282
FairQueueingControlledDelay.CEThresholdSec, config_parse_fair_queueing_controlled_delay_usec, QDISC_KIND_FQ_CODEL, 0
279283
FairQueueingControlledDelay.ECN, config_parse_fair_queueing_controlled_delay_bool, QDISC_KIND_FQ_CODEL, 0
280284
NetworkEmulator.Parent, config_parse_qdisc_parent, QDISC_KIND_NETEM, 0
285+
NetworkEmulator.Handle, config_parse_qdisc_handle, QDISC_KIND_NETEM, 0
281286
NetworkEmulator.DelaySec, config_parse_network_emulator_delay, QDISC_KIND_NETEM, 0
282287
NetworkEmulator.DelayJitterSec, config_parse_network_emulator_delay, QDISC_KIND_NETEM, 0
283288
NetworkEmulator.LossRate, config_parse_network_emulator_rate, QDISC_KIND_NETEM, 0
284289
NetworkEmulator.DuplicateRate, config_parse_network_emulator_rate, QDISC_KIND_NETEM, 0
285290
NetworkEmulator.PacketLimit, config_parse_network_emulator_packet_limit, QDISC_KIND_NETEM, 0
286291
StochasticFairnessQueueing.Parent, config_parse_qdisc_parent, QDISC_KIND_SFQ, 0
292+
StochasticFairnessQueueing.Handle, config_parse_qdisc_handle, QDISC_KIND_SFQ, 0
287293
StochasticFairnessQueueing.PerturbPeriodSec, config_parse_stochastic_fairness_queueing_perturb_period, QDISC_KIND_SFQ, 0
288294
TokenBucketFilter.Parent, config_parse_qdisc_parent, QDISC_KIND_TBF, 0
295+
TokenBucketFilter.Handle, config_parse_qdisc_handle, QDISC_KIND_TBF, 0
289296
TokenBucketFilter.Rate, config_parse_token_bucket_filter_size, QDISC_KIND_TBF, 0
290297
TokenBucketFilter.Burst, config_parse_token_bucket_filter_size, QDISC_KIND_TBF, 0
291298
TokenBucketFilter.LimitSize, config_parse_token_bucket_filter_size, QDISC_KIND_TBF, 0
@@ -294,6 +301,7 @@ TokenBucketFilter.MPUBytes, config_parse_token_bucket_filter_si
294301
TokenBucketFilter.PeakRate, config_parse_token_bucket_filter_size, QDISC_KIND_TBF, 0
295302
TokenBucketFilter.LatencySec, config_parse_token_bucket_filter_latency, QDISC_KIND_TBF, 0
296303
TrivialLinkEqualizer.Parent, config_parse_qdisc_parent, QDISC_KIND_TEQL, 0
304+
TrivialLinkEqualizer.Handle, config_parse_qdisc_handle, QDISC_KIND_TEQL, 0
297305
TrivialLinkEqualizer.Id, config_parse_trivial_link_equalizer_id, QDISC_KIND_TEQL, 0
298306
/* backwards compatibility: do not add new entries to this section */
299307
Network.IPv4LL, config_parse_ipv4ll, 0, offsetof(Network, link_local)

src/network/tc/qdisc.c

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,8 @@ int config_parse_qdisc_parent(
270270

271271
if (streq(rvalue, "root")) {
272272
qdisc->parent = TC_H_ROOT;
273-
qdisc->handle = TC_H_UNSPEC;
273+
if (qdisc->handle == 0)
274+
qdisc->handle = TC_H_UNSPEC;
274275
} else if (streq(rvalue, "clsact")) {
275276
qdisc->parent = TC_H_CLSACT;
276277
qdisc->handle = TC_H_MAKE(TC_H_CLSACT, 0);
@@ -296,3 +297,49 @@ int config_parse_qdisc_parent(
296297

297298
return 0;
298299
}
300+
301+
int config_parse_qdisc_handle(
302+
const char *unit,
303+
const char *filename,
304+
unsigned line,
305+
const char *section,
306+
unsigned section_line,
307+
const char *lvalue,
308+
int ltype,
309+
const char *rvalue,
310+
void *data,
311+
void *userdata) {
312+
313+
_cleanup_(qdisc_free_or_set_invalidp) QDisc *qdisc = NULL;
314+
Network *network = data;
315+
uint16_t n;
316+
int r;
317+
318+
assert(filename);
319+
assert(lvalue);
320+
assert(rvalue);
321+
assert(data);
322+
323+
r = qdisc_new_static(ltype, network, filename, section_line, &qdisc);
324+
if (r < 0)
325+
return r;
326+
327+
if (isempty(rvalue)) {
328+
qdisc->handle = TC_H_UNSPEC;
329+
qdisc = NULL;
330+
return 0;
331+
}
332+
333+
r = safe_atou16_full(rvalue, 16, &n);
334+
if (r < 0) {
335+
log_syntax(unit, LOG_ERR, filename, line, r,
336+
"Failed to parse 'Handle=', ignoring assignment: %s",
337+
rvalue);
338+
return 0;
339+
}
340+
341+
qdisc->handle = (uint32_t) n << 16;
342+
qdisc = NULL;
343+
344+
return 0;
345+
}

src/network/tc/qdisc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ int qdisc_section_verify(QDisc *qdisc, bool *has_root, bool *has_clsact);
6666
DEFINE_NETWORK_SECTION_FUNCTIONS(QDisc, qdisc_free);
6767

6868
CONFIG_PARSER_PROTOTYPE(config_parse_qdisc_parent);
69+
CONFIG_PARSER_PROTOTYPE(config_parse_qdisc_handle);
6970

7071
#include "codel.h"
7172
#include "fq-codel.h"

test/fuzz/fuzz-network-parser/directives.network

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,15 +272,18 @@ Id=
272272
Gateway=
273273
[QDisc]
274274
Parent=
275+
Handle=
275276
[NetworkEmulator]
276277
Parent=
278+
Handle=
277279
DelaySec=
278280
DelayJitterSec=
279281
LossRate=
280282
DuplicateRate=
281283
PacketLimit=
282284
[TokenBucketFilter]
283285
Parent=
286+
Handle=
284287
Rate=
285288
Burst=
286289
LimitSize=
@@ -290,9 +293,11 @@ PeakRate=
290293
LatencySec=
291294
[StochasticFairnessQueueing]
292295
Parent=
296+
Handle=
293297
PerturbPeriodSec=
294298
[FairQueueingControlledDelay]
295299
Parent=
300+
Handle=
296301
PacketLimit=
297302
MemoryLimit=
298303
Flows=
@@ -303,6 +308,7 @@ CEThresholdSec=
303308
ECN=
304309
[FairQueueing]
305310
Parent=
311+
Handle=
306312
PacketLimit=
307313
FlowLimit=
308314
Quantum=
@@ -314,6 +320,7 @@ Pacing=
314320
CEThresholdSec=
315321
[ControlledDelay]
316322
Parent=
323+
Handle=
317324
PacketLimit=
318325
TargetSec=
319326
IntervalSec=
@@ -328,4 +335,5 @@ NetworkEmulatorDuplicateRate=
328335
NetworkEmulatorPacketLimit=
329336
[TrivialLinkEqualizer]
330337
Parent=
338+
Handle=
331339
Id=

test/test-network/conf/25-qdisc-fq-codel.network

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Address=10.1.2.3/16
77

88
[FairQueueing]
99
Parent=root
10+
Handle=0003
1011
PacketLimit=1000
1112
FlowLimit=200
1213
Quantum=1500

test/test-network/conf/25-qdisc-netem-and-fqcodel.network

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Address=10.1.2.3/16
77

88
[NetworkEmulator]
99
Parent=root
10+
Handle=001f
1011
DelaySec=50ms
1112
DelayJitterSec=10ms
1213
LossRate=20%

test/test-network/conf/25-qdisc-tbf-and-sfq.network

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Address=10.1.2.4/16
77

88
[TokenBucketFilter]
99
Parent=root
10+
Handle=003f
1011
Rate=1G
1112
Burst=5K
1213
LatencySec=70msec

test/test-network/conf/25-qdisc-teql.network

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ Address=10.1.2.3/16
77

88
[TrivialLinkEqualizer]
99
Parent=root
10+
Handle=0002
1011
Id=1

test/test-network/systemd-networkd-tests.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2243,13 +2243,13 @@ def test_qdisc(self):
22432243

22442244
output = check_output('tc qdisc show dev dummy98')
22452245
print(output)
2246-
self.assertRegex(output, 'qdisc netem')
2246+
self.assertRegex(output, 'qdisc netem 1f:')
22472247
self.assertRegex(output, 'limit 100 delay 50.0ms 10.0ms loss 20%')
22482248
self.assertRegex(output, 'qdisc fq_codel')
22492249
self.assertRegex(output, 'limit 20480p flows 2048 quantum 1400 target 10.0ms ce_threshold 100.0ms interval 200.0ms memory_limit 64Mb ecn')
22502250
output = check_output('tc qdisc show dev test1')
22512251
print(output)
2252-
self.assertRegex(output, 'qdisc tbf')
2252+
self.assertRegex(output, 'qdisc tbf 3f:')
22532253
self.assertRegex(output, 'rate 1Gbit burst 5000b peakrate 100Gbit minburst 987500b lat 70.0ms')
22542254
self.assertRegex(output, 'qdisc sfq')
22552255
self.assertRegex(output, 'perturb 5sec')
@@ -2263,7 +2263,7 @@ def test_qdisc2(self):
22632263

22642264
output = check_output('tc qdisc show dev dummy98')
22652265
print(output)
2266-
self.assertRegex(output, 'qdisc fq')
2266+
self.assertRegex(output, 'qdisc fq 3:')
22672267
self.assertRegex(output, 'limit 1000p flow_limit 200p buckets 512 orphan_mask 511')
22682268
self.assertRegex(output, 'quantum 1500')
22692269
self.assertRegex(output, 'initial_quantum 13000')
@@ -2299,7 +2299,7 @@ def test_qdisc4(self):
22992299

23002300
output = check_output('tc qdisc show dev dummy98')
23012301
print(output)
2302-
self.assertRegex(output, 'qdisc teql1')
2302+
self.assertRegex(output, 'qdisc teql1 2:')
23032303

23042304
class NetworkdStateFileTests(unittest.TestCase, Utilities):
23052305
links = [

0 commit comments

Comments
 (0)