ONT CONNECTIONS - это функционал для сохранения состояний ONT (Optical Network Terminal). Данный функционал используется провайдерами, для отслеживания состояний терминалов и сбора статистики работы.
Сохраняется следующая информация - Serial Number - серийный номер ONT, Equipment ID - наименование ONT, Firmware version - версия ПО терминала, LinkUP - время активации ONT, LinkDown - время деактивации ONT. Last State - состояние ONT на момент деактивации. Всего ONT может быть 2048 штук - 16 портов, по 128 ONT на каждом порту. Соответственно ONT индексируются парой значение - индекс порта/индекс ONT на порту. Сохраняется не более 10 событий.
-
Инициализация/деиницилизация библиотеки - создания и очистки ресурсов при начале и завершение работы с библиотекой.
-
Обновление записи - обновление подразумевает как добавление новой записи, так и обновление текущей.
-
Получения данных по одной ONT - получить все записи по данной ONT.
-
Получение данных по одной ONT c фильтром - получить запись по данной ONT с фильтром по времени и по статус
Собранный файл находится в директории bin/. API находится в include/. Для сборки динамической библиотеки необходимо в главной директории прописать команду:
make
Для очистки используйте :
make clean
Для проверки работоспособности библиотеки можно зайти в папку test/ и ввести
make
./test
Тесты демонстрируют:
-
Валидность входных аргументов для внешнего API
-
Имитацию работы: имитация нескольких добавлений и т.п., получение карточек и сравнение с эталоном.
struct Ont_info ont_info = {0};
enum Errors errors = NO_ERRORS;
ont_info.num_port = 0;
ont_info.num_ont = 0;
strncpy(ont_info.serial, "serial0", ONT_SERIAL_SIZE);
strncpy(ont_info.eq_id, "eq_id0", ONT_EQ_ID_SIZE);
strncpy(ont_info.fw_version, "fw_version0", ONT_FW_VERSION_SIZE);
for(size_t i = 0; i < 15; i++)
{
ont_info.link_up = i;
ont_info.status = ACTIVATION ;
sended_cards[i].status = ont_info.status;
errors = ont__add_card(&ont_info);
if(errors < 0)
{
exit(errors);
}
}
errors = ont__get_card(0, 0, received_cards, 10);
if(errors < 0)
{
exit(errors);
}
int ont__add_card(struct Ont_info const *const ont_info);
Функция добавления нового события в базовую структуру. При успешном добавлении, функция возвращает NO_ERRORS и новое событие сохранено в базовой структуре, в соответствующем для него месте в структуре. При наличии ошибки, функция возвращает код, соответствующий ошибке. Получения данных по одной ONT c фильтром:
int ont__get_card(uint32_t const num_port, uint32_t const num_ont, struct Ont_connection ont_connection[NUM_OF_RECORDS]);
Функция получения всех событий по одной ont. При успешном выполнении, функция возвращает код ошибки NO_ERRORS, а указатель ont_connection, имеет копию данных связанных с нужной ont. При наличии ошибки, функция возвращает код, соответствующий ошибке.
int ont__get_card_filter( uint32_t const num_port, uint32_t const num_ont, void *const key, struct Ont_connection * const ont_connection, enum Card_filter filter);
Функция получения карточек по одной ONT с фильтром. При успешном выполнении, функция возвращает код ошибки NO_ERRORS, а в аргумент ont_connection типа Ont_connection помещает, копию данных связанных с нужной ont по соответствующему фильтру. При наличии ошибки, функция возвращает код, соответствующий ошибке. Для сортировки необходимо использовать FIND_STATUS - для поиска по состояниям и FIND_TIME для поиска по времени.
При работе с библиотекой могут возникнуть следующие ошибки:
NO_ERRORS= 0, код выполнился без ошибок.
NUM_PORT_ERROR= -1, неверно указан порт ONT.
NUM_ONT_ERROR= -2, неверно указан номер ONT
NULL_PTR_ERROR= -3, передан указатель на NULL.
NOT_FOUND_ERROR= -4, функция поиска не нашла элементы подходящие под условие.
VALUE_NULL_ERROR= -5, значение ключа имеет значение NULL.
LIST_NULL_ERROR= -6, передан нулевой указатель на список.
ARRAY_SIZE_ERROR= -7, передано неверное количество элементов массива.
WRONG_VALUE_ERROR= -8, переданы некорректные значения
MUTEX_ERROR= -9, ошибка захвата mutex.
typedef struct Ont_connection {
char serial[ONT_SERIAL_SIZE]; - Серийный номер ONT в текстовом формате
char eq_id[ONT_EQ_ID_SIZE]; - Наименование ONT в текстовом формате
char fw_version[ONT_FW_VERSION_SIZE]; - Версия прошивки ONT в текстовом формате
time_t link_up; - время активации. День, год, час, минута, секунда
time_t link_down; - время деактивации. День, год, час, минута, секунда
enum Ont_status status; - Статус ONT. Возможные статусы: Activation, Working, CfgFail, Block.
} Ont_connection;
typedef struct Ont_info {
uint32_t num_port; - Номер порта.
uint32_t num_ont; - Номер ONT.
char serial[ONT_SERIAL_SIZE]; - Серийный номер ONT в текстовом формате
char eq_id[ONT_EQ_ID_SIZE]; - Наименование ONT в текстовом формате
char fw_version[ONT_FW_VERSION_SIZE]; - Версия прошивки ONT в текстовом формате
time_t link_up; - время активации. День, год, час, минута, секунда
time_t link_down; - время деактивации. День, год, час, минута, секунда
enum Ont_status status; - Статус ONT. Возможные статусы: Activation, Working, CfgFail, Block.
} Ont_info;
ONT_SERIAL_SIZE= 16, размер в байтах серийного номера ONT.
ONT_EQ_ID_SIZE= 18, размер в байтах наименования ONT.
ONT_FW_VERSION_SIZE= 32, размер в байтах версии прошивки ONT.
NUM_OF_PORTS= 16, количество портов.
NUM_OF_ONT_ON_PORT= 128, количество ONT на одном порту.
NUM_OF_RECORDS= 10, количество событий в карточке.
NUM_OF_ONT_CONNECTIONS= 2048, общее количество ONT