/* SPDX-License-Identifier: LGPL-2.1-or-later * Copyright © 2019 VMware, Inc. */ #pragma once #include "conf-parser.h" #include "networkd-util.h" typedef struct Link Link; typedef struct Manager Manager; typedef struct Network Network; typedef enum TClassKind { TCLASS_KIND_DRR, TCLASS_KIND_HTB, TCLASS_KIND_QFQ, _TCLASS_KIND_MAX, _TCLASS_KIND_INVALID = -EINVAL, } TClassKind; typedef struct TClass { Link *link; Network *network; ConfigSection *section; NetworkConfigSource source; NetworkConfigState state; uint32_t classid; uint32_t parent; TClassKind kind; char *tca_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; \ } DEFINE_NETWORK_CONFIG_STATE_FUNCTIONS(TClass, tclass); TClass* tclass_free(TClass *tclass); int tclass_new_static(TClassKind kind, Network *network, const char *filename, unsigned section_line, TClass **ret); int link_find_tclass(Link *link, uint32_t classid, TClass **ret); int link_request_tclass(Link *link, TClass *tclass); void network_drop_invalid_tclass(Network *network); int manager_rtnl_process_tclass(sd_netlink *rtnl, sd_netlink_message *message, Manager *m); DEFINE_SECTION_CLEANUP_FUNCTIONS(TClass, tclass_free); CONFIG_PARSER_PROTOTYPE(config_parse_tclass_parent); CONFIG_PARSER_PROTOTYPE(config_parse_tclass_classid); #include "drr.h" #include "htb.h" #include "qfq.h"