#ifndef ROUTE_BGP_H #define ROUTE_BGP_H #include #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