]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/network/tc/qdisc.h
network/tc: support Parent=X:0 for qdiscs
[thirdparty/systemd.git] / src / network / tc / qdisc.h
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later
0f5bd7fe
SS
2 * Copyright © 2019 VMware, Inc. */
3#pragma once
4
5#include "conf-parser.h"
737f1405 6#include "networkd-util.h"
3a67b8bb
YW
7
8typedef struct Link Link;
9typedef struct Manager Manager;
10typedef struct Network Network;
e8c17dc0
YW
11
12typedef enum QDiscKind {
c853f594 13 QDISC_KIND_BFIFO,
ad8352f4 14 QDISC_KIND_CAKE,
a9a5d632 15 QDISC_KIND_CODEL,
f5fc0441 16 QDISC_KIND_DRR,
d474aa51 17 QDISC_KIND_ETS,
7234b915 18 QDISC_KIND_FQ,
e8c17dc0 19 QDISC_KIND_FQ_CODEL,
8f6b6d70 20 QDISC_KIND_FQ_PIE,
609e8340 21 QDISC_KIND_GRED,
7f224020 22 QDISC_KIND_HHF,
b934ac3d 23 QDISC_KIND_HTB,
e8c17dc0 24 QDISC_KIND_NETEM,
a7476065 25 QDISC_KIND_PFIFO,
1a95964b 26 QDISC_KIND_PFIFO_FAST,
053a2ddb 27 QDISC_KIND_PFIFO_HEAD_DROP,
bde4ae88 28 QDISC_KIND_PIE,
b12aaee5 29 QDISC_KIND_QFQ,
982998b0 30 QDISC_KIND_SFB,
e8c17dc0
YW
31 QDISC_KIND_SFQ,
32 QDISC_KIND_TBF,
9b749c11 33 QDISC_KIND_TEQL,
e8c17dc0 34 _QDISC_KIND_MAX,
2d93c20e 35 _QDISC_KIND_INVALID = -EINVAL,
e8c17dc0 36} QDiscKind;
0f5bd7fe 37
edc54f2f 38typedef struct QDisc {
828a81a9 39 Link *link;
0f5bd7fe 40 Network *network;
828a81a9
YW
41 ConfigSection *section;
42 NetworkConfigSource source;
43 NetworkConfigState state;
0f5bd7fe 44
0f5bd7fe
SS
45 uint32_t handle;
46 uint32_t parent;
47
d8081020 48 char *tca_kind;
e8c17dc0 49 QDiscKind kind;
edc54f2f 50} QDisc;
0f5bd7fe 51
e8c17dc0
YW
52typedef struct QDiscVTable {
53 size_t object_size;
54 const char *tca_kind;
ac810b75
YW
55 /* called in qdisc_new() */
56 int (*init)(QDisc *qdisc);
e8c17dc0
YW
57 int (*fill_message)(Link *link, QDisc *qdisc, sd_netlink_message *m);
58 int (*verify)(QDisc *qdisc);
21261ea2 59 int (*is_ready)(QDisc *qdisc, Link *link);
e8c17dc0
YW
60} QDiscVTable;
61
62extern const QDiscVTable * const qdisc_vtable[_QDISC_KIND_MAX];
63
64#define QDISC_VTABLE(q) ((q)->kind != _QDISC_KIND_INVALID ? qdisc_vtable[(q)->kind] : NULL)
65
66/* For casting a qdisc into the various qdisc kinds */
67#define DEFINE_QDISC_CAST(UPPERCASE, MixedCase) \
68 static inline MixedCase* UPPERCASE(QDisc *q) { \
69 if (_unlikely_(!q || q->kind != QDISC_KIND_##UPPERCASE)) \
70 return NULL; \
71 \
72 return (MixedCase*) q; \
73 }
74
828a81a9
YW
75DEFINE_NETWORK_CONFIG_STATE_FUNCTIONS(QDisc, qdisc);
76
75db809a 77QDisc* qdisc_free(QDisc *qdisc);
e8c17dc0 78int qdisc_new_static(QDiscKind kind, Network *network, const char *filename, unsigned section_line, QDisc **ret);
0f5bd7fe 79
be8e9339
YW
80QDisc* qdisc_drop(QDisc *qdisc);
81
9e4d8716 82int link_find_qdisc(Link *link, uint32_t handle, const char *kind, QDisc **qdisc);
7ec18462 83
1dec9d81 84int link_request_qdisc(Link *link, QDisc *qdisc);
3a67b8bb
YW
85
86void network_drop_invalid_qdisc(Network *network);
8efb93f0 87
828a81a9
YW
88int manager_rtnl_process_qdisc(sd_netlink *rtnl, sd_netlink_message *message, Manager *m);
89
307fe3cd 90DEFINE_SECTION_CLEANUP_FUNCTIONS(QDisc, qdisc_free);
0f5bd7fe 91
18de0969 92CONFIG_PARSER_PROTOTYPE(config_parse_qdisc_parent);
d8b2396d 93CONFIG_PARSER_PROTOTYPE(config_parse_qdisc_handle);
e8c17dc0 94
ad8352f4 95#include "cake.h"
a9a5d632 96#include "codel.h"
d474aa51 97#include "ets.h"
a7476065 98#include "fifo.h"
e8c17dc0 99#include "fq-codel.h"
8f6b6d70 100#include "fq-pie.h"
7234b915 101#include "fq.h"
609e8340 102#include "gred.h"
7f224020 103#include "hhf.h"
b934ac3d 104#include "htb.h"
bde4ae88 105#include "pie.h"
b12aaee5 106#include "qfq.h"
e8c17dc0 107#include "netem.h"
f5fc0441 108#include "drr.h"
982998b0 109#include "sfb.h"
e8c17dc0
YW
110#include "sfq.h"
111#include "tbf.h"
9b749c11 112#include "teql.h"