]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: ignore sections which have both NetworkEmulator and TokenBufferFilter settings
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 24 Nov 2019 11:31:38 +0000 (20:31 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 4 Dec 2019 11:55:55 +0000 (20:55 +0900)
src/network/networkd-network.c
src/network/tc/qdisc.c
src/network/tc/qdisc.h

index 6e443975f1716da7a59402d1a0e64669fb92d83d..6bf979e922563945de49cbd27e2e697f82c1014f 100644 (file)
@@ -154,6 +154,8 @@ int network_verify(Network *network) {
         Prefix *prefix, *prefix_next;
         Route *route, *route_next;
         FdbEntry *fdb, *fdb_next;
+        QDiscs *qdisc;
+        Iterator i;
 
         assert(network);
         assert(network->filename);
@@ -313,6 +315,11 @@ int network_verify(Network *network) {
                 if (routing_policy_rule_section_verify(rule) < 0)
                         routing_policy_rule_free(rule);
 
+        bool has_root = false, has_clsact = false;
+        ORDERED_HASHMAP_FOREACH(qdisc, network->qdiscs_by_section, i)
+                if (qdisc_section_verify(qdisc, &has_root, &has_clsact) < 0)
+                        qdisc_free(qdisc);
+
         return 0;
 }
 
index 9baf7234619f9415c3fd36774967be6fd4bc16c0..9b966f3d3710450bd2ebcb89d9c814e1cdc7fd51 100644 (file)
@@ -178,6 +178,39 @@ int qdisc_configure(Link *link, QDiscs *qdisc) {
         return 0;
 }
 
+int qdisc_section_verify(QDiscs *qdisc, bool *has_root, bool *has_clsact) {
+        assert(qdisc);
+        assert(has_root);
+        assert(has_clsact);
+
+        if (section_is_invalid(qdisc->section))
+                return -EINVAL;
+
+        if (qdisc->has_network_emulator && qdisc->has_token_buffer_filter)
+                return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
+                                         "%s: TrafficControlQueueingDiscipline section has both NetworkEmulator and TokenBufferFilter settings. "
+                                         "Ignoring [TrafficControlQueueingDiscipline] section from line %u.",
+                                         qdisc->section->filename, qdisc->section->line);
+
+        if (qdisc->parent == TC_H_ROOT) {
+                if (*has_root)
+                        return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
+                                                 "%s: More than one root TrafficControlQueueingDiscipline sections are defined. "
+                                                 "Ignoring [TrafficControlQueueingDiscipline] section from line %u.",
+                                                 qdisc->section->filename, qdisc->section->line);
+                *has_root = true;
+        } else if (qdisc->parent == TC_H_CLSACT) {
+                if (*has_clsact)
+                        return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
+                                                 "%s: More than one clsact TrafficControlQueueingDiscipline sections are defined. "
+                                                 "Ignoring [TrafficControlQueueingDiscipline] section from line %u.",
+                                                 qdisc->section->filename, qdisc->section->line);
+                *has_clsact = true;
+        }
+
+        return 0;
+}
+
 int config_parse_tc_qdiscs_parent(
                 const char *unit,
                 const char *filename,
index 0453c85c9d1eb0e97a14b826556789088a293915..f108c603015e80391384e469d7952343e7495a2a 100644 (file)
@@ -32,6 +32,8 @@ int qdisc_new_static(Network *network, const char *filename, unsigned section_li
 
 int qdisc_configure(Link *link, QDiscs *qdisc);
 
+int qdisc_section_verify(QDiscs *qdisc, bool *has_root, bool *has_clsact);
+
 DEFINE_NETWORK_SECTION_FUNCTIONS(QDiscs, qdisc_free);
 
 CONFIG_PARSER_PROTOTYPE(config_parse_tc_qdiscs_parent);