diff options
Diffstat (limited to 'tools/testing/selftests/bpf/prog_tests/sockmap_basic.c')
| -rw-r--r-- | tools/testing/selftests/bpf/prog_tests/sockmap_basic.c | 79 | 
1 files changed, 79 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c b/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c new file mode 100644 index 000000000000..aa43e0bd210c --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (c) 2020 Cloudflare + +#include "test_progs.h" + +#define TCP_REPAIR		19	/* TCP sock is under repair right now */ + +#define TCP_REPAIR_ON		1 +#define TCP_REPAIR_OFF_NO_WP	-1	/* Turn off without window probes */ + +static int connected_socket_v4(void) +{ +	struct sockaddr_in addr = { +		.sin_family = AF_INET, +		.sin_port = htons(80), +		.sin_addr = { inet_addr("127.0.0.1") }, +	}; +	socklen_t len = sizeof(addr); +	int s, repair, err; + +	s = socket(AF_INET, SOCK_STREAM, 0); +	if (CHECK_FAIL(s == -1)) +		goto error; + +	repair = TCP_REPAIR_ON; +	err = setsockopt(s, SOL_TCP, TCP_REPAIR, &repair, sizeof(repair)); +	if (CHECK_FAIL(err)) +		goto error; + +	err = connect(s, (struct sockaddr *)&addr, len); +	if (CHECK_FAIL(err)) +		goto error; + +	repair = TCP_REPAIR_OFF_NO_WP; +	err = setsockopt(s, SOL_TCP, TCP_REPAIR, &repair, sizeof(repair)); +	if (CHECK_FAIL(err)) +		goto error; + +	return s; +error: +	perror(__func__); +	close(s); +	return -1; +} + +/* Create a map, populate it with one socket, and free the map. */ +static void test_sockmap_create_update_free(enum bpf_map_type map_type) +{ +	const int zero = 0; +	int s, map, err; + +	s = connected_socket_v4(); +	if (CHECK_FAIL(s == -1)) +		return; + +	map = bpf_create_map(map_type, sizeof(int), sizeof(int), 1, 0); +	if (CHECK_FAIL(map == -1)) { +		perror("bpf_create_map"); +		goto out; +	} + +	err = bpf_map_update_elem(map, &zero, &s, BPF_NOEXIST); +	if (CHECK_FAIL(err)) { +		perror("bpf_map_update"); +		goto out; +	} + +out: +	close(map); +	close(s); +} + +void test_sockmap_basic(void) +{ +	if (test__start_subtest("sockmap create_update_free")) +		test_sockmap_create_update_free(BPF_MAP_TYPE_SOCKMAP); +	if (test__start_subtest("sockhash create_update_free")) +		test_sockmap_create_update_free(BPF_MAP_TYPE_SOCKHASH); +}  | 
