qosd: добавлены атрибуты узлов

Мне показалось, будет удобно использовать вложенную структуру в качестве
аргумента конструктора.
This commit is contained in:
Сергей Маринкевич
2025-09-03 20:12:47 +07:00
parent 9c32fb89b8
commit 9b5996abb5
7 changed files with 133 additions and 11 deletions
+16 -1
View File
@@ -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_{};
};
+23 -2
View File
@@ -1,5 +1,7 @@
#pragma once
#include <cstdint>
#include <string>
#include "nodes/ComplexNode.h"
#include "mixins/FabricMixin.h"
#include "Logger.h"
@@ -8,16 +10,35 @@
class HTBNode : public ComplexNode,
public FabricMixin<HTBNode> {
public:
struct Config {
std::uint64_t rate = 0; ///< Разрешённая полоса, бит/с
std::uint64_t burst = 0; ///< Токены для rate, байты
std::uint64_t ceil = 0; ///< Допустимая полоса, бит/с
std::uint64_t cburst = 0; ///< Токены для ceil, байты
std::uint32_t prio = 0; ///< Приоритет класса
std::uint32_t quantum = 0; ///< Квант DRR, байты
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)) {
HTBNode(std::string&& name) : ComplexNode(std::move(name)) {
kind_ = "HTB";
Logger::get("ConDes").dbg(std::string("--- HTB constructor called for: ") + name_);
}
HTBNode(std::string&& name, Config&& config) : ComplexNode(std::move(name)),
config_(std::move(config)) {
kind_ = "HTB";
Logger::get("ConDes").dbg(std::string("--- HTB constructor called for: ") + name_);
}
Config config_{};
};
+16 -1
View File
@@ -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_{};
};
+25 -1
View File
@@ -1,5 +1,6 @@
#pragma once
#include <cstdint>
#include "nodes/LeafNode.h"
#include "mixins/FabricMixin.h"
#include "Logger.h"
@@ -8,14 +9,37 @@
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_{};
};
+23 -1
View File
@@ -1,5 +1,6 @@
#pragma once
#include <cstdint>
#include "nodes/BaseNode.h"
#include "mixins/LazyLinkMixin.h"
#include "mixins/FabricMixin.h"
@@ -12,15 +13,36 @@ class SFQNode : public BaseNode,
virtual public LazyLinkMixin<TypedOneToOneLink<INode, REDNode>>,
public FabricMixin<SFQNode> {
public:
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; ///< Отбрасывать из головы очереди
/// Параметры RED per-flow задаются через дочерний REDNode.
};
~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)) {
SFQNode(std::string&& name) : BaseNode(std::move(name)) {
kind_ = "SFQ";
Logger::get("ConDes").dbg(std::string("--- SFQ constructor called for: ") + name_);
}
SFQNode(std::string&& name, Config&& config)
: BaseNode(std::move(name)), config_(std::move(config)) {
kind_ = "SFQ";
Logger::get("ConDes").dbg(std::string("--- SFQ constructor called for: ") + name_);
}
Config config_{};
};
+22 -1
View File
@@ -1,5 +1,7 @@
#pragma once
#include <cstdint>
#include <string>
#include "nodes/BaseNode.h"
#include "mixins/LazyLinkMixin.h"
#include "mixins/FabricMixin.h"
@@ -11,15 +13,34 @@ class WREDNode : public BaseNode,
virtual public LazyLinkMixin<TypedOneToManyLink<INode, REDNode>>,
public FabricMixin<WREDNode> {
public:
struct Config {
std::uint32_t vqs = 0; ///< Количество виртуальных очередей (обязателен)
std::uint32_t def = 0; ///< Виртуальная очередь по умолчанию
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)) {
WREDNode(std::string&& name) : BaseNode(std::move(name)) {
kind_ = "WRED";
Logger::get("ConDes").dbg(std::string("--- WRED constructor called for: ") + name_);
}
WREDNode(std::string&& name, Config&& config)
: BaseNode(std::move(name)), config_(std::move(config)) {
kind_ = "WRED";
Logger::get("ConDes").dbg(std::string("--- WRED constructor called for: ") + name_);
}
Config config_{};
};