]>
Commit | Line | Data |
---|---|---|
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 | |
8 | void 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 | 24 | static 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 |
38 | int 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 | 59 | static 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 | 72 | void 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 | } |