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-
3325struct tuple {
3426 int family ;
35- struct addr_port src ;
36- struct addr_port dst ;
27+ struct sockaddr_storage src ;
28+ struct sockaddr_storage dst ;
3729};
3830
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- }
6131
62- static bool set_up_conn (const struct sockaddr * addr , socklen_t len , int type ,
32+ static bool set_up_conn (const struct sockaddr_storage * addr , socklen_t len , int type ,
6333 int * server , int * conn , struct tuple * tuple )
6434{
6535 struct sockaddr_storage ss ;
6636 socklen_t slen = sizeof (ss );
67- struct sockaddr * sa = (struct sockaddr * )& ss ;
6837
69- * server = start_server_addr (type , ( struct sockaddr_storage * ) addr , len , NULL );
38+ * server = start_server_addr (type , addr , len , NULL );
7039 if (* server < 0 )
7140 return false;
7241
73- if (CHECK_FAIL (getsockname (* server , sa , & slen )))
42+ if (CHECK_FAIL (getsockname (* server , ( struct sockaddr * ) & ss , & slen )))
7443 goto close_server ;
7544
76- * conn = connect_to_addr (type , ( struct sockaddr_storage * ) sa , slen , NULL );
45+ * conn = connect_to_addr (type , & ss , slen , NULL );
7746 if (* conn < 0 )
7847 goto close_server ;
7948
8049 /* We want to simulate packets arriving at conn, so we have to
8150 * swap src and dst.
8251 */
83- slen = sizeof (ss );
84- if (CHECK_FAIL (getsockname (* conn , sa , & slen )))
52+ slen = sizeof (tuple -> dst );
53+ if (CHECK_FAIL (getsockname (* conn , ( struct sockaddr * ) & tuple -> dst , & slen )))
8554 goto close_conn ;
8655
87- if (CHECK_FAIL (!fill_addr_port (sa , & tuple -> dst )))
56+ slen = sizeof (tuple -> src );
57+ if (CHECK_FAIL (getpeername (* conn , (struct sockaddr * )& tuple -> src , & slen )))
8858 goto close_conn ;
8959
90- slen = sizeof (ss );
91- if (CHECK_FAIL (getpeername (* conn , sa , & slen )))
92- goto close_conn ;
93-
94- if (CHECK_FAIL (!fill_addr_port (sa , & tuple -> src )))
95- goto close_conn ;
96-
97- tuple -> family = ss .ss_family ;
60+ tuple -> family = tuple -> dst .ss_family ;
9861 return true;
9962
10063close_conn :
@@ -110,17 +73,16 @@ static socklen_t prepare_addr(struct sockaddr_storage *addr, int family)
11073{
11174 struct sockaddr_in * addr4 ;
11275 struct sockaddr_in6 * addr6 ;
76+ memset (addr , 0 , sizeof (* addr ));
11377
11478 switch (family ) {
11579 case AF_INET :
11680 addr4 = (struct sockaddr_in * )addr ;
117- memset (addr4 , 0 , sizeof (* addr4 ));
11881 addr4 -> sin_family = family ;
11982 addr4 -> sin_addr .s_addr = htonl (INADDR_LOOPBACK );
12083 return sizeof (* addr4 );
12184 case AF_INET6 :
12285 addr6 = (struct sockaddr_in6 * )addr ;
123- memset (addr6 , 0 , sizeof (* addr6 ));
12486 addr6 -> sin6_family = family ;
12587 addr6 -> sin6_addr = in6addr_loopback ;
12688 return sizeof (* addr6 );
@@ -244,7 +206,11 @@ static void encap_init(encap_headers_t *encap, uint8_t hop_count, uint8_t proto)
244206static size_t build_input (const struct test_cfg * test , void * const buf ,
245207 const struct tuple * tuple )
246208{
247- in_port_t sport = tuple -> src .port ;
209+ struct sockaddr_in6 * src_in6 = (struct sockaddr_in6 * )& tuple -> src ;
210+ struct sockaddr_in6 * dst_in6 = (struct sockaddr_in6 * )& tuple -> dst ;
211+ struct sockaddr_in * src_in = (struct sockaddr_in * )& tuple -> src ;
212+ struct sockaddr_in * dst_in = (struct sockaddr_in * )& tuple -> dst ;
213+ in_port_t sport , dport ;
248214 encap_headers_t encap ;
249215 struct iphdr ip ;
250216 struct ipv6hdr ipv6 ;
@@ -254,6 +220,9 @@ static size_t build_input(const struct test_cfg *test, void *const buf,
254220 uint8_t * p = buf ;
255221 int proto ;
256222
223+ sport = (tuple -> family == AF_INET ) ? src_in -> sin_port : src_in6 -> sin6_port ;
224+ dport = (tuple -> family == AF_INET ) ? dst_in -> sin_port : dst_in6 -> sin6_port ;
225+
257226 proto = IPPROTO_IPIP ;
258227 if (tuple -> family == AF_INET6 )
259228 proto = IPPROTO_IPV6 ;
@@ -277,8 +246,8 @@ static size_t build_input(const struct test_cfg *test, void *const buf,
277246 .version = 4 ,
278247 .ttl = IPDEFTTL ,
279248 .protocol = proto ,
280- .saddr = tuple -> src . in_addr .s_addr ,
281- .daddr = tuple -> dst . in_addr .s_addr ,
249+ .saddr = src_in -> sin_addr .s_addr ,
250+ .daddr = dst_in -> sin_addr .s_addr ,
282251 };
283252 p = mempcpy (p , & ip , sizeof (ip ));
284253 break ;
@@ -287,8 +256,8 @@ static size_t build_input(const struct test_cfg *test, void *const buf,
287256 .version = 6 ,
288257 .hop_limit = IPDEFTTL ,
289258 .nexthdr = proto ,
290- .saddr = tuple -> src . in6_addr ,
291- .daddr = tuple -> dst . in6_addr ,
259+ .saddr = src_in6 -> sin6_addr ,
260+ .daddr = dst_in6 -> sin6_addr ,
292261 };
293262 p = mempcpy (p , & ipv6 , sizeof (ipv6 ));
294263 break ;
@@ -303,18 +272,16 @@ static size_t build_input(const struct test_cfg *test, void *const buf,
303272 case TCP :
304273 tcp = (struct tcphdr ){
305274 .source = sport ,
306- .dest = tuple -> dst .port ,
275+ .dest = dport ,
276+ .syn = (test -> flags == SYN ),
277+ .ack = (test -> flags == ACK ),
307278 };
308- if (test -> flags == SYN )
309- tcp .syn = true;
310- if (test -> flags == ACK )
311- tcp .ack = true;
312279 p = mempcpy (p , & tcp , sizeof (tcp ));
313280 break ;
314281 case UDP :
315282 udp = (struct udphdr ){
316283 .source = sport ,
317- .dest = tuple -> dst . port ,
284+ .dest = dport ,
318285 };
319286 p = mempcpy (p , & udp , sizeof (udp ));
320287 break ;
@@ -339,25 +306,23 @@ static void test_cls_redirect_common(struct bpf_program *prog)
339306 LIBBPF_OPTS (bpf_test_run_opts , tattr );
340307 int families [] = { AF_INET , AF_INET6 };
341308 struct sockaddr_storage ss ;
342- struct sockaddr * addr ;
343309 socklen_t slen ;
344310 int i , j , err , prog_fd ;
345311 int servers [__NR_KIND ][ARRAY_SIZE (families )] = {};
346312 int conns [__NR_KIND ][ARRAY_SIZE (families )] = {};
347313 struct tuple tuples [__NR_KIND ][ARRAY_SIZE (families )];
348314
349- addr = (struct sockaddr * )& ss ;
350315 for (i = 0 ; i < ARRAY_SIZE (families ); i ++ ) {
351316 slen = prepare_addr (& ss , families [i ]);
352317 if (CHECK_FAIL (!slen ))
353318 goto cleanup ;
354319
355- if (CHECK_FAIL (!set_up_conn (addr , slen , SOCK_DGRAM ,
320+ if (CHECK_FAIL (!set_up_conn (& ss , slen , SOCK_DGRAM ,
356321 & servers [UDP ][i ], & conns [UDP ][i ],
357322 & tuples [UDP ][i ])))
358323 goto cleanup ;
359324
360- if (CHECK_FAIL (!set_up_conn (addr , slen , SOCK_STREAM ,
325+ if (CHECK_FAIL (!set_up_conn (& ss , slen , SOCK_STREAM ,
361326 & servers [TCP ][i ], & conns [TCP ][i ],
362327 & tuples [TCP ][i ])))
363328 goto cleanup ;
0 commit comments