#ifndef ROUTE_LIB_H #define ROUTE_LIB_H #include #include #include // задача модуля: поиск по таблице маршрутизации нужной записи, вставка-удаление маршрутов // Forward declarations struct ETCP_CONNECTIONS; struct ROUTE_TABLE; struct ROUTE_ENTRY; struct NODEINFO_Q; /** * @brief Флаги узла */ typedef enum { ROUTE_FLAG_ACTIVE = (1 << 0), /**< Маршрут активен */ ROUTE_FLAG_LEARNED = (1 << 1) /**< Маршрут изучен */ } route_flags_t; /** * @brief Расширенная запись маршрута * * Структура представляет собой отдельную запись в таблице маршрутизации с детальной информацией о маршруте. */ struct ROUTE_ENTRY { uint32_t network; // Сетевой адрес (big-endian) uint8_t prefix_length; // Длина префикса подсети struct NODEINFO_Q* v_node_info; // узел владелец этих маршрутов. null если - локальный маршрут. }; /** * @brief Таблица маршрутизации * * Структура представляет собой таблицу маршрутизации, содержащую записи маршрутов, подсети и статистику. * маршруты не должны пересекаться. т.е. адрес 192.168.1.1/30 нельзя добавить если есть 192.168.1.2/32 или 192.168.1.1/24 */ 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 node узел, все маршруты которого нужно добавить * * @return true если вставка/обновление успешно */ bool route_insert(struct ROUTE_TABLE *table, struct NODEINFO_Q *node); /** * @brief Удаляет все записи из таблицы маршрутизации для указанного узла * * @param table Указатель на таблицу маршрутизации * @param node узел, все маршруты которого нужно удалить */ void route_delete(struct ROUTE_TABLE *table, struct NODEINFO_Q *node); /** * @brief Выполняет поиск маршрута для заданного IP-адреса * * @param table Указатель на таблицу маршрутизации * @param dest_ip Целевой IP-адрес * @return найденный маршрут или NULL */ struct ROUTE_ENTRY* route_lookup(struct ROUTE_TABLE *table, uint32_t dest_ip); /** * @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); bool route_add_local_subnet(struct ROUTE_TABLE *table, uint32_t network, uint8_t prefix_length); #endif // ROUTE_LIB_H