@@ -534,13 +534,67 @@ static void mptcp_pm_nl_subflow_established(struct mptcp_sock *msk)
534
534
mptcp_pm_create_subflow_or_signal_addr (msk );
535
535
}
536
536
537
+ /* Fill all the local addresses into the array addrs[],
538
+ * and return the array size.
539
+ */
540
+ static unsigned int fill_local_addresses_vec (struct mptcp_sock * msk ,
541
+ struct mptcp_addr_info * addrs )
542
+ {
543
+ struct sock * sk = (struct sock * )msk ;
544
+ struct mptcp_pm_addr_entry * entry ;
545
+ struct mptcp_addr_info local ;
546
+ struct pm_nl_pernet * pernet ;
547
+ unsigned int subflows_max ;
548
+ int i = 0 ;
549
+
550
+ pernet = net_generic (sock_net (sk ), pm_nl_pernet_id );
551
+ subflows_max = mptcp_pm_get_subflows_max (msk );
552
+
553
+ rcu_read_lock ();
554
+ __mptcp_flush_join_list (msk );
555
+ list_for_each_entry_rcu (entry , & pernet -> local_addr_list , list ) {
556
+ if (!(entry -> flags & MPTCP_PM_ADDR_FLAG_FULLMESH ))
557
+ continue ;
558
+
559
+ if (entry -> addr .family != sk -> sk_family ) {
560
+ #if IS_ENABLED (CONFIG_MPTCP_IPV6 )
561
+ if ((entry -> addr .family == AF_INET &&
562
+ !ipv6_addr_v4mapped (& sk -> sk_v6_daddr )) ||
563
+ (sk -> sk_family == AF_INET &&
564
+ !ipv6_addr_v4mapped (& entry -> addr .addr6 )))
565
+ #endif
566
+ continue ;
567
+ }
568
+
569
+ if (msk -> pm .subflows < subflows_max ) {
570
+ msk -> pm .subflows ++ ;
571
+ addrs [i ++ ] = entry -> addr ;
572
+ }
573
+ }
574
+ rcu_read_unlock ();
575
+
576
+ /* If the array is empty, fill in the single
577
+ * 'IPADDRANY' local address
578
+ */
579
+ if (!i ) {
580
+ memset (& local , 0 , sizeof (local ));
581
+ local .family = msk -> pm .remote .family ;
582
+
583
+ msk -> pm .subflows ++ ;
584
+ addrs [i ++ ] = local ;
585
+ }
586
+
587
+ return i ;
588
+ }
589
+
537
590
static void mptcp_pm_nl_add_addr_received (struct mptcp_sock * msk )
538
591
{
592
+ struct mptcp_addr_info addrs [MPTCP_PM_ADDR_MAX ];
539
593
struct sock * sk = (struct sock * )msk ;
540
594
unsigned int add_addr_accept_max ;
541
595
struct mptcp_addr_info remote ;
542
- struct mptcp_addr_info local ;
543
596
unsigned int subflows_max ;
597
+ int i , nr ;
544
598
545
599
add_addr_accept_max = mptcp_pm_get_add_addr_accept_max (msk );
546
600
subflows_max = mptcp_pm_get_subflows_max (msk );
@@ -552,23 +606,22 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
552
606
if (lookup_subflow_by_daddr (& msk -> conn_list , & msk -> pm .remote ))
553
607
goto add_addr_echo ;
554
608
555
- msk -> pm .add_addr_accepted ++ ;
556
- msk -> pm .subflows ++ ;
557
- if (msk -> pm .add_addr_accepted >= add_addr_accept_max ||
558
- msk -> pm .subflows >= subflows_max )
559
- WRITE_ONCE (msk -> pm .accept_addr , false);
560
-
561
609
/* connect to the specified remote address, using whatever
562
610
* local address the routing configuration will pick.
563
611
*/
564
612
remote = msk -> pm .remote ;
565
613
if (!remote .port )
566
614
remote .port = sk -> sk_dport ;
567
- memset (& local , 0 , sizeof (local ));
568
- local .family = remote .family ;
615
+ nr = fill_local_addresses_vec (msk , addrs );
616
+
617
+ msk -> pm .add_addr_accepted ++ ;
618
+ if (msk -> pm .add_addr_accepted >= add_addr_accept_max ||
619
+ msk -> pm .subflows >= subflows_max )
620
+ WRITE_ONCE (msk -> pm .accept_addr , false);
569
621
570
622
spin_unlock_bh (& msk -> pm .lock );
571
- __mptcp_subflow_connect (sk , & local , & remote );
623
+ for (i = 0 ; i < nr ; i ++ )
624
+ __mptcp_subflow_connect (sk , & addrs [i ], & remote );
572
625
spin_lock_bh (& msk -> pm .lock );
573
626
574
627
add_addr_echo :
0 commit comments