Глава 5. Обзор классов NS-3

При создании тестов с модулем Satellite неизбежно будут использованы классы NS-3. В этой главе будут дано краткое описание наиболее часто используемых классов. Обзор каждого класса будет строиться по одной и той же схеме:

• описание полей;

• описание атрибутов NS-3;

• описание методов.

5.1 Класс AttributeValue

Базовый класс для хранения значений атрибутов в системе NS-3. Экземпляры этого класса должны быть обернуты в объект Attribute. Большинство подклассов этого базового класса реализуются с помощью макросов ATTRIBUTE_HELPER_*.

Описание полей

нет полей.

Описание атрибутов

Класс не определяет собственных атрибутов в системе TypeId.

Описание методов

AttributeValue(): конструктор по умолчанию.

~AttributeValue(): виртуальный деструктор.

Copy(): возвращает глубокую копию экземпляра этого класса, обернутую в объект Attribute.

SerializeToString(Ptr checker): возвращает строковое представление этого значения. В большинстве случаев этот метод не использует аргумент checker (указатель на функцию валидации значения), однако в ограниченном наборе случаев он необходим для выполнения правильной сериализации.

DeserializeFromString(std::string value, Ptr checker): десериализует строку в значение. Принимает строковое представление value и указатель на checker, связанный с атрибутом. Возвращает true, если входная строка была корректно отформатирована и успешно десериализована.

5.1.1 Классы значений для AttributeValue

Используются для передачи значений в Config::SetDefault:

  • EnumValue: обертка для перечисляемых типов.

  • UintegerValue: обертка для беззнаковых целых чисел.

  • DoubleValue: обертка для чисел с плавающей запятой.

  • BooleanValue: обертка для логических значений.

  • StringValue: обертка для строк.

5.2 Класс AttributeAccessor

Класс, позволяющий устанавливать и получать значение атрибута. Цель этого класса - скрыть от пользователя детали того, как атрибут фактически устанавливается или извлекается из экземпляра класса. Реализации этого базового класса обычно предоставляются через функции шаблонов MakeAccessorHelper.

Описание полей

нет полей.

Описание атрибутов

Класс не определяет собственных атрибутов в системе TypeId.

Описание методов

AttributeAccessor(): конструктор по умолчанию.

~AttributeAccessor(): виртуальный деструктор.

Set(ObjectBase object, const AttributeValue& value)*: устанавливает значение в объекте. Аргумент object указывает на экземпляр объекта, в котором устанавливается значение, а value - само значение. Возвращает true, если значение было успешно установлено.

Get(const ObjectBase object, AttributeValue& attribute)*: получает значение из объекта. Аргумент object указывает на экземпляр объекта, из которого считывается значение, а attribute принимает считанное значение. Возвращает true, если значение было успешно прочитано и сохранено.

HasGetter(): возвращает true, если этот аксессор поддерживает операцию чтения (Get).

HasSetter(): возвращает true, если этот аксессор поддерживает операцию записи (Set).

5.3 Класс AttributeChecker

Класс, представляющий тип атрибута. Для каждого типа атрибута существует связанный уникальный подкласс AttributeChecker. Тип подкласса может безопасно использоваться пользователями для определения типа связанного атрибута. Большинство подклассов этого базового класса реализуются макросами ATTRIBUTE_HELPER_HEADER и ATTRIBUTE_HELPER_CPP.

Описание полей

нет полей.

Описание атрибутов

Класс не определяет собственных атрибутов в системе TypeId.

Описание методов

AttributeChecker(): конструктор по умолчанию.

~AttributeChecker(): виртуальный деструктор.

CreateValidValue(const AttributeValue& value): создает валидное значение на основе аргумента value или пытается интерпретировать аргумент как строку. Возвращает указатель на валидное значение или nullptr в случае неудачи.

Check(const AttributeValue& value): проверяет значение. Возвращает true, если входное значение имеет правильный тип и его значение находится в запрошенном диапазоне.

GetValueTypeName(): возвращает полное имя типа C++ подкласса ns3::AttributeValue, связанного с этим чекером.

HasUnderlyingTypeInformation(): возвращает true, если этот проверяющий имеет информацию о базовом типе C++.

GetUnderlyingTypeInformation(): возвращает удобочитаемое представление информации о базовом типе C++.

Create(): возвращает новый экземпляр AttributeValue (обернутый в экземпляр Attribute), который соответствует типу базового атрибута. Этот метод обычно используется для создания временной переменной перед вызовом Attribute::DeserializeFromString.

Copy(const AttributeValue& source, AttributeValue& destination): копирует значение источника в назначение. Аргумент source является исходным значением, destination - целевым. Возвращает true, если копирование прошло успешно.

5.4 Класс ObjectBase

Класс ObjectBase является фундаментом для системы типов и атрибутов в симуляторе NS-3. Он обеспечивает базовую функциональность, необходимую для интеграции классов в систему TypeId, что позволяет связывать объекты с их метаданными. Класс предоставляет интерфейс для динамической установки и получения значений атрибутов, а также механизмы для подключения и отключения колбэков к источникам трассировки (TraceSource) без необходимости изменения исходного кода классов.

Описание полей

Класс не содержит явных объявлений полей.

Описание атрибутов

Класс не определяет собственных атрибутов в системе TypeId.

Описание методов

GetTypeId(): статический метод, возвращающий уникальный идентификатор типа TypeId для данного класса. Используется системой для регистрации типа и иерархии наследования.

~ObjectBase(): виртуальный деструктор. Обеспечивает корректное удаление объектов производных классов.

GetInstanceTypeId():

  • чисто виртуальный метод;

  • должен быть переопределен в производных классах.

Возвращает TypeId, соответствующий типу данного экземпляра класса.

SetAttribute(std::string name, const AttributeValue& value): устанавливает значение атрибута по его имени. Вызывает фатальную ошибку, если атрибут не существует, не имеет сеттера или если не удалось выполнить преобразование значения.

SetAttributeFailSafe(std::string name, const AttributeValue& value):

  • устанавливает значение атрибута по его имени;

  • не генерирует ошибок в случае неудачи.

возвращает true, если атрибут был успешно установлен, и false в противном случае.

GetAttribute(std::string name, AttributeValue& value, bool permissive):

  • считывает значение атрибута по имени в параметр value;

  • вызывает фатальную ошибку, если атрибут не существует, не имеет геттера или не поддерживает строковое форматирование. аргумент permissive определяет, следует ли подавлять предупреждения об устаревших (deprecated) атрибутах.

GetAttributeFailSafe(std::string name, AttributeValue& value):

  • считывает значение атрибута по имени;

  • не генерирует ошибок в случае неудачи.

Возвращает true, если значение было успешно прочитано, и false в противном случае.

TraceConnect(std::string name, std::string context, const CallbackBase& cb): подключает колбэк к источнику трассировки с указанием контекста. Возвращает true при успешном подключении или false, если источник трассировки не найден.

TraceConnectWithoutContext(std::string name, const CallbackBase& cb): подключает колбэк к источнику трассировки без указания контекста. Возвращает true при успешном подключении или false, если источник трассировки не найден.

