qosd: добавлены атрибуты узлов
Мне показалось, будет удобно использовать вложенную структуру в качестве аргумента конструктора.
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include "nodes/LeafNode.h"
|
||||
#include "mixins/FabricMixin.h"
|
||||
#include "Logger.h"
|
||||
@@ -8,14 +9,28 @@
|
||||
class BFIFONode : public LeafNode,
|
||||
public FabricMixin<BFIFONode> {
|
||||
public:
|
||||
struct Config {
|
||||
/// Размер очереди в байтах.
|
||||
std::uint64_t limit = 0;
|
||||
};
|
||||
|
||||
~BFIFONode() {
|
||||
Logger::get("ConDes").dbg(std::string("--- BFIFO destructor called for: ") + name_);
|
||||
}
|
||||
|
||||
const Config& config() const { return config_; }
|
||||
private:
|
||||
friend class FabricMixin<BFIFONode>;
|
||||
BFIFONode(std::string name) : LeafNode(std::move(name), "BFIFO") {
|
||||
BFIFONode(std::string&& name) : LeafNode(std::move(name), "BFIFO") {
|
||||
Logger::get("ConDes").dbg(std::string("--- BFIFO constructor called for: ") + name_);
|
||||
}
|
||||
|
||||
BFIFONode(std::string&& name, Config&& config) : LeafNode(std::move(name), "BFIFO"),
|
||||
config_(std::move(config)) {
|
||||
Logger::get("ConDes").dbg(std::string("--- BFIFO constructor called for: ") + name_);
|
||||
}
|
||||
|
||||
Config config_{};
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include "nodes/ComplexNode.h"
|
||||
#include "mixins/FabricMixin.h"
|
||||
#include "Logger.h"
|
||||
@@ -8,14 +10,42 @@
|
||||
class HTBNode : public ComplexNode,
|
||||
public FabricMixin<HTBNode> {
|
||||
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>;
|
||||
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_{};
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include "nodes/LeafNode.h"
|
||||
#include "mixins/FabricMixin.h"
|
||||
#include "Logger.h"
|
||||
@@ -8,14 +9,28 @@
|
||||
class PFIFONode : public LeafNode,
|
||||
public FabricMixin<PFIFONode> {
|
||||
public:
|
||||
struct Config {
|
||||
/// \brief Кол-во пакетов.
|
||||
std::uint32_t limit;
|
||||
};
|
||||
|
||||
~PFIFONode() {
|
||||
Logger::get("ConDes").dbg(std::string("--- PFIFO destructor called for: ") + name_);
|
||||
}
|
||||
|
||||
const Config& config() const { return config_; }
|
||||
private:
|
||||
friend class FabricMixin<PFIFONode>;
|
||||
PFIFONode(std::string name) : LeafNode(std::move(name), "PFIFO") {
|
||||
PFIFONode(std::string&& name) : LeafNode(std::move(name), "PFIFO") {
|
||||
Logger::get("ConDes").dbg(std::string("--- PFIFO constructor called for: ") + name_);
|
||||
}
|
||||
|
||||
PFIFONode(std::string&& name, Config&& config) : LeafNode(std::move(name), "PFIFO"),
|
||||
config_(std::move(config)) {
|
||||
Logger::get("ConDes").dbg(std::string("--- PFIFO constructor called for: ") + name_);
|
||||
}
|
||||
|
||||
Config config_{};
|
||||
};
|
||||
|
||||
|
||||
|
||||
+28
-1
@@ -1,21 +1,48 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include "nodes/LeafNode.h"
|
||||
#include "mixins/FabricMixin.h"
|
||||
#include "Logger.h"
|
||||
|
||||
/// \brief Узел дисциплины RED. Лист; не допускает дочерних элементов.
|
||||
///
|
||||
/// \note Может быть подключен к:
|
||||
/// + WRED для настройки VQ;
|
||||
/// + SFQ для настройки per-flow RED.
|
||||
class REDNode : public LeafNode,
|
||||
public FabricMixin<REDNode> {
|
||||
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>;
|
||||
REDNode(std::string name) : LeafNode(std::move(name), "RED") {
|
||||
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_{};
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include "nodes/BaseNode.h"
|
||||
#include "mixins/LazyLinkMixin.h"
|
||||
#include "mixins/FabricMixin.h"
|
||||
@@ -12,14 +13,34 @@ 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_{};
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include "nodes/BaseNode.h"
|
||||
#include "mixins/LazyLinkMixin.h"
|
||||
#include "mixins/FabricMixin.h"
|
||||
@@ -11,14 +13,30 @@ class WREDNode : public BaseNode,
|
||||
virtual public LazyLinkMixin<TypedOneToManyLink<INode, REDNode>>,
|
||||
public FabricMixin<WREDNode> {
|
||||
public:
|
||||
struct Config {
|
||||
bool grio = false; ///< Наследование буферов (GRIO)
|
||||
std::uint64_t limit = 0; ///< Глобальный лимит буфера, байты (необязателен)
|
||||
bool ecn = false; ///< Включить ECN на дисциплине
|
||||
bool harddrop = false; ///< Жёсткий дроп при превышении max
|
||||
};
|
||||
|
||||
~WREDNode() {
|
||||
Logger::get("ConDes").dbg(std::string("--- WRED destructor called for: ") + name_);
|
||||
}
|
||||
|
||||
const Config& config() const { return config_; }
|
||||
private:
|
||||
friend class FabricMixin<WREDNode>;
|
||||
WREDNode(std::string&& name) : BaseNode(std::move(name), "WRED") {
|
||||
Logger::get("ConDes").dbg(std::string("--- WRED constructor called for: ") + name_);
|
||||
}
|
||||
|
||||
WREDNode(std::string&& name, Config&& config) : BaseNode(std::move(name), "WRED"),
|
||||
config_(std::move(config)) {
|
||||
Logger::get("ConDes").dbg(std::string("--- WRED constructor called for: ") + name_);
|
||||
}
|
||||
|
||||
Config config_{};
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user