]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/network/tc/tc.c
network: rename network_verify_xxx() -> network_drop_invalid_xxx()
[thirdparty/systemd.git] / src / network / tc / tc.c
CommitLineData
34658df2
YW
1/* SPDX-License-Identifier: LGPL-2.1+ */
2
3#include "macro.h"
4#include "qdisc.h"
5#include "tc.h"
4666f63b 6#include "tclass.h"
34658df2
YW
7
8void traffic_control_free(TrafficControl *tc) {
9 if (!tc)
10 return;
11
12 switch (tc->kind) {
13 case TC_KIND_QDISC:
14 qdisc_free(TC_TO_QDISC(tc));
15 break;
4666f63b
YW
16 case TC_KIND_TCLASS:
17 tclass_free(TC_TO_TCLASS(tc));
18 break;
34658df2
YW
19 default:
20 assert_not_reached("Invalid traffic control type");
21 }
22}
23
20054379 24static int traffic_control_configure(Link *link, TrafficControl *tc) {
34658df2
YW
25 assert(link);
26 assert(tc);
27
28 switch(tc->kind) {
29 case TC_KIND_QDISC:
30 return qdisc_configure(link, TC_TO_QDISC(tc));
4666f63b
YW
31 case TC_KIND_TCLASS:
32 return tclass_configure(link, TC_TO_TCLASS(tc));
34658df2
YW
33 default:
34 assert_not_reached("Invalid traffic control type");
35 }
36}
37
20054379
YW
38int link_configure_traffic_control(Link *link) {
39 TrafficControl *tc;
40 int r;
41
42 link->tc_configured = false;
43 link->tc_messages = 0;
44
45 ORDERED_HASHMAP_FOREACH(tc, link->network->tc_by_section) {
46 r = traffic_control_configure(link, tc);
47 if (r < 0)
48 return r;
49 }
50
51 if (link->tc_messages == 0)
52 link->tc_configured = true;
53 else
54 log_link_debug(link, "Configuring traffic control");
55
56 return 0;
57}
58
209af9a6 59static int traffic_control_section_verify(TrafficControl *tc, bool *qdisc_has_root, bool *qdisc_has_clsact) {
34658df2
YW
60 assert(tc);
61
62 switch(tc->kind) {
63 case TC_KIND_QDISC:
64 return qdisc_section_verify(TC_TO_QDISC(tc), qdisc_has_root, qdisc_has_clsact);
4666f63b
YW
65 case TC_KIND_TCLASS:
66 return tclass_section_verify(TC_TO_TCLASS(tc));
34658df2
YW
67 default:
68 assert_not_reached("Invalid traffic control type");
69 }
70}
209af9a6 71
13ffa39f 72void network_drop_invalid_traffic_control(Network *network) {
209af9a6
YW
73 bool has_root = false, has_clsact = false;
74 TrafficControl *tc;
75
76 assert(network);
77
78 ORDERED_HASHMAP_FOREACH(tc, network->tc_by_section)
79 if (traffic_control_section_verify(tc, &has_root, &has_clsact) < 0)
80 traffic_control_free(tc);
81}