eff0b26a53
Теперь конкретные узлы не сами устанавливают себе `kind_`, а делают это через `BaseNode` — единую точку входа.
47 lines
1.8 KiB
C++
47 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
#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<TypedOneToOneLink<INode, REDNode>>,
|
|
public FabricMixin<SFQNode> {
|
|
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>;
|
|
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_{};
|
|
};
|
|
|
|
|