TraceDisconnect(std::string name, std::string context, const CallbackBase& cb): отключает колбэк от источника трассировки с указанием контекста. Возвращает true при успешном отключении или false, если источник трассировки не найден.

TraceDisconnectWithoutContext(std::string name, const CallbackBase& cb): отключает колбэк от источника трассировки без указания контекста. Возвращает true при успешном отключении или false, если источник трассировки не найден.

ConstructSelf(const AttributeConstructionList& attributes): защищенный метод, выполняющий полную инициализацию объекта.

  • проходит по дереву наследования и устанавливает атрибуты, используя переданный список переменныx окружения или начальные значения по умолчанию;

  • вызывает метод NotifyConstructionCompleted после завершения установки атрибутов.

NotifyConstructionCompleted(): защищенный виртуальный метод.

  • вызывается после завершения инициализации всех атрибутов объекта;

  • предназначен для переопределения в производных классах для выполнения действий, зависящих от готовности объекта.

DoSet(Ptr accessor, Ptr checker, const AttributeValue& value): Приватный метод, выполняющий проверку и установку значения.

  • создает валидную копию значения с помощью checker (раздел 5.3);

  • использует accessor (раздел 5.2) для записи значения в объект, возвращая true в случае успеха.

5.5 Класс TypeId

Класс TypeId представляет собой уникальный идентификатор для интерфейса в системе NS-3. Он хранит и управляет метаинформацией о классах, наследуемых от ObjectBase (раздел 5.4), включая имя типа, родительский класс, размер объекта, доступные конструкторы, атрибуты и источники трассировки. Класс является основой системы атрибутов и механизма RTTI (Run-Time Type Information) в симуляторе, позволяя осуществлять проверку типов и динамическое управление параметрами объектов во время выполнения.

Описание полей

m_tid (uint16_t): хранит уникальный числовой идентификатор типа.

Описание атрибутов

У класса TypeId нет атрибутов в контексте системы конфигурации NS-3, так как он сам является инструментом управления атрибутами других классов.

Описание методов

TypeId(const std::string& name): конструктор, создающий идентификатор типа по его строковому имени.

  • выделяет новый уникальный uid через синглтон IidManager;

  • инициализирует внутреннее поле m_tid полученным значением;

  • проверяет, что имя не было зарегистрировано ранее.

LookupByName(std::string name): статический метод для получения идентификатора типа по его имени.

  • выполняет поиск uid в IidManager;

  • генерирует ошибку, если имя не найдено;

  • выводит предупреждение в консоль, если используется устаревшее имя.

Возвращает объект TypeId, соответствующий имени.

LookupByNameFailSafe(std::string name, TypeId tid)*: статический метод для безопасного поиска идентификатора типа. Выполняет поиск в IidManager.

Возвращает true и заполняет указатель tid, если тип найден, в противном случае вернет false без генерирации ошибки.

GetParent() const: метод для получения родительского типа. Запрашивает uid родителя в IidManager. Возвращает объект TypeId родительского класса или самого себя, если родителя нет.

SetParent(TypeId tid): метод для установки родительского типа. Регистрирует в IidManager переданный tid как родительский для текущего типа. Возвращает ссылку на текущий объект для цепочечных вызовов.

IsChildOf(TypeId other) const: метод проверки наследования. Проходит вверх по иерархии типов от текущего объекта. Возвращает true, если текущий тип является потомком other.

AddAttribute(…): метод для добавления атрибута к описанию типа. Принимает параметры: имя атрибута, строку помощи, начальное значение, аксессор, чекер типизации, уровень поддержки и сообщение об устаревании.

  • копирует начальное значение атрибута;

  • регистрирует атрибут в системе через IidManager.

Возвращает ссылку на текущий объект.

SetAttributeInitialValue(std::size_t i, Ptr initialValue): метод для изменения начального значения атрибута по индексу.

  • находит атрибут по индексу i;

  • устанавливает новое начальное значение в IidManager.

Возвращает true в случае успеха.

GetAttributeN() const: метод для получения количества атрибутов. Возвращает число атрибутов, зарегистрированных для данного типа.

GetAttribute(std::size_t i) const: метод для получения информации об атрибуте по индексу i. Возвращает структуру AttributeInformation, содержащую все метаданные атрибута.

LookupAttributeByName(std::string name, TypeId::AttributeInformation* info, bool permissive): метод для поиска атрибута по имени в текущем типе и его родителях. Принимает имя атрибута, указатель на структуру для результата и флаг режима (permissive). Проверяет уровень поддержки (SUPPORTED, DEPRECATED, OBSOLETE) и выводит предупреждения или ошибки.

Возвращает true и заполняет структуру info, если атрибут найден.

AddTraceSource(…): метод для добавления источника трассировки (трассировка используется для логирования процесса моделирования). Принимает параметры: имя, описание, аксессор источника, имя типа callback, уровень поддержки и сообщение. Регистрирует источник трассировки в IidManager.

Возвращает ссылку на текущий объект.

GetTraceSourceN() const: метод для получения количества источников трассировки. Возвращает число источников трассировки, зарегистрированных для этого типа.

GetTraceSource(std::size_t i) const: метод для получения информации об источнике трассировки по индексу. Возвращает структуру TraceSourceInformation с деталями источника.

LookupTraceSourceByName(std::string name, TraceSourceInformation* info) const: метод для поиска источника трассировки по имени. – ищет источник в текущем типе и родительских классах; – проверяет уровень поддержки и выводит сообщения для устаревших или устаревших источников.

Возвращает аксессор найденного источника или nullptr.

HideFromDocumentation(): метод для скрытия типа из документации, устанавливает флаг сокрытия в IidManager. Возвращает ссылку на текущий объект.

MustHideFromDocumentation() const: метод проверки необходимости исключения из документации. Возвращает true, если тип должен быть исключен из пользовательской документации.

GetUid() const: метод доступа к внутреннему идентификатору. Возвращает значение поля m_tid.

SetUid(uint16_t uid): метод установки внутреннего идентификатора. Присваивает новое значение полю m_tid.

operator <<(std::ostream& output_stream, TypeId tid): оператор вывода в поток. Записывает имя типа, полученное через GetName, в поток output_stream. Возвращает модифицированный поток.

operator >>(std::istream& input_stream, TypeId& tid): оператор чтения из потока.

  • считывает строковое представление имени типа из потока input_stream;

  • пытается найти соответствующий TypeId и присваивает его tid;

  • устанавливает флаг ошибки потока, если имя не найдено.

5.6 Класс Object

Класс Object представляет собой базовый класс для иерархии объектов в системе NS-3. Он обеспечивает управление памятью с использованием подсчета ссылок (reference-counting) и реализует механизм агрегации объектов, позволяющий динамически расширять функциональность. Класс также предоставляет методы для инициализации и корректного освобождения ресурсов (Dispose), что помогает разрывать циклические ссылки перед удалением объекта.

Описание полей

m_tid (TypeId): идентификатор типа данного экземпляра объекта, используемый системой типов NS-3.

m_disposed (bool): флаг, который устанавливается в true после выполнения метода DoDispose, указывая на то, что объект освобожден.

