#pragma once #include #include "nodes/BaseNode.h" #include "mixins/LazyLinkMixin.h" #include "mixins/FabricMixin.h" #include "links/TypedOneToOneLink.h" #include "nodes/REDNode.h" #include "Logger.h" /// \brief Узел дисциплины SFQ. Допускает одного ребёнка типа REDNode для настройки per-flow RED. class SFQNode : public BaseNode, virtual public LazyLinkMixin>, public FabricMixin { public: /// \note Параметры RED per-flow задаются через дочерний REDNode. struct Config { std::uint32_t limit = 0; ///< Суммарный лимит по всем потокам, пакеты std::uint32_t depth = 0; ///< Лимит на один поток, пакеты std::uint32_t divisor = 1024; ///< Размер хэш-таблицы (степень двойки) std::uint32_t perturb = 0; ///< Период пертурбации, секунды std::uint32_t flows = 0; ///< Число потоков std::uint32_t quantum = 0; ///< Порция RR, байты bool headdrop = false; ///< Отбрасывать из головы очереди }; ~SFQNode() { Logger::get("ConDes").dbg(std::string("--- SFQ destructor called for: ") + name_); } const Config& config() const { return config_; } private: friend class FabricMixin; SFQNode(std::string&& name) : BaseNode(std::move(name), "SFQ") { Logger::get("ConDes").dbg(std::string("--- SFQ constructor called for: ") + name_); } SFQNode(std::string&& name, Config&& config) : BaseNode(std::move(name), "SFQ"), config_(std::move(config)) { Logger::get("ConDes").dbg(std::string("--- SFQ constructor called for: ") + name_); } Config config_{}; };