From d3269cadd81bf644b6ee19040beafcf12e9718bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=9C=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=BD=D0=BA=D0=B5=D0=B2=D0=B8=D1=87?= Date: Wed, 8 Oct 2025 17:43:29 +0700 Subject: [PATCH] =?UTF-8?q?qosd:=20=D1=83=D1=82=D0=BE=D1=87=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BA=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D0=BC=20=D1=83=D0=B7=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/nodes/ComplexNode.h | 3 ++- include/nodes/HTBNode.h | 23 ++++++++++++++++------- include/nodes/REDNode.h | 24 ++++++++++++++---------- include/nodes/SFQNode.h | 16 ++++++++-------- 4 files changed, 40 insertions(+), 26 deletions(-) diff --git a/include/nodes/ComplexNode.h b/include/nodes/ComplexNode.h index c5e68eb..8e33181 100644 --- a/include/nodes/ComplexNode.h +++ b/include/nodes/ComplexNode.h @@ -6,7 +6,8 @@ #include "Logger.h" /// \brief Класс сложного (составного) узла дерева. -/// Может содержать несколько дочерних ComplexNode или один SimpleNode. +/// Может содержать несколько дочерних узлов такого же типа или один узел +/// отличного типа. class ComplexNode : public BaseNode, virtual public HierarchicalLinkMixin { public: diff --git a/include/nodes/HTBNode.h b/include/nodes/HTBNode.h index 8a7e569..2d8713d 100644 --- a/include/nodes/HTBNode.h +++ b/include/nodes/HTBNode.h @@ -11,13 +11,22 @@ class HTBNode : public ComplexNode, public FabricMixin { 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; ///< Поправка размера пакета, байты + 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() { diff --git a/include/nodes/REDNode.h b/include/nodes/REDNode.h index db1ce0d..4ad14f1 100644 --- a/include/nodes/REDNode.h +++ b/include/nodes/REDNode.h @@ -6,20 +6,24 @@ #include "Logger.h" /// \brief Узел дисциплины RED. Лист; не допускает дочерних элементов. +/// +/// \note Может быть подключен к: +/// + WRED для настройки VQ; +/// + SFQ для настройки per-flow RED. class REDNode : public LeafNode, public FabricMixin { 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-пакеты + 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() { diff --git a/include/nodes/SFQNode.h b/include/nodes/SFQNode.h index c7e4ca0..3d4b4a7 100644 --- a/include/nodes/SFQNode.h +++ b/include/nodes/SFQNode.h @@ -13,15 +13,15 @@ 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; ///< Отбрасывать из головы очереди - /// Параметры RED per-flow задаются через дочерний REDNode. + 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() {