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.
 
 
 
 
 
 

72 lines
2.9 KiB

#ifndef ROUTE_BGP_H
#define ROUTE_BGP_H
#include <stdint.h>
#include "../lib/ll_queue.h"
#include "route_lib.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_ENTRY_REROUTE 0x02 // old_node_id + элемент таблицы - когда найден альтернативный маршрут при WITHDRAW
#define ROUTE_SUBCMD_WITHDRAW 0x03 // Отзыв маршрута
#define ROUTE_SUBCMD_NODEINFO 0x04 // информация об узле для прямого подключения
/**
* @brief Пакет маршрутной информации (бинарный формат)
*/
struct PEER_INFO_ENTRY {
struct ROUTE_PEER_INFO;
}
struct BGP_ENTRY_PACKET {
uint8_t cmd; // ETCP_CMD_ROUTE (1)
uint8_t subcmd; // ROUTE_SUBCMD_ENTRY (1)
struct ROUTE_PEER_INFO peer_info;
} __attribute__((packed));
struct BGP_NODEINFO_PACKET {
uint8_t cmd; // ETCP_CMD_ROUTE (1)
uint8_t subcmd; // ROUTE_SUBCMD_NODEINFO (4)
struct ROUTE_NODE_INFO node_info;
} __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