m_initialized (bool): флаг, который устанавливается в true после выполнения метода DoInitialize, указывая на то, что объект инициализирован.

m_aggregates (Aggregates* ): указатель на структуру, содержащую массив указателей на объекты, агрегированные к данному объекту.

m_unidirectionalAggregates(std::vector<Ptr < Object >>): вектор указателей на объекты, которые агрегированы к данному объекту однонаправленно (то есть они могут быть найдены из текущего объекта, но не наоборот).

m_getObjectCount (uint32_t): счетчик количества вызовов метода GetObject, используемый для эвристической сортировки списка агрегатов по частоте доступа.

Описание атрибутов

Класс не имеет атрибутов.

Описание методов

GetTypeId(): Статический метод для регистрации типа. Возвращает уникальный идентификатор TypeId для класса Object, необходимый для системы типов и атрибутов NS-3.

Object(): Конструктор по умолчанию. Инициализирует внутренние члены класса, включая счетчики ссылок и флаги состояния.

~Object(): Деструктор. Автоматически вызывает метод Dispose(), если это не было сделано ранее, перед удалением объекта для обеспечения корректного освобождения ресурсов.

GetInstanceTypeId(): Возвращает идентификатор типа экземпляра. Переопределяет соответствующий метод базового класса для возврата TypeId, соответствующего конкретному типу этого объекта.

GetObject(…): Шаблонный метод для поиска агрегированного объекта.

  • позволяет получить указатель на объект запрошенного типа T, агрегированный к текущему объекту;

  • если тип T совпадает с ns3::Object, возвращается указатель на сам вызывающий объект; реализует оптимизацию быстрого доступа, проверяя первый элемент в буфере агрегатов перед полным поиском.

Dispose(): Инициирует процесс освобождения ресурсов.

  • вызывает метод DoDispose() у этого объекта и у всех объектов, агрегированных к нему;

  • предназначен для разрыва циклических ссылок;

  • безопасен для многократного вызова, так как гарантирует, что DoDispose() будет выполнен только один раз.

AggregateObject(Ptr< Object > other): Агрегирует другой объект к текущему.

  • после вызова делает возможным получение доступа к объекту other через метод GetObject() текущего объекта и наоборот;

  • уведомляет оба объекта и их агрегаты о новом соединении, вызывая метод NotifyNewAggregate().

UnidirectionalAggregateObject(Ptr< Object > other): Выполняет однонаправленную агрегацию объекта.

  • позволяет агрегировать объект other к текущему, но не позволяет найти текущий объект через other;

  • используется в случаях, когда один объект должен быть общим для нескольких других агрегатов, что дает возможность избежать закольцованных агрегаций;

  • вызывает NotifyNewAggregate() для уведомления участников об изменении структуры.

GetAggregateIterator(): Возвращает итератор по агрегированным объектам.

  • предоставляет итератор для обхода всех объектов, агрегированных к текущему (за исключением родительского объекта, с которого начался поиск);

  • позволяет последовательно перебирать агрегаты с проверкой наличия следующего элемента.

Initialize(): Инициализирует объект и его агрегаты.

  • вызывает виртуальный метод DoInitialize для этого объекта и всех агрегированных объектов;

  • гарантирует, что DoInitialize будет вызван только один раз за время жизни объекта, независимо от количества вызовов Initialize.

IsInitialized(): Проверяет статус инициализации. Возвращает true, если метод Initialize (и, соответственно, DoInitialize) уже был вызван для данного объекта.

NotifyNewAggregate(): Виртуальный метод уведомления о новой агрегации.

  • вызывается автоматически, когда два набора объектов объединяются через агрегацию;

  • предназначен для переопределения в подклассах, которые должны реагировать на появление новых агрегатов, при этом требуется вызывать реализацию родительского класса.

DoInitialize(): Виртуальный метод реализации инициализации.

  • вызывается методом Initialize только один раз;

  • должен быть переопределен в подклассах для выполнения специфичной логики инициализации, например, планирования событий.

*DoDispose(): Виртуальный метод реализации освобождения ресурсов.

  • вызывается методом Dispose или деструктором перед фактическим удалением объекта;

  • должен быть переопределен в подклассах для освобождения ресурсов и обнуления указателей, при этом необходимо вызывать реализацию родительского класса в конце.

5.7 Класс NetDevice

Класс NetDevice представляет собой абстрактный базовый класс, определяющий интерфейс между сетевым уровнем (уровень 3, например, IP) и уровнем сетевых устройств (уровень 2). Он инкапсулирует детали, специфичные для MAC-уровня, позволяя сетевому уровню работать с различными типами устройств без изменений. Класс предоставляет API для управления адресацией, отправки и получения пакетов, настройки MTU, работы с широковещательными и групповыми адресами, а также отслеживания состояния канала связи.

Описание полей

Класс не имеет полей.

Описание атрибутов

Класс не имеет атрибутов.

Описание методов

getTypeId(): cтатический метод, возвращающий объект TypeId для данного класса. Регистрирует класс в системе NS-3 с родительским классом Object и группой «Network».

~NetDevice(): виртуальный деструктор класса.

setIfIndex(const uint32_t index): устанавливает индекс интерфейса (ifIndex) для устройства.

getIfIndex(): возвращает индекс интерфейса устройства.

getChannel(): возвращает указатель на канал, к которому подключен данный экземпляр NetDevice. Вернет нулевой указатель, если устройство не подключено к каналу или не имеет концепции канала.

setAddress(Address address): устанавливает адрес (например, MAC-адрес) данного интерфейса.

getAddress(): возвращает текущий адрес данного интерфейса.

setMtu(const uint16_t mtu): устанавливает значение MTU (максимальную единицу передачи) в байтах. Возвращает true, если значение MTU находится в допустимых пределах.

getMtu(): возвращает значение MTU канального уровня в байтах. Используется сетевым уровнем для фрагментации пакетов при необходимости.

isLinkUp(): возвращает true, если канал активен (link is up), и false в противном случае.

addLinkChangeCallback(Callback callback): добавляет обратный вызов, который вызывается при изменении статуса канала на состояние UP. Используется уровнями IP и ARP для очистки кэшей при поднятии канала.

isBroadcast(): возвращает true, если интерфейс поддерживает широковещательную адресацию.

getBroadcast(): возвращает широковещательный адрес, поддерживаемый данным сетевым устройством. Вызов метода корректен, только если isBroadcast возвращает true.

isMulticast(): возвращает true, если устройство поддерживает мультикаст (групповую рассылку).

getMulticast(Ipv4Address multicastGroup):

  • создает и возвращает MAC-адрес мультикаста на основе предоставленной группы IPv4;

  • выполняет отображение адреса согласно RFC 1112 (младшие 23 бита IP-адреса помещаются в MAC-адрес).

getMulticast(Ipv6Address addr): возвращает MAC-адрес мультикаста, соответствующий предоставленному адресу IPv6.

isBridge(): возвращает true, если сетевое устройство работает в режиме моста.

isPointToPoint(): возвращает true, если устройство находится на канале точка-точка.

