Browse Source

Fix test_etcp_api: use single callback with connection check

etcp_bind uses global table - multiple binds with same ID overwrite.
Fixed by using single recv_callback that checks conn pointer:
- conn == server_conn: forward direction (client->server)
- conn == client_conn: backward direction (server->client)

Test now passes: All 100 packets transmitted in each direction.
nodeinfo-routing-update
Evgeny 8 months ago
parent
commit
7a1f160094
  1. 75
      tests/test_etcp_api.c

75
tests/test_etcp_api.c

@ -154,12 +154,11 @@ static int verify_packet_data(uint8_t* buffer, int size, int expected_seq) {
return 1; return 1;
} }
// Callback для получения пакетов на сервере (forward direction) // Универсальный callback для получения пакетов
static void server_recv_callback(struct ETCP_CONN* conn, struct ll_entry* entry) { // Определяет направление по соединению (client_conn vs server_conn)
(void)conn; static void recv_callback(struct ETCP_CONN* conn, struct ll_entry* entry) {
if (!entry || !entry->dgram || entry->len < PACKET_HEADER_SIZE + 1) { if (!entry || !entry->dgram || entry->len < PACKET_HEADER_SIZE + 1) {
DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "Server received invalid packet"); DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "Received invalid packet");
if (entry) { if (entry) {
queue_entry_free(entry); queue_entry_free(entry);
queue_dgram_free(entry); queue_dgram_free(entry);
@ -167,40 +166,27 @@ static void server_recv_callback(struct ETCP_CONN* conn, struct ll_entry* entry)
return; return;
} }
// Verify packet with strict sequence checking // Определяем направление по соединению
if (verify_packet_data(entry->dgram, entry->len, packets_received_fwd)) { if (conn == server_conn) {
packets_received_fwd++; // Пакет пришел на сервер (forward direction: client->server)
} else { if (verify_packet_data(entry->dgram, entry->len, packets_received_fwd)) {
int seq = entry->dgram[1] | (entry->dgram[2] << 8); packets_received_fwd++;
DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "Server packet verification failed, seq=%d, expected=%d", } else {
seq, packets_received_fwd); int seq = entry->dgram[1] | (entry->dgram[2] << 8);
} DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "Server packet verification failed, seq=%d, expected=%d",
seq, packets_received_fwd);
// Освобождаем entry и dgram }
queue_entry_free(entry); } else if (conn == client_conn) {
queue_dgram_free(entry); // Пакет пришел на клиент (backward direction: server->client)
} if (verify_packet_data(entry->dgram, entry->len, packets_received_back)) {
packets_received_back++;
// Callback для получения пакетов на клиенте (backward direction) } else {
static void client_recv_callback(struct ETCP_CONN* conn, struct ll_entry* entry) { int seq = entry->dgram[1] | (entry->dgram[2] << 8);
(void)conn; DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "Client packet verification failed, seq=%d, expected=%d",
seq, packets_received_back);
if (!entry || !entry->dgram || entry->len < PACKET_HEADER_SIZE + 1) {
DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "Client received invalid packet");
if (entry) {
queue_entry_free(entry);
queue_dgram_free(entry);
} }
return;
}
// Verify packet with strict sequence checking
if (verify_packet_data(entry->dgram, entry->len, packets_received_back)) {
packets_received_back++;
} else { } else {
int seq = entry->dgram[1] | (entry->dgram[2] << 8); DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "Unknown connection %p", (void*)conn);
DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "Client packet verification failed, seq=%d, expected=%d",
seq, packets_received_back);
} }
// Освобождаем entry и dgram // Освобождаем entry и dgram
@ -486,21 +472,14 @@ int main() {
// Инициализация ETCP API // Инициализация ETCP API
etcp_api_init(); etcp_api_init();
// Регистрируем callbacks для получения пакетов // Регистрируем callback для получения пакетов (один на все соединения)
if (etcp_bind(DATA_PACKET_ID, server_recv_callback) != 0) { if (etcp_bind(DATA_PACKET_ID, recv_callback) != 0) {
printf("Failed to bind server callback\n"); printf("Failed to bind callback\n");
etcp_api_deinit();
return 1;
}
if (etcp_bind(DATA_PACKET_ID, client_recv_callback) != 0) {
printf("Failed to bind client callback\n");
etcp_unbind(DATA_PACKET_ID);
etcp_api_deinit(); etcp_api_deinit();
return 1; return 1;
} }
printf("Callbacks registered for ID=%d\n", DATA_PACKET_ID); printf("Callback registered for ID=%d\n", DATA_PACKET_ID);
printf("Creating server...\n"); printf("Creating server...\n");
ua = uasync_create(); ua = uasync_create();

Loading…
Cancel
Save