Добавлен group_id в etcp_router и topo_group, удалён msg_transport
- etcp_router: SVC_ROUTE_HDR (+8B), ETCP_ROUTER_CONN/TRANSIT_QUEUE хеши расширены под group_id - Все caller'ы (proxy, routing, conn_mgr, nat, chatgui, tests) обновлены - topo_group: глобальный реестр TOPO_NODE по node_id, ref_count=0 при создании - BGP-обмен активируется для всех групп (а не только дефолтной) - Протокол: group_id добавлен в WITHDRAW/TABLE_REQ/TABLE_COMPLETE/ERR_GROUP_MISMATCH - Per-connection коллбэки заменены на instance-level conn_status - msg_transport полностью удалён из проекта 57/57 тестов
This commit is contained in:
1 parent
5265783164
commit
852ce401e7
37 files changed
+375
-1125
No files matched your search
@@ -243,7 +243,7 @@ static int send_one_pkt(uint32_t seq, int data_len) {
|
||||
memcpy(e->dgram, buf, 10 + data_len);
|
||||
e->len = 10 + data_len;
|
||||
|
||||
return etcp_route_send(cli, server_node_id, e, 0);
|
||||
return etcp_route_send(cli, TOPO_GROUP_UTUN, server_node_id, e, 0);
|
||||
}
|
||||
|
||||
// ======================== Server handler ========================
|
||||
@@ -338,7 +338,7 @@ static int test_loopback(void) {
|
||||
uint8_t data[6] = { 0xF0, 0xAA, 0xBB, 0xCC, 0x00, 0x00 };
|
||||
struct ll_entry* e = queue_entry_new(0);
|
||||
e->dgram = u_malloc(6); memcpy(e->dgram, data, 6); e->len = 6;
|
||||
etcp_route_send(srv, srv->node_id, e, 0);
|
||||
etcp_route_send(srv, TOPO_GROUP_UTUN, srv->node_id, e, 0);
|
||||
etcp_router_unbind(srv, 0xF0);
|
||||
if (loop_rcvd != 1 || !loop_ok) {
|
||||
printf("[FAIL] loopback: rcvd=%d ok=%d\n", loop_rcvd, loop_ok);
|
||||
@@ -540,7 +540,7 @@ static void monitor(void* arg) {
|
||||
sb->recv, sb->sent, sb->dropped, sb->lost, sb->queue_max);
|
||||
|
||||
// Router stats
|
||||
struct ETCP_ROUTER_CONN* rconn = etcp_router_conn_get(cli, server_node_id, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* rconn = etcp_router_conn_get(cli, TOPO_GROUP_UTUN, server_node_id, TEST_SVC_ID);
|
||||
if (rconn) {
|
||||
printf(" router: tx_seq=%u rx_seq=%u tx_acked=%u c_pkts_sent=%u c_pkts_rcvd=%u c_dup_dropped=%u c_oob_dropped=%u\n",
|
||||
rconn->tx_seq, rconn->rx_seq, rconn->tx_acked,
|
||||
|
||||
@@ -146,7 +146,7 @@ static int send_one_pkt(void) {
|
||||
gen_payload(g_seq, buf+7, len);
|
||||
struct ll_entry* e=queue_entry_new(0); if(!e){u_free(buf);return -1;}
|
||||
e->dgram=buf; e->len=7+len;
|
||||
int ret = etcp_route_send(g_a, node_c, e, 0);
|
||||
int ret = etcp_route_send(g_a, TOPO_GROUP_UTUN, node_c, e, 0);
|
||||
if (ret == 0) g_seq++;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -65,6 +65,7 @@ static void inject(etcp_recv_fn recv_cb, struct UTUN_INSTANCE* inst,
|
||||
struct SVC_ROUTE_HDR hdr;
|
||||
memset(&hdr, 0, sizeof(hdr));
|
||||
hdr.cmd = ETCP_RT_ID_SVC_ROUTE;
|
||||
hdr.group_id = TOPO_GROUP_UTUN;
|
||||
hdr.dst_node_id = inst->node_id;
|
||||
hdr.src_node_id = src;
|
||||
hdr.seq = seq;
|
||||
@@ -194,6 +195,7 @@ static void inject_signed(etcp_recv_fn recv_cb, struct UTUN_INSTANCE* inst,
|
||||
struct SVC_ROUTE_HDR* hdr = (struct SVC_ROUTE_HDR*)dgram;
|
||||
memset(hdr, 0, SVC_ROUTE_HDR_SIZE);
|
||||
hdr->cmd = ETCP_RT_ID_SVC_ROUTE;
|
||||
hdr->group_id = TOPO_GROUP_UTUN;
|
||||
hdr->dst_node_id = inst->node_id;
|
||||
hdr->src_node_id = src;
|
||||
hdr->seq = seq;
|
||||
@@ -282,7 +284,7 @@ static int test_conn_get_create(void) {
|
||||
struct UASYNC* ua; struct UTUN_INSTANCE inst; etcp_recv_fn recv_cb;
|
||||
SETUP();
|
||||
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c) FAIL("conn_get returned NULL");
|
||||
if (c->remote_node_id != TEST_REMOTE_NODE) FAIL("wrong remote_node_id");
|
||||
if (c->svc_id != TEST_SVC_ID) FAIL("wrong svc_id");
|
||||
@@ -305,14 +307,14 @@ static int test_conn_get_reuse(void) {
|
||||
struct UASYNC* ua; struct UTUN_INSTANCE inst; etcp_recv_fn recv_cb;
|
||||
SETUP();
|
||||
|
||||
struct ETCP_ROUTER_CONN* c1 = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c1 = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c1) FAIL("c1 NULL");
|
||||
struct ETCP_ROUTER_CONN* c2 = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c2 = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (c1 != c2) FAIL("reuse: different pointers");
|
||||
|
||||
struct ETCP_ROUTER_CONN* c3 = etcp_router_conn_get(&inst, TEST_REMOTE_NODE2, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c3 = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE2, TEST_SVC_ID);
|
||||
if (c3 == c1) FAIL("different remote, same pointer");
|
||||
struct ETCP_ROUTER_CONN* c4 = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID2);
|
||||
struct ETCP_ROUTER_CONN* c4 = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID2);
|
||||
if (c4 == c1) FAIL("different svc, same pointer");
|
||||
|
||||
etcp_router_conn_close(c1);
|
||||
@@ -328,11 +330,11 @@ static int test_conn_close(void) {
|
||||
struct UASYNC* ua; struct UTUN_INSTANCE inst; etcp_recv_fn recv_cb;
|
||||
SETUP();
|
||||
|
||||
struct ETCP_ROUTER_CONN* c1 = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c1 = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c1) FAIL("c1 NULL");
|
||||
c1->tx_seq = 99; // mark
|
||||
etcp_router_conn_close(c1);
|
||||
struct ETCP_ROUTER_CONN* c2 = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c2 = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c2) FAIL("c2 NULL");
|
||||
if (c2->tx_seq != 0 || c2->rx_seq != 0) FAIL("not fresh after close+reopen");
|
||||
|
||||
@@ -348,7 +350,7 @@ static int test_in_order(void) {
|
||||
TEST("in-order delivery (seq 0,1,2)");
|
||||
struct UASYNC* ua; struct UTUN_INSTANCE inst; etcp_recv_fn recv_cb;
|
||||
SETUP();
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c) FAIL("conn_get failed");
|
||||
|
||||
rx_reset(0xAA);
|
||||
@@ -371,7 +373,7 @@ static int test_out_of_order(void) {
|
||||
TEST("out-of-order (0,2,3 then 1 → assembly to 3)");
|
||||
struct UASYNC* ua; struct UTUN_INSTANCE inst; etcp_recv_fn recv_cb;
|
||||
SETUP();
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c) FAIL("conn_get failed");
|
||||
|
||||
rx_reset(0xBB);
|
||||
@@ -398,7 +400,7 @@ static int test_duplicate_same(void) {
|
||||
TEST("duplicate — same seq injected twice");
|
||||
struct UASYNC* ua; struct UTUN_INSTANCE inst; etcp_recv_fn recv_cb;
|
||||
SETUP();
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c) FAIL("conn_get failed");
|
||||
|
||||
rx_reset(0xCC);
|
||||
@@ -420,7 +422,7 @@ static int test_duplicate_past(void) {
|
||||
TEST("duplicate — past seq (already delivered)");
|
||||
struct UASYNC* ua; struct UTUN_INSTANCE inst; etcp_recv_fn recv_cb;
|
||||
SETUP();
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c) FAIL("conn_get failed");
|
||||
|
||||
rx_reset(0xDD);
|
||||
@@ -443,7 +445,7 @@ static int test_out_of_bounds(void) {
|
||||
TEST("out of bounds — seq too far ahead");
|
||||
struct UASYNC* ua; struct UTUN_INSTANCE inst; etcp_recv_fn recv_cb;
|
||||
SETUP();
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c) FAIL("conn_get failed");
|
||||
|
||||
rx_reset(0xEE);
|
||||
@@ -466,7 +468,7 @@ static int test_circular_wrap(void) {
|
||||
TEST("32-bit circular wrap-around");
|
||||
struct UASYNC* ua; struct UTUN_INSTANCE inst; etcp_recv_fn recv_cb;
|
||||
SETUP();
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c) FAIL("conn_get failed");
|
||||
|
||||
c->rx_seq = 0xFFFFFFFE;
|
||||
@@ -491,7 +493,7 @@ static int test_data_integrity(void) {
|
||||
TEST("data integrity — payload preserved");
|
||||
struct UASYNC* ua; struct UTUN_INSTANCE inst; etcp_recv_fn recv_cb;
|
||||
SETUP();
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c) FAIL("conn_get failed");
|
||||
|
||||
rx_reset(0x77);
|
||||
@@ -511,7 +513,7 @@ static int test_ack_receive(void) {
|
||||
TEST("ACK receive — tx_acked updated");
|
||||
struct UASYNC* ua; struct UTUN_INSTANCE inst; etcp_recv_fn recv_cb;
|
||||
SETUP();
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c) FAIL("conn_get failed");
|
||||
|
||||
rx_reset(0x00);
|
||||
@@ -532,7 +534,7 @@ static int test_ack_timer(void) {
|
||||
TEST("ACK timer scheduled on data receive");
|
||||
struct UASYNC* ua; struct UTUN_INSTANCE inst; etcp_recv_fn recv_cb;
|
||||
SETUP();
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c) FAIL("conn_get failed");
|
||||
|
||||
if (c->ack_timer != NULL) FAIL("ack_timer set before any data");
|
||||
@@ -554,7 +556,7 @@ static int test_send_q(void) {
|
||||
TEST("send_q — inflight full queues, not lost");
|
||||
struct UASYNC* ua; struct UTUN_INSTANCE inst; etcp_recv_fn recv_cb;
|
||||
SETUP();
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c) FAIL("conn_get failed");
|
||||
|
||||
// Simulate full inflight: set tx_acked far behind tx_seq
|
||||
@@ -594,7 +596,7 @@ static int test_loopback(void) {
|
||||
memcpy(e->dgram, buf, 4);
|
||||
e->len = 4;
|
||||
|
||||
if (etcp_route_send(&inst, inst.node_id, e, 0) != 0) FAIL("loopback send failed");
|
||||
if (etcp_route_send(&inst, TOPO_GROUP_UTUN, inst.node_id, e, 0) != 0) FAIL("loopback send failed");
|
||||
if (rx.delivered != 1) FAIL("loopback not delivered");
|
||||
if (rx.errors != 0) FAIL("loopback data mismatch");
|
||||
|
||||
@@ -607,7 +609,7 @@ static int test_timestamp(void) {
|
||||
TEST("last_dgram_ts updated on data");
|
||||
struct UASYNC* ua; struct UTUN_INSTANCE inst; etcp_recv_fn recv_cb;
|
||||
SETUP();
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c) FAIL("conn_get failed");
|
||||
|
||||
uint16_t before = c->last_dgram_ts;
|
||||
@@ -630,7 +632,7 @@ static int test_conn_send_no_bgp(void) {
|
||||
TEST("conn_send — no BGP returns error");
|
||||
struct UASYNC* ua; struct UTUN_INSTANCE inst; etcp_recv_fn recv_cb;
|
||||
SETUP();
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c) FAIL("conn_get failed");
|
||||
|
||||
uint8_t data[4] = { 1, 2, 3, 4 };
|
||||
@@ -669,7 +671,7 @@ static int test_rst_flag(void) {
|
||||
inject(recv_cb, &inst, TEST_REMOTE_NODE, TEST_SVC_ID, n, data + 1, 2, 0, ROUTER_FLAG_RST);
|
||||
if (g_notify_count != 1) FAIL("RST should notify service");
|
||||
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c) FAIL("new rconn should exist");
|
||||
etcp_router_conn_close(c);
|
||||
|
||||
@@ -733,7 +735,7 @@ static int test_sess_id_wrap(void) {
|
||||
uint8_t f3 = (3 << ROUTER_SESS_ID_SHIFT);
|
||||
rx_reset(0xD1);
|
||||
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c) FAIL("rconn not found");
|
||||
c->peer_sess_id = 3;
|
||||
|
||||
@@ -769,7 +771,7 @@ static int test_server_reinit(void) {
|
||||
recv_cb = inst.api_bindings.callbacks[ETCP_RT_ID_SVC_ROUTE];
|
||||
if (!recv_cb) FAIL("recv_cb not bound");
|
||||
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
struct ETCP_ROUTER_CONN* c = etcp_router_conn_get(&inst, TOPO_GROUP_UTUN, TEST_REMOTE_NODE, TEST_SVC_ID);
|
||||
if (!c) FAIL("rconn after reinit");
|
||||
if (c->start_sent != 0) FAIL("start_sent != 0 after reinit");
|
||||
if (c->sess_id != 0) FAIL("sess_id != 0 after reinit");
|
||||
@@ -868,6 +870,7 @@ static int test_sign_too_short(void) {
|
||||
struct SVC_ROUTE_HDR hdr;
|
||||
memset(&hdr, 0, sizeof(hdr));
|
||||
hdr.cmd = ETCP_RT_ID_SVC_ROUTE;
|
||||
hdr.group_id = TOPO_GROUP_UTUN;
|
||||
hdr.dst_node_id = inst.node_id;
|
||||
hdr.src_node_id = SIGNER_NODE;
|
||||
hdr.seq = 0;
|
||||
|
||||
@@ -307,7 +307,7 @@ static int test_provider_egress(void) {
|
||||
entry->dgram = dgram;
|
||||
entry->len = total;
|
||||
|
||||
int ret = etcp_route_send(inst_client, g_provider_node_id, entry, 0);
|
||||
int ret = etcp_route_send(inst_client, TOPO_GROUP_UTUN, g_provider_node_id, entry, 0);
|
||||
if (ret != 0) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_NAT, "etcp_route_send failed");
|
||||
queue_dgram_free(entry);
|
||||
@@ -476,7 +476,7 @@ static int test_full_roundtrip(void) {
|
||||
struct ll_entry* entry = queue_entry_new(0);
|
||||
entry->dgram = dgram;
|
||||
entry->len = total;
|
||||
int ret = etcp_route_send(inst_client, g_provider_node_id, entry, 0);
|
||||
int ret = etcp_route_send(inst_client, TOPO_GROUP_UTUN, g_provider_node_id, entry, 0);
|
||||
if (ret != 0) { DEBUG_ERROR(DEBUG_CATEGORY_NAT, "etcp_route_send failed"); queue_dgram_free(entry); queue_entry_free(entry); return 0; }
|
||||
|
||||
// Poll for provider to process egress
|
||||
|
||||
Reference in new issue
Block a user