From b12aaee5ab59bd51e052e3442ed42bee3e0dab7d Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Thu, 19 Mar 2020 22:41:57 +0100 Subject: [PATCH] network: tc: introduce Quick Fair Queueing (QFQ) --- man/systemd.network.xml | 11 +++++++++++ src/network/meson.build | 2 ++ src/network/networkd-network-gperf.gperf | 2 ++ src/network/networkd-network.c | 7 ++++--- src/network/tc/qdisc.c | 1 + src/network/tc/qdisc.h | 2 ++ src/network/tc/qfq.c | 10 ++++++++++ src/network/tc/qfq.h | 12 ++++++++++++ test/fuzz/fuzz-network-parser/directives.network | 3 +++ 9 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 src/network/tc/qfq.c create mode 100644 src/network/tc/qfq.h diff --git a/man/systemd.network.xml b/man/systemd.network.xml index 146401f6c90..472172094d4 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -3252,6 +3252,17 @@ + + [QuickFairQueueing] Section Options + The [QuickFairQueueing] section manages the queueing discipline + (qdisc) of Quick Fair Queueing (QFQ). + + + + + + + [BridgeVLAN] Section Options The [BridgeVLAN] section manages the VLAN ID configuration of a bridge port and accepts diff --git a/src/network/meson.build b/src/network/meson.build index 35b35a76a6e..9cd5796f099 100644 --- a/src/network/meson.build +++ b/src/network/meson.build @@ -131,6 +131,8 @@ sources = files(''' tc/pie.h tc/qdisc.c tc/qdisc.h + tc/qfq.c + tc/qfq.h tc/sfb.c tc/sfb.h tc/sfq.c diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index b3dde3bfac6..a27a02ca244 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -312,6 +312,8 @@ PFIFOFast.Handle, config_parse_qdisc_handle, PFIFOHeadDrop.Parent, config_parse_qdisc_parent, QDISC_KIND_PFIFO_HEAD_DROP, 0 PFIFOHeadDrop.Handle, config_parse_qdisc_handle, QDISC_KIND_PFIFO_HEAD_DROP, 0 PFIFOHeadDrop.PacketLimit, config_parse_pfifo_size, QDISC_KIND_PFIFO_HEAD_DROP, 0 +QuickFairQueueing.Parent, config_parse_qdisc_parent, QDISC_KIND_QFQ, 0 +QuickFairQueueing.Handle, config_parse_qdisc_handle, QDISC_KIND_QFQ, 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 diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 50e50fd945b..fc8581c983d 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -508,9 +508,6 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi "ControlledDelay\0" "DeficitRoundRobinScheduler\0" "DeficitRoundRobinSchedulerClass\0" - "PFIFO\0" - "PFIFOFast\0" - "PFIFOHeadDrop\0" "FairQueueing\0" "FairQueueingControlledDelay\0" "GenericRandomEarlyDetection\0" @@ -518,7 +515,11 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi "HierarchyTokenBucket\0" "HierarchyTokenBucketClass\0" "NetworkEmulator\0" + "PFIFO\0" + "PFIFOFast\0" + "PFIFOHeadDrop\0" "PIE\0" + "QuickFairQueueing\0" "StochasticFairBlue\0" "StochasticFairnessQueueing\0" "TokenBucketFilter\0" diff --git a/src/network/tc/qdisc.c b/src/network/tc/qdisc.c index 543f71330f7..6ba4325c9c5 100644 --- a/src/network/tc/qdisc.c +++ b/src/network/tc/qdisc.c @@ -27,6 +27,7 @@ const QDiscVTable * const qdisc_vtable[_QDISC_KIND_MAX] = { [QDISC_KIND_HTB] = &htb_vtable, [QDISC_KIND_NETEM] = &netem_vtable, [QDISC_KIND_PIE] = &pie_vtable, + [QDISC_KIND_QFQ] = &qfq_vtable, [QDISC_KIND_PFIFO] = &pfifo_vtable, [QDISC_KIND_PFIFO_FAST] = &pfifo_fast_vtable, [QDISC_KIND_PFIFO_HEAD_DROP] = &pfifo_head_drop_vtable, diff --git a/src/network/tc/qdisc.h b/src/network/tc/qdisc.h index 5c43d7a8381..802653efb01 100644 --- a/src/network/tc/qdisc.h +++ b/src/network/tc/qdisc.h @@ -23,6 +23,7 @@ typedef enum QDiscKind { QDISC_KIND_PFIFO_FAST, QDISC_KIND_PFIFO_HEAD_DROP, QDISC_KIND_PIE, + QDISC_KIND_QFQ, QDISC_KIND_SFB, QDISC_KIND_SFQ, QDISC_KIND_TBF, @@ -93,6 +94,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_qdisc_handle); #include "hhf.h" #include "htb.h" #include "pie.h" +#include "qfq.h" #include "netem.h" #include "drr.h" #include "sfb.h" diff --git a/src/network/tc/qfq.c b/src/network/tc/qfq.c new file mode 100644 index 00000000000..8084cda8012 --- /dev/null +++ b/src/network/tc/qfq.c @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: LGPL-2.1+ + * Copyright © 2020 VMware, Inc. */ + +#include "qdisc.h" +#include "qfq.h" + +const QDiscVTable qfq_vtable = { + .object_size = sizeof(QuickFairQueueing), + .tca_kind = "qfq", +}; diff --git a/src/network/tc/qfq.h b/src/network/tc/qfq.h new file mode 100644 index 00000000000..aa1bad219b4 --- /dev/null +++ b/src/network/tc/qfq.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: LGPL-2.1+ + * Copyright © 2020 VMware, Inc. */ +#pragma once + +#include "qdisc.h" + +typedef struct QuickFairQueueing { + QDisc meta; +} QuickFairQueueing; + +DEFINE_QDISC_CAST(QFQ, QuickFairQueueing); +extern const QDiscVTable qfq_vtable; diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network index 0b62420e0a9..f5c6d472962 100644 --- a/test/fuzz/fuzz-network-parser/directives.network +++ b/test/fuzz/fuzz-network-parser/directives.network @@ -411,6 +411,9 @@ PacketLimit= Parent= Handle= PacketLimit= +[QuickFairQueueing] +Parent= +Handle= [DeficitRoundRobinScheduler] Parent= Handle= -- 2.39.2