2222
2323static int duration = 0 ;
2424
25- struct addr_port {
26- in_port_t port ;
27- union {
28- struct in_addr in_addr ;
29- struct in6_addr in6_addr ;
30- };
31- };
32-
33- struct tuple {
34- int family ;
35- struct addr_port src ;
36- struct addr_port dst ;
37- };
38-
39- static bool fill_addr_port (const struct sockaddr * sa , struct addr_port * ap )
40- {
41- const struct sockaddr_in6 * in6 ;
42- const struct sockaddr_in * in ;
43-
44- switch (sa -> sa_family ) {
45- case AF_INET :
46- in = (const struct sockaddr_in * )sa ;
47- ap -> in_addr = in -> sin_addr ;
48- ap -> port = in -> sin_port ;
49- return true;
50-
51- case AF_INET6 :
52- in6 = (const struct sockaddr_in6 * )sa ;
53- ap -> in6_addr = in6 -> sin6_addr ;
54- ap -> port = in6 -> sin6_port ;
55- return true;
56-
57- default :
58- return false;
59- }
60- }
6125
62- static bool set_up_conn (const struct sockaddr * addr , socklen_t len , int type ,
63- int * server , int * conn , struct tuple * tuple )
26+ static bool set_up_conn (const struct sockaddr_storage * addr , socklen_t len , int type ,
27+ int * server , int * conn ,
28+ struct sockaddr_storage * src ,
29+ struct sockaddr_storage * dst )
6430{
6531 struct sockaddr_storage ss ;
6632 socklen_t slen = sizeof (ss );
67- struct sockaddr * sa = (struct sockaddr * )& ss ;
6833
69- * server = start_server_addr (type , ( struct sockaddr_storage * ) addr , len , NULL );
34+ * server = start_server_addr (type , addr , len , NULL );
7035 if (* server < 0 )
7136 return false;
7237
73- if (CHECK_FAIL (getsockname (* server , sa , & slen )))
38+ if (CHECK_FAIL (getsockname (* server , ( struct sockaddr * ) & ss , & slen )))
7439 goto close_server ;
7540
76- * conn = connect_to_addr (type , ( struct sockaddr_storage * ) sa , slen , NULL );
41+ * conn = connect_to_addr (type , & ss , slen , NULL );
7742 if (* conn < 0 )
7843 goto close_server ;
7944
8045 /* We want to simulate packets arriving at conn, so we have to
8146 * swap src and dst.
8247 */
83- slen = sizeof (ss );
84- if (CHECK_FAIL (getsockname (* conn , sa , & slen )))
85- goto close_conn ;
86-
87- if (CHECK_FAIL (!fill_addr_port (sa , & tuple -> dst )))
48+ slen = sizeof (* dst );
49+ if (CHECK_FAIL (getsockname (* conn , (struct sockaddr * )dst , & slen )))
8850 goto close_conn ;
8951
90- slen = sizeof (ss );
91- if (CHECK_FAIL (getpeername (* conn , sa , & slen )))
52+ slen = sizeof (* src );
53+ if (CHECK_FAIL (getpeername (* conn , ( struct sockaddr * ) src , & slen )))
9254 goto close_conn ;
9355
94- if (CHECK_FAIL (!fill_addr_port (sa , & tuple -> src )))
95- goto close_conn ;
96-
97- tuple -> family = ss .ss_family ;
9856 return true;
9957
10058close_conn :
@@ -110,17 +68,16 @@ static socklen_t prepare_addr(struct sockaddr_storage *addr, int family)
11068{
11169 struct sockaddr_in * addr4 ;
11270 struct sockaddr_in6 * addr6 ;
71+ memset (addr , 0 , sizeof (* addr ));
11372
11473 switch (family ) {
11574 case AF_INET :
11675 addr4 = (struct sockaddr_in * )addr ;
117- memset (addr4 , 0 , sizeof (* addr4 ));
11876 addr4 -> sin_family = family ;
11977 addr4 -> sin_addr .s_addr = htonl (INADDR_LOOPBACK );
12078 return sizeof (* addr4 );
12179 case AF_INET6 :
12280 addr6 = (struct sockaddr_in6 * )addr ;
123- memset (addr6 , 0 , sizeof (* addr6 ));
12481 addr6 -> sin6_family = family ;
12582 addr6 -> sin6_addr = in6addr_loopback ;
12683 return sizeof (* addr6 );
@@ -242,9 +199,15 @@ static void encap_init(encap_headers_t *encap, uint8_t hop_count, uint8_t proto)
242199}
243200
244201static size_t build_input (const struct test_cfg * test , void * const buf ,
245- const struct tuple * tuple )
202+ const struct sockaddr_storage * src ,
203+ const struct sockaddr_storage * dst )
246204{
247- in_port_t sport = tuple -> src .port ;
205+ struct sockaddr_in6 * src_in6 = (struct sockaddr_in6 * )src ;
206+ struct sockaddr_in6 * dst_in6 = (struct sockaddr_in6 * )dst ;
207+ struct sockaddr_in * src_in = (struct sockaddr_in * )src ;
208+ struct sockaddr_in * dst_in = (struct sockaddr_in * )dst ;
209+ sa_family_t family = src -> ss_family ;
210+ in_port_t sport , dport ;
248211 encap_headers_t encap ;
249212 struct iphdr ip ;
250213 struct ipv6hdr ipv6 ;
@@ -254,8 +217,11 @@ static size_t build_input(const struct test_cfg *test, void *const buf,
254217 uint8_t * p = buf ;
255218 int proto ;
256219
220+ sport = (family == AF_INET ) ? src_in -> sin_port : src_in6 -> sin6_port ;
221+ dport = (family == AF_INET ) ? dst_in -> sin_port : dst_in6 -> sin6_port ;
222+
257223 proto = IPPROTO_IPIP ;
258- if (tuple -> family == AF_INET6 )
224+ if (family == AF_INET6 )
259225 proto = IPPROTO_IPV6 ;
260226
261227 encap_init (& encap , test -> hops == ONE_HOP ? 1 : 0 , proto );
@@ -270,15 +236,15 @@ static size_t build_input(const struct test_cfg *test, void *const buf,
270236 if (test -> type == UDP )
271237 proto = IPPROTO_UDP ;
272238
273- switch (tuple -> family ) {
239+ switch (family ) {
274240 case AF_INET :
275241 ip = (struct iphdr ){
276242 .ihl = 5 ,
277243 .version = 4 ,
278244 .ttl = IPDEFTTL ,
279245 .protocol = proto ,
280- .saddr = tuple -> src . in_addr .s_addr ,
281- .daddr = tuple -> dst . in_addr .s_addr ,
246+ .saddr = src_in -> sin_addr .s_addr ,
247+ .daddr = dst_in -> sin_addr .s_addr ,
282248 };
283249 p = mempcpy (p , & ip , sizeof (ip ));
284250 break ;
@@ -287,8 +253,8 @@ static size_t build_input(const struct test_cfg *test, void *const buf,
287253 .version = 6 ,
288254 .hop_limit = IPDEFTTL ,
289255 .nexthdr = proto ,
290- .saddr = tuple -> src . in6_addr ,
291- .daddr = tuple -> dst . in6_addr ,
256+ .saddr = src_in6 -> sin6_addr ,
257+ .daddr = dst_in6 -> sin6_addr ,
292258 };
293259 p = mempcpy (p , & ipv6 , sizeof (ipv6 ));
294260 break ;
@@ -303,18 +269,16 @@ static size_t build_input(const struct test_cfg *test, void *const buf,
303269 case TCP :
304270 tcp = (struct tcphdr ){
305271 .source = sport ,
306- .dest = tuple -> dst .port ,
272+ .dest = dport ,
273+ .syn = (test -> flags == SYN ),
274+ .ack = (test -> flags == ACK ),
307275 };
308- if (test -> flags == SYN )
309- tcp .syn = true;
310- if (test -> flags == ACK )
311- tcp .ack = true;
312276 p = mempcpy (p , & tcp , sizeof (tcp ));
313277 break ;
314278 case UDP :
315279 udp = (struct udphdr ){
316280 .source = sport ,
317- .dest = tuple -> dst . port ,
281+ .dest = dport ,
318282 };
319283 p = mempcpy (p , & udp , sizeof (udp ));
320284 break ;
@@ -339,27 +303,26 @@ static void test_cls_redirect_common(struct bpf_program *prog)
339303 LIBBPF_OPTS (bpf_test_run_opts , tattr );
340304 int families [] = { AF_INET , AF_INET6 };
341305 struct sockaddr_storage ss ;
342- struct sockaddr * addr ;
343306 socklen_t slen ;
344307 int i , j , err , prog_fd ;
345308 int servers [__NR_KIND ][ARRAY_SIZE (families )] = {};
346309 int conns [__NR_KIND ][ARRAY_SIZE (families )] = {};
347- struct tuple tuples [__NR_KIND ][ARRAY_SIZE (families )];
310+ struct sockaddr_storage srcs [__NR_KIND ][ARRAY_SIZE (families )];
311+ struct sockaddr_storage dsts [__NR_KIND ][ARRAY_SIZE (families )];
348312
349- addr = (struct sockaddr * )& ss ;
350313 for (i = 0 ; i < ARRAY_SIZE (families ); i ++ ) {
351314 slen = prepare_addr (& ss , families [i ]);
352315 if (CHECK_FAIL (!slen ))
353316 goto cleanup ;
354317
355- if (CHECK_FAIL (!set_up_conn (addr , slen , SOCK_DGRAM ,
318+ if (CHECK_FAIL (!set_up_conn (& ss , slen , SOCK_DGRAM ,
356319 & servers [UDP ][i ], & conns [UDP ][i ],
357- & tuples [UDP ][i ])))
320+ & srcs [ UDP ][ i ], & dsts [UDP ][i ])))
358321 goto cleanup ;
359322
360- if (CHECK_FAIL (!set_up_conn (addr , slen , SOCK_STREAM ,
323+ if (CHECK_FAIL (!set_up_conn (& ss , slen , SOCK_STREAM ,
361324 & servers [TCP ][i ], & conns [TCP ][i ],
362- & tuples [TCP ][i ])))
325+ & srcs [ TCP ][ i ], & dsts [TCP ][i ])))
363326 goto cleanup ;
364327 }
365328
@@ -368,19 +331,20 @@ static void test_cls_redirect_common(struct bpf_program *prog)
368331 struct test_cfg * test = & tests [i ];
369332
370333 for (j = 0 ; j < ARRAY_SIZE (families ); j ++ ) {
371- struct tuple * tuple = & tuples [test -> type ][j ];
334+ struct sockaddr_storage * src = & srcs [test -> type ][j ];
335+ struct sockaddr_storage * dst = & dsts [test -> type ][j ];
372336 char input [256 ];
373337 char tmp [256 ];
374338
375- test_str (tmp , sizeof (tmp ), test , tuple -> family );
339+ test_str (tmp , sizeof (tmp ), test , families [ j ] );
376340 if (!test__start_subtest (tmp ))
377341 continue ;
378342
379343 tattr .data_out = tmp ;
380344 tattr .data_size_out = sizeof (tmp );
381345
382346 tattr .data_in = input ;
383- tattr .data_size_in = build_input (test , input , tuple );
347+ tattr .data_size_in = build_input (test , input , src , dst );
384348 if (CHECK_FAIL (!tattr .data_size_in ))
385349 continue ;
386350
0 commit comments