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.
113 lines
5.4 KiB
113 lines
5.4 KiB
#ifndef ROUTE_LIB_H |
|
#define ROUTE_LIB_H |
|
#include <stdint.h> |
|
#include <stddef.h> |
|
#include <stdbool.h> |
|
// задача модуля: поиск по таблице маршрутизации нужной записи, вставка-удаление маршрутов |
|
|
|
|
|
// 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); |
|
|
|
#endif // ROUTE_LIB_H
|
|
|