Browse Source

add bgp request "send all"

nodeinfo-routing-update
Evgeny 1 week ago
parent
commit
58c637ce1a
  1. 67
      src/route_bgp.c
  2. 11
      src/route_bgp.h

67
src/route_bgp.c

@ -80,6 +80,53 @@ static void route_bgp_send_route(struct ROUTE_BGP* bgp, struct ETCP_CONN* conn,
} }
} }
static void route_bgp_send_table_request(struct ROUTE_BGP* bgp, struct ETCP_CONN* conn) {
if (!bgp || !conn) return;
struct BGP_ROUTE_REQUEST* req = u_calloc(1, sizeof(struct BGP_ROUTE_REQUEST));
if (!req) {
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "route_bgp_send_table_request: alloc failed");
return;
}
req->cmd = ETCP_ID_ROUTE_ENTRY;
req->subcmd = ROUTE_SUBCMD_REQUEST_TABLE;
req->version = 0;
struct ll_entry* send_entry = queue_entry_new(0);
if (!send_entry) {
u_free(req);
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "route_bgp_send_table_request: queue_entry_new failed");
return;
}
send_entry->dgram = (uint8_t*)req;
send_entry->len = sizeof(struct BGP_ROUTE_REQUEST);
if (etcp_send(conn, send_entry) != 0) {
queue_entry_free(send_entry);
u_free(req);
DEBUG_WARN(DEBUG_CATEGORY_BGP, "Failed to send table request to %s", conn ? conn->log_name : "unknown");
} else {
DEBUG_INFO(DEBUG_CATEGORY_BGP, "Sent table request to %s (version=0)", conn->log_name);
}
}
static void route_bgp_send_full_table(struct ROUTE_BGP* bgp, struct ETCP_CONN* conn) {
if (!bgp || !conn || !conn->instance || !conn->instance->rt) {
DEBUG_WARN(DEBUG_CATEGORY_BGP, "route_bgp_send_full_table: invalid args");
return;
}
struct ROUTE_TABLE* rt = conn->instance->rt;
for (size_t i = 0; i < rt->count; i++) {
route_bgp_send_route(bgp, conn, &rt->entries[i], ROUTE_SUBCMD_ENTRY);
}
DEBUG_INFO(DEBUG_CATEGORY_BGP, "Sent full routing table to %s (version=%u)",
conn->log_name, bgp->table_version);
}
// ============================================================================ // ============================================================================
// Broadcast / Withdraw // Broadcast / Withdraw
// ============================================================================ // ============================================================================
@ -282,6 +329,16 @@ static void route_bgp_receive_cbk(struct ETCP_CONN* from_conn, struct ll_entry*
// === ИСПРАВЛЕНИЕ: поддержка резервных путей === // === ИСПРАВЛЕНИЕ: поддержка резервных путей ===
route_remove_path(instance->rt, from_conn, node_id); route_remove_path(instance->rt, from_conn, node_id);
// callback внутри route_remove_path уже сделает broadcast (withdraw или reroute) // callback внутри route_remove_path уже сделает broadcast (withdraw или reroute)
} else if (subcmd == ROUTE_SUBCMD_REQUEST_TABLE) {
if (entry->len < sizeof(struct BGP_ROUTE_REQUEST)) {
queue_dgram_free(entry); queue_entry_free(entry);
return;
}
struct BGP_ROUTE_REQUEST* req = (struct BGP_ROUTE_REQUEST*)data;
DEBUG_INFO(DEBUG_CATEGORY_BGP, "Received table request from %s (version=%u), sending full table",
from_conn->log_name, be32toh(req->version));
route_bgp_send_full_table(bgp, from_conn);
} }
queue_dgram_free(entry); queue_dgram_free(entry);
@ -337,6 +394,7 @@ struct ROUTE_BGP* route_bgp_init(struct UTUN_INSTANCE* instance) {
} }
bgp->instance = instance; bgp->instance = instance;
bgp->table_version = 1;
bgp->senders_list = queue_new(instance->ua, 0, "BGP_senders"); bgp->senders_list = queue_new(instance->ua, 0, "BGP_senders");
if (!bgp->senders_list) { if (!bgp->senders_list) {
@ -433,13 +491,8 @@ void route_bgp_new_conn(struct ETCP_CONN* conn) {
DEBUG_INFO(DEBUG_CATEGORY_BGP, "New connection added to senders_list"); DEBUG_INFO(DEBUG_CATEGORY_BGP, "New connection added to senders_list");
} }
// === 3. В любом случае отправляем полную таблицу (это и нужно при переподключении) === // === 3. Отправляем запрос на получение таблицы (обе стороны при on_up) ===
for (size_t i = 0; i < rt->count; i++) { route_bgp_send_table_request(bgp, conn);
route_bgp_send_route(bgp, conn, &rt->entries[i], ROUTE_SUBCMD_ENTRY);
}
DEBUG_INFO(DEBUG_CATEGORY_BGP, "Sent full routing table to %s (reconnect OK)",
conn->log_name);
} }
void route_bgp_remove_conn(struct ETCP_CONN* conn) { void route_bgp_remove_conn(struct ETCP_CONN* conn) {

11
src/route_bgp.h

@ -13,6 +13,7 @@
#define ROUTE_SUBCMD_ENTRY_REROUTE 0x02 // Reroute (preferred_conn изменился) — пока обрабатывается как ENTRY #define ROUTE_SUBCMD_ENTRY_REROUTE 0x02 // Reroute (preferred_conn изменился) — пока обрабатывается как ENTRY
#define ROUTE_SUBCMD_WITHDRAW 0x03 #define ROUTE_SUBCMD_WITHDRAW 0x03
#define ROUTE_SUBCMD_NODEINFO 0x04 #define ROUTE_SUBCMD_NODEINFO 0x04
#define ROUTE_SUBCMD_REQUEST_TABLE 0x05 // запрос полной таблицы (version=0 в запросе)
#define MAX_HOPS 16 #define MAX_HOPS 16
@ -39,6 +40,15 @@ struct BGP_WITHDRAW_PACKET {
uint64_t node_id; uint64_t node_id;
} __attribute__((packed)); } __attribute__((packed));
/**
* @brief Пакет запроса полной таблицы
*/
struct BGP_ROUTE_REQUEST {
uint8_t cmd; // ETCP_ID_ROUTE_ENTRY
uint8_t subcmd; // ROUTE_SUBCMD_REQUEST_TABLE
uint32_t version; // 0 для запроса
} __attribute__((packed));
struct ROUTE_BGP_CONN_ITEM { struct ROUTE_BGP_CONN_ITEM {
struct ll_entry ll; struct ll_entry ll;
struct ETCP_CONN* conn; struct ETCP_CONN* conn;
@ -47,6 +57,7 @@ struct ROUTE_BGP_CONN_ITEM {
struct ROUTE_BGP { struct ROUTE_BGP {
struct UTUN_INSTANCE* instance; struct UTUN_INSTANCE* instance;
struct ll_queue* senders_list; struct ll_queue* senders_list;
uint32_t table_version; // starts at 1, for future use
}; };
struct ROUTE_BGP* route_bgp_init(struct UTUN_INSTANCE* instance); struct ROUTE_BGP* route_bgp_init(struct UTUN_INSTANCE* instance);

Loading…
Cancel
Save