2019-03-01 19:42:13 -08:00
/* SPDX-License-Identifier: GPL-2.0 */
# include <stdio.h>
# include <unistd.h>
# include <errno.h>
# include <string.h>
# include <assert.h>
# include <stdlib.h>
# include <stdarg.h>
# include <time.h>
# include <signal.h>
# include <linux/types.h>
typedef __u16 __sum16 ;
# include <arpa/inet.h>
# include <linux/if_ether.h>
# include <linux/if_packet.h>
# include <linux/ip.h>
# include <linux/ipv6.h>
# include <linux/tcp.h>
# include <linux/filter.h>
# include <linux/perf_event.h>
# include <linux/unistd.h>
# include <sys/ioctl.h>
# include <sys/wait.h>
# include <sys/types.h>
# include <sys/time.h>
# include <fcntl.h>
# include <pthread.h>
# include <linux/bpf.h>
# include <linux/err.h>
# include <bpf/bpf.h>
# include <bpf/libbpf.h>
# include "test_iptunnel_common.h"
# include "bpf_util.h"
# include "bpf_endian.h"
# include "trace_helpers.h"
# include "flow_dissector_load.h"
selftests/bpf: add sub-tests support for test_progs
Allow tests to have their own set of sub-tests. Also add ability to do
test/subtest selection using `-t <test-name>/<subtest-name>` and `-n
<test-nums-set>/<subtest-nums-set>`, as an extension of existing -t/-n
selector options. For the <test-num-set> format: it's a comma-separated
list of either individual test numbers (1-based), or range of test
numbers. E.g., all of the following are valid sets of test numbers:
- 10
- 1,2,3
- 1-3
- 5-10,1,3-4
'/<subtest' part is optional, but has the same format. E.g., to select
test #3 and its sub-tests #10 through #15, use: -t 3/10-15.
Similarly, to select tests by name, use `-t verif/strobe`:
$ sudo ./test_progs -t verif/strobe
#3/12 strobemeta.o:OK
#3/13 strobemeta_nounroll1.o:OK
#3/14 strobemeta_nounroll2.o:OK
#3 bpf_verif_scale:OK
Summary: 1/3 PASSED, 0 FAILED
Example of using subtest API is in the next patch, converting
bpf_verif_scale.c tests to use sub-tests.
Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
2019-07-27 20:25:29 -07:00
struct test_selector {
const char * name ;
bool * num_set ;
int num_set_len ;
} ;
2019-07-27 20:25:28 -07:00
struct test_env {
selftests/bpf: add sub-tests support for test_progs
Allow tests to have their own set of sub-tests. Also add ability to do
test/subtest selection using `-t <test-name>/<subtest-name>` and `-n
<test-nums-set>/<subtest-nums-set>`, as an extension of existing -t/-n
selector options. For the <test-num-set> format: it's a comma-separated
list of either individual test numbers (1-based), or range of test
numbers. E.g., all of the following are valid sets of test numbers:
- 10
- 1,2,3
- 1-3
- 5-10,1,3-4
'/<subtest' part is optional, but has the same format. E.g., to select
test #3 and its sub-tests #10 through #15, use: -t 3/10-15.
Similarly, to select tests by name, use `-t verif/strobe`:
$ sudo ./test_progs -t verif/strobe
#3/12 strobemeta.o:OK
#3/13 strobemeta_nounroll1.o:OK
#3/14 strobemeta_nounroll2.o:OK
#3 bpf_verif_scale:OK
Summary: 1/3 PASSED, 0 FAILED
Example of using subtest API is in the next patch, converting
bpf_verif_scale.c tests to use sub-tests.
Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
2019-07-27 20:25:29 -07:00
struct test_selector test_selector ;
struct test_selector subtest_selector ;
2019-07-27 20:25:28 -07:00
bool verifier_stats ;
bool verbose ;
bool very_verbose ;
bool jit_enabled ;
struct prog_test_def * test ;
2019-08-06 10:45:27 -07:00
FILE * stdout ;
FILE * stderr ;
2019-07-27 20:25:28 -07:00
char * log_buf ;
size_t log_cnt ;
selftests/bpf: add sub-tests support for test_progs
Allow tests to have their own set of sub-tests. Also add ability to do
test/subtest selection using `-t <test-name>/<subtest-name>` and `-n
<test-nums-set>/<subtest-nums-set>`, as an extension of existing -t/-n
selector options. For the <test-num-set> format: it's a comma-separated
list of either individual test numbers (1-based), or range of test
numbers. E.g., all of the following are valid sets of test numbers:
- 10
- 1,2,3
- 1-3
- 5-10,1,3-4
'/<subtest' part is optional, but has the same format. E.g., to select
test #3 and its sub-tests #10 through #15, use: -t 3/10-15.
Similarly, to select tests by name, use `-t verif/strobe`:
$ sudo ./test_progs -t verif/strobe
#3/12 strobemeta.o:OK
#3/13 strobemeta_nounroll1.o:OK
#3/14 strobemeta_nounroll2.o:OK
#3 bpf_verif_scale:OK
Summary: 1/3 PASSED, 0 FAILED
Example of using subtest API is in the next patch, converting
bpf_verif_scale.c tests to use sub-tests.
Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
2019-07-27 20:25:29 -07:00
int succ_cnt ; /* successful tests */
int sub_succ_cnt ; /* successful sub-tests */
int fail_cnt ; /* total failed tests + sub-tests */
2019-08-21 16:44:24 -07:00
int skip_cnt ; /* skipped tests */
2019-07-27 20:25:28 -07:00
} ;
extern struct test_env env ;
extern void test__force_log ( ) ;
selftests/bpf: add sub-tests support for test_progs
Allow tests to have their own set of sub-tests. Also add ability to do
test/subtest selection using `-t <test-name>/<subtest-name>` and `-n
<test-nums-set>/<subtest-nums-set>`, as an extension of existing -t/-n
selector options. For the <test-num-set> format: it's a comma-separated
list of either individual test numbers (1-based), or range of test
numbers. E.g., all of the following are valid sets of test numbers:
- 10
- 1,2,3
- 1-3
- 5-10,1,3-4
'/<subtest' part is optional, but has the same format. E.g., to select
test #3 and its sub-tests #10 through #15, use: -t 3/10-15.
Similarly, to select tests by name, use `-t verif/strobe`:
$ sudo ./test_progs -t verif/strobe
#3/12 strobemeta.o:OK
#3/13 strobemeta_nounroll1.o:OK
#3/14 strobemeta_nounroll2.o:OK
#3 bpf_verif_scale:OK
Summary: 1/3 PASSED, 0 FAILED
Example of using subtest API is in the next patch, converting
bpf_verif_scale.c tests to use sub-tests.
Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
2019-07-27 20:25:29 -07:00
extern bool test__start_subtest ( const char * name ) ;
2019-08-21 16:44:24 -07:00
extern void test__skip ( void ) ;
2019-08-21 16:44:25 -07:00
extern void test__fail ( void ) ;
2019-03-01 19:42:13 -08:00
# define MAGIC_BYTES 123
/* ipv4 test vector */
struct ipv4_packet {
struct ethhdr eth ;
struct iphdr iph ;
struct tcphdr tcp ;
} __packed ;
extern struct ipv4_packet pkt_v4 ;
/* ipv6 test vector */
struct ipv6_packet {
struct ethhdr eth ;
struct ipv6hdr iph ;
struct tcphdr tcp ;
} __packed ;
extern struct ipv6_packet pkt_v6 ;
# define _CHECK(condition, tag, duration, format...) ({ \
int __ret = ! ! ( condition ) ; \
if ( __ret ) { \
2019-08-21 16:44:25 -07:00
test__fail ( ) ; \
2019-08-06 10:45:28 -07:00
printf ( " %s:FAIL:%s " , __func__ , tag ) ; \
printf ( format ) ; \
2019-03-01 19:42:13 -08:00
} else { \
2019-08-06 10:45:28 -07:00
printf ( " %s:PASS:%s %d nsec \n " , \
__func__ , tag , duration ) ; \
2019-03-01 19:42:13 -08:00
} \
__ret ; \
} )
2019-08-21 16:44:25 -07:00
# define CHECK_FAIL(condition) ({ \
int __ret = ! ! ( condition ) ; \
if ( __ret ) { \
test__fail ( ) ; \
2019-08-30 19:34:27 -07:00
printf ( " %s:FAIL:%d \n " , __func__ , __LINE__ ) ; \
2019-08-21 16:44:25 -07:00
} \
__ret ; \
} )
2019-03-01 19:42:13 -08:00
# define CHECK(condition, tag, format...) \
_CHECK ( condition , tag , duration , format )
# define CHECK_ATTR(condition, tag, format...) \
_CHECK ( condition , tag , tattr . duration , format )
2019-03-01 19:42:15 -08:00
# define MAGIC_VAL 0x1234
# define NUM_ITER 100000
# define VIP_NUM 5
2019-03-01 19:42:19 -08:00
static inline __u64 ptr_to_u64 ( const void * ptr )
{
return ( __u64 ) ( unsigned long ) ptr ;
}
2019-03-01 19:42:13 -08:00
int bpf_find_map ( const char * test , struct bpf_object * obj , const char * name ) ;
2019-03-01 19:42:16 -08:00
int compare_map_keys ( int map1_fd , int map2_fd ) ;
int compare_stack_ips ( int smap_fd , int amap_fd , int stack_trace_len ) ;
int extract_build_id ( char * build_id , size_t size ) ;
2019-03-01 19:42:18 -08:00
void * spin_lock_thread ( void * arg ) ;
2019-07-16 14:58:27 +02:00
# ifdef __x86_64__
# define SYS_NANOSLEEP_KPROBE_NAME "__x64_sys_nanosleep"
# elif defined(__s390x__)
# define SYS_NANOSLEEP_KPROBE_NAME "__s390x_sys_nanosleep"
# else
# define SYS_NANOSLEEP_KPROBE_NAME "sys_nanosleep"
# endif