#ifndef ROUTE_LIB_H #define ROUTE_LIB_H #include #include #include // Forward declarations struct ETCP_CONNECTIONS; struct ROUTE_TABLE; struct ROUTE_ENTRY; /** * @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 metric; /**< общее качество подсчитанное из метрик (меньше - лучше) */ uint32_t bandwidth_kbps; /**< Пропускная способность в Кбит/с */ uint16_t packet_loss_rate; /**< Уровень потери пакетов (x0.1%) */ uint16_t latency_ms; /**< Задержка в миллисекундах */ uint8_t hop_count; /**< Количество прыжков */ uint64_t last_updated; /**< Время последнего обновления (в микросекундах) */ }; struct ROUTE_ARRAY { uint32_t capacity;// max число элементов (для realloc) uint32_t routes; /**< число маршрутов в массиве */ uint32_t ip; /**< адрес назначения */ struct ROUTE_ENTRY* entries[0]; /**< массив указателей на роуты */ }; /** * @brief Callback тип для уведомления об изменении маршрута * * @param table Таблица маршрутизации * @param entry Запись маршрута * @param action Действие: 0=insert, 1=update, 2=delete * @param arg Пользовательский аргумент */ typedef void (*route_change_callback_fn)(struct ROUTE_TABLE* table, struct ROUTE_ENTRY* entry, int action, void* arg); /** * @brief Расширенная запись маршрута * * Структура представляет собой отдельную запись в таблице маршрутизации с детальной информацией о маршруте. */ struct ROUTE_ENTRY { uint32_t network; /**< Сетевой адрес */ uint8_t prefix_length; /**< Длина префикса подсети */ struct ETCP_CONN* next_hop; /**< Указатель на подключение до следующего хопа */ route_type_t type; /**< Тип маршрута */ uint8_t flags; /**< Флаги маршрута */ struct ROUTE_METRICS metrics; /**< Метрики маршрута */ uint64_t created_time; /**< Время создания (в микросекундах) */ uint64_t last_update; /**< Время последнего обновления (в микросекундах) */ // BGP поля - информация о конечном узле для прямого подключения uint32_t endpoint_ip; /**< IP для прямого подключения (из BGP) */ uint16_t endpoint_port; /**< Порт для прямого подключения (из BGP) */ uint64_t destination_node_id; /**< ID узла назначения (из BGP) */ }; /** * @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 local_routes; /**< Количество локальных маршрутов */ uint64_t learned_routes; /**< Количество изученных маршрутов */ uint64_t routes_lookup_hits; /**< Количество попаданий в поиск маршрутов */ uint64_t routes_lookup_misses; /**< Количество промахов в поиск маршрутов */ } stats; /**< Статистика таблицы маршрутизации */ route_change_callback_fn change_callback; /**< Callback при изменении маршрута */ void* change_callback_arg; /**< Аргумент для callback */ }; /** * @brief Создает новую таблицу маршрутизации * * @return Указатель на созданную таблицу или NULL в случае ошибки */ struct ROUTE_TABLE *route_table_create(void); /** * @brief Уничтожает таблицу маршрутизации и освобождает ресурсы * * @param table Указатель на таблицу маршрутизации */ void route_table_destroy(struct ROUTE_TABLE *table); /** * @brief Очищает глобальный кеш маршрутов */ void route_cache_clear(void); /** * @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 conn соединение все роуты которого надо удалить */ void route_table_delete(struct ROUTE_TABLE *table, struct ETCP_CONN* conn); /** * @brief Удаляет конкретный маршрут из таблицы * * @param table Указатель на таблицу маршрутизации * @param network Сетевой адрес * @param prefix_length Длина префикса подсети * @param next_hop Указатель на соединение (NULL = любой next_hop) * @return true если маршрут найден и удален, false если не найден */ bool route_table_delete_entry(struct ROUTE_TABLE *table, uint32_t network, uint8_t prefix_length, struct ETCP_CONN* next_hop); /** * @brief Выполняет поиск доступных маршрутов для заданного IP-адреса, отсортированных по quality * при поиске ищет готовый результат в кеше или добавляет в кеш новый результат и возвращает запись из кеша * * @param table Указатель на таблицу маршрутизации * @param dest_ip Целевой IP-адрес * @return структура с найденными маршрутами */ struct ROUTE_ARRAY* route_table_lookup(struct ROUTE_TABLE *table, uint32_t dest_ip); // пересчитывает quality на основе других метрик (rtt, %loss, hopcount). чем меньше quality - тем лучше bool route_update_quality(struct ROUTE_ENTRY *entry); /** * @brief Печатает содержимое таблицы маршрутизации * * @param table Указатель на таблицу маршрутизации */ void route_table_print(const struct ROUTE_TABLE *table); /* * @brief Парсит строку подсети в сетевой адрес и длину префикса * * @param subnet_str Строка подсети (например, "192.168.1.0/24") * @param network Указатель для сохранения сетевого адреса * @param prefix_length Указатель для сохранения длины префикса * @return 0 при успехе, -1 при ошибке */ int parse_subnet(const char *subnet_str, uint32_t *network, uint8_t *prefix_length); /** * @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 Указатель для сохранения массива маршрутов (выделяется calloc) * @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); #endif // ROUTE_LIB_H