qosd: добавлены базовые дисциплины Complex QoS ESR

А именно:

+ [B|P]FIFO;
+ HTB;
+ RED;
+ WRED (a.k.a. `gred` в Linux/TC и нашем CLI);
+ SFQ.

Два замечания:

1. Вместо GRED и RED теперь WRED и RED: RED — как был, так и есть, а
   WRED — специальный узел, который несёт глобальные настройки GRED, но
   параметры RED на VQ задаются через подключение дочерних узлов RED.
2. Параметры RED для SFQ также были оптимизированы: в узле SFQ их не
   будет, но зато к SFQ можно подключить один дочерний узел. Если
   подключить туда RED, то настройки RED будут применяться для per-flow
   RED дисциплины SFQ.
This commit is contained in:
Сергей Маринкевич
2025-09-02 19:56:58 +07:00
parent 63a7907bba
commit 6a82699c5c
19 changed files with 475 additions and 135 deletions
+31
View File
@@ -0,0 +1,31 @@
#pragma once
#include <stdexcept>
/// \brief Обёртка для связей, чтобы сделать их типизированными.
/// Типизированная связь позволяет подключать только узлы заданного типа.
/// \tparam TElem Тип элемента.
/// \tparam TBase Базовый Link. После проверки типа, управление передаётся этому классу.
/// \tparam TExpected Опциональный ожидаемый конкретный тип детей.
/// Если не задан, сравниваем с родителем.
template <class TElem, class TBase, class TExpected = void>
class TypedLink : public TBase {
public:
using ElemPtr = std::shared_ptr<TElem>;
TypedLink(ElemPtr e) : TBase(e) {}
void addChild(const ElemPtr& child) override {
/* Validate type according to policy */
if constexpr (std::is_void_v<TExpected>) {
/* Default behavior: child must be exactly the same type as parent */
if (typeid(*child) != typeid(*this->owner_node_.lock()))
throw std::logic_error("Foundling child");
} else {
/* Explicit expected child type */
if (typeid(*child) != typeid(TExpected))
throw std::logic_error("Unexpected child type");
}
TBase::addChild(child);
}
};