]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/network/tc/sfq.c
Merge pull request #17549 from yuwata/tiny-fixes
[thirdparty/systemd.git] / src / network / tc / sfq.c
index 393b0e12e1d07b55e41957408e5f700319417e98..387be83a99698d896c5f1e9dfa638280edb5fb39 100644 (file)
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: LGPL-2.1+
+/* SPDX-License-Identifier: LGPL-2.1-or-later
  * Copyright © 2019 VMware, Inc. */
 
 #include <linux/pkt_sched.h>
 #include "sfq.h"
 #include "string-util.h"
 
-int stochastic_fairness_queueing_new(StochasticFairnessQueueing **ret) {
-        StochasticFairnessQueueing *sfq = NULL;
-
-        sfq = new0(StochasticFairnessQueueing, 1);
-        if (!sfq)
-                return -ENOMEM;
-
-        *ret = TAKE_PTR(sfq);
-
-        return 0;
-}
-
-int stochastic_fairness_queueing_fill_message(Link *link, const StochasticFairnessQueueing *sfq, sd_netlink_message *req) {
+static int stochastic_fairness_queueing_fill_message(Link *link, QDisc *qdisc, sd_netlink_message *req) {
+        StochasticFairnessQueueing *sfq;
         struct tc_sfq_qopt_v1 opt = {};
         int r;
 
         assert(link);
-        assert(sfq);
+        assert(qdisc);
         assert(req);
 
+        sfq = SFQ(qdisc);
+
         opt.v0.perturb_period = sfq->perturb_period / USEC_PER_SEC;
 
         r = sd_netlink_message_append_data(req, TCA_OPTIONS, &opt, sizeof(struct tc_sfq_qopt_v1));
@@ -40,7 +31,7 @@ int stochastic_fairness_queueing_fill_message(Link *link, const StochasticFairne
         return 0;
 }
 
-int config_parse_tc_stochastic_fairness_queueing_perturb_period(
+int config_parse_stochastic_fairness_queueing_perturb_period(
                 const char *unit,
                 const char *filename,
                 unsigned line,
@@ -53,6 +44,7 @@ int config_parse_tc_stochastic_fairness_queueing_perturb_period(
                 void *userdata) {
 
         _cleanup_(qdisc_free_or_set_invalidp) QDisc *qdisc = NULL;
+        StochasticFairnessQueueing *sfq;
         Network *network = data;
         int r;
 
@@ -61,27 +53,39 @@ int config_parse_tc_stochastic_fairness_queueing_perturb_period(
         assert(rvalue);
         assert(data);
 
-        r = qdisc_new_static(network, filename, section_line, &qdisc);
-        if (r < 0)
-                return r;
+        r = qdisc_new_static(QDISC_KIND_SFQ, 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;
+        }
+
+        sfq = SFQ(qdisc);
 
         if (isempty(rvalue)) {
-                qdisc->sfq.perturb_period = 0;
+                sfq->perturb_period = 0;
 
                 qdisc = NULL;
                 return 0;
         }
 
-        r = parse_sec(rvalue, &qdisc->sfq.perturb_period);
+        r = parse_sec(rvalue, &sfq->perturb_period);
         if (r < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, r,
+                log_syntax(unit, LOG_WARNING, filename, line, r,
                            "Failed to parse '%s=', ignoring assignment: %s",
                            lvalue, rvalue);
                 return 0;
         }
 
-        qdisc->has_stochastic_fairness_queueing = true;
         qdisc = NULL;
 
         return 0;
 }
+
+const QDiscVTable sfq_vtable = {
+        .object_size = sizeof(StochasticFairnessQueueing),
+        .tca_kind = "sfq",
+        .fill_message = stochastic_fairness_queueing_fill_message,
+};