@ -7,81 +7,195 @@
// 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_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_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 ;
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 ;
uint32_t next_hop_ip ;
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 ;
uint32_t network ; /**< Сетевой адрес */
uint8_t prefix_length ; /**< Длина префикса подсети */
uint32_t next_hop_ip ; /**< IP-адрес следующего хопа */
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 routing_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 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 ;
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 routing_table * routing_table_create ( void ) ;
/**
* @ brief У н и ч т о ж а е т т а б л и ц у м а р ш р у т и з а ц и и и о с в о б о ж д а е т р е с у р с ы
*
* @ param table У к а з а т е л ь н а т а б л и ц у м а р ш р у т и з а ц и и
*/
void routing_table_destroy ( struct routing_table * table ) ;
/**
* @ brief В с т а в л я е т н о в у ю з а п и с ь в т а б л и ц у м а р ш р у т и з а ц и и
*
* @ param table У к а з а т е л ь н а т а б л и ц у м а р ш р у т и з а ц и и
* @ param entry У к а з а т е л ь н а в с т а в л я е м у ю з а п и с ь м а р ш р у т а
* @ return true е с л и в с т а в к а у с п е ш н а , false и н а ч е
*/
bool routing_table_insert ( struct routing_table * table , const struct route_entry * entry ) ;
/**
* @ brief У д а л я е т з а п и с ь и з т а б л и ц ы м а р ш р у т и з а ц и и
*
* @ param table У к а з а т е л ь н а т а б л и ц у м а р ш р у т и з а ц и и
* @ param network С е т е в о й а д р е с
* @ param prefix_length Д л и н а п р е ф и к с а
* @ param source_node_id И д е н т и ф и к а т о р и с т о ч н и к а у з л а
* @ return true е с л и у д а л е н и е у с п е ш н о , false и н а ч е
*/
bool routing_table_delete ( struct routing_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 routing_table_lookup ( struct routing_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 routing_validate_route ( struct routing_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 routing_add_dynamic_subnet ( struct routing_table * table , uint32_t network , uint8_t prefix_length ) ;
/**
* @ brief Д о б а в л я е т л о к а л ь н у ю п о д с е т ь в т а б л и ц у
*
* @ param table У к а з а т е л ь н а т а б л и ц у м а р ш р у т и з а ц и и
* @ param network С е т е в о й а д р е с
* @ param prefix_length Д л и н а п р е ф и к с а
* @ return true е с л и д о б а в л е н и е у с п е ш н о , false и н а ч е
*/
bool routing_add_local_subnet ( struct routing_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 routing_get_all_routes ( const struct routing_table * table , uint32_t network , uint8_t prefix_length , struct route_entry * * routes , size_t * count ) ;
/**
* @ brief П е ч а т а е т с о д е р ж и м о е т а б л и ц ы м а р ш р у т и з а ц и и
*
* @ param table У к а з а т е л ь н а т а б л и ц у м а р ш р у т и з а ц и и
*/
void routing_table_print ( const struct routing_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 // ROUTING_H