2019-10-07 16:19:00 +02:00
|
|
|
/* SPDX-License-Identifier: LGPL-2.1+
|
|
|
|
* Copyright © 2019 VMware, Inc. */
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "conf-parser.h"
|
2019-10-30 09:02:15 +01:00
|
|
|
#include "networkd-link.h"
|
|
|
|
#include "networkd-network.h"
|
|
|
|
#include "networkd-util.h"
|
2020-02-10 12:53:00 +01:00
|
|
|
#include "tc.h"
|
2019-12-11 12:10:29 +01:00
|
|
|
|
|
|
|
typedef enum QDiscKind {
|
2020-03-10 12:53:32 +01:00
|
|
|
QDISC_KIND_BFIFO,
|
2020-03-02 07:54:17 +01:00
|
|
|
QDISC_KIND_CAKE,
|
2019-12-21 20:18:09 +01:00
|
|
|
QDISC_KIND_CODEL,
|
2020-03-10 08:46:40 +01:00
|
|
|
QDISC_KIND_DRR,
|
2019-12-11 10:52:51 +01:00
|
|
|
QDISC_KIND_FQ,
|
2019-12-11 12:10:29 +01:00
|
|
|
QDISC_KIND_FQ_CODEL,
|
2020-02-10 13:24:02 +01:00
|
|
|
QDISC_KIND_GRED,
|
2020-02-10 11:41:12 +01:00
|
|
|
QDISC_KIND_HTB,
|
2019-12-11 12:10:29 +01:00
|
|
|
QDISC_KIND_NETEM,
|
2020-02-10 16:12:21 +01:00
|
|
|
QDISC_KIND_PFIFO,
|
2020-03-10 13:19:56 +01:00
|
|
|
QDISC_KIND_PFIFO_HEAD_DROP,
|
2020-03-09 10:48:03 +01:00
|
|
|
QDISC_KIND_PIE,
|
2020-02-11 08:24:27 +01:00
|
|
|
QDISC_KIND_SFB,
|
2019-12-11 12:10:29 +01:00
|
|
|
QDISC_KIND_SFQ,
|
|
|
|
QDISC_KIND_TBF,
|
2020-02-06 09:52:24 +01:00
|
|
|
QDISC_KIND_TEQL,
|
2019-12-11 12:10:29 +01:00
|
|
|
_QDISC_KIND_MAX,
|
|
|
|
_QDISC_KIND_INVALID = -1,
|
|
|
|
} QDiscKind;
|
2019-10-07 16:19:00 +02:00
|
|
|
|
2019-11-25 15:07:58 +01:00
|
|
|
typedef struct QDisc {
|
2020-02-10 12:53:00 +01:00
|
|
|
TrafficControl meta;
|
|
|
|
|
2019-10-07 16:19:00 +02:00
|
|
|
NetworkConfigSection *section;
|
|
|
|
Network *network;
|
|
|
|
|
|
|
|
int family;
|
|
|
|
uint32_t handle;
|
|
|
|
uint32_t parent;
|
|
|
|
|
2019-12-07 17:46:37 +01:00
|
|
|
char *tca_kind;
|
2019-12-11 12:10:29 +01:00
|
|
|
QDiscKind kind;
|
2019-11-25 15:07:58 +01:00
|
|
|
} QDisc;
|
2019-10-07 16:19:00 +02:00
|
|
|
|
2019-12-11 12:10:29 +01:00
|
|
|
typedef struct QDiscVTable {
|
|
|
|
size_t object_size;
|
|
|
|
const char *tca_kind;
|
2019-12-12 09:25:29 +01:00
|
|
|
/* called in qdisc_new() */
|
|
|
|
int (*init)(QDisc *qdisc);
|
2020-02-06 09:52:24 +01:00
|
|
|
int (*fill_tca_kind)(Link *link, QDisc *qdisc, sd_netlink_message *m);
|
2019-12-11 12:10:29 +01:00
|
|
|
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)
|
|
|
|
|
2019-11-25 15:07:58 +01:00
|
|
|
void qdisc_free(QDisc *qdisc);
|
2019-12-11 12:10:29 +01:00
|
|
|
int qdisc_new_static(QDiscKind kind, Network *network, const char *filename, unsigned section_line, QDisc **ret);
|
2019-10-07 16:19:00 +02:00
|
|
|
|
2019-11-25 15:07:58 +01:00
|
|
|
int qdisc_configure(Link *link, QDisc *qdisc);
|
|
|
|
int qdisc_section_verify(QDisc *qdisc, bool *has_root, bool *has_clsact);
|
2019-11-24 12:31:38 +01:00
|
|
|
|
2019-11-25 15:07:58 +01:00
|
|
|
DEFINE_NETWORK_SECTION_FUNCTIONS(QDisc, qdisc_free);
|
2019-10-07 16:19:00 +02:00
|
|
|
|
2020-02-10 12:53:00 +01:00
|
|
|
DEFINE_TC_CAST(QDISC, QDisc);
|
|
|
|
|
2020-02-04 13:45:29 +01:00
|
|
|
CONFIG_PARSER_PROTOTYPE(config_parse_qdisc_parent);
|
2020-02-10 08:05:35 +01:00
|
|
|
CONFIG_PARSER_PROTOTYPE(config_parse_qdisc_handle);
|
2019-12-11 12:10:29 +01:00
|
|
|
|
2020-03-02 07:54:17 +01:00
|
|
|
#include "cake.h"
|
2019-12-21 20:18:09 +01:00
|
|
|
#include "codel.h"
|
2020-02-10 16:12:21 +01:00
|
|
|
#include "fifo.h"
|
2019-12-11 12:10:29 +01:00
|
|
|
#include "fq-codel.h"
|
2019-12-11 10:52:51 +01:00
|
|
|
#include "fq.h"
|
2020-02-10 13:24:02 +01:00
|
|
|
#include "gred.h"
|
2020-02-10 11:41:12 +01:00
|
|
|
#include "htb.h"
|
2020-03-09 10:48:03 +01:00
|
|
|
#include "pie.h"
|
2019-12-11 12:10:29 +01:00
|
|
|
#include "netem.h"
|
2020-03-10 08:46:40 +01:00
|
|
|
#include "drr.h"
|
2020-02-11 08:24:27 +01:00
|
|
|
#include "sfb.h"
|
2019-12-11 12:10:29 +01:00
|
|
|
#include "sfq.h"
|
|
|
|
#include "tbf.h"
|
2020-02-06 09:52:24 +01:00
|
|
|
#include "teql.h"
|