xref: /openbmc/linux/tools/testing/vsock/util.h (revision 5c338112)
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