send(Ptr packet, const Address& dest, uint16_t protocolNumber): метод отправки пакетов. В качестве аргументов принимает пакет, MAC-адрес назначения и номер протокола. Вызывается с верхнего уровня для отправки пакета в сетевое устройство указанному адресату. Возвращает true, если операция отправки прошла успешно.

sendFrom(…): метод отправки пакетов. Вызывается с верхнего уровня для отправки пакета с указанными адресом источника и назначения. Принимает следующие аргументы:

  • packet: отправляемый пакет;

  • source: MAC-адрес источника;

  • dest: MAC-адрес назначения;

  • protocolNumber: идентификатор типа полезной нагрузки в пакете.

Возвращает true, если операция отправки прошла успешно.

getNode(): возвращает указатель на узел (Node раздел 5.9), который содержит данный сетевой интерфейс.

setNode(Ptr node): связывает сетевое устройство с узлом. Вызывается методом ns3::Node::AddDevice.

needsArp(): возвращает true, если для работы с данным экземпляром NetDevice требуется использование протокола ARP.

setReceiveCallback(ReceiveCallback cb): устанавливает обратный вызов, который уведомляет верхние уровни о получении пакета, требующего обработки.

setPromiscReceiveCallback(PromiscReceiveCallback cb): включает promiscuous (неразборчивый) режим и устанавливает обратный вызов для обработки всех пакетов, включая те, что предназначены другим хостам.

supportsSendFrom(): возвращает true, если интерфейс поддерживает режим моста и использование метода SendFrom.

5.8 Класс Application

Класс Application представляет собой базовый класс для всех приложений (имеются в виду приложения работающие на узлах сети) в симуляторе NS-3. Он обеспечивает управление жизненным циклом приложения, привязанного к узлу сети, позволяя задавать время запуска и остановки, а также планировать соответствующие события в симуляции.

Описание полей

m_node (Ptr): указатель на узел сети, на котором установлено данное приложение.

m_startTime (Time): время от начала симуляции, в которое приложение должно начать свою работу.

m_stopTime (Time): время от начала симуляции, в которое приложение должно завершить свою работу.

m_startEvent (EventId): идентификатор события, запланированного на время m_startTime для вызова метода запуска приложения.

m_stopEvent (EventId): идентификатор события, запланированного на время m_stopTime для вызова метода остановки приложения.

Описание атрибутов

StartTime(Time, по умолчанию: 0,0 с): Время, в которое приложение начнет свою работу относительно начала симуляции.

StopTime(Time, по умолчанию: 0 шагов): Время, в которое приложение остановит свою работу относительно начала симуляции.

Описание методов

GetTypeId(): Статический метод для получения идентификатора типа объекта.

  • регистрирует атрибут “StartTime” со значением по умолчанию 0.0 секунды;

  • регистрирует атрибут “StopTime” со значением по умолчанию, равным нулю шагов симуляции.

Возвращает TypeID.

SetStartTime(Time start): Устанавливает время запуска приложения.

  • принимает объект времени start в качестве аргумента;

  • сохраняет переданное значение в поле m_startTime.

SetStopTime(Time stop): Устанавливает время остановки приложения.

  • принимает объект времени stop в качестве аргумента;

  • сохраняет переданное значение в поле m_stopTime.

DoInitialize(): Инициализирует приложение и планирует события жизненного цикла.

  • планирует вызов метода StartApplication на время, указанное в m_startTime;

  • если m_stopTime не равно нулю, планирует вызов метода StopApplication на время, указанное в m_stopTime;

  • вызывает метод DoInitialize родительского класса Object.

DoDispose(): Освобождает ресурсы, используемые приложением.

  • сбрасывает указатель на узел m_node в nullptr;

  • отменяет запланированные события запуска m_startEvent и остановки m_stopEvent;

  • вызывает метод DoDispose родительского класса Object.

GetNode(): Возвращает указатель на узел, к которому привязано приложение.

SetNode(Ptr node): Устанавливает узел (Node раздел 5.9) для данного приложения.

  • принимает указатель на объект Node;

  • сохраняет указатель в поле m_node.

StartApplication(): Приватный метод, содержащий логику запуска конкретного приложения. Предназначен для переопределения в производных классах. В базовой реализации выполняет только логирование.

StopApplication(): Приватный метод, содержащий логику остановки конкретного приложения. Предназначен для переопределения в производных классах. В базовой реализации выполняет только логирование.

AssignStreams(int64_t stream): Назначает фиксированный поток случайных чисел для использования в приложении. Принимает индекс первого потока stream.

«Поток случайных чисел» (random number stream) — это механизм управления генерацией псевдослучайных чисел, который обеспечивает воспроизводимость и управление стохастическими процессами при моделировании.

Возвращает количество назначенных потоков (в базовой реализации всегда возвращает 0).

5.9 Класс Node

Класс Node представляет собой сетевой узел в симуляторе NS-3. Он агрегирует сетевые устройства (NetDevice), которые действуют как сетевые интерфейсы, подключенные к каналам, а также приложения (Application), которые генерируют и принимают трафик через API сокетов. Каждый узел обладает уникальным идентификатором (Id) и системным идентификатором (SystemId), используемым для параллельных симуляций. При создании узел автоматически добавляется в глобальный список узлов (NodeList).

Описание полей

m_id: уникальный идентификатор узла (целое число без знака).

m_sid: системный идентификатор узла, используемый для параллельных симуляций.

m_devices: вектор умных указателей на объекты сетевых устройств (NetDevice раздел ), ассоциированных с данным узлом.

m_applications: вектор умных указателей на объекты приложений (Application раздел 5.8), работающих на данном узле.

m_handlers: список записей обработчиков протоколов (ProtocolHandlerList), используемых для демультиплексирования входящих пакетов.

m_deviceAdditionListeners: список слушателей (DeviceAdditionListenerList), которых необходимо уведомить при добавлении нового устройства в узел.

Описание атрибутов

DeviceList (ObjectVectorValue): список сетевых устройств, ассоциированных с этим узлом.

ApplicationList (ObjectVectorValue): список приложений, ассоциированных с этим узлом.

Id(UintegerValue, только для чтения*)*: уникальный идентификатор этого узла (целое число без знака).

SystemId (UintegerValue, чтение и запись*)*: системный идентификатор узла для параллельных симуляций.

Описание методов

GetTypeId(): возвращает объект TypeId для этого класса, регистрируя атрибуты и конструкторы.

Node(): конструктор по умолчанию. Инициализирует идентификаторы узла и системы нулевыми значениями и вызывает метод Construct.

Node(uint32_t systemId): конструктор для параллельных симуляций. Принимает системный идентификатор, инициализирует идентификатор узла нулевым значением и вызывает метод Construct.

GetId(): возвращает уникальный идентификатор этого узла;

GetLocalTime(): возвращает локальное время узла. В текущей реализации является псевдонимом для глобального времени симуляции Simulator::Now.

GetSystemId(): возвращает системный идентификатор этого узла.

AddDevice(Ptr device): ассоциирует сетевое устройство (NetDevice 5.7) с этим узлом.

  • добавляет устройство в список m_devices;

  • устанавливает ссылку на узел внутри устройства;

  • назначает устройству индекс интерфейса;

  • устанавливает обратный вызов для приема пакетов в не неразборчивом режиме;

  • планирует инициализацию устройства в контексте данного узла;

  • уведомляет слушателей о добавлении устройства.

