diff options
Diffstat (limited to 'tools/testing/selftests/bpf/prog_tests')
| -rw-r--r-- | tools/testing/selftests/bpf/prog_tests/fexit_sleep.c | 8 | ||||
| -rw-r--r-- | tools/testing/selftests/bpf/prog_tests/sockmap_listen.c | 85 | ||||
| -rw-r--r-- | tools/testing/selftests/bpf/prog_tests/xdp_metadata.c | 3 | 
3 files changed, 68 insertions, 28 deletions
| diff --git a/tools/testing/selftests/bpf/prog_tests/fexit_sleep.c b/tools/testing/selftests/bpf/prog_tests/fexit_sleep.c index f949647dbbc2..552a0875ca6d 100644 --- a/tools/testing/selftests/bpf/prog_tests/fexit_sleep.c +++ b/tools/testing/selftests/bpf/prog_tests/fexit_sleep.c @@ -21,13 +21,13 @@ static int do_sleep(void *skel)  }  #define STACK_SIZE (1024 * 1024) -static char child_stack[STACK_SIZE];  void test_fexit_sleep(void)  {  	struct fexit_sleep_lskel *fexit_skel = NULL;  	int wstatus, duration = 0;  	pid_t cpid; +	char *child_stack = NULL;  	int err, fexit_cnt;  	fexit_skel = fexit_sleep_lskel__open_and_load(); @@ -38,6 +38,11 @@ void test_fexit_sleep(void)  	if (CHECK(err, "fexit_attach", "fexit attach failed: %d\n", err))  		goto cleanup; +	child_stack = mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | +			   MAP_ANONYMOUS | MAP_STACK, -1, 0); +	if (!ASSERT_NEQ(child_stack, MAP_FAILED, "mmap")) +		goto cleanup; +  	cpid = clone(do_sleep, child_stack + STACK_SIZE, CLONE_FILES | SIGCHLD, fexit_skel);  	if (CHECK(cpid == -1, "clone", "%s\n", strerror(errno)))  		goto cleanup; @@ -78,5 +83,6 @@ void test_fexit_sleep(void)  		goto cleanup;  cleanup: +	munmap(child_stack, STACK_SIZE);  	fexit_sleep_lskel__destroy(fexit_skel);  } diff --git a/tools/testing/selftests/bpf/prog_tests/sockmap_listen.c b/tools/testing/selftests/bpf/prog_tests/sockmap_listen.c index e91b59366030..9ce0e0e0b7da 100644 --- a/tools/testing/selftests/bpf/prog_tests/sockmap_listen.c +++ b/tools/testing/selftests/bpf/prog_tests/sockmap_listen.c @@ -29,6 +29,8 @@  #include "sockmap_helpers.h" +#define NO_FLAGS 0 +  static void test_insert_invalid(struct test_sockmap_listen *skel __always_unused,  				int family, int sotype, int mapfd)  { @@ -1376,7 +1378,8 @@ static void test_redir(struct test_sockmap_listen *skel, struct bpf_map *map,  static void pairs_redir_to_connected(int cli0, int peer0, int cli1, int peer1,  				     int sock_mapfd, int nop_mapfd, -				     int verd_mapfd, enum redir_mode mode) +				     int verd_mapfd, enum redir_mode mode, +				     int send_flags)  {  	const char *log_prefix = redir_mode_str(mode);  	unsigned int pass; @@ -1396,12 +1399,11 @@ static void pairs_redir_to_connected(int cli0, int peer0, int cli1, int peer1,  			return;  	} -	n = write(cli1, "a", 1); -	if (n < 0) -		FAIL_ERRNO("%s: write", log_prefix); -	if (n == 0) -		FAIL("%s: incomplete write", log_prefix); -	if (n < 1) +	/* Last byte is OOB data when send_flags has MSG_OOB bit set */ +	n = xsend(cli1, "ab", 2, send_flags); +	if (n >= 0 && n < 2) +		FAIL("%s: incomplete send", log_prefix); +	if (n < 2)  		return;  	key = SK_PASS; @@ -1416,6 +1418,25 @@ static void pairs_redir_to_connected(int cli0, int peer0, int cli1, int peer1,  		FAIL_ERRNO("%s: recv_timeout", log_prefix);  	if (n == 0)  		FAIL("%s: incomplete recv", log_prefix); + +	if (send_flags & MSG_OOB) { +		/* Check that we can't read OOB while in sockmap */ +		errno = 0; +		n = recv(peer1, &b, 1, MSG_OOB | MSG_DONTWAIT); +		if (n != -1 || errno != EOPNOTSUPP) +			FAIL("%s: recv(MSG_OOB): expected EOPNOTSUPP: retval=%d errno=%d", +			     log_prefix, n, errno); + +		/* Remove peer1 from sockmap */ +		xbpf_map_delete_elem(sock_mapfd, &(int){ 1 }); + +		/* Check that OOB was dropped on redirect */ +		errno = 0; +		n = recv(peer1, &b, 1, MSG_OOB | MSG_DONTWAIT); +		if (n != -1 || errno != EINVAL) +			FAIL("%s: recv(MSG_OOB): expected EINVAL: retval=%d errno=%d", +			     log_prefix, n, errno); +	}  }  static void unix_redir_to_connected(int sotype, int sock_mapfd, @@ -1432,7 +1453,8 @@ static void unix_redir_to_connected(int sotype, int sock_mapfd,  		goto close0;  	c1 = sfd[0], p1 = sfd[1]; -	pairs_redir_to_connected(c0, p0, c1, p1, sock_mapfd, -1, verd_mapfd, mode); +	pairs_redir_to_connected(c0, p0, c1, p1, sock_mapfd, -1, verd_mapfd, +				 mode, NO_FLAGS);  	xclose(c1);  	xclose(p1); @@ -1722,7 +1744,8 @@ static void udp_redir_to_connected(int family, int sock_mapfd, int verd_mapfd,  	if (err)  		goto close_cli0; -	pairs_redir_to_connected(c0, p0, c1, p1, sock_mapfd, -1, verd_mapfd, mode); +	pairs_redir_to_connected(c0, p0, c1, p1, sock_mapfd, -1, verd_mapfd, +				 mode, NO_FLAGS);  	xclose(c1);  	xclose(p1); @@ -1780,7 +1803,8 @@ static void inet_unix_redir_to_connected(int family, int type, int sock_mapfd,  	if (err)  		goto close; -	pairs_redir_to_connected(c0, p0, c1, p1, sock_mapfd, -1, verd_mapfd, mode); +	pairs_redir_to_connected(c0, p0, c1, p1, sock_mapfd, -1, verd_mapfd, +				 mode, NO_FLAGS);  	xclose(c1);  	xclose(p1); @@ -1815,10 +1839,9 @@ static void inet_unix_skb_redir_to_connected(struct test_sockmap_listen *skel,  	xbpf_prog_detach2(verdict, sock_map, BPF_SK_SKB_VERDICT);  } -static void unix_inet_redir_to_connected(int family, int type, -					int sock_mapfd, int nop_mapfd, -					int verd_mapfd, -					enum redir_mode mode) +static void unix_inet_redir_to_connected(int family, int type, int sock_mapfd, +					 int nop_mapfd, int verd_mapfd, +					 enum redir_mode mode, int send_flags)  {  	int c0, c1, p0, p1;  	int sfd[2]; @@ -1828,19 +1851,18 @@ static void unix_inet_redir_to_connected(int family, int type,  	if (err)  		return; -	if (socketpair(AF_UNIX, SOCK_DGRAM | SOCK_NONBLOCK, 0, sfd)) +	if (socketpair(AF_UNIX, type | SOCK_NONBLOCK, 0, sfd))  		goto close_cli0;  	c1 = sfd[0], p1 = sfd[1]; -	pairs_redir_to_connected(c0, p0, c1, p1, -				 sock_mapfd, nop_mapfd, verd_mapfd, mode); +	pairs_redir_to_connected(c0, p0, c1, p1, sock_mapfd, nop_mapfd, +				 verd_mapfd, mode, send_flags);  	xclose(c1);  	xclose(p1);  close_cli0:  	xclose(c0);  	xclose(p0); -  }  static void unix_inet_skb_redir_to_connected(struct test_sockmap_listen *skel, @@ -1859,31 +1881,42 @@ static void unix_inet_skb_redir_to_connected(struct test_sockmap_listen *skel,  	skel->bss->test_ingress = false;  	unix_inet_redir_to_connected(family, SOCK_DGRAM,  				     sock_map, -1, verdict_map, -				     REDIR_EGRESS); +				     REDIR_EGRESS, NO_FLAGS);  	unix_inet_redir_to_connected(family, SOCK_DGRAM,  				     sock_map, -1, verdict_map, -				     REDIR_EGRESS); +				     REDIR_EGRESS, NO_FLAGS);  	unix_inet_redir_to_connected(family, SOCK_DGRAM,  				     sock_map, nop_map, verdict_map, -				     REDIR_EGRESS); +				     REDIR_EGRESS, NO_FLAGS); +	unix_inet_redir_to_connected(family, SOCK_STREAM, +				     sock_map, nop_map, verdict_map, +				     REDIR_EGRESS, NO_FLAGS); + +	/* MSG_OOB not supported by AF_UNIX SOCK_DGRAM */  	unix_inet_redir_to_connected(family, SOCK_STREAM,  				     sock_map, nop_map, verdict_map, -				     REDIR_EGRESS); +				     REDIR_EGRESS, MSG_OOB); +  	skel->bss->test_ingress = true;  	unix_inet_redir_to_connected(family, SOCK_DGRAM,  				     sock_map, -1, verdict_map, -				     REDIR_INGRESS); +				     REDIR_INGRESS, NO_FLAGS);  	unix_inet_redir_to_connected(family, SOCK_STREAM,  				     sock_map, -1, verdict_map, -				     REDIR_INGRESS); +				     REDIR_INGRESS, NO_FLAGS);  	unix_inet_redir_to_connected(family, SOCK_DGRAM,  				     sock_map, nop_map, verdict_map, -				     REDIR_INGRESS); +				     REDIR_INGRESS, NO_FLAGS); +	unix_inet_redir_to_connected(family, SOCK_STREAM, +				     sock_map, nop_map, verdict_map, +				     REDIR_INGRESS, NO_FLAGS); + +	/* MSG_OOB not supported by AF_UNIX SOCK_DGRAM */  	unix_inet_redir_to_connected(family, SOCK_STREAM,  				     sock_map, nop_map, verdict_map, -				     REDIR_INGRESS); +				     REDIR_INGRESS, MSG_OOB);  	xbpf_prog_detach2(verdict, sock_map, BPF_SK_SKB_VERDICT);  } diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_metadata.c b/tools/testing/selftests/bpf/prog_tests/xdp_metadata.c index f76b5d67a3ee..c87ee2bf558c 100644 --- a/tools/testing/selftests/bpf/prog_tests/xdp_metadata.c +++ b/tools/testing/selftests/bpf/prog_tests/xdp_metadata.c @@ -68,7 +68,8 @@ static int open_xsk(int ifindex, struct xsk *xsk)  		.fill_size = XSK_RING_PROD__DEFAULT_NUM_DESCS,  		.comp_size = XSK_RING_CONS__DEFAULT_NUM_DESCS,  		.frame_size = XSK_UMEM__DEFAULT_FRAME_SIZE, -		.flags = XDP_UMEM_UNALIGNED_CHUNK_FLAG | XDP_UMEM_TX_SW_CSUM, +		.flags = XDP_UMEM_UNALIGNED_CHUNK_FLAG | XDP_UMEM_TX_SW_CSUM | +			 XDP_UMEM_TX_METADATA_LEN,  		.tx_metadata_len = sizeof(struct xsk_tx_metadata),  	};  	__u32 idx; |