@@ -251,14 +251,17 @@ unsigned int mptcp_pm_get_local_addr_max(struct mptcp_sock *msk)
251
251
}
252
252
EXPORT_SYMBOL_GPL (mptcp_pm_get_local_addr_max );
253
253
254
- static void check_work_pending (struct mptcp_sock * msk )
254
+ bool mptcp_pm_nl_check_work_pending (struct mptcp_sock * msk )
255
255
{
256
256
struct pm_nl_pernet * pernet = net_generic (sock_net ((struct sock * )msk ), pm_nl_pernet_id );
257
257
258
258
if (msk -> pm .subflows == mptcp_pm_get_subflows_max (msk ) ||
259
259
(find_next_and_bit (pernet -> id_bitmap , msk -> pm .id_avail_bitmap ,
260
- MPTCP_PM_MAX_ADDR_ID + 1 , 0 ) == MPTCP_PM_MAX_ADDR_ID + 1 ))
260
+ MPTCP_PM_MAX_ADDR_ID + 1 , 0 ) == MPTCP_PM_MAX_ADDR_ID + 1 )) {
261
261
WRITE_ONCE (msk -> pm .work_pending , false);
262
+ return false;
263
+ }
264
+ return true;
262
265
}
263
266
264
267
struct mptcp_pm_add_entry *
@@ -427,29 +430,36 @@ static bool lookup_address_in_vec(struct mptcp_addr_info *addrs, unsigned int nr
427
430
static unsigned int fill_remote_addresses_vec (struct mptcp_sock * msk , bool fullmesh ,
428
431
struct mptcp_addr_info * addrs )
429
432
{
433
+ bool deny_id0 = READ_ONCE (msk -> pm .remote_deny_join_id0 );
430
434
struct sock * sk = (struct sock * )msk , * ssk ;
431
435
struct mptcp_subflow_context * subflow ;
432
436
struct mptcp_addr_info remote = { 0 };
433
437
unsigned int subflows_max ;
434
438
int i = 0 ;
435
439
436
440
subflows_max = mptcp_pm_get_subflows_max (msk );
441
+ remote_address ((struct sock_common * )sk , & remote );
437
442
438
443
/* Non-fullmesh endpoint, fill in the single entry
439
444
* corresponding to the primary MPC subflow remote address
440
445
*/
441
446
if (!fullmesh ) {
442
- remote_address ((struct sock_common * )sk , & remote );
447
+ if (deny_id0 )
448
+ return 0 ;
449
+
443
450
msk -> pm .subflows ++ ;
444
451
addrs [i ++ ] = remote ;
445
452
} else {
446
453
mptcp_for_each_subflow (msk , subflow ) {
447
454
ssk = mptcp_subflow_tcp_sock (subflow );
448
- remote_address ((struct sock_common * )ssk , & remote );
449
- if (!lookup_address_in_vec (addrs , i , & remote ) &&
455
+ remote_address ((struct sock_common * )ssk , & addrs [i ]);
456
+ if (deny_id0 && addresses_equal (& addrs [i ], & remote , false))
457
+ continue ;
458
+
459
+ if (!lookup_address_in_vec (addrs , i , & addrs [i ]) &&
450
460
msk -> pm .subflows < subflows_max ) {
451
461
msk -> pm .subflows ++ ;
452
- addrs [ i ++ ] = remote ;
462
+ i ++ ;
453
463
}
454
464
}
455
465
}
@@ -503,12 +513,12 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
503
513
504
514
/* do lazy endpoint usage accounting for the MPC subflows */
505
515
if (unlikely (!(msk -> pm .status & BIT (MPTCP_PM_MPC_ENDPOINT_ACCOUNTED ))) && msk -> first ) {
506
- struct mptcp_addr_info local ;
516
+ struct mptcp_addr_info mpc_addr ;
507
517
int mpc_id ;
508
518
509
- local_address ((struct sock_common * )msk -> first , & local );
510
- mpc_id = lookup_id_by_addr (pernet , & local );
511
- if (mpc_id < 0 )
519
+ local_address ((struct sock_common * )msk -> first , & mpc_addr );
520
+ mpc_id = lookup_id_by_addr (pernet , & mpc_addr );
521
+ if (mpc_id >= 0 )
512
522
__clear_bit (mpc_id , msk -> pm .id_avail_bitmap );
513
523
514
524
msk -> pm .status |= BIT (MPTCP_PM_MPC_ENDPOINT_ACCOUNTED );
@@ -534,26 +544,28 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
534
544
}
535
545
536
546
/* check if should create a new subflow */
537
- if (msk -> pm .local_addr_used < local_addr_max &&
538
- msk -> pm .subflows < subflows_max &&
539
- !READ_ONCE (msk -> pm .remote_deny_join_id0 )) {
547
+ while (msk -> pm .local_addr_used < local_addr_max &&
548
+ msk -> pm .subflows < subflows_max ) {
549
+ struct mptcp_addr_info addrs [MPTCP_PM_ADDR_MAX ];
550
+ bool fullmesh ;
551
+ int i , nr ;
552
+
540
553
local = select_local_address (pernet , msk );
541
- if (local ) {
542
- bool fullmesh = !!(local -> flags & MPTCP_PM_ADDR_FLAG_FULLMESH );
543
- struct mptcp_addr_info addrs [MPTCP_PM_ADDR_MAX ];
544
- int i , nr ;
554
+ if (!local )
555
+ break ;
545
556
546
- msk -> pm .local_addr_used ++ ;
547
- nr = fill_remote_addresses_vec (msk , fullmesh , addrs );
548
- if (nr )
549
- __clear_bit (local -> addr .id , msk -> pm .id_avail_bitmap );
550
- spin_unlock_bh (& msk -> pm .lock );
551
- for (i = 0 ; i < nr ; i ++ )
552
- __mptcp_subflow_connect (sk , & local -> addr , & addrs [i ]);
553
- spin_lock_bh (& msk -> pm .lock );
554
- }
557
+ fullmesh = !!(local -> flags & MPTCP_PM_ADDR_FLAG_FULLMESH );
558
+
559
+ msk -> pm .local_addr_used ++ ;
560
+ nr = fill_remote_addresses_vec (msk , fullmesh , addrs );
561
+ if (nr )
562
+ __clear_bit (local -> addr .id , msk -> pm .id_avail_bitmap );
563
+ spin_unlock_bh (& msk -> pm .lock );
564
+ for (i = 0 ; i < nr ; i ++ )
565
+ __mptcp_subflow_connect (sk , & local -> addr , & addrs [i ]);
566
+ spin_lock_bh (& msk -> pm .lock );
555
567
}
556
- check_work_pending (msk );
568
+ mptcp_pm_nl_check_work_pending (msk );
557
569
}
558
570
559
571
static void mptcp_pm_nl_fully_established (struct mptcp_sock * msk )
@@ -760,11 +772,12 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp_sock *msk,
760
772
i , rm_list -> ids [i ], subflow -> local_id , subflow -> remote_id );
761
773
spin_unlock_bh (& msk -> pm .lock );
762
774
mptcp_subflow_shutdown (sk , ssk , how );
775
+
776
+ /* the following takes care of updating the subflows counter */
763
777
mptcp_close_ssk (sk , ssk , subflow );
764
778
spin_lock_bh (& msk -> pm .lock );
765
779
766
780
removed = true;
767
- msk -> pm .subflows -- ;
768
781
__MPTCP_INC_STATS (sock_net (sk ), rm_type );
769
782
}
770
783
__set_bit (rm_list -> ids [1 ], msk -> pm .id_avail_bitmap );
0 commit comments