#pragma once #include #include #include "nodes/ComplexNode.h" #include "mixins/FabricMixin.h" #include "Logger.h" /// \brief Узел дисциплины HTB. Составной, допускает нескольких детей. class HTBNode : public ComplexNode, public FabricMixin { public: struct Config { std::uint64_t cir = 0; ///< Разрешённая полоса, CIR, бит/с. std::uint64_t cburst = 0; ///< Токены для CIR, байты. std::uint64_t pir = 0; ///< Допустимая полоса, PIR, бит/с. std::uint64_t pburst = 0; ///< Токены для PIR, байты. std::uint32_t prio = 0; ///< Приоритет класса. std::uint32_t quantum = 0; ///< Квант DRR, байты. /// \brief Поправка размера пакета, байты. /// /// \note Вообще, этот параметр исторически взят с Linux/TC HTB. /// И в таком контексте: речь **не** про STAB, а именно про /// параметр класса HTB. Он, в отличие от STAB, не влияет на сам /// размер пакета, а используется только для поправки шейпера /// конкретно этого класса. Впрочем, в BC2 есть такая же местная /// поправка для шейперов, см. FS 31.5.2.3 Packet Length Offset. std::int32_t overhead = 0; }; ~HTBNode() { Logger::get("ConDes").dbg(std::string("--- HTB destructor called for: ") + name_); } const Config& config() const { return config_; } private: friend class FabricMixin; HTBNode(std::string&& name) : ComplexNode(std::move(name), "HTB") { Logger::get("ConDes").dbg(std::string("--- HTB constructor called for: ") + name_); } HTBNode(std::string&& name, Config&& config) : ComplexNode(std::move(name), "HTB"), config_(std::move(config)) { Logger::get("ConDes").dbg(std::string("--- HTB constructor called for: ") + name_); } Config config_{}; };