#ifndef TEST_UDP_SOCKET_H #define TEST_UDP_SOCKET_H #include #include #include #include #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