summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSusant Sahani <ssahani@vmware.com>2020-03-19 22:41:57 +0100
committerYu Watanabe <watanabe.yu+github@gmail.com>2020-06-03 14:17:51 +0900
commitb12aaee5ab59bd51e052e3442ed42bee3e0dab7d (patch)
treeae415bf1612e530f88d8232b2ff6e49730cbfee1
parentc33f1e5a3fef019c137ee727dee75bcca622eae9 (diff)
downloadsystemd-b12aaee5ab59bd51e052e3442ed42bee3e0dab7d.tar.gz
network: tc: introduce Quick Fair Queueing (QFQ)
-rw-r--r--man/systemd.network.xml11
-rw-r--r--src/network/meson.build2
-rw-r--r--src/network/networkd-network-gperf.gperf2
-rw-r--r--src/network/networkd-network.c7
-rw-r--r--src/network/tc/qdisc.c1
-rw-r--r--src/network/tc/qdisc.h2
-rw-r--r--src/network/tc/qfq.c10
-rw-r--r--src/network/tc/qfq.h12
-rw-r--r--test/fuzz/fuzz-network-parser/directives.network3
9 files changed, 47 insertions, 3 deletions
diff --git a/man/systemd.network.xml b/man/systemd.network.xml
index 146401f6c9..472172094d 100644
--- a/man/systemd.network.xml
+++ b/man/systemd.network.xml
@@ -3253,6 +3253,17 @@
</refsect1>
<refsect1>
+ <title>[QuickFairQueueing] Section Options</title>
+ <para>The <literal>[QuickFairQueueing]</literal> section manages the queueing discipline
+ (qdisc) of Quick Fair Queueing (QFQ).</para>
+
+ <variablelist class='network-directives'>
+ <xi:include href="tc.xml" xpointer="qdisc-parent" />
+ <xi:include href="tc.xml" xpointer="qdisc-handle" />
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
<title>[BridgeVLAN] Section Options</title>
<para>The <literal>[BridgeVLAN]</literal> section manages the VLAN ID configuration of a bridge port and accepts
the following keys. Specify several <literal>[BridgeVLAN]</literal> sections to configure several VLAN entries.
diff --git a/src/network/meson.build b/src/network/meson.build
index 35b35a76a6..9cd5796f09 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 b3dde3bfac..a27a02ca24 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 50e50fd945..fc8581c983 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 543f71330f..6ba4325c9c 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 5c43d7a838..802653efb0 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 0000000000..8084cda801
--- /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 0000000000..aa1bad219b
--- /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 0b62420e0a..f5c6d47296 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=