@@ -62,21 +62,30 @@ struct xdp_hints_mark {
6262} xdp_hints_mark = { 0 };
6363
6464struct xsk_btf_info * setup_btf_info (struct btf * btf ,
65- const char * struct_name )
65+ const char * struct_name ,
66+ int * errval )
6667{
6768 struct xsk_btf_info * xbi = NULL ;
6869 int err ;
6970
7071 err = xsk_btf__init_xdp_hint (btf , struct_name , & xbi );
7172 if (err ) {
72- fprintf (stderr , "WARN(%d): Cannot BTF locate valid struct:%s\n" ,
73- err , struct_name );
73+ if (errval ) {
74+ /* Expect caller to handle err detection */
75+ * errval = err ;
76+ } else {
77+ fprintf (stderr ,
78+ "WARN(%d): Cannot BTF locate valid struct:%s\n" ,
79+ err , struct_name );
80+ }
7481 return NULL ;
7582 }
7683
77- if (verbose )
78- printf ("Setup BTF based XDP hints for struct: %s\n" ,
79- struct_name );
84+ if (verbose ) {
85+ int btf_id = xsk_btf__btf_type_id (xbi );
86+ printf ("Setup BTF based XDP hints for (btf_id:%d) struct: %s\n" ,
87+ btf_id , struct_name );
88+ }
8089
8190 return xbi ;
8291}
@@ -86,7 +95,7 @@ int init_btf_info_via_bpf_object(struct bpf_object *bpf_obj)
8695 struct btf * btf = bpf_object__btf (bpf_obj );
8796 struct xsk_btf_info * xbi ;
8897
89- xbi = setup_btf_info (btf , "xdp_hints_rx_time" );
98+ xbi = setup_btf_info (btf , "xdp_hints_rx_time" , NULL );
9099 if (xbi ) {
91100 /* Lookup info on required member "rx_ktime" */
92101 if (!xsk_btf__field_member ("rx_ktime" , xbi ,
@@ -100,7 +109,7 @@ int init_btf_info_via_bpf_object(struct bpf_object *bpf_obj)
100109 }
101110 /* Remember to cleanup later: xsk_btf__free_xdp_hint(xbi); */
102111
103- xbi = setup_btf_info (btf , "xdp_hints_mark" );
112+ xbi = setup_btf_info (btf , "xdp_hints_mark" , NULL );
104113 if (xbi ) {
105114 if (!xsk_btf__field_member ("mark" , xbi , & xdp_hints_mark .mark ))
106115 return - EBADSLT ;
@@ -135,20 +144,57 @@ int test01_normal()
135144 return EXIT_OK ;
136145}
137146
138- int main ( int argc , char * * argv )
147+ int test02_should_fail ( )
139148{
140149 struct bpf_object * bpf_obj ;
141- int err ;
142-
143- err = test01_normal () ;
144- if ( err ! = EXIT_OK )
145- return err ;
150+ struct xsk_btf_info * xbi ;
151+ struct btf * btf ;
152+ int errval = 0 ;
153+ int ret = EXIT_OK ;
154+ const char * xdp_hint_name = "xdp_hints_fail001" ;
146155
147156 bpf_obj = load_bpf_object ("btf_unit_test_bpf.o" );
148157 if (!bpf_obj )
149158 return EXIT_FAIL_BPF ;
159+
160+ btf = bpf_object__btf (bpf_obj );
161+
162+ xbi = setup_btf_info (btf , xdp_hint_name , & errval );
163+ if (xbi ) {
164+ /* Unexpected success - as hints layout should be invalid */
165+ printf (" - Unexpected success in test that should fail\n" );
166+ xsk_btf__free_xdp_hint (xbi );
167+ ret = EXIT_FAIL_BPF ;
168+ goto out ;
169+ }
170+ if (errval != - EOVERFLOW ) {
171+ /* Expecting failure with EOVERFLOW as btf_id not last member */
172+ printf ("Unexpect FAIL - with errno:%d\n" , errval );
173+ ret = EXIT_FAIL_BTF ;
174+ goto out ;
175+ }
176+ if (verbose ) {
177+ printf ("SUCCESS - "
178+ "detect btf_id not last member in struct %s\n" ,
179+ xdp_hint_name );
180+ }
181+
182+ out :
150183 bpf_object__close (bpf_obj );
184+ return ret ;
185+ }
151186
187+ int main (int argc , char * * argv )
188+ {
189+ int err ;
190+
191+ err = test01_normal ();
192+ if (err )
193+ return err ;
194+
195+ err = test02_should_fail ();
196+ if (err )
197+ return err ;
152198
153199 return EXIT_OK ;
154200}
0 commit comments