]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/tc/qdisc.h
Merge pull request #18007 from fw-strlen/ipv6_masq_and_dnat
[thirdparty/systemd.git] / src / network / tc / qdisc.h
1 /* SPDX-License-Identifier: LGPL-2.1-or-later
2 * Copyright © 2019 VMware, Inc. */
3 #pragma once
4
5 #include "conf-parser.h"
6 #include "networkd-link.h"
7 #include "networkd-network.h"
8 #include "networkd-util.h"
9 #include "tc.h"
10
11 typedef enum QDiscKind {
12 QDISC_KIND_BFIFO,
13 QDISC_KIND_CAKE,
14 QDISC_KIND_CODEL,
15 QDISC_KIND_DRR,
16 QDISC_KIND_ETS,
17 QDISC_KIND_FQ,
18 QDISC_KIND_FQ_CODEL,
19 QDISC_KIND_FQ_PIE,
20 QDISC_KIND_GRED,
21 QDISC_KIND_HHF,
22 QDISC_KIND_HTB,
23 QDISC_KIND_NETEM,
24 QDISC_KIND_PFIFO,
25 QDISC_KIND_PFIFO_FAST,
26 QDISC_KIND_PFIFO_HEAD_DROP,
27 QDISC_KIND_PIE,
28 QDISC_KIND_QFQ,
29 QDISC_KIND_SFB,
30 QDISC_KIND_SFQ,
31 QDISC_KIND_TBF,
32 QDISC_KIND_TEQL,
33 _QDISC_KIND_MAX,
34 _QDISC_KIND_INVALID = -EINVAL,
35 } QDiscKind;
36
37 typedef struct QDisc {
38 TrafficControl meta;
39
40 NetworkConfigSection *section;
41 Network *network;
42
43 int family;
44 uint32_t handle;
45 uint32_t parent;
46
47 char *tca_kind;
48 QDiscKind kind;
49 } QDisc;
50
51 typedef struct QDiscVTable {
52 size_t object_size;
53 const char *tca_kind;
54 /* called in qdisc_new() */
55 int (*init)(QDisc *qdisc);
56 int (*fill_tca_kind)(Link *link, QDisc *qdisc, sd_netlink_message *m);
57 int (*fill_message)(Link *link, QDisc *qdisc, sd_netlink_message *m);
58 int (*verify)(QDisc *qdisc);
59 } QDiscVTable;
60
61 extern const QDiscVTable * const qdisc_vtable[_QDISC_KIND_MAX];
62
63 #define QDISC_VTABLE(q) ((q)->kind != _QDISC_KIND_INVALID ? qdisc_vtable[(q)->kind] : NULL)
64
65 /* For casting a qdisc into the various qdisc kinds */
66 #define DEFINE_QDISC_CAST(UPPERCASE, MixedCase) \
67 static inline MixedCase* UPPERCASE(QDisc *q) { \
68 if (_unlikely_(!q || q->kind != QDISC_KIND_##UPPERCASE)) \
69 return NULL; \
70 \
71 return (MixedCase*) q; \
72 }
73
74 /* For casting the various qdisc kinds into a qdisc */
75 #define QDISC(q) (&(q)->meta)
76
77 QDisc* qdisc_free(QDisc *qdisc);
78 int qdisc_new_static(QDiscKind kind, Network *network, const char *filename, unsigned section_line, QDisc **ret);
79
80 int qdisc_configure(Link *link, QDisc *qdisc);
81 int qdisc_section_verify(QDisc *qdisc, bool *has_root, bool *has_clsact);
82
83 DEFINE_NETWORK_SECTION_FUNCTIONS(QDisc, qdisc_free);
84
85 DEFINE_TC_CAST(QDISC, QDisc);
86
87 CONFIG_PARSER_PROTOTYPE(config_parse_qdisc_parent);
88 CONFIG_PARSER_PROTOTYPE(config_parse_qdisc_handle);
89
90 #include "cake.h"
91 #include "codel.h"
92 #include "ets.h"
93 #include "fifo.h"
94 #include "fq-codel.h"
95 #include "fq-pie.h"
96 #include "fq.h"
97 #include "gred.h"
98 #include "hhf.h"
99 #include "htb.h"
100 #include "pie.h"
101 #include "qfq.h"
102 #include "netem.h"
103 #include "drr.h"
104 #include "sfb.h"
105 #include "sfq.h"
106 #include "tbf.h"
107 #include "teql.h"