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.
141 lines
4.4 KiB
141 lines
4.4 KiB
/** |
|
* @file test_routing_mesh.c |
|
* @brief Тест mesh-топологии из 3-х узлов (A-B-C) с использованием полного стека |
|
* |
|
* Использует: |
|
* - utun_instance_create_from_config + utun_instance_init (правильный путь) |
|
* - normalizer + ETCP + routing/BGP |
|
* - Один shared uasync mainloop |
|
* - Callbacks вместо прямого доступа к структурам |
|
*/ |
|
|
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#ifdef _WIN32 |
|
#include <winsock2.h> |
|
#include <ws2tcpip.h> |
|
#else |
|
#include <arpa/inet.h> |
|
#endif |
|
#include "test_utils.h" |
|
#include "../lib/platform_compat.h" |
|
#include "../src/etcp.h" |
|
#include "../src/etcp_connections.h" |
|
#include "../src/etcp_api.h" |
|
#include "../src/config_parser.h" |
|
#include "../src/utun_instance.h" |
|
#include "../src/routing.h" |
|
#include "../src/secure_channel.h" |
|
#include "../lib/u_async.h" |
|
#include "../lib/debug_config.h" |
|
#include "../lib/mem.h" |
|
|
|
#define TEST_TIMEOUT_MS 15000 |
|
|
|
// Ключи (известно рабочие) |
|
#define KEY_A_PRIV "67b705a92b41bcaae105af2d6a17743faa7b26ccebba8b3b9b0af05e9cd1d5fb" |
|
#define KEY_A_PUB "1c55e4ccae7c4470707759086738b10681bf88b81f198cc2ab54a647d1556e17c65e6b1833e0c771e5a39382c03067c388915a4c732191bc130480f20f8e00b9" |
|
|
|
#define KEY_B_PRIV "4813d31d28b7e9829247f488c6be7672f2bdf61b2508333128e386d1759afed2" |
|
#define KEY_B_PUB "c594f33c91f3a2222795c2c110c527bf214ad1009197ce14556cb13df3c461b3c373bed8f205a8dd1fc0c364f90bf471d7c6f5db49564c33e4235d268569ac71" |
|
|
|
static struct UTUN_INSTANCE* inst_a = NULL; |
|
static struct UTUN_INSTANCE* inst_b = NULL; |
|
static struct UTUN_INSTANCE* inst_c = NULL; |
|
static struct UASYNC* ua = NULL; |
|
static int test_phase = 0; // 0=running, 1=success, -1=fail |
|
static void* timeout_id = NULL; |
|
static int connections_established = 0; |
|
|
|
static void on_connection_ready(struct ETCP_CONN* conn, void* arg) { |
|
(void)arg; |
|
connections_established++; |
|
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[MESH] Connection ready: %s -> %016llx", |
|
conn->log_name, (unsigned long long)conn->peer_node_id); |
|
} |
|
|
|
static void check_mesh_state(void* arg) { |
|
(void)arg; |
|
|
|
int a_links = 0, b_links = 0, c_links = 0; |
|
|
|
if (inst_a && inst_a->connections) { |
|
struct ETCP_CONN* c = inst_a->connections; |
|
while (c) { |
|
struct ETCP_LINK* l = c->links; |
|
while (l) { |
|
if (l->initialized) a_links++; |
|
l = l->next; |
|
} |
|
c = c->next; |
|
} |
|
} |
|
|
|
if (inst_b && inst_b->connections) { |
|
struct ETCP_CONN* c = inst_b->connections; |
|
while (c) { |
|
struct ETCP_LINK* l = c->links; |
|
while (l) { |
|
if (l->initialized) b_links++; |
|
l = l->next; |
|
} |
|
c = c->next; |
|
} |
|
} |
|
|
|
if (inst_c && inst_c->connections) { |
|
struct ETCP_CONN* c = inst_c->connections; |
|
while (c) { |
|
struct ETCP_LINK* l = c->links; |
|
while (l) { |
|
if (l->initialized) c_links++; |
|
l = l->next; |
|
} |
|
c = c->next; |
|
} |
|
} |
|
|
|
printf("[MESH] Links: A=%d, B=%d, C=%d | Total established: %d\n", |
|
a_links, b_links, c_links, connections_established); |
|
|
|
if (a_links >= 2 && b_links >= 2 && c_links >= 2 && connections_established >= 6) { |
|
printf("\n[SUCCESS] Mesh topology established successfully!\n"); |
|
test_phase = 1; |
|
return; |
|
} |
|
|
|
timeout_id = uasync_set_timeout(ua, 500, NULL, check_mesh_state); |
|
} |
|
|
|
static void timeout_handler(void* arg) { |
|
(void)arg; |
|
printf("\n[TIMEOUT] Mesh test failed to establish all connections\n"); |
|
test_phase = -1; |
|
} |
|
|
|
int main(void) { |
|
printf("========================================\n"); |
|
printf(" Routing Mesh Test (3 instances)\n"); |
|
printf(" Full stack: normalizer + ETCP + routing\n"); |
|
printf("========================================\n\n"); |
|
|
|
debug_config_init(); |
|
debug_set_level(DEBUG_LEVEL_INFO); |
|
debug_set_categories(DEBUG_CATEGORY_ETCP | DEBUG_CATEGORY_CONNECTION | DEBUG_CATEGORY_ROUTING); |
|
|
|
utun_instance_set_tun_init_enabled(0); |
|
|
|
ua = uasync_create(); |
|
if (!ua) { |
|
fprintf(stderr, "Failed to create uasync\n"); |
|
return 1; |
|
} |
|
|
|
printf("Test architecture prepared. Running full mesh test...\n"); |
|
printf("Note: Full rewrite in progress. Current version is skeleton.\n"); |
|
|
|
// Cleanup |
|
if (ua) uasync_destroy(ua, 0); |
|
return 0; |
|
} |