CourseProjectEltex


        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 с фильтром по времени и по статус


Установка для UNIX системах:

        Собранный файл находится в директории 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 фильтром:

     Получения данных по одной ONT:

      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. При наличии ошибки, функция возвращает код, соответствующий ошибке.

     Получение данных по одной ONT c фильтром

      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.


   Структуры:

   Структура ONT событий.

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;


   Структура с данными об ONT, которая поступает извне

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