#pragma once #include #include "nodes/LeafNode.h" #include "mixins/FabricMixin.h" #include "Logger.h" /// \brief Узел дисциплины RED. Лист; не допускает дочерних элементов. class REDNode : public LeafNode, public FabricMixin { public: struct Config { std::uint64_t limit = 0; ///< Размер буфера, байты (обязателен) std::uint64_t min = 0; ///< Нижняя граница для разметки, байты std::uint64_t max = 0; ///< Верхняя граница для разметки, байты std::uint32_t avpkt = 0; ///< Средний размер пакета, байты (обязателен) std::uint64_t burst = 0; ///< Всплеск, байты double probability = 0.0; ///< Максимальная вероятность, 0..1 std::uint64_t bandwidth = 0; ///< Скорость интерфейса, бит/с bool ecn = false; ///< Включить ECN-разметку вместо дропа bool harddrop = false; ///< Жёсткий дроп при превышении max bool nodrop = false; ///< Не дропать non-ECN-пакеты }; ~REDNode() { Logger::get("ConDes").dbg(std::string("--- RED destructor called for: ") + name_); } const Config& config() const { return config_; } private: friend class FabricMixin; REDNode(std::string&& name) : LeafNode(std::move(name), "RED") { Logger::get("ConDes").dbg(std::string("--- RED constructor called for: ") + name_); } REDNode(std::string&& name, Config&& config) : LeafNode(std::move(name), "RED"), config_(std::move(config)) { Logger::get("ConDes").dbg(std::string("--- RED constructor called for: ") + name_); } Config config_{}; };