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.
 
 
 
 
 
 

200 lines
10 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 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