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.
71 lines
3.3 KiB
71 lines
3.3 KiB
#ifndef ROUTE_BGP_H |
|
#define ROUTE_BGP_H |
|
|
|
#include <stdint.h> |
|
#include "../lib/ll_queue.h" |
|
|
|
// Forward declarations |
|
struct UTUN_INSTANCE; |
|
struct ETCP_CONN; |
|
|
|
// ETCP ID для маршрутных пакетов |
|
#define ETCP_ID_ROUTE_ENTRY 0x01 |
|
|
|
// Sub-команды для маршрутных пакетов |
|
#define ROUTE_SUBCMD_ENTRY 0x01 // Элемент таблицы |
|
#define ROUTE_SUBCMD_WITHDRAW 0x02 // Отзыв маршрута |
|
#define ROUTE_SUBCMD_REQUEST 0x03 // Запрос полной таблицы |
|
|
|
// Флаги в prefix_length (2 старших бита) |
|
#define ROUTE_PREFIX_F_DIRECT 0x40 // Можно подключиться напрямую |
|
#define ROUTE_PREFIX_F_LOCAL 0x80 // Локальный маршрут (не пересылать) |
|
|
|
/** |
|
* @brief Пакет маршрутной информации (бинарный формат) |
|
*/ |
|
struct ROUTE_BGP_PACKET { |
|
uint8_t cmd; // ETCP_CMD_ROUTE (1) |
|
uint8_t subcmd; // ROUTE_SUBCMD_ENTRY (1) |
|
uint8_t hop_count; // Количество прыжков (инкриментирует получатель) |
|
uint8_t prefix_length; // Длина префикса подсети + флаги (2 старших бита) |
|
uint16_t latency; // Задержка (x0.1 ms) |
|
uint16_t endpoint_port; // Порт для прямого подключения |
|
uint32_t endpoint_ip; // IP для прямого подключения |
|
uint32_t network; // Сетевой адрес (big-endian) |
|
uint32_t bandwidth_kbps; // Пропускная способность |
|
uint64_t node_id; // ID узла назначения |
|
} __attribute__((packed)); |
|
|
|
|
|
struct ROUTE_BGP_QUEUE_ITEM { |
|
struct ll_entry ll; // Для очереди |
|
struct ETCP_CONN* target; // Кому отправлять (NULL = всем) |
|
}; |
|
|
|
/** |
|
* @brief Элемент списка соединений для рассылки обновлений |
|
*/ |
|
struct ROUTE_BGP_CONN_ITEM { |
|
struct ll_entry ll; // Для очереди/списка |
|
struct ETCP_CONN* conn; // Указатель на соединение |
|
}; |
|
|
|
struct ROUTE_BGP { |
|
struct UTUN_INSTANCE* instance; // Ссылка на instance |
|
struct ll_queue* senders_list; // список для рассылки обновлений (рассылаем через etcp_send) |
|
}; |
|
|
|
|
|
// Создание/уничтожение (делаем bind на 0x01) |
|
struct ROUTE_BGP* route_bgp_init(struct UTUN_INSTANCE* instance); |
|
void route_bgp_destroy(struct UTUN_INSTANCE* instance); |
|
|
|
// Прием пакетов (вызывается из ETCP при получении ETCP_ID_ROUTE) |
|
//BIND: static void route_bgp_receive_cbk(struct ETCP_CONN* from_conn, struct ll_entry* entry); |
|
|
|
// Отправка таблицы конкретному соединению или всем |
|
void route_bgp_new_conn(struct ETCP_CONN* conn); // Добавление в список рассылки и отправка таблицы |
|
void route_bgp_remove_conn(struct ETCP_CONN* conn); // Удаление из списка рассылки и отправка withdraw |
|
void route_bgp_close_conn(struct ETCP_CONN* conn); // Убрать из списка рассылки (deprecated, используй remove_conn) |
|
|
|
#endif // ROUTE_BGP_H
|
|
|