@@ -368,21 +368,29 @@ 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 )
371
+ static void wait_for_new_subflows ( int fd )
372
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
- }
373
+ socklen_t len ;
374
+ u8 subflows ;
375
+ int err , i ;
376
376
377
- static int ss_search (char * src , char * keyword )
378
- {
379
- return _ss_search (src , ADDR_1 , "dport" , keyword );
377
+ len = sizeof (subflows );
378
+ /* Wait max 1 sec for new subflows to be created */
379
+ for (i = 0 ; i < 10 ; i ++ ) {
380
+ err = getsockopt (fd , SOL_MPTCP , MPTCP_INFO , & subflows , & len );
381
+ if (!err && subflows > 0 )
382
+ break ;
383
+
384
+ sleep (0.1 );
385
+ }
380
386
}
381
387
382
- static void run_subflow (char * new )
388
+ static void run_subflow (void )
383
389
{
384
390
int server_fd , client_fd , err ;
391
+ char new [TCP_CA_NAME_MAX ];
385
392
char cc [TCP_CA_NAME_MAX ];
393
+ unsigned int mark ;
386
394
socklen_t len ;
387
395
388
396
server_fd = start_mptcp_server (AF_INET , ADDR_1 , PORT_1 , 0 );
@@ -393,19 +401,21 @@ static void run_subflow(char *new)
393
401
if (!ASSERT_GE (client_fd , 0 , "connect to fd" ))
394
402
goto close_server ;
395
403
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
404
send_byte (client_fd );
405
+ wait_for_new_subflows (client_fd );
406
+
407
+ len = sizeof (mark );
408
+ err = getsockopt (client_fd , SOL_SOCKET , SO_MARK , & mark , & len );
409
+ if (ASSERT_OK (err , "getsockopt(client_fd, SO_MARK)" ))
410
+ ASSERT_EQ (mark , 0 , "mark" );
411
+
412
+ len = sizeof (new );
413
+ err = getsockopt (client_fd , SOL_TCP , TCP_CONGESTION , new , & len );
414
+ if (ASSERT_OK (err , "getsockopt(client_fd, TCP_CONGESTION)" )) {
415
+ get_msk_ca_name (cc );
416
+ ASSERT_STREQ (new , cc , "cc" );
417
+ }
402
418
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" );
407
-
408
- close_client :
409
419
close (client_fd );
410
420
close_server :
411
421
close (server_fd );
@@ -416,6 +426,7 @@ static void test_subflow(void)
416
426
int cgroup_fd , prog_fd , err ;
417
427
struct mptcp_subflow * skel ;
418
428
struct nstoken * nstoken ;
429
+ struct bpf_link * link ;
419
430
420
431
cgroup_fd = test__join_cgroup ("/mptcp_subflow" );
421
432
if (!ASSERT_GE (cgroup_fd , 0 , "join_cgroup: mptcp_subflow" ))
@@ -441,8 +452,14 @@ static void test_subflow(void)
441
452
if (endpoint_init ("subflow" ) < 0 )
442
453
goto close_netns ;
443
454
444
- run_subflow (skel -> data -> cc );
455
+ link = bpf_program__attach_cgroup (skel -> progs ._getsockopt_subflow ,
456
+ cgroup_fd );
457
+ if (!ASSERT_OK_PTR (link , "getsockopt prog" ))
458
+ goto close_netns ;
459
+
460
+ run_subflow ();
445
461
462
+ bpf_link__destroy (link );
446
463
close_netns :
447
464
cleanup_netns (nstoken );
448
465
skel_destroy :
0 commit comments