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