/* 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_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"