1df7e0e0dSStefan Hajnoczi /* SPDX-License-Identifier: GPL-2.0-only */ 2df7e0e0dSStefan Hajnoczi #ifndef UTIL_H 3df7e0e0dSStefan Hajnoczi #define UTIL_H 4df7e0e0dSStefan Hajnoczi 59bb8a29dSStefan Hajnoczi #include <sys/socket.h> 69bb8a29dSStefan Hajnoczi #include <linux/vm_sockets.h> 79bb8a29dSStefan Hajnoczi 8df7e0e0dSStefan Hajnoczi /* Tests can either run as the client or the server */ 9df7e0e0dSStefan Hajnoczi enum test_mode { 10df7e0e0dSStefan Hajnoczi TEST_MODE_UNSET, 11df7e0e0dSStefan Hajnoczi TEST_MODE_CLIENT, 12df7e0e0dSStefan Hajnoczi TEST_MODE_SERVER 13df7e0e0dSStefan Hajnoczi }; 14df7e0e0dSStefan Hajnoczi 15df7e0e0dSStefan Hajnoczi /* Test runner options */ 16df7e0e0dSStefan Hajnoczi struct test_opts { 17df7e0e0dSStefan Hajnoczi enum test_mode mode; 18df7e0e0dSStefan Hajnoczi unsigned int peer_cid; 19df7e0e0dSStefan Hajnoczi }; 20df7e0e0dSStefan Hajnoczi 21df7e0e0dSStefan Hajnoczi /* A test case definition. Test functions must print failures to stderr and 22df7e0e0dSStefan Hajnoczi * terminate with exit(EXIT_FAILURE). 23df7e0e0dSStefan Hajnoczi */ 24df7e0e0dSStefan Hajnoczi struct test_case { 25df7e0e0dSStefan Hajnoczi const char *name; /* human-readable name */ 26df7e0e0dSStefan Hajnoczi 27df7e0e0dSStefan Hajnoczi /* Called when test mode is TEST_MODE_CLIENT */ 28df7e0e0dSStefan Hajnoczi void (*run_client)(const struct test_opts *opts); 29df7e0e0dSStefan Hajnoczi 30df7e0e0dSStefan Hajnoczi /* Called when test mode is TEST_MODE_SERVER */ 31df7e0e0dSStefan Hajnoczi void (*run_server)(const struct test_opts *opts); 325a2b2425SStefano Garzarella 335a2b2425SStefano Garzarella bool skip; 34df7e0e0dSStefan Hajnoczi }; 35df7e0e0dSStefan Hajnoczi 36df7e0e0dSStefan Hajnoczi void init_signals(void); 37df7e0e0dSStefan Hajnoczi unsigned int parse_cid(const char *str); 389bb8a29dSStefan Hajnoczi int vsock_stream_connect(unsigned int cid, unsigned int port); 3941b792d7SArseny Krasnov int vsock_seqpacket_connect(unsigned int cid, unsigned int port); 409bb8a29dSStefan Hajnoczi int vsock_stream_accept(unsigned int cid, unsigned int port, 419bb8a29dSStefan Hajnoczi struct sockaddr_vm *clientaddrp); 4241b792d7SArseny Krasnov int vsock_seqpacket_accept(unsigned int cid, unsigned int port, 4341b792d7SArseny Krasnov struct sockaddr_vm *clientaddrp); 44770ce007SStefano Garzarella void vsock_wait_remote_close(int fd); 45092f32aeSStefan Hajnoczi void send_byte(int fd, int expected_ret, int flags); 46092f32aeSStefan Hajnoczi void recv_byte(int fd, int expected_ret, int flags); 47df7e0e0dSStefan Hajnoczi void run_tests(const struct test_case *test_cases, 48df7e0e0dSStefan Hajnoczi const struct test_opts *opts); 495a2b2425SStefano Garzarella void list_tests(const struct test_case *test_cases); 505a2b2425SStefano Garzarella void skip_test(struct test_case *test_cases, size_t test_cases_len, 515a2b2425SStefano Garzarella const char *test_id_str); 52*5c338112SArseniy Krasnov unsigned long hash_djb2(const void *data, size_t len); 53df7e0e0dSStefan Hajnoczi #endif /* UTIL_H */ 54