- Fixed incorrect init_connections() call in test_etcp_simple_traffic.c (was calling server_instance instead of client_instance) - Fixed double free in timeout_heap_pop() when handling deleted elements - Enhanced NULL pointer safety in uasync_print_resources() by removing complex heap manipulation - Added debug logging to timeout_heap_pop() for better error tracking Test results: test_etcp_simple_traffic now passes without double free errors
101 lines
3.5 KiB
C
Executable File
101 lines
3.5 KiB
C
Executable File
#ifndef TEST_UDP_SOCKET_H
|
|
#define TEST_UDP_SOCKET_H
|
|
|
|
#include <sys/socket.h>
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
#include <stdbool.h>
|
|
|
|
#define TEST_UDP_MAX_PACKET_SIZE 65536
|
|
#define TEST_UDP_MAX_QUEUE_SIZE 1000
|
|
|
|
// Test UDP packet structure
|
|
struct test_udp_packet {
|
|
uint8_t* data;
|
|
size_t len;
|
|
struct sockaddr_storage addr;
|
|
socklen_t addr_len;
|
|
struct test_udp_packet* next;
|
|
};
|
|
|
|
// Virtual UDP socket for testing
|
|
struct test_udp_socket {
|
|
int fd; // Virtual file descriptor
|
|
int family; // Address family (AF_INET or AF_INET6)
|
|
struct sockaddr_storage local_addr;
|
|
bool bound;
|
|
bool nonblocking;
|
|
|
|
// Receive queue (packets waiting to be read)
|
|
struct test_udp_packet* recv_queue_head;
|
|
struct test_udp_packet* recv_queue_tail;
|
|
size_t recv_queue_size;
|
|
|
|
// Statistics
|
|
struct {
|
|
size_t packets_sent;
|
|
size_t packets_received;
|
|
size_t bytes_sent;
|
|
size_t bytes_received;
|
|
size_t send_errors;
|
|
size_t recv_errors;
|
|
} stats;
|
|
|
|
// Callback for outgoing packets
|
|
void (*packet_sent)(const uint8_t* data, size_t len,
|
|
const struct sockaddr* dest_addr, socklen_t addr_len,
|
|
void* context);
|
|
|
|
void* context;
|
|
};
|
|
|
|
// Create virtual UDP socket
|
|
struct test_udp_socket* test_udp_socket_create(int family);
|
|
|
|
// Destroy virtual UDP socket
|
|
void test_udp_socket_destroy(struct test_udp_socket* sock);
|
|
|
|
// Bind virtual socket
|
|
int test_udp_socket_bind(struct test_udp_socket* sock, const struct sockaddr* addr, socklen_t len);
|
|
|
|
// Set socket options (limited implementation for testing)
|
|
int test_udp_socket_setsockopt(struct test_udp_socket* sock, int level, int optname,
|
|
const void *optval, socklen_t optlen);
|
|
|
|
// Get socket options
|
|
int test_udp_socket_getsockopt(struct test_udp_socket* sock, int level, int optname,
|
|
void *optval, socklen_t *optlen);
|
|
|
|
// Set non-blocking mode
|
|
int test_udp_socket_set_nonblocking(struct test_udp_socket* sock, bool nonblocking);
|
|
|
|
// Send packet using virtual socket
|
|
ssize_t test_udp_socket_sendto(struct test_udp_socket* sock, const void *buf, size_t len, int flags,
|
|
const struct sockaddr *dest_addr, socklen_t addr_len);
|
|
|
|
// Receive packet from virtual socket
|
|
ssize_t test_udp_socket_recvfrom(struct test_udp_socket* sock, void *buf, size_t len, int flags,
|
|
struct sockaddr *src_addr, socklen_t *addr_len);
|
|
|
|
// Inject packet into receive queue (simulates incoming packet)
|
|
int test_udp_socket_inject(struct test_udp_socket* sock,
|
|
const uint8_t* data, size_t len,
|
|
const struct sockaddr* src_addr, socklen_t addr_len);
|
|
|
|
// Get virtual socket file descriptor
|
|
int test_udp_socket_get_fd(struct test_udp_socket* sock);
|
|
|
|
// Get socket statistics
|
|
void test_udp_socket_get_stats(struct test_udp_socket* sock, size_t* packets_sent,
|
|
size_t* packets_received, size_t* bytes_sent,
|
|
size_t* bytes_received, size_t* send_errors, size_t* recv_errors);
|
|
|
|
// Reset socket statistics
|
|
void test_udp_socket_reset_stats(struct test_udp_socket* sock);
|
|
|
|
// Global virtual socket registry for fd-based operations
|
|
struct test_udp_socket* test_udp_socket_find_by_fd(int fd);
|
|
void test_udp_socket_register(struct test_udp_socket* sock);
|
|
void test_udp_socket_unregister(struct test_udp_socket* sock);
|
|
|
|
#endif // TEST_UDP_SOCKET_H
|