From 863542e1ce105907b595e7caf090c484297e2572 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 4 Nov 2021 04:16:20 +0900 Subject: [PATCH] network: tc/cake: introduce MPUBytes= setting --- man/systemd.network.xml | 8 +++ src/network/networkd-network-gperf.gperf | 1 + src/network/tc/cake.c | 65 +++++++++++++++++++ src/network/tc/cake.h | 2 + .../fuzz-network-parser/directives.network | 1 + 5 files changed, 77 insertions(+) diff --git a/man/systemd.network.xml b/man/systemd.network.xml index 13eb06fdca..b82efd4394 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -3491,6 +3491,14 @@ Token=prefixstable:2002:da8:1:: + + MPUBytes= + + Rounds each packet (including overhead) up to the specified bytes. Takes an integer in + the range 1…256. Defaults to unset and kernel's default is used. + + + CompensationMode= diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 1fe4b72b5f..1c09f300bd 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -388,6 +388,7 @@ CAKE.Handle, config_parse_qdisc_handle, CAKE.Bandwidth, config_parse_cake_bandwidth, QDISC_KIND_CAKE, 0 CAKE.AutoRateIngress, config_parse_cake_tristate, QDISC_KIND_CAKE, 0 CAKE.OverheadBytes, config_parse_cake_overhead, QDISC_KIND_CAKE, 0 +CAKE.MPUBytes, config_parse_cake_mpu, QDISC_KIND_CAKE, 0 CAKE.CompensationMode, config_parse_cake_compensation_mode, QDISC_KIND_CAKE, 0 CAKE.FlowIsolationMode, config_parse_cake_flow_isolation_mode, QDISC_KIND_CAKE, 0 CAKE.NAT, config_parse_cake_tristate, QDISC_KIND_CAKE, 0 diff --git a/src/network/tc/cake.c b/src/network/tc/cake.c index 27395918ea..7641574fd8 100644 --- a/src/network/tc/cake.c +++ b/src/network/tc/cake.c @@ -59,6 +59,12 @@ static int cake_fill_message(Link *link, QDisc *qdisc, sd_netlink_message *req) return log_link_error_errno(link, r, "Could not append TCA_CAKE_OVERHEAD attribute: %m"); } + if (c->mpu > 0) { + r = sd_netlink_message_append_u32(req, TCA_CAKE_MPU, c->mpu); + if (r < 0) + return log_link_error_errno(link, r, "Could not append TCA_CAKE_MPU attribute: %m"); + } + if (c->compensation_mode >= 0) { r = sd_netlink_message_append_u32(req, TCA_CAKE_ATM, c->compensation_mode); if (r < 0) @@ -199,6 +205,65 @@ int config_parse_cake_overhead( return 0; } +int config_parse_cake_mpu( + 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; + CommonApplicationsKeptEnhanced *c; + Network *network = data; + uint32_t v; + int r; + + assert(filename); + assert(lvalue); + assert(rvalue); + assert(data); + + r = qdisc_new_static(QDISC_KIND_CAKE, network, filename, section_line, &qdisc); + if (r == -ENOMEM) + return log_oom(); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "More than one kind of queueing discipline, ignoring assignment: %m"); + return 0; + } + + c = CAKE(qdisc); + + if (isempty(rvalue)) { + c->mpu = 0; + TAKE_PTR(qdisc); + return 0; + } + + r = safe_atou32(rvalue, &v); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to parse '%s=', ignoring assignment: %s", + lvalue, rvalue); + return 0; + } + if (v <= 0 || v > 256) { + log_syntax(unit, LOG_WARNING, filename, line, 0, + "Invalid '%s=', ignoring assignment: %s", + lvalue, rvalue); + return 0; + } + + c->mpu = v; + TAKE_PTR(qdisc); + return 0; +} + int config_parse_cake_tristate( const char *unit, const char *filename, diff --git a/src/network/tc/cake.h b/src/network/tc/cake.h index 1be8cacbe9..c8defb505e 100644 --- a/src/network/tc/cake.h +++ b/src/network/tc/cake.h @@ -38,6 +38,7 @@ typedef struct CommonApplicationsKeptEnhanced { /* Overhead compensation parameters */ bool overhead_set; int overhead; + uint32_t mpu; CakeCompensationMode compensation_mode; /* Flow isolation parameters */ @@ -51,6 +52,7 @@ extern const QDiscVTable cake_vtable; CONFIG_PARSER_PROTOTYPE(config_parse_cake_bandwidth); CONFIG_PARSER_PROTOTYPE(config_parse_cake_overhead); +CONFIG_PARSER_PROTOTYPE(config_parse_cake_mpu); CONFIG_PARSER_PROTOTYPE(config_parse_cake_tristate); CONFIG_PARSER_PROTOTYPE(config_parse_cake_compensation_mode); CONFIG_PARSER_PROTOTYPE(config_parse_cake_flow_isolation_mode); diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network index 5d0d0968e7..de6d460eb1 100644 --- a/test/fuzz/fuzz-network-parser/directives.network +++ b/test/fuzz/fuzz-network-parser/directives.network @@ -470,6 +470,7 @@ Handle= Bandwidth= AutoRateIngress= OverheadBytes= +MPUBytes= CompensationMode= FlowIsolationMode= NAT= -- 2.25.1