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
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
|
|
|