@@ -368,22 +368,13 @@ static int endpoint_init(char *flags)
368
368
return -1 ;
369
369
}
370
370
371
- static int _ss_search (char * src , char * dst , char * port , char * keyword )
372
- {
373
- return SYS_NOFAIL ("ip netns exec %s ss -enita src %s dst %s %s %d | grep -q '%s'" ,
374
- NS_TEST , src , dst , port , PORT_1 , keyword );
375
- }
376
-
377
- static int ss_search (char * src , char * keyword )
378
- {
379
- return _ss_search (src , ADDR_1 , "dport" , keyword );
380
- }
381
-
382
371
static void run_subflow (char * new )
383
372
{
384
- int server_fd , client_fd , err ;
373
+ int server_fd , client_fd , err , i ;
385
374
char cc [TCP_CA_NAME_MAX ];
375
+ unsigned int mark ;
386
376
socklen_t len ;
377
+ u8 subflows ;
387
378
388
379
server_fd = start_mptcp_server (AF_INET , ADDR_1 , PORT_1 , 0 );
389
380
if (!ASSERT_GE (server_fd , 0 , "start_mptcp_server" ))
@@ -393,17 +384,29 @@ static void run_subflow(char *new)
393
384
if (!ASSERT_GE (client_fd , 0 , "connect to fd" ))
394
385
goto close_server ;
395
386
396
- len = sizeof (cc );
397
- err = getsockopt (server_fd , SOL_TCP , TCP_CONGESTION , cc , & len );
398
- if (!ASSERT_OK (err , "getsockopt(server_fd, TCP_CONGESTION)" ))
399
- goto close_client ;
400
-
401
387
send_byte (client_fd );
402
388
403
- ASSERT_OK (ss_search (ADDR_1 , "fwmark:0x1" ), "ss_search fwmark:0x1" );
404
- ASSERT_OK (ss_search (ADDR_2 , "fwmark:0x2" ), "ss_search fwmark:0x2" );
405
- ASSERT_OK (ss_search (ADDR_1 , new ), "ss_search new cc" );
406
- ASSERT_OK (ss_search (ADDR_2 , cc ), "ss_search default cc" );
389
+ len = sizeof (subflows );
390
+ /* Wait max 1 sec for new subflows to be created */
391
+ for (i = 0 ; i < 10 ; i ++ ) {
392
+ err = getsockopt (client_fd , SOL_MPTCP , MPTCP_INFO , & subflows , & len );
393
+ if (!err && subflows > 0 )
394
+ break ;
395
+
396
+ sleep (0.1 );
397
+ }
398
+
399
+ len = sizeof (mark );
400
+ err = getsockopt (client_fd , SOL_SOCKET , SO_MARK , & mark , & len );
401
+ if (!ASSERT_OK (err , "getsockopt(client_fd, SO_MARK)" ))
402
+ goto close_client ;
403
+ ASSERT_EQ (mark , 0 , "mark" );
404
+
405
+ len = sizeof (cc );
406
+ err = getsockopt (client_fd , SOL_TCP , TCP_CONGESTION , cc , & len );
407
+ if (!ASSERT_OK (err , "getsockopt(client_fd, TCP_CONGESTION)" ))
408
+ goto close_client ;
409
+ ASSERT_STREQ (cc , new , "cc" );
407
410
408
411
close_client :
409
412
close (client_fd );
@@ -416,6 +419,7 @@ static void test_subflow(void)
416
419
int cgroup_fd , prog_fd , err ;
417
420
struct mptcp_subflow * skel ;
418
421
struct nstoken * nstoken ;
422
+ struct bpf_link * link ;
419
423
420
424
cgroup_fd = test__join_cgroup ("/mptcp_subflow" );
421
425
if (!ASSERT_GE (cgroup_fd , 0 , "join_cgroup: mptcp_subflow" ))
@@ -441,13 +445,19 @@ static void test_subflow(void)
441
445
if (endpoint_init ("subflow" ) < 0 )
442
446
goto close_netns ;
443
447
448
+ link = bpf_program__attach_cgroup (skel -> progs ._getsockopt_subflow ,
449
+ cgroup_fd );
450
+ if (!ASSERT_OK_PTR (link , "getsockopt prog" ))
451
+ goto close_netns ;
452
+
444
453
run_subflow (skel -> data -> cc );
445
454
446
455
close_netns :
447
456
cleanup_netns (nstoken );
448
457
skel_destroy :
449
458
mptcp_subflow__destroy (skel );
450
459
close_cgroup :
460
+ bpf_link__destroy (link );
451
461
close (cgroup_fd );
452
462
}
453
463
0 commit comments