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() {