You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

183 lines
9.3 KiB

#ifndef ROUTE_LIB_H
#define ROUTE_LIB_H
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
// 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