72 lines
2.1 KiB
C
72 lines
2.1 KiB
C
/* 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"
|
|
#include "tc.h"
|
|
|
|
typedef enum TClassKind {
|
|
TCLASS_KIND_DRR,
|
|
TCLASS_KIND_HTB,
|
|
TCLASS_KIND_QFQ,
|
|
_TCLASS_KIND_MAX,
|
|
_TCLASS_KIND_INVALID = -1,
|
|
} TClassKind;
|
|
|
|
typedef struct TClass {
|
|
TrafficControl meta;
|
|
|
|
NetworkConfigSection *section;
|
|
Network *network;
|
|
|
|
uint32_t classid;
|
|
uint32_t parent;
|
|
|
|
TClassKind kind;
|
|
} TClass;
|
|
|
|
typedef struct TClassVTable {
|
|
size_t object_size;
|
|
const char *tca_kind;
|
|
/* called in tclass_new() */
|
|
int (*init)(TClass *tclass);
|
|
int (*fill_message)(Link *link, TClass *tclass, sd_netlink_message *m);
|
|
int (*verify)(TClass *tclass);
|
|
} TClassVTable;
|
|
|
|
extern const TClassVTable * const tclass_vtable[_TCLASS_KIND_MAX];
|
|
|
|
#define TCLASS_VTABLE(t) ((t)->kind != _TCLASS_KIND_INVALID ? tclass_vtable[(t)->kind] : NULL)
|
|
|
|
/* For casting a tclass into the various tclass kinds */
|
|
#define DEFINE_TCLASS_CAST(UPPERCASE, MixedCase) \
|
|
static inline MixedCase* TCLASS_TO_##UPPERCASE(TClass *t) { \
|
|
if (_unlikely_(!t || t->kind != TCLASS_KIND_##UPPERCASE)) \
|
|
return NULL; \
|
|
\
|
|
return (MixedCase*) t; \
|
|
}
|
|
|
|
/* For casting the various tclass kinds into a tclass */
|
|
#define TCLASS(t) (&(t)->meta)
|
|
|
|
void tclass_free(TClass *tclass);
|
|
int tclass_new_static(TClassKind kind, Network *network, const char *filename, unsigned section_line, TClass **ret);
|
|
|
|
int tclass_configure(Link *link, TClass *tclass);
|
|
int tclass_section_verify(TClass *tclass);
|
|
|
|
DEFINE_NETWORK_SECTION_FUNCTIONS(TClass, tclass_free);
|
|
|
|
DEFINE_TC_CAST(TCLASS, TClass);
|
|
|
|
CONFIG_PARSER_PROTOTYPE(config_parse_tclass_parent);
|
|
CONFIG_PARSER_PROTOTYPE(config_parse_tclass_classid);
|
|
|
|
#include "drr.h"
|
|
#include "htb.h"
|
|
#include "qfq.h"
|