@@ -70,7 +70,7 @@ static struct {
70
70
.tcp .urg_ptr = 123 ,
71
71
};
72
72
73
- #define CHECK (condition , tag , format ...) ({ \
73
+ #define _CHECK (condition , tag , duration , format ...) ({ \
74
74
int __ret = !!(condition); \
75
75
if (__ret) { \
76
76
error_cnt++; \
@@ -83,6 +83,11 @@ static struct {
83
83
__ret; \
84
84
})
85
85
86
+ #define CHECK (condition , tag , format ...) \
87
+ _CHECK(condition, tag, duration, format)
88
+ #define CHECK_ATTR (condition , tag , format ...) \
89
+ _CHECK(condition, tag, tattr.duration, format)
90
+
86
91
static int bpf_find_map (const char * test , struct bpf_object * obj ,
87
92
const char * name )
88
93
{
@@ -124,6 +129,53 @@ static void test_pkt_access(void)
124
129
bpf_object__close (obj );
125
130
}
126
131
132
+ static void test_prog_run_xattr (void )
133
+ {
134
+ const char * file = "./test_pkt_access.o" ;
135
+ struct bpf_object * obj ;
136
+ char buf [10 ];
137
+ int err ;
138
+ struct bpf_prog_test_run_attr tattr = {
139
+ .repeat = 1 ,
140
+ .data_in = & pkt_v4 ,
141
+ .data_size_in = sizeof (pkt_v4 ),
142
+ .data_out = buf ,
143
+ .data_size_out = 5 ,
144
+ };
145
+
146
+ err = bpf_prog_load (file , BPF_PROG_TYPE_SCHED_CLS , & obj ,
147
+ & tattr .prog_fd );
148
+ if (CHECK_ATTR (err , "load" , "err %d errno %d\n" , err , errno ))
149
+ return ;
150
+
151
+ memset (buf , 0 , sizeof (buf ));
152
+
153
+ err = bpf_prog_test_run_xattr (& tattr );
154
+ CHECK_ATTR (err != -1 || errno != ENOSPC || tattr .retval , "run" ,
155
+ "err %d errno %d retval %d\n" , err , errno , tattr .retval );
156
+
157
+ CHECK_ATTR (tattr .data_size_out != sizeof (pkt_v4 ), "data_size_out" ,
158
+ "incorrect output size, want %lu have %u\n" ,
159
+ sizeof (pkt_v4 ), tattr .data_size_out );
160
+
161
+ CHECK_ATTR (buf [5 ] != 0 , "overflow" ,
162
+ "BPF_PROG_TEST_RUN ignored size hint\n" );
163
+
164
+ tattr .data_out = NULL ;
165
+ tattr .data_size_out = 0 ;
166
+ errno = 0 ;
167
+
168
+ err = bpf_prog_test_run_xattr (& tattr );
169
+ CHECK_ATTR (err || errno || tattr .retval , "run_no_output" ,
170
+ "err %d errno %d retval %d\n" , err , errno , tattr .retval );
171
+
172
+ tattr .data_size_out = 1 ;
173
+ err = bpf_prog_test_run_xattr (& tattr );
174
+ CHECK_ATTR (err != - EINVAL , "run_wrong_size_out" , "err %d\n" , err );
175
+
176
+ bpf_object__close (obj );
177
+ }
178
+
127
179
static void test_xdp (void )
128
180
{
129
181
struct vip key4 = {.protocol = 6 , .family = AF_INET };
@@ -1837,6 +1889,7 @@ int main(void)
1837
1889
jit_enabled = is_jit_enabled ();
1838
1890
1839
1891
test_pkt_access ();
1892
+ test_prog_run_xattr ();
1840
1893
test_xdp ();
1841
1894
test_xdp_adjust_tail ();
1842
1895
test_l4lb_all ();
0 commit comments