#ifndef ROUTE_LIB_H #define ROUTE_LIB_H #include #include #include // Forward declarations struct ETCP_CONNECTIONS; /** * @brief Типы маршрутов */ typedef enum { ROUTE_TYPE_STATIC = 0, /**< Статический маршрут */ ROUTE_TYPE_DYNAMIC = 1, /**< Динамический маршрут */ ROUTE_TYPE_LOCAL = 2, /**< Локальный маршрут */ ROUTE_TYPE_LEARNED = 3 /**< Изученный маршрут */ } route_type_t; /** * @brief Флаги маршрута */ typedef enum { ROUTE_FLAG_ACTIVE = (1 << 0), /**< Маршрут активен */ ROUTE_FLAG_VALIDATED = (1 << 1), /**< Маршрут валидирован */ ROUTE_FLAG_ADVERTISED = (1 << 2), /**< Маршрут анонсирован */ ROUTE_FLAG_LEARNED = (1 << 3) /**< Маршрут изучен */ } route_flags_t; /** * @brief Расширенные метрики маршрута * * Структура содержит дополнительные метрики для оценки качества маршрута. */ struct route_metrics { uint32_t bandwidth_kbps; /**< Пропускная способность в Кбит/с */ uint16_t packet_loss_rate; /**< Уровень потери пакетов (в промилле) */ uint16_t latency_ms; /**< Задержка в миллисекундах */ uint8_t hop_count; /**< Количество прыжков */ uint64_t last_updated; /**< Время последнего обновления (в микросекундах) */ }; /** * @brief Расширенная запись маршрута * * Структура представляет собой отдельную запись в таблице маршрутизации с детальной информацией о маршруте. */ struct route_entry { uint32_t network; /**< Сетевой адрес */ uint8_t prefix_length; /**< Длина префикса подсети */ struct ETCP_SOCKET* next_hop; /**< Указатель на сокет следующего хопа */ route_type_t type; /**< Тип маршрута */ uint8_t flags; /**< Флаги маршрута */ struct route_metrics metrics; /**< Метрики маршрута */ uint64_t created_time; /**< Время создания (в микросекундах) */ uint64_t last_update; /**< Время последнего обновления (в микросекундах) */ uint64_t last_used; /**< Время последнего использования (в микросекундах) */ }; /** * @brief Таблица маршрутизации * * Структура представляет собой таблицу маршрутизации, содержащую записи маршрутов, подсети и статистику. */ struct route_table { struct route_entry *entries; /**< Массив записей маршрутов */ size_t count; /**< Текущее количество записей */ size_t capacity; /**< Максимальная емкость таблицы */ uint32_t *dynamic_subnets; /**< Динамические подсети (массив пар: сеть, префикс) */ size_t dynamic_subnet_count; /**< Количество динамических подсетей */ uint32_t *local_subnets; /**< Локальные подсети (массив пар: сеть, префикс) */ size_t local_subnet_count; /**< Количество локальных подсетей */ struct { uint64_t total_routes; /**< Общее количество маршрутов */ uint64_t static_routes; /**< Количество статических маршрутов */ uint64_t dynamic_routes; /**< Количество динамических маршрутов */ uint64_t local_routes; /**< Количество локальных маршрутов */ uint64_t learned_routes; /**< Количество изученных маршрутов */ uint64_t routes_added; /**< Количество добавленных маршрутов */ uint64_t routes_deleted; /**< Количество удаленных маршрутов */ uint64_t lookup_count; /**< Количество запросов поиска */ uint64_t hit_count; /**< Количество успешных поисков */ uint64_t routes_lookup_hits; /**< Количество попаданий в поиск маршрутов */ uint64_t routes_lookup_misses; /**< Количество промахов в поиск маршрутов */ uint64_t validation_failures; /**< Количество неудачных валидаций */ } stats; /**< Статистика таблицы маршрутизации */ }; /** * @brief Создает новую таблицу маршрутизации * * @return Указатель на созданную таблицу или NULL в случае ошибки */ struct route_table *route_table_create(void); /** * @brief Уничтожает таблицу маршрутизации и освобождает ресурсы * * @param table Указатель на таблицу маршрутизации */ void route_table_destroy(struct route_table *table); /** * @brief Вставляет новую запись в таблицу маршрутизации * * @param table Указатель на таблицу маршрутизации * @param entry Указатель на вставляемую запись маршрута * @return true если вставка успешна, false иначе */ bool route_table_insert(struct route_table *table, const struct route_entry *entry); /** * @brief Удаляет запись из таблицы маршрутизации * * @param table Указатель на таблицу маршрутизации * @param network Сетевой адрес * @param prefix_length Длина префикса * @param source_node_id Идентификатор источника узла * @return true если удаление успешно, false иначе */ bool route_table_delete(struct route_table *table, uint32_t network, uint8_t prefix_length, uint32_t source_node_id); /** * @brief Выполняет поиск лучшего маршрута для заданного IP-адреса * * @param table Указатель на таблицу маршрутизации * @param dest_ip Целевой IP-адрес * @param best_route Указатель на структуру для хранения лучшего маршрута * @return true если маршрут найден, false иначе */ bool route_table_lookup(struct route_table *table, uint32_t dest_ip, struct route_entry *best_route); /** * @brief Валидирует маршрут на основе типа и подсетей * * @param table Указатель на таблицу маршрутизации * @param network Сетевой адрес * @param prefix_length Длина префикса * @param route_type Тип маршрута * @return true если маршрут валиден, false иначе */ bool route_validate_route(struct route_table *table, uint32_t network, uint8_t prefix_length, route_type_t route_type); /** * @brief Добавляет динамическую подсеть в таблицу * * @param table Указатель на таблицу маршрутизации * @param network Сетевой адрес * @param prefix_length Длина префикса * @return true если добавление успешно, false иначе */ bool route_add_dynamic_subnet(struct route_table *table, uint32_t network, uint8_t prefix_length); /** * @brief Добавляет локальную подсеть в таблицу * * @param table Указатель на таблицу маршрутизации * @param network Сетевой адрес * @param prefix_length Длина префикса * @return true если добавление успешно, false иначе */ bool route_add_local_subnet(struct route_table *table, uint32_t network, uint8_t prefix_length); /** * @brief Получает все маршруты для заданной сети и префикса * * @param table Указатель на таблицу маршрутизации * @param network Сетевой адрес * @param prefix_length Длина префикса * @param routes Указатель на массив маршрутов (будет выделен) * @param count Указатель на количество найденных маршрутов * @return true если операция успешна, false иначе */ bool route_get_all_routes(const struct route_table *table, uint32_t network, uint8_t prefix_length, struct route_entry **routes, size_t *count); /** * @brief Печатает содержимое таблицы маршрутизации * * @param table Указатель на таблицу маршрутизации */ void route_table_print(const struct route_table *table); /** * @brief Преобразует тип маршрута в строковое представление * * @param type Тип маршрута * @return Строковое представление типа */ const char* route_type_to_string(route_type_t type); /** * @brief Преобразует IP-адрес в строковое представление * * @param ip IP-адрес в сетевом формате * @param buffer Буфер для хранения строки (минимум 16 байт) * @return Указатель на буфер с строкой */ char* ip_to_string(uint32_t ip, char *buffer); #endif // ROUTE_LIB_H