Files
poc-links/include/nodes/HTBNode.h
T
2025-10-08 18:51:16 +07:00

52 lines
2.1 KiB
C++

#pragma once
#include <cstdint>
#include <string>
#include "nodes/ComplexNode.h"
#include "mixins/FabricMixin.h"
#include "Logger.h"
/// \brief Узел дисциплины HTB. Составной, допускает нескольких детей.
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_{};
};