summaryrefslogtreecommitdiff
path: root/src/network/tc/qdisc.h
blob: cef540a4d53d94824a8b2e45a042eefcdcc1269c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/* SPDX-License-Identifier: LGPL-2.1+
 * Copyright © 2019 VMware, Inc. */
#pragma once

#include "conf-parser.h"
#include "networkd-link.h"
#include "networkd-network.h"
#include "networkd-util.h"

typedef enum QDiscKind {
        QDISC_KIND_FQ,
        QDISC_KIND_FQ_CODEL,
        QDISC_KIND_NETEM,
        QDISC_KIND_SFQ,
        QDISC_KIND_TBF,
        _QDISC_KIND_MAX,
        _QDISC_KIND_INVALID = -1,
} QDiscKind;

typedef struct QDisc {
        NetworkConfigSection *section;
        Network *network;

        int family;
        uint32_t handle;
        uint32_t parent;

        char *tca_kind;
        QDiscKind kind;
} QDisc;

typedef struct QDiscVTable {
        size_t object_size;
        const char *tca_kind;
        int (*fill_message)(Link *link, QDisc *qdisc, sd_netlink_message *m);
        int (*verify)(QDisc *qdisc);
} QDiscVTable;

extern const QDiscVTable * const qdisc_vtable[_QDISC_KIND_MAX];

#define QDISC_VTABLE(q) ((q)->kind != _QDISC_KIND_INVALID ? qdisc_vtable[(q)->kind] : NULL)

/* For casting a qdisc into the various qdisc kinds */
#define DEFINE_QDISC_CAST(UPPERCASE, MixedCase)                           \
        static inline MixedCase* UPPERCASE(QDisc *q) {                    \
                if (_unlikely_(!q || q->kind != QDISC_KIND_##UPPERCASE))  \
                        return NULL;                                      \
                                                                          \
                return (MixedCase*) q;                                    \
        }

/* For casting the various qdisc kinds into a qdisc */
#define QDISC(q) (&(q)->meta)

void qdisc_free(QDisc *qdisc);
int qdisc_new_static(QDiscKind kind, Network *network, const char *filename, unsigned section_line, QDisc **ret);

int qdisc_configure(Link *link, QDisc *qdisc);
int qdisc_section_verify(QDisc *qdisc, bool *has_root, bool *has_clsact);

DEFINE_NETWORK_SECTION_FUNCTIONS(QDisc, qdisc_free);

CONFIG_PARSER_PROTOTYPE(config_parse_tc_qdiscs_parent);

#include "fq-codel.h"
#include "fq.h"
#include "netem.h"
#include "sfq.h"
#include "tbf.h"