Возвращает индекс добавленного устройства.

GetDevice(uint32_t index): возвращает указатель на сетевое устройство по указанному индексу. Выполняет проверку выхода индекса за допустимые пределы.

GetNDevices(): возвращает количество сетевых устройств, ассоциированных с этим узлом.

AddApplication(Ptr application): ассоциирует приложение с этим узлом.

  • добавляет приложение в список m_applications;

  • устанавливает ссылку на узел внутри приложения;

  • планирует инициализацию приложения в контексте данного узла.

Возвращает индекс добавленного приложения.

GetApplication(uint32_t index): возвращает указатель на приложение по указанному индексу. Выполняет проверку, что индекс в допустимых пределах.

GetNApplications(): возвращает количество приложений, ассоциированных с этим узлом.

RegisterProtocolHandler(…): регистрирует обработчик протокола для приема пакетов. Принимает на вход следующие аргументы:

  • handler: callback-функция, которая будет вызвана при получении пакета;

  • protocolType: 16-битный номер протокола (например, EtherType). Значение 0 означает соответствие всем протоколам;

  • device: указатель на сетевое устройство. Если указан нулевой указатель, обработчик привязывается ко всем устройствам узла;

  • promiscuous: логический флаг. Если равен true, включает неразборчивый (promiscuous) режим на соответствующих устройствах.

UnregisterProtocolHandler(ProtocolHandler handler): отменяет регистрацию указанного обработчика протокола, удаляя его из списка.

RegisterDeviceAdditionListener(DeviceAdditionListener listener): регистрирует слушателя события добавления устройства. При регистрации нового слушателя он немедленно получает уведомления о всех устройствах, уже добавленных в узел.

UnregisterDeviceAdditionListener(DeviceAdditionListener listener): удаляет указанного слушателя из списка уведомлений о добавлении устройств.

ChecksumEnabled(): статический метод, возвращающий значение глобального флага, определяющего, включена ли проверка контрольных сумм для всех протоколов.

DoDispose(): метод освобождения ресурсов.

  • очищает списки слушателей и обработчиков;

  • освобождает ресурсы всех устройств и приложений, обнуляя умные указатели;

  • вызывает метод DoDispose родительского класса.

DoInitialize(): метод инициализации. Вызывает метод Initialize для всех устройств и приложений, ассоциированных с узлом.

NotifyDeviceAdded(Ptr device): приватный метод. Вызывает всех зарегистрированных слушателей, передавая им указатель на новое устройство.

NonPromiscReceiveFromDevice(…): приватный метод. Обрабатывает получение пакета от устройства в обычном режиме. Принимает на вход следующие аргументы:

  • device: указатель на сетевое устройство, получившее пакет;

  • packet: полученный пакет;

  • protocol: номер протокола;

  • from: адрес отправителя. Формирует адрес получателя как адрес устройства и вызывает метод ReceiveFromDevice с параметром promisc, равным false.

PromiscReceiveFromDevice(…): приватный метод. Обрабатывает получение пакета от устройства в неразборчивом режиме. Принимает на вход следующие аргументы:

  • device: указатель на сетевое устройство;

  • packet: полученный пакет;

  • protocol: номер протокола;

  • from: адрес отправителя;

  • to: адрес получателя;

  • packetType: тип пакета (unicast, broadcast и др.);

  • вызывает метод ReceiveFromDevice с параметром promisc, равным true.

ReceiveFromDevice(…): приватный метод. Реализует логику доставки пакетов зарегистрированным обработчикам. Принимает на вход следующие аргументы:

  • device: устройство, от которого получен пакет;

  • packet: пакет данных;

  • protocol: номер протокола;

  • from: адрес отправителя;

  • to: адрес получателя;

  • packetType: тип пакета;

  • promisc: флаг, указывающий на режим приема (неразборчивый или нет). Метод проверяет, что контекст симуляции соответствует идентификатору узла. Перебирает список обработчиков и вызывает те, которые соответствуют устройству, протоколу и режиму приема.

Возвращает true, если пакет был доставлен хотя бы одному обработчику.

Construct(): приватный метод. Завершает построение узла, получая уникальный идентификатор из глобального списка узлов NodeList.

5.10 Класс NodeContainer

Класс NodeContainer предназначен для хранения и управления набором указателей на сетевые узлы (объекты Node). Этот контейнер упрощает выполнение операций над группой узлов одновременно, что часто используется вспомогательными классами (хелперами) при установке сетевых устройств, протоколов или приложений. Он предоставляет методы для создания новых узлов, добавления существующих, а также для доступа к узлам через итераторы или индексы.

Описание полей

m_nodes (std::vector< Ptr< Node > >): вектор умных указателей, в котором хранятся все узлы, добавленные в данный контейнер.

Описание атрибутов

В данном классе отсутствуют атрибуты.

Описание методов

static NodeContainer GetGlobal(): создает и возвращает контейнер, содержащий все узлы, существующие в симуляции.

  • метод обращается к глобальному списку узлов NodeList;

  • последовательно добавляет каждый узел из глобального списка в новый контейнер.

Возвращает результирующий контейнер со всеми узлами системы.

NodeContainer(): конструктор по умолчанию, создающий пустой контейнер узлов.

NodeContainer(Ptr node): конструктор. Создает контейнер, содержащий один узел, переданный через умный указатель. Принимает указатель Ptr и добавляет его во внутренний список.

NodeContainer(std::string nodeName): конструктор. Создает контейнер с одним узлом, найденным по его имени. Использует службу имен Names для поиска объекта Node по строковому имени. Добавляет найденный узел в контейнер.

*NodeContainer(uint32_t n, uint32_t systemId = 0): конструктор. Ссоздает контейнер с заданным количеством новых узлов.

  • резервирует место в векторе под n элементов;

  • вызывает метод Create для генерации узлов, привязывая их к указанному идентификатору системы systemId.

NodeContainer(…): конструктор, принимающий несколько контейнеров узлов и объединяющий их в один. Является вариативным шаблоном.

  • использует рекурсивный вызов метода Add для объединения всех переданных контейнеров;

  • поддерживает неявное преобразование указателей Ptr в указатели на контейнеры.

Iterator Begin() const: возвращает итератор, указывающий на первый узел в контейнере. Позволяет организовать цикл обхода узлов в стиле стандартной библиотеки C++.

Iterator End() const: возвращает итератор, указывающий на позицию за последним узлом в контейнере. Используется как условие завершения при итерации по узлам.

uint32_t GetN() const: возвращает количество узлов, хранящихся в контейнере. Используется для определения размера контейнера при доступе по индексу в цикле.

Ptr Get(uint32_t i) const: возвращает указатель на узел с заданным индексом i. Предоставляет прямой доступ к конкретному узлу из внутреннего вектора.

void Create(uint32_t n): создает n новых узлов и добавляет их в конец контейнера. Каждый узел создается с помощью фабрики объектов CreateObject. Полезен для быстрой генерации топологии сети.

