Project

General

Profile

Actions

Интерфейс настройки

Введение

В симуляторе присутствует несколько видов настроек:
  1. Конфигурация симулятора
  2. Конфигурация сети
  3. Конфигурация устройств

Для упрощения конфигурирования нежелательно иметь 3 различных "точки входа" для выполнения каждой из настроек, поэтому в симуляторе всё конфигурирование происходит через одну основную "точку входа" и, возможно, несколько дополнительных, которые производят инициализацию симулятора при его старте (т.е. в тот момент, когда он ещё до конца не запущен и мы не можем его конфигурировать).

Также желательно иметь возможность сопоставлять "точке входа" свой тип взаимодействия с пользователем - например, вся конфигурация может быть записана в каком-то файле и она больше не меняется, либо пользователь во время работы хочет подключиться по telnet и в любой момент производить различные настройки, либо пользователь реализовал логику взаимодействия на .NET-языке и хочет (эффективно) привязать её к симулятору. Эффективность понимается в том смысле, что данные будут передаваться через память, а не каким-то другим способом - через файл, именованный канал, сокет...

Была предложена следующая схема настройки.

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

Далее открывается сокет взаимодействия, который имеет несколько каналов. Сообщения, передаваемые в канале, имеют следующий формат:

#channel
length of message
message

Один (или несколько) каналов выделены для произведения настройки, другие каналы могут быть выделены для передачи различных данных (например, дампа траффика).
Сама настройка производится вводом определённых команд, при этом каждый канал настроек имеет несколько различных контекстов - можно привязать конкретный канал для настройки какого-то определённого устройства (все команды, вводимые в этот канал, будут напрямую передаваться прошивке устройства).

С точки зрения реализации, у симулятора есть некоторый интерфейс ввода команд и конечное число каналов для их ввода. Для конфигурирования (т.е. передачи команды от пользователя) есть абстрактный класс, передающий информацию в интерфейс ввода команд. Той "точкой входа" по умолчанию служит реализация этого абстрактного класса, которая принимает/получает команды через сокет. При этом среди команд предусмотрена команда подключения нового интерфейса ввода. Такой подход позволит произвольно конфигурировать симулятор - например, можно написать .NET-сборку, которая в зависимости от ответов конфигуратора даёт ему разные команды и при запуске её подключить как "точку входа".

Формат и обработка передаваемых данных

Конфигурирование симулятора происходит путём ввода текстовых команд. Команд настройки может быть много, кроме того, некоторые команды имеют ограниченную область действия - например, только настраивают топологию или только настраивают устройство на физическом уровне (добавляют/убирают интерфейсы ...). Для облегчения конфигурирования команды организованы в некое "меню".

Всё меню поделено на контексты, каждая команда может находиться в одном определённом контексте.
Примерами контекстов могут служить, например, настройки самого симулятора, настройки топологии, настройки физического уровня устройства и т.д. Контексты имеют параметры - например, настройка физуровня устройства А и физуровня устройства В - это два разных контекста, несмотря на то, что список команд у них может быть одинаков. Отметим, что контексты могут быть вложенными. Команды также имеют параметры.
При исполнении команды обработчику передаются не только параметры, но и весь стек контекстов, в которых команда была вызвана.

Для выполнения команды необязательно последовательно вводить команды для изменения текущего контекста исполнения, а затем вводить команду, которую нужно исполнить. Команда также представляется в виде конкатенации команд изменения контекста и далее самой команды. Сами же команды конкатенировать нельзя.
Другими словами, формат передаваемых данных таков:

context_1 param_1_1 ... param_1_N1 context_2 param2_1 ... param_2_N2  . . .  context_K param_K_1 ... param_K_NK command param_1 ... param_M

где context_1, ..., context_K - вложенные друг в друга контексты, а command - команда.

При разборе входной строки при неоднозначности определения (команда или контекст) выбор совершается в пользу варианта "контекст". Для корректного разбора параметров считается, что у контекста число параметров задано заранее и это число фиксировано. У команды же может быть произвольное число аргументов - ограничений никаких нет.

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

Updated by Виктор Самунь about 11 years ago · 8 revisions