@@ -374,15 +374,29 @@ static int _ss_search(char *src, char *dst, char *port, char *keyword)
374
374
NS_TEST , src , dst , port , PORT_1 , keyword );
375
375
}
376
376
377
- static int ss_search ( char * src , char * keyword )
377
+ static void wait_for_new_subflows ( int fd )
378
378
{
379
- return _ss_search (src , ADDR_1 , "dport" , keyword );
379
+ socklen_t len ;
380
+ u8 subflows ;
381
+ int err , i ;
382
+
383
+ len = sizeof (subflows );
384
+ /* Wait max 1 sec for new subflows to be created */
385
+ for (i = 0 ; i < 10 ; i ++ ) {
386
+ err = getsockopt (fd , SOL_MPTCP , MPTCP_INFO , & subflows , & len );
387
+ if (!err && subflows > 0 )
388
+ break ;
389
+
390
+ sleep (0.1 );
391
+ }
380
392
}
381
393
382
- static void run_subflow (char * new )
394
+ static void run_subflow (void )
383
395
{
384
396
int server_fd , client_fd , err ;
397
+ char new [TCP_CA_NAME_MAX ];
385
398
char cc [TCP_CA_NAME_MAX ];
399
+ unsigned int mark ;
386
400
socklen_t len ;
387
401
388
402
server_fd = start_mptcp_server (AF_INET , ADDR_1 , PORT_1 , 0 );
@@ -393,19 +407,21 @@ static void run_subflow(char *new)
393
407
if (!ASSERT_GE (client_fd , 0 , "connect to fd" ))
394
408
goto close_server ;
395
409
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
410
send_byte (client_fd );
411
+ wait_for_new_subflows (client_fd );
412
+
413
+ len = sizeof (mark );
414
+ err = getsockopt (client_fd , SOL_SOCKET , SO_MARK , & mark , & len );
415
+ if (ASSERT_OK (err , "getsockopt(client_fd, SO_MARK)" ))
416
+ ASSERT_EQ (mark , 0 , "mark" );
417
+
418
+ len = sizeof (new );
419
+ err = getsockopt (client_fd , SOL_TCP , TCP_CONGESTION , new , & len );
420
+ if (ASSERT_OK (err , "getsockopt(client_fd, TCP_CONGESTION)" )) {
421
+ get_msk_ca_name (cc );
422
+ ASSERT_STREQ (new , cc , "cc" );
423
+ }
402
424
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
425
close (client_fd );
410
426
close_server :
411
427
close (server_fd );
@@ -416,6 +432,7 @@ static void test_subflow(void)
416
432
int cgroup_fd , prog_fd , err ;
417
433
struct mptcp_subflow * skel ;
418
434
struct nstoken * nstoken ;
435
+ struct bpf_link * link ;
419
436
420
437
cgroup_fd = test__join_cgroup ("/mptcp_subflow" );
421
438
if (!ASSERT_GE (cgroup_fd , 0 , "join_cgroup: mptcp_subflow" ))
@@ -425,6 +442,8 @@ static void test_subflow(void)
425
442
if (!ASSERT_OK_PTR (skel , "skel_open_load: mptcp_subflow" ))
426
443
goto close_cgroup ;
427
444
445
+ skel -> bss -> pid = getpid ();
446
+
428
447
err = mptcp_subflow__attach (skel );
429
448
if (!ASSERT_OK (err , "skel_attach: mptcp_subflow" ))
430
449
goto skel_destroy ;
@@ -441,8 +460,14 @@ static void test_subflow(void)
441
460
if (endpoint_init ("subflow" ) < 0 )
442
461
goto close_netns ;
443
462
444
- run_subflow (skel -> data -> cc );
463
+ link = bpf_program__attach_cgroup (skel -> progs ._getsockopt_subflow ,
464
+ cgroup_fd );
465
+ if (!ASSERT_OK_PTR (link , "getsockopt prog" ))
466
+ goto close_netns ;
467
+
468
+ run_subflow ();
445
469
470
+ bpf_link__destroy (link );
446
471
close_netns :
447
472
cleanup_netns (nstoken );
448
473
skel_destroy :
0 commit comments