void Create(uint32_t n, uint32_t systemId): создает n новых узлов с привязкой к идентификатору системы для распределенных симуляций.

  • передает параметр systemId (ранг) в конструктор каждого создаваемого узла;

  • добавляет созданные узлы в контейнер.

void Add(const NodeContainer& nc): добавляет все узлы из другого контейнера в конец текущего.

– проходит по узлам переданного контейнера от начала до конца; – добавляет каждый узел во внутренний вектор m_nodes.

void Add(…): добавляет узлы из нескольких других контейнеров в текущий.

  • является вариативным шаблоном, принимающим список контейнеров;

  • рекурсивно вызывает себя для обработки каждого аргумента; позволяет объединять произвольное количество контейнеров узлов одной командой.

void Add(Ptr node): добавляет один узел, переданный через умный указатель, в контейнер. Помещает указатель в конец внутреннего вектора узлов.

void Add(std::string nodeName): ищет узел по имени и добавляет его в контейнер.

  • использует Names::Find для получения указателя на объект по имени;

  • добавляет полученный указатель в список.

bool Contains(uint32_t id) const: проверяет наличие узла с указанным идентификатором в контейнере. Последовательно перебирает узлы и сравнивает их ID с заданным значением. Возвращает true, если узел найден, иначе возвращает false.

5.11 Класс SystemPath

Класс SystemPath (фактически являющийся пространством имен) предназначен для инкапсуляции специфичных для операционной системы функций по манипулированию путями к файлам и директориям. Он предоставляет кроссплатформенный интерфейс для выполнения таких операций, как объединение и разделение путей, чтение содержимого директорий, проверка существования файлов и создание временных каталогов, скрывая различия между Windows, Linux, macOS и FreeBSD.

Описание полей

Класс не имеет полей.

Описание атрибутов

Класс не имеет атрибутов.

Описание методов

FindSelfDirectory(): Метод, возвращающий путь к директории, в которой находится исполняемый файл текущего процесса. Определение пути выполняется в зависимости от платформы:

  • в Linux используется чтение ссылки /proc/self/exe,

  • в Windows — функция GetModuleFileName;

  • в macOS_NSGetExecutablePath;

  • во FreeBSD — системный вызов sysctl.

Возвращает строку с полным путем к директории исполняемого файла.

Append(std::string left, std::string right): Метод для объединения двух элементов пути в один.

  • удаляет завершающие разделители из левой части пути (left), если они присутствуют;

  • объединяет left и right с использованием системного разделителя пути («\» для Windows, «/» для остальных).

Возвращает корректно сформированную строку пути.

Split(std::string path): Метод разбивает строку пути на список компонент на основе системного разделителя. является обратной операцией для метода Join. Использует функцию разделения строк, передавая ей системный разделитель пути.

Возвращает список строк (std::liststd::string), представляющих отдельные директории или имя файла.

Join(std::liststd::string::const_iterator begin, std::liststd::string::const_iterator end): Метод объединяет список элементов пути в одну строку.

  • принимает итераторы на начало и конец списка строк;

  • пропускает пустые строки;

  • добавляет системный разделитель между элементами списка.

Возвращает собранную строку пути.

ReadFiles(std::string path): Метод получает список имен файлов, расположенных в указанной директории. Принимает путь к директории в качестве аргумента. Вызывает фатальную ошибку, если указанная директория не существует или недоступна. Возвращает список имен файлов, игнорируя поддиректории.

MakeTemporaryDirectoryName(): Метод генерирует уникальное имя для временной директории.

  • определяет корневую временную директорию, проверяя переменные окружения TMP и TEMP, или использует /tmp по умолчанию;

  • формирует имя, включающее префикс «ns3», текущее время (часы, минуты, секунды) и случайное число для избежания коллизий.

Возвращает строку с полным путем к несуществующей временной директории. Сама директория этим методом не создается, для создания необходимо передать эту строку методу MakeDirectories.

MakeDirectories(std::string path): Метод создает структуру директорий по указанному пути.

  • использует std::filesystem::create_directories для рекурсивного создания всех промежуточных директорий;

  • генерирует фатальную ошибку, если создание директории не удалось.

Exists(const std::string path): Метод проверяет существование файла или директории по указанному пути.

  • сначала проверяет существование родительской директории, извлекая её с помощью Dirname;

  • если путь указывает на директорию (последний компонент пустой), возвращает true, если родительская директория существует;

  • если путь указывает на файл, считывает список файлов в родительской директории и проверяет наличие искомого имени.

Возвращает true, если путь существует, и false в противном случае.

CreateValidSystemPath(const std::string path): Метод заменяет несовместимые символы в строке пути на подчеркивания.

  • находит символы, которые могут вызывать проблемы в файловых системах (например, пробелы, двоеточия, «<», «>», «*»);

  • заменяет найденные символы на знак подчеркивания «_»;

Возвращает модифицированную строку пути, безопасную для использования в различных операционных системах, особенно в Windows.

5.12 Класс CommandLine

Класс CommandLine предназначен для парсинга аргументов командной строки в приложениях NS-3. Он обеспечивает унифицированный способ регистрации пользовательских параметров, задания строк документации и справки, а также установки значений атрибутов и глобальных переменных системы напрямую из консоли. Класс автоматически обрабатывает стандартные аргументы для вывода справки, версии программы и списков атрибутов.

Описание полей

m_options (Items): контейнер для хранения списка зарегистрированных опций, начинающихся с дефиса.

m_nonOptions (Items): контейнер для хранения списка позиционных аргументов, не имеющих префиксов («-» или «- -»).

m_NNonOptions (std::size_t): ожидаемое количество позиционных аргументов, заданное пользователем.

m_nonOptionCount (std::size_t): счетчик фактически найденных и обработанных позиционных аргументов.

m_usage (std::string): строка, содержащая общее описание использования программы.

m_shortName (std::string): короткое имя программы (без расширения), используемое при генерации справки.

Описание атрибутов

У класса нет атрибутов.

Описание методов

CommandLine(): Конструктор по умолчанию.

  • инициализирует счетчики m_NNonOptions и m_nonOptionCount нулевыми значениями;

  • очищает строки m_usage и m_shortName.

CommandLine(const std::string& filename): Конструктор, принимающий имя файла.

  • извлекает базовое имя файла из переданного пути;

  • сохраняет имя программы без расширения в поле m_shortName для использования в документации.

operator=(const CommandLine& cmd): Оператор присваивания.

  • очищает текущее состояние объекта;

  • копирует данные (опции, аргументы, счетчики и строки) из переданного объекта cmd.

~CommandLine(): Деструктор. Вызывает метод Clear для освобождения ресурсов и очистки контейнеров.

Usage(const std::string& usage): Устанавливает описание использования программы. Сохраняет переданную строку в поле m_usage для последующего вывода в справочном сообщении.

AddValue(const std::string& name, const std::string& help, T& value): Добавляет опцию командной строки, связывая её с переменной.

  • создает объект UserItem для типа T;

  • сохраняет имя, описание, указатель на переменную и значение по умолчанию;

  • добавляет объект в список m_options.

