diff --git a/man/systemd.network.xml b/man/systemd.network.xml index 350b5172be..556deea881 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -2739,6 +2739,32 @@ + + [DeficitRoundRobinScheduler] Section Options + The [DeficitRoundRobinScheduler] section manages the queueing discipline (qdisc) of + Deficit Round Robin Scheduler (DRR). + + + + Parent= + + Specifies the parent Queueing Discipline (qdisc). Takes one of root, + clsact, ingress or a class id. The class id takes the + major and minor number in hexadecimal ranges 1 to ffff separated with a colon + (major:minor). 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. + + + + + [GenericRandomEarlyDetection] Section Options The [GenericRandomEarlyDetection] section manages the queueing discipline diff --git a/src/network/meson.build b/src/network/meson.build index 92ef0c1feb..8376a087b9 100644 --- a/src/network/meson.build +++ b/src/network/meson.build @@ -111,6 +111,8 @@ sources = files(''' tc/cake.h tc/codel.c tc/codel.h + tc/drr.c + tc/drr.h tc/fifo.c tc/fifo.h tc/fq.c diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 9b58702f10..17e4256b54 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -269,6 +269,8 @@ ControlledDelay.TargetSec, config_parse_controlled_delay_usec, 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 +DeficitRoundRobinScheduler.Parent, config_parse_qdisc_parent, QDISC_KIND_DRR, 0 +DeficitRoundRobinScheduler.Handle, config_parse_qdisc_handle, QDISC_KIND_DRR, 0 PFIFO.Parent, config_parse_qdisc_parent, QDISC_KIND_PFIFO, 0 PFIFO.Handle, config_parse_qdisc_handle, QDISC_KIND_PFIFO, 0 PFIFO.PacketLimit, config_parse_fifo_size, QDISC_KIND_PFIFO, 0 diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 62e9a7c5d5..896e5b9de6 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -488,6 +488,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi "QDisc\0" "CAKE\0" "ControlledDelay\0" + "DeficitRoundRobinScheduler\0" "PFIFO\0" "FairQueueing\0" "FairQueueingControlledDelay\0" diff --git a/src/network/tc/drr.c b/src/network/tc/drr.c new file mode 100644 index 0000000000..086d775ed4 --- /dev/null +++ b/src/network/tc/drr.c @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: LGPL-2.1+ + * Copyright © 2020 VMware, Inc. */ + +#include "drr.h" + +const QDiscVTable drr_vtable = { + .object_size = sizeof(DeficitRoundRobinScheduler), + .tca_kind = "drr", +}; diff --git a/src/network/tc/drr.h b/src/network/tc/drr.h new file mode 100644 index 0000000000..4e20c4f7d1 --- /dev/null +++ b/src/network/tc/drr.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: LGPL-2.1+ + * Copyright © 2020 VMware, Inc. */ +#pragma once + +#include "qdisc.h" + +typedef struct DeficitRoundRobinScheduler { + QDisc meta; +} DeficitRoundRobinScheduler; + +DEFINE_QDISC_CAST(DRR, DeficitRoundRobinScheduler); +extern const QDiscVTable drr_vtable; diff --git a/src/network/tc/qdisc.c b/src/network/tc/qdisc.c index 44f296e744..06204063eb 100644 --- a/src/network/tc/qdisc.c +++ b/src/network/tc/qdisc.c @@ -18,6 +18,7 @@ const QDiscVTable * const qdisc_vtable[_QDISC_KIND_MAX] = { [QDISC_KIND_CAKE] = &cake_vtable, [QDISC_KIND_CODEL] = &codel_vtable, + [QDISC_KIND_DRR] = &drr_vtable, [QDISC_KIND_FQ] = &fq_vtable, [QDISC_KIND_FQ_CODEL] = &fq_codel_vtable, [QDISC_KIND_GRED] = &gred_vtable, diff --git a/src/network/tc/qdisc.h b/src/network/tc/qdisc.h index 81e740f66d..dea3847728 100644 --- a/src/network/tc/qdisc.h +++ b/src/network/tc/qdisc.h @@ -11,6 +11,7 @@ typedef enum QDiscKind { QDISC_KIND_CAKE, QDISC_KIND_CODEL, + QDISC_KIND_DRR, QDISC_KIND_FQ, QDISC_KIND_FQ_CODEL, QDISC_KIND_GRED, @@ -88,6 +89,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_qdisc_handle); #include "htb.h" #include "pie.h" #include "netem.h" +#include "drr.h" #include "sfb.h" #include "sfq.h" #include "tbf.h" diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network index b48e7eb3e4..151b1c2c39 100644 --- a/test/fuzz/fuzz-network-parser/directives.network +++ b/test/fuzz/fuzz-network-parser/directives.network @@ -374,3 +374,6 @@ PacketLimit= Parent= Handle= PacketLimit= +[DeficitRoundRobinScheduler] +Parent= +Handle=