@@ -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,26 @@ 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 || mark != 2 , "getsockopt(client_fd, SO_MARK)" ))
402
+ goto close_client ;
403
+
404
+ len = sizeof (cc );
405
+ err = getsockopt (client_fd , SOL_TCP , TCP_CONGESTION , cc , & len );
406
+ ASSERT_OK (err || strcmp (cc , new ), "getsockopt(client_fd, TCP_CONGESTION)" );
407
407
408
408
close_client :
409
409
close (client_fd );
@@ -416,6 +416,7 @@ static void test_subflow(void)
416
416
int cgroup_fd , prog_fd , err ;
417
417
struct mptcp_subflow * skel ;
418
418
struct nstoken * nstoken ;
419
+ struct bpf_link * link ;
419
420
420
421
cgroup_fd = test__join_cgroup ("/mptcp_subflow" );
421
422
if (!ASSERT_GE (cgroup_fd , 0 , "join_cgroup: mptcp_subflow" ))
@@ -441,6 +442,11 @@ static void test_subflow(void)
441
442
if (endpoint_init ("subflow" ) < 0 )
442
443
goto close_netns ;
443
444
445
+ link = bpf_program__attach_cgroup (skel -> progs ._getsockopt_subflow ,
446
+ cgroup_fd );
447
+ if (!ASSERT_OK_PTR (link , "getsockopt prog" ))
448
+ goto close_netns ;
449
+
444
450
run_subflow (skel -> data -> cc );
445
451
446
452
close_netns :
@@ -449,6 +455,7 @@ static void test_subflow(void)
449
455
mptcp_subflow__destroy (skel );
450
456
close_cgroup :
451
457
close (cgroup_fd );
458
+ bpf_link__destroy (link );
452
459
}
453
460
454
461
static struct nstoken * sched_init (char * flags , char * sched )
@@ -470,9 +477,15 @@ static struct nstoken *sched_init(char *flags, char *sched)
470
477
return NULL ;
471
478
}
472
479
480
+ static int ss_search (char * src , char * dst , char * port , char * keyword )
481
+ {
482
+ return SYS_NOFAIL ("ip netns exec %s ss -enita src %s dst %s %s %d | grep -q '%s'" ,
483
+ NS_TEST , src , dst , port , PORT_1 , keyword );
484
+ }
485
+
473
486
static int has_bytes_sent (char * dst )
474
487
{
475
- return _ss_search (ADDR_1 , dst , "sport" , "bytes_sent:" );
488
+ return ss_search (ADDR_1 , dst , "sport" , "bytes_sent:" );
476
489
}
477
490
478
491
static void send_data_and_verify (char * sched , bool addr1 , bool addr2 )
0 commit comments