AddValue(…): Перегруженный метод для добавления опции с использованием C-строки. Принимает в качестве аргументов имя name, описание help, указатель на буфер value и размер буфера num.

  • создает объект CharStarItem для безопасного копирования строки в буфер с учетом его размера;

  • регистрирует опцию в списке m_options.

AddValue(…): Перегруженный метод для добавления опции с обработкой через callback-функцию. Принимает в качестве аргументов имя name, описание help, callback-объект callback и строку значения по умолчанию defaultValue.

  • создает объект CallbackItem, делегирующий парсинг значения переданной функции;

  • добавляет элемент в контейнер опций.

AddValue(const std::string& name, const std::string& attributePath): Добавляет опцию как псевдоним для атрибута системы NS-3.

  • парсит путь к атрибуту, извлекая имя типа и имя атрибута;

  • формирует справочную строку на основе информации об атрибуте;

  • связывает опцию с обработчиком HandleAttribute для динамической установки значения.

AddNonOption(const std::string& name, const std::string& help, T& value): Добавляет позиционный аргумент.

  • создает объект UserItem для хранения аргумента;

  • помещает его в список m_nonOptions;

  • увеличивает счетчик ожидаемых позиционных аргументов m_NNonOptions.

GetExtraNonOption(std::size_t i): Возвращает дополнительный позиционный аргумент по индексу. Проверяет наличие аргумента по смещению i + m_NNonOptions в списке m_nonOptions. Возвращает строковое значение аргумента или пустую строку, если аргумент не найден.

GetNExtraNonOptions(): Возвращает количество дополнительных позиционных аргументов. Вычисляет разницу между общим количеством найденных аргументов и количеством ожидаемых. Возвращает результат вычисления.

GetName(): Возвращает короткое имя программы - значение поля m_shortName.

Parse(int argc, char argv[])*: Запускает разбор аргументов командной строки из массива C-строк.

  • преобразует аргументы в вектор строк и удаляет имя программы;

  • вызывает метод HandleHardOptions для обработки системных команд;

  • итеративно обрабатывает оставшиеся параметры, определяя их как опции или позиционные аргументы.

Parse(std::vector< std::string > args): Запускает разбор аргументов из вектора строк.

  • выполняет логику разбора аналогично версии с argc и argv;

  • инициирует генерацию файла документации Doxygen, если установлена переменная окружения NS_COMMANDLINE_INTROSPECTION.

PrintHelp(std::ostream& os): Выводит справочное сообщение в поток.

  • выводит имя программы и доступные категории аргументов;

  • отображает текст использования m_usage, если он задан;

  • форматирует и выводит списки опций и позиционных аргументов с их описаниями и значениями по умолчанию;

  • выводит список общих системных аргументов.

GetVersion(): Возвращает строку с версией программы. Версия сборки будет подробной, если включена поддержка ENABLE_BUILD_VERSION, в противном случае возвращает сообщение об отключенной поддержке версий.

PrintVersion(std::ostream& os): Печатает версию программы. Получает строку версии через GetVersion и записывает её в поток os.

Copy(const CommandLine& cmd): Приватный метод копирования данных.

  • копирует списки m_options и m_nonOptions из другого объекта;

  • копирует значения счетчиков и строк использования.

Clear(): Приватный метод очистки данных.

  • удаляет все элементы из контейнеров опций и аргументов;

  • сбрасывает счетчики и строки в начальные значения.

GetOptionName(const std::string& param): Приватный метод для парсинга строки параметра.

  • удаляет префиксы «-» или «- -»;

  • разделяет строку по символу «=», выделяя имя и значение;

Возвращает кортеж с флагом опции, именем и значением.

HandleHardOptions(…): Приватный метод обработки встроенных команд.

  • перебирает аргументы на наличие команд вроде - -PrintHelp или - -PrintVersion;

  • вызывает соответствующий метод вывода информации;

  • после обработки команды завершает выполнение программы.

HandleOption(const std::string& param): Приватный метод обработки одной опции.

  • использует GetOptionName для извлечения имени и значения;

  • передает управление в метод HandleArgument.

HandleNonOption(const std::string& value): Приватный метод обработки позиционного аргумента.

  • создает объект StringItem для лишних аргументов, если их количество превышает ожидаемое;

  • вызывает метод Parse соответствующего элемента для преобразования значения;

  • увеличивает счетчик обработанных неопционных аргументов.

HandleArgument(…): Приватный метод диспетчеризации аргументов.

  • ищет аргумент в списке m_options и парсит его значение;

  • если аргумент не найден, пытается установить глобальное значение или атрибут через HandleAttribute;

  • при ошибке выводит сообщение и завершает работу.

HandleAttribute(const std::string& name, const std::string& value): Статический приватный метод установки атрибута.

  • пытается установить глобальное значение через Config::SetGlobalFailSafe;

  • при неудаче пытается установить значение атрибута по умолчанию через Config::SetDefaultFailSafe.

Возвращает true при успешной установке любого из параметров.

PrintDoxygenUsage(): Приватный метод генерации документации.

  • проверяет переменную окружения NS_COMMANDLINE_INTROSPECTION;

  • создает файл с описанием использования программы в формате Doxygen;

  • выполняет HTML-кодирование текста и завершает программу после записи файла.

PrintGlobals(std::ostream& os): Приватный метод вывода глобальных значений.

  • собирает список всех глобальных значений GlobalValue;

  • сортирует их по имени и выводит с описаниями в поток os.

PrintAttributes(…): Приватный метод вывода атрибутов заданного типа.

  • находит TypeId по имени;

  • выводит атрибуты заданного типа и всех его родительских классов, используя метод PrintAttributeList.

PrintAttributeList(…): Приватный метод вывода списка атрибутов одного типа.

  • проверяет наличие атрибутов у типа;

  • формирует строки с именами, значениями и справкой для каждого атрибута;

  • выводит отсортированный список в поток.

PrintGroup(…): Приватный метод вывода типов группы.

  • перебирает все зарегистрированные TypeId;

  • выводит имена типов, принадлежащих указанной группе group, в отсортированном виде.

PrintTypeIds(std::ostream& os): Приватный метод вывода всех типов.

  • собирает имена всех зарегистрированных TypeId;

  • сортирует и выводит их в поток os.

PrintGroups(std::ostream& os): Приватный метод вывода всех групп.

  • собирает уникальные имена групп из всех типов;

  • выводит отсортированный список групп.

5.13 Класс Config

Глобальный класс для установки и получения значений атрибутов объектов системы. Класс Config (реализованный как синглтон ConfigImpl и предоставляющий функционал через пространство имен Config) представляет собой подсистему глобальной конфигурации симуляции. Данный класс отвечает за управление атрибутами объектов, подключение к источникам трассировки и манипуляцию глобальными значениями, используя строковые пути для доступа к объектам без необходимости хранить прямые указатели на них. Он обеспечивает централизованный интерфейс для изменения параметров множества объектов, соответствующих определенному пути в иерархии симуляции.

Описание полей

m_roots (Roots): вектор умных указателей на объекты, являющиеся корневыми для пространства имен; используется как начальная точка при разрешении путей конфигурации и поиске объектов.

Описание методов

Set(std::string path, const AttributeValue& value): Устанавливает значение указанного атрибута для всех объектов, соответствующих заданному пути конфигурации.

  • разделяет путь на корневую часть и имя атрибута;

  • выполняет поиск объектов, соответствующих корневой части пути, с помощью LookupMatches;

  • применяет переданное значение к найденным атрибутам.

SetFailSafe(std::string path, const AttributeValue& value): Безопасная версия метода Set, которая не приводит к критической ошибке, если атрибут не найден.

  • выполняет поиск и установку атрибута;

  • возвращает true, если значение было успешно установлено хотя бы для одного объекта, и false в противном случае.

ConnectWithoutContextFailSafe(std::string path, const CallbackBase& cb): подключает функцию обратного вызова к источнику трассировки без добавления контекстной строки.

  • выполняет поиск соответствующего пути;

  • возвращает true, если подключение успешно выполнено.

ConnectFailSafe(std::string path, const CallbackBase& cb): подключает функцию обратного вызова к источнику трассировки, передавая ей полный путь в качестве контекста. Ищет объекты, соответствующие пути. Возвращает true в случае успешного подключения хотя бы к одному источнику.

DisconnectWithoutContext(std::string path, const CallbackBase& cb): отключает функцию обратного вызова от источника трассировки без контекста.

  • использует LookupMatches для поиска объектов;

  • выводит предупреждение, если соответствующие объекты не найдены.

Disconnect(std::string path, const CallbackBase& cb): отключает функцию обратного вызова от источника трассировки, который был подключен с контекстом. Находит соответствующие объекты и отключает указанный callback.

LookupMatches(std::string path): выполняет поиск всех объектов, соответствующих указанному пути конфигурации.

  • использует внутренний резолвер для обхода иерархии объектов начиная с корневых элементов и пространства имен;

  • возвращает контейнер MatchContainer, содержащий найденные объекты и их полные пути.

RegisterRootNamespaceObject(Ptr< Object > obj): регистрирует новый объект в качестве корневого в пространстве имен конфигурации. Добавляет объект в список m_roots, чтобы он участвовал в операциях разрешения путей.

UnregisterRootNamespaceObject(Ptr< Object > obj): удаляет объект из списка корневых объектов пространства имен. Ищет объект в списке m_roots и исключает его.

GetRootNamespaceObjectN(): возвращает количество зарегистрированных корневых объектов в пространстве имен.

GetRootNamespaceObject(uint32_t i): возвращает указатель на корневой объект с заданным индексом. Обеспечивает доступ к элементам списка m_roots.

5.14 Класс ConfigStore

Класс ConfigStore предназначен для сохранения и загрузки конфигурации атрибутов симуляции в системе NS-3. Он обеспечивает возможность экспортировать и импортировать значения атрибутов (как значения по умолчанию, так и значения для конкретных экземпляров объектов) в файлы различных форматов, таких как XML или неформатированный текст. Класс управляет выбором формата файла и режима работы (чтение или запись) через систему атрибутов и делегирует фактические операции с файлами специализированным объектам.

Описание полей

m_mode: перечисление, определяющее текущий режим работы хранилища (загрузка, сохранение или отсутствие действия).

m_fileFormat: перечисление, указывающее формат файла конфигурации (XML или неформатированный текст).

m_saveDeprecated: логическое значение, определяющее, нужно ли сохранять атрибуты, отмеченные как устаревшие.

m_filename: строка, содержащая путь к файлу, используемому для сохранения или загрузки конфигурации.

m_file: указатель на объект, реализующий интерфейс FileConfig для выполнения конкретных операций чтения или записи файла.

Описание атрибутов

Mode (Enum, по умолчанию: NONE): Режим работы хранилища конфигурации. Определяет, будет ли происходить загрузка конфигурации из файла, сохранение в файл или никаких действий выполнено не будет.

Filename (String, по умолчанию: “”): Имя файла, в который должна быть сохранена конфигурация или из которого она должна быть загружена.

FileFormat (Enum, по умолчанию: RAW_TEXT): Тип формата файла конфигурации. Доступные варианты включают неформатированный текст и XML.

SaveDeprecated (Boolean, по умолчанию: true): Флаг, определяющий сохранение атрибутов, помеченных как устаревшие. Атрибут является OBSOLETE (устаревшим) начиная с версии ns-3.43, так как больше не требуется.

Описание методов

ConfigStore(): Основной конструктор.

  • вызывает ConstructSelf для инициализации атрибутов объекта;

  • проверяет доступность поддержки XML на этапе компиляции;

  • на основе заданных режима и формата файла создает соответствующий объект (XmlConfigSave, XmlConfigLoad, RawTextConfigSave, RawTextConfigLoad или NoneFileConfig) и присваивает его указателю m_file;

  • устанавливает имя файла для созданного объекта конфигурации.

~ConfigStore(): Деструктор.

  • удаляет объект m_file;

  • устанавливает указатель m_file в nullptr.

SetMode(Mode mode): Устанавливает режим работы хранилища.

  • принимает в качестве аргумента значение перечисления Mode (LOAD, SAVE или NONE);

  • сохраняет переданное значение в поле m_mode.

SetFileFormat(FileFormat format): Устанавливает формат файла конфигурации.

  • принимает в качестве аргумента значение перечисления FileFormat (XML или RAW_TEXT);

  • сохраняет переданное значение в поле m_fileFormat.

SetFilename(std::string filename): Устанавливает имя файла для операций конфигурации.

  • принимает строку с путем к файлу;

  • сохраняет переданное значение в поле m_filename.

SetSaveDeprecated(bool saveDeprecated): Устанавливает политику сохранения устаревших атрибутов.

  • принимает логическое значение;

  • сохраняет переданное значение в поле m_saveDeprecated.

ConfigureDefaults(): Выполняет настройку значений атрибутов по умолчанию.

  • вызывает метод Default() объекта m_file для обработки значений по умолчанию;

  • вызывает метод Global() объекта m_file для обработки глобальных значений.

ConfigureAttributes(): Выполняет настройку значений атрибутов экземпляров объектов. Вызывает метод Attributes() объекта m_file для сохранения или загрузки текущих атрибутов.

GetTypeId(): Статический метод для получения идентификатора типа. Возвращает объект TypeId, связанный с классом ConfigStore, содержащий информацию о его атрибутах и метаданные.

GetInstanceTypeId(): Метод для получения идентификатора типа экземпляра. Возвращает объект TypeId для текущего экземпляра класса.

Мы звкончили обзор наиболее употребляемых в тестах классах NS-3 и вследующей статье уже перейдем к обзору классов модуля Satellite.

Работа выполнена в рамках Программы создания и развития центра НТИ на базе МФТИ, Физтех по направлению («сквозной» технологии) Национальной технологической инициативы «Перспективные технологии для космических систем и сервисов» при реализации комплексного научно-исследовательского и опытно-конструкторского проекта “Разработка комплексной среды моделирования и проектирования гибридных инфокоммуникационных сетей наземного, стратосферного и космического сегментов с использованием параметрического и структурного синтеза”.