#ifndef UTUN_TEST_SOCKET_API_H #define UTUN_TEST_SOCKET_API_H #include #include struct utun_test_packet { uint8_t* data; size_t len; struct sockaddr_storage addr; socklen_t addrlen; struct utun_test_packet* next; }; struct utun_test_packet_queue { struct utun_test_packet* head; struct utun_test_packet* tail; size_t count; }; struct utun_test_socket_api { struct utun_test_packet_queue send_queue; struct utun_test_packet_queue recv_queue; ssize_t (*on_send)(const uint8_t* data, size_t len, const struct sockaddr* dest_addr, socklen_t dest_addrlen, void* user_data); ssize_t (*on_recv)(uint8_t* buffer, size_t buffer_size, struct sockaddr* src_addr, socklen_t* src_addrlen, void* user_data); void* user_data; }; void utun_test_packet_queue_init(struct utun_test_packet_queue* queue); void utun_test_packet_queue_cleanup(struct utun_test_packet_queue* queue); void utun_test_packet_queue_push(struct utun_test_packet_queue* queue, const uint8_t* data, size_t len, const struct sockaddr* addr, socklen_t addrlen); struct utun_test_packet* utun_test_packet_queue_pop(struct utun_test_packet_queue* queue); size_t utun_test_packet_queue_count(struct utun_test_packet_queue* queue); ssize_t utun_test_default_on_send(const uint8_t* data, size_t len, const struct sockaddr* dest_addr, socklen_t dest_addrlen, void* user_data); ssize_t utun_test_default_on_recv(uint8_t* buffer, size_t buffer_size, struct sockaddr* src_addr, socklen_t* src_addrlen, void* user_data); #endif