#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 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 Расширенная запись маршрута * * Структура представляет собой отдельную запись в таблице маршрутизации с детальной информацией о маршруте. */ 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; /**< Время последнего обновления (в микросекундах) */ }; /** * @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; /**< Статистика таблицы маршрутизации */ }; /** * @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 conn соединение все роуты которого надо удалить */ void route_table_delete(struct ROUTE_TABLE *table, struct ETCP_SOCKET* conn